Skip to content

Commit 168d94a

Browse files
committed
Replacing _implicit_environ module globals with a container.
This is so that a container instance can have lazily loaded properties.
1 parent 00a9953 commit 168d94a

11 files changed

Lines changed: 114 additions & 77 deletions

gcloud/datastore/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def set_default_dataset_id(dataset_id=None):
9595
dataset_id = _implicit_environ.compute_engine_id()
9696

9797
if dataset_id is not None:
98-
_implicit_environ.DATASET_ID = dataset_id
98+
_implicit_environ._DEFAULTS.dataset_id = dataset_id
9999
else:
100100
raise EnvironmentError('No dataset ID could be inferred.')
101101

@@ -107,7 +107,7 @@ def set_default_connection(connection=None):
107107
:param connection: A connection provided to be the default.
108108
"""
109109
connection = connection or get_connection()
110-
_implicit_environ.CONNECTION = connection
110+
_implicit_environ._DEFAULTS.connection = connection
111111

112112

113113
def set_defaults(dataset_id=None, connection=None):

gcloud/datastore/_implicit_environ.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,19 @@
2828
app_identity = None
2929

3030

31-
DATASET_ID = None
32-
"""Module global to allow persistent implied dataset ID from enviroment."""
31+
class _DefaultsContainer(object):
32+
"""Container for defaults.
3333
34-
CONNECTION = None
35-
"""Module global to allow persistent implied connection from enviroment."""
34+
:type connection: :class:`gcloud.datastore.connection.Connection`
35+
:param connection: Persistent implied connection from environment.
36+
37+
:type dataset_id: string
38+
:param dataset_id: Persistent implied dataset ID from environment.
39+
"""
40+
41+
def __init__(self, connection=None, dataset_id=None):
42+
self.connection = connection
43+
self.dataset_id = dataset_id
3644

3745

3846
def app_engine_id():
@@ -87,7 +95,7 @@ def get_default_connection():
8795
:rtype: :class:`gcloud.datastore.connection.Connection` or ``NoneType``
8896
:returns: The default connection if one has been set.
8997
"""
90-
return CONNECTION
98+
return _DEFAULTS.connection
9199

92100

