Skip to content

Commit 662ad4a

Browse files
committed
Adding lazy loading property for dataset ID in Environment.
1 parent 83e3d9f commit 662ad4a

File tree

2 files changed

+72
-5
lines changed

2 files changed

+72
-5
lines changed

gcloud/datastore/_implicit_environ.py

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,31 @@
3232
_DATASET_ENV_VAR_NAME = 'GCLOUD_DATASET_ID'
3333

3434

35+
class _DatasetIDProperty(object):
36+
"""Descriptor for lazy loaded dataset ID."""
37+
38+
def __get__(self, obj, objtype):
39+
if obj is None or objtype is not Environment:
40+
return self
41+
42+
obj.dataset_id = get_default_dataset_id()
43+
return obj.dataset_id
44+
45+
3546
class Environment(object):
36-
"""Container for environment settings."""
47+
"""Container for environment settings.
48+
49+
:type dataset_id: string
50+
:param dataset_id: Persistent implied dataset ID from environment.
51+
52+
:type connection: :class:`gcloud.datastore.connection.Connection`
53+
:param connection: Persistent implied connection from environment.
54+
"""
3755

38-
dataset_id = None
39-
"""Attribute to allow persistent implied dataset ID from environment."""
56+
dataset_id = _DatasetIDProperty()
4057

41-
connection = None
42-
"""Attribute to allow persistent implied connection from environment."""
58+
def __init__(self):
59+
self.connection = None
4360

4461

4562
def app_engine_id():

gcloud/datastore/test__implicit_environ.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,56 @@ def test_set_implicit_three_env_appengine_and_compute(self):
213213
self.assertEqual(connection.timeout, None)
214214

215215

216+
class Test_lazy_loaded_dataset_id(unittest2.TestCase):
217+
218+
def setUp(self):
219+
from gcloud.datastore import _implicit_environ
220+
self._replaced_default = _implicit_environ.DEFAULT_ENVIRON
221+
_implicit_environ.DEFAULT_ENVIRON = _implicit_environ.Environment()
222+
223+
def tearDown(self):
224+
from gcloud.datastore import _implicit_environ
225+
_implicit_environ.DEFAULT_ENVIRON = self._replaced_default
226+
227+
def test_prop_default(self):
228+
from gcloud.datastore import _implicit_environ
229+
from gcloud.datastore._implicit_environ import Environment
230+
231+
self.assertTrue(isinstance(Environment.dataset_id,
232+
_implicit_environ._DatasetIDProperty))
233+
self.assertEqual(_implicit_environ.DEFAULT_ENVIRON.dataset_id, None)
234+
235+
def test_prop_on_wrong_class(self):
236+
from gcloud.datastore import _implicit_environ
237+
238+
data_prop = _implicit_environ._DatasetIDProperty()
239+
240+
class FakeEnv(object):
241+
dataset_id = data_prop
242+
243+
self.assertTrue(FakeEnv.dataset_id is data_prop)
244+
self.assertTrue(FakeEnv().dataset_id is data_prop)
245+
246+
def test_prop_descriptor(self):
247+
from gcloud._testing import _Monkey
248+
from gcloud.datastore import _implicit_environ
249+
250+
self.assertFalse(
251+
'dataset_id' in _implicit_environ.DEFAULT_ENVIRON.__dict__)
252+
253+
DEFAULT = object()
254+
255+
def mock_default():
256+
return DEFAULT
257+
258+
with _Monkey(_implicit_environ, get_default_dataset_id=mock_default):
259+
lazy_loaded = _implicit_environ.DEFAULT_ENVIRON.dataset_id
260+
261+
self.assertEqual(lazy_loaded, DEFAULT)
262+
self.assertTrue(
263+
'dataset_id' in _implicit_environ.DEFAULT_ENVIRON.__dict__)
264+
265+
216266
class _AppIdentity(object):
217267

218268
def __init__(self, app_id):

0 commit comments

Comments
 (0)