93101
def get_default_dataset_id():
@@ -96,4 +104,7 @@ def get_default_dataset_id():
96104
:rtype: string or ``NoneType``
97105
:returns: The default dataset ID if one has been set.
98106
"""
99-
return DATASET_ID
107+
return _DEFAULTS.dataset_id
108+
109+
110+
_DEFAULTS = _DefaultsContainer()

gcloud/datastore/test___init__.py

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@ class Test_set_default_dataset_id(unittest2.TestCase):
1919

2020
def setUp(self):
2121
from gcloud.datastore import _implicit_environ
22-
self._replaced_dataset_id = _implicit_environ.DATASET_ID
23-
_implicit_environ.DATASET_ID = None
22+
self._replaced_defaults = _implicit_environ._DEFAULTS
23+
_implicit_environ._DEFAULTS = _implicit_environ._DefaultsContainer(
24+
None, None)
2425

2526
def tearDown(self):
2627
from gcloud.datastore import _implicit_environ
27-
_implicit_environ.DATASET_ID = self._replaced_dataset_id
28+
_implicit_environ._DEFAULTS = self._replaced_defaults
2829

2930
def _callFUT(self, dataset_id=None):
3031
from gcloud.datastore import set_default_dataset_id
@@ -60,7 +61,7 @@ def test_no_env_var_set(self):
6061
with self._monkeyImplicit():
6162
self.assertRaises(EnvironmentError, self._callFUT)
6263

63-
self.assertEqual(_implicit_environ.DATASET_ID, None)
64+
self.assertEqual(_implicit_environ.get_default_dataset_id(), None)
6465

6566
def test_set_from_env_var(self):
6667
from gcloud.datastore import _implicit_environ
@@ -70,7 +71,8 @@ def test_set_from_env_var(self):
7071
with self._monkeyImplicit():
7172
self._callFUT()
7273

73-
self.assertEqual(_implicit_environ.DATASET_ID, IMPLICIT_DATASET_ID)
74+
self.assertEqual(_implicit_environ.get_default_dataset_id(),
75+
IMPLICIT_DATASET_ID)
7476

7577
def test_set_explicit_w_env_var_set(self):
7678
from gcloud.datastore import _implicit_environ
@@ -80,7 +82,8 @@ def test_set_explicit_w_env_var_set(self):
8082
with self._monkeyImplicit():
8183
self._callFUT(EXPLICIT_DATASET_ID)
8284

83-
self.assertEqual(_implicit_environ.DATASET_ID, EXPLICIT_DATASET_ID)
85+
self.assertEqual(_implicit_environ.get_default_dataset_id(),
86+
EXPLICIT_DATASET_ID)
8487

8588
def test_set_explicit_no_env_var_set(self):
8689
from gcloud.datastore import _implicit_environ
@@ -91,7 +94,8 @@ def test_set_explicit_no_env_var_set(self):
9194
with self._monkeyImplicit():
9295
self._callFUT(EXPLICIT_DATASET_ID)
9396

94-
self.assertEqual(_implicit_environ.DATASET_ID, EXPLICIT_DATASET_ID)
97+
self.assertEqual(_implicit_environ.get_default_dataset_id(),
98+
EXPLICIT_DATASET_ID)
9599

96100
def test_set_explicit_None_wo_env_var_set(self):
97101
from gcloud.datastore import _implicit_environ
@@ -100,7 +104,7 @@ def test_set_explicit_None_wo_env_var_set(self):
100104
with self._monkeyImplicit():
101105
self.assertRaises(EnvironmentError, self._callFUT, None)
102106

103-
self.assertEqual(_implicit_environ.DATASET_ID, None)
107+
self.assertEqual(_implicit_environ.get_default_dataset_id(), None)
104108

105109
def test_set_explicit_None_w_env_var_set(self):
106110
from gcloud.datastore import _implicit_environ
@@ -110,7 +114,8 @@ def test_set_explicit_None_w_env_var_set(self):
110114
with self._monkeyImplicit():
111115
self._callFUT(None)
112116

113-
self.assertEqual(_implicit_environ.DATASET_ID, IMPLICIT_DATASET_ID)
117+
self.assertEqual(_implicit_environ.get_default_dataset_id(),
118+
IMPLICIT_DATASET_ID)
114119

115120
def test_set_implicit_from_appengine(self):
116121
from gcloud.datastore import _implicit_environ
@@ -122,7 +127,8 @@ def test_set_implicit_from_appengine(self):
122127
with self._monkeyImplicit(app_identity=APP_IDENTITY):
123128
self._callFUT()
124129

125-
self.assertEqual(_implicit_environ.DATASET_ID, APP_ENGINE_ID)
130+
self.assertEqual(_implicit_environ.get_default_dataset_id(),
131+
APP_ENGINE_ID)
126132

127133
def test_set_implicit_both_env_and_appengine(self):
128134
from gcloud.datastore import _implicit_environ
@@ -134,7 +140,8 @@ def test_set_implicit_both_env_and_appengine(self):
134140
with self._monkeyImplicit(app_identity=APP_IDENTITY):
135141
self._callFUT()
136142

137-
self.assertEqual(_implicit_environ.DATASET_ID, IMPLICIT_DATASET_ID)
143+
self.assertEqual(_implicit_environ.get_default_dataset_id(),
144+
IMPLICIT_DATASET_ID)
138145

139146
def _implicit_compute_engine_helper(self, status):
140147
from gcloud.datastore import _implicit_environ
@@ -157,7 +164,8 @@ def _implicit_compute_engine_helper(self, status):
157164
else:
158165
self._callFUT()
159166

160-
self.assertEqual(_implicit_environ.DATASET_ID, EXPECTED_ID)
167+
self.assertEqual(_implicit_environ.get_default_dataset_id(),
168+
EXPECTED_ID)
161169
self.assertEqual(connection.host, '169.254.169.254')
162170
self.assertEqual(connection.timeout, 0.1)
163171
self.assertEqual(
@@ -192,7 +200,8 @@ def test_set_implicit_both_appengine_and_compute(self):
192200
app_identity=APP_IDENTITY):
193201
self._callFUT()
194202

195-
self.assertEqual(_implicit_environ.DATASET_ID, APP_ENGINE_ID)
203+
self.assertEqual(_implicit_environ.get_default_dataset_id(),
204+
APP_ENGINE_ID)
196205
self.assertEqual(connection.host, None)
197206
self.assertEqual(connection.timeout, None)
198207

@@ -208,7 +217,8 @@ def test_set_implicit_three_env_appengine_and_compute(self):
208217
app_identity=APP_IDENTITY):
209218
self._callFUT()
210219

211-
self.assertEqual(_implicit_environ.DATASET_ID, IMPLICIT_DATASET_ID)
220+
self.assertEqual(_implicit_environ.get_default_dataset_id(),
221+
IMPLICIT_DATASET_ID)
212222
self.assertEqual(connection.host, None)
213223
self.assertEqual(connection.timeout, None)
214224

@@ -217,12 +227,13 @@ class Test_set_default_connection(unittest2.TestCase):
217227

218228
def setUp(self):
219229
from gcloud.datastore import _implicit_environ
220-
self._replaced_connection = _implicit_environ.CONNECTION
221-
_implicit_environ.CONNECTION = None
230+
self._replaced_defaults = _implicit_environ._DEFAULTS
231+
_implicit_environ._DEFAULTS = _implicit_environ._DefaultsContainer(
232+
None, None)
222233

223234
def tearDown(self):
224235
from gcloud.datastore import _implicit_environ
225-
_implicit_environ.CONNECTION = self._replaced_connection
236+
_implicit_environ._DEFAULTS = self._replaced_defaults
226237

227238
def _callFUT(self, connection=None):
228239
from gcloud.datastore import set_default_connection
@@ -231,23 +242,23 @@ def _callFUT(self, connection=None):
231242
def test_set_explicit(self):
232243
from gcloud.datastore import _implicit_environ
233244

234-
self.assertEqual(_implicit_environ.CONNECTION, None)
245+
self.assertEqual(_implicit_environ.get_default_connection(), None)
235246
fake_cnxn = object()
236247
self._callFUT(connection=fake_cnxn)
237-
self.assertEqual(_implicit_environ.CONNECTION, fake_cnxn)
248+
self.assertEqual(_implicit_environ.get_default_connection(), fake_cnxn)
238249

239250
def test_set_implicit(self):
240251
from gcloud._testing import _Monkey
241252
from gcloud import datastore
242253
from gcloud.datastore import _implicit_environ
243254

244-
self.assertEqual(_implicit_environ.CONNECTION, None)
255+
self.assertEqual(_implicit_environ.get_default_connection(), None)
245256

246257
fake_cnxn = object()
247258
with _Monkey(datastore, get_connection=lambda: fake_cnxn):
248259
self._callFUT()
249260

250-
self.assertEqual(_implicit_environ.CONNECTION, fake_cnxn)
261+
self.assertEqual(_implicit_environ.get_default_connection(), fake_cnxn)
251262

252263

253264
class Test_set_defaults(unittest2.TestCase):

gcloud/datastore/test__implicit_environ.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ def test_preset(self):
2929
from gcloud.datastore import _implicit_environ
3030

3131
SENTINEL = object()
32-
with _Monkey(_implicit_environ, CONNECTION=SENTINEL):
32+
MOCK_DEFAULTS = _implicit_environ._DefaultsContainer(SENTINEL, None)
33+
with _Monkey(_implicit_environ, _DEFAULTS=MOCK_DEFAULTS):
3334
self.assertEqual(self._callFUT(), SENTINEL)
3435

3536

@@ -47,5 +48,6 @@ def test_preset(self):
4748
from gcloud.datastore import _implicit_environ
4849

4950
SENTINEL = object()
50-
with _Monkey(_implicit_environ, DATASET_ID=SENTINEL):
51+
MOCK_DEFAULTS = _implicit_environ._DefaultsContainer(None, SENTINEL)
52+
with _Monkey(_implicit_environ, _DEFAULTS=MOCK_DEFAULTS):
5153
self.assertEqual(self._callFUT(), SENTINEL)

gcloud/datastore/test_api.py

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ def _callFUT(self, passed=_MARKER, first_key=None):
2828
def _monkey(self, dataset_id):
2929
from gcloud.datastore import _implicit_environ
3030
from gcloud._testing import _Monkey
31-
return _Monkey(_implicit_environ, DATASET_ID=dataset_id)
31+
MOCK_DEFAULTS = _implicit_environ._DefaultsContainer(None, dataset_id)
32+
return _Monkey(_implicit_environ, _DEFAULTS=MOCK_DEFAULTS)
3233

3334
def test_implicit_unset_wo_keys(self):
3435
with self._monkey(None):
@@ -122,7 +123,8 @@ def _callFUT(self, passed=_MARKER):
122123
def _monkey(self, connection):
123124
from gcloud.datastore import _implicit_environ
124125
from gcloud._testing import _Monkey
125-
return _Monkey(_implicit_environ, CONNECTION=connection)
126+
MOCK_DEFAULTS = _implicit_environ._DefaultsContainer(connection, None)
127+
return _Monkey(_implicit_environ, _DEFAULTS=MOCK_DEFAULTS)
126128

127129
def test_implicit_unset(self):
128130
with self._monkey(None):
@@ -471,8 +473,9 @@ def test_implicit_wo_transaction(self):
471473
CUSTOM_CONNECTION = _Connection(entity_pb)
472474

473475
key = Key(KIND, ID, dataset_id=DATASET_ID)
474-
with _Monkey(_implicit_environ, CONNECTION=CUSTOM_CONNECTION,
475-
DATASET_ID=DATASET_ID):
476+
MOCK_DEFAULTS = _implicit_environ._DefaultsContainer(CUSTOM_CONNECTION,
477+
DATASET_ID)
478+
with _Monkey(_implicit_environ, _DEFAULTS=MOCK_DEFAULTS):
476479
result, = self._callFUT([key])
477480

478481
expected_called_with = {
@@ -577,7 +580,7 @@ def test_no_connection(self):
577580
entity = _Entity(foo=u'bar')
578581
entity.key = _Key(_DATASET)
579582

580-
self.assertEqual(_implicit_environ.CONNECTION, None)
583+
self.assertEqual(_implicit_environ.get_default_connection(), None)
581584
with self.assertRaises(EnvironmentError):
582585
self._callFUT([entity], dataset_id=_DATASET)
583586

@@ -593,7 +596,7 @@ def test_no_dataset_id(self):
593596
entity = _Entity(foo=u'bar')
594597
entity.key = _Key(_DATASET)
595598

596-
self.assertEqual(_implicit_environ.CONNECTION, None)
599+
self.assertEqual(_implicit_environ.get_default_connection(), None)
597600
result = self._callFUT([entity], connection=connection)
598601

599602
self.assertEqual(result, None)
@@ -610,7 +613,7 @@ def test_no_dataset_id(self):
610613
def test_no_entities(self):
611614
from gcloud.datastore import _implicit_environ
612615

613-
self.assertEqual(_implicit_environ.CONNECTION, None)
616+
self.assertEqual(_implicit_environ.get_default_connection(), None)
614617
result = self._callFUT([])
615618
self.assertEqual(result, None)
616619

@@ -677,7 +680,8 @@ def test_implicit_connection(self):
677680
entity = _Entity(foo=u'bar')
678681
key = entity.key = _Key(_DATASET)
679682

680-
with _Monkey(_implicit_environ, CONNECTION=connection):
683+
MOCK_DEFAULTS = _implicit_environ._DefaultsContainer(connection, None)
684+
with _Monkey(_implicit_environ, _DEFAULTS=MOCK_DEFAULTS):
681685
# Set up Batch on stack so we can check it is used.
682686
with _NoCommitBatch(_DATASET, connection) as CURR_BATCH:
683687
result = self._callFUT([entity])
@@ -708,7 +712,7 @@ def test_no_connection(self):
708712
_DATASET = 'DATASET'
709713
key = _Key(_DATASET)
710714

711-
self.assertEqual(_implicit_environ.CONNECTION, None)
715+
self.assertEqual(_implicit_environ.get_default_connection(), None)
712716
with self.assertRaises(EnvironmentError):
713717
self._callFUT([key], dataset_id=_DATASET)
714718

@@ -722,7 +726,7 @@ def test_no_dataset_id(self):
722726
connection = _Connection()
723727
key = _Key(_DATASET)
724728

725-
self.assertEqual(_implicit_environ.CONNECTION, None)
729+
self.assertEqual(_implicit_environ.get_default_connection(), None)
726730

727731
result = self._callFUT([key], connection=connection)
728732

@@ -735,7 +739,7 @@ def test_no_dataset_id(self):
735739
def test_no_keys(self):
736740
from gcloud.datastore import _implicit_environ
737741

738-
self.assertEqual(_implicit_environ.CONNECTION, None)
742+
self.assertEqual(_implicit_environ.get_default_connection(), None)
739743
result = self._callFUT([])
740744
self.assertEqual(result, None)
741745

@@ -768,9 +772,9 @@ def test_wo_batch_w_key_different_than_default_dataset_id(self):
768772
connection = _Connection()
769773
key = _Key(_DATASET)
770774

771-
with _Monkey(_implicit_environ,
772-
CONNECTION=connection,
773-
DATASET_ID=_DEFAULT_DATASET):
775+
MOCK_DEFAULTS = _implicit_environ._DefaultsContainer(connection,
776+
_DEFAULT_DATASET)
777+
with _Monkey(_implicit_environ, _DEFAULTS=MOCK_DEFAULTS):
774778
result = self._callFUT([key])
775779
self.assertEqual(result, None)
776780
self.assertEqual(len(connection._committed), 1)
@@ -831,9 +835,9 @@ def test_implicit_connection_and_dataset_id(self):
831835
connection = _Connection()
832836
key = _Key(_DATASET)
833837

834-
with _Monkey(_implicit_environ,
835-
CONNECTION=connection,
836-
DATASET_ID=_DATASET):
838+
MOCK_DEFAULTS = _implicit_environ._DefaultsContainer(connection,
839+
_DATASET)
840+
with _Monkey(_implicit_environ, _DEFAULTS=MOCK_DEFAULTS):
837841
# Set up Batch on stack so we can check it is used.
838842
with _NoCommitBatch(_DATASET, connection) as CURR_BATCH:
839843
result = self._callFUT([key])
@@ -878,8 +882,9 @@ def test_w_implicit_connection(self):
878882

879883
CUSTOM_CONNECTION = _Connection()
880884
NUM_IDS = 2
881-
with _Monkey(_implicit_environ, CONNECTION=CUSTOM_CONNECTION,
882-
DATASET_ID='DATASET'):
885+
MOCK_DEFAULTS = _implicit_environ._DefaultsContainer(CUSTOM_CONNECTION,
886+
'DATASET')
887+
with _Monkey(_implicit_environ, _DEFAULTS=MOCK_DEFAULTS):
883888
INCOMPLETE_KEY = Key('KIND')
884889
result = self._callFUT(INCOMPLETE_KEY, NUM_IDS)
885890

@@ -893,8 +898,9 @@ def test_with_already_completed_key(self):
893898
from gcloud._testing import _Monkey
894899

895900
CUSTOM_CONNECTION = _Connection()
896-
with _Monkey(_implicit_environ, CONNECTION=CUSTOM_CONNECTION,
897-
DATASET_ID='DATASET'):
901+
MOCK_DEFAULTS = _implicit_environ._DefaultsContainer(CUSTOM_CONNECTION,
902+
'DATASET')
903+
with _Monkey(_implicit_environ, _DEFAULTS=MOCK_DEFAULTS):
898904
COMPLETE_KEY = Key('KIND', 1234)
899905
self.assertRaises(ValueError, self._callFUT,
900906
COMPLETE_KEY, 2)

0 commit comments

Comments
 (0)