Skip to content

Commit 7cd77f2

Browse files
committed
Making cached dataset ID require explicit interaction.
Incorporates feedback from @tseaver. Also - Fixing bad tests that accidentally leave side-effects. - Making the method to set the default dataset public.
1 parent d85d200 commit 7cd77f2

File tree

6 files changed

+60
-66
lines changed

6 files changed

+60
-66
lines changed

gcloud/datastore/__init__.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,26 @@
5858
_DATASET_ENV_VAR_NAME = 'GCLOUD_DATASET_ID'
5959

6060

61-
def _set_dataset_from_environ():
61+
def set_default_dataset(dataset_id=None):
6262
"""Determines auth settings from local enviroment.
6363
64-
Currently only supports enviroment variable but will implicitly
65-
support App Engine, Compute Engine and other environments in
66-
the future.
64+
Sets a default dataset either explicitly or via the local
65+
enviroment. Currently only supports enviroment variable but will
66+
implicitly support App Engine, Compute Engine and other environments
67+
in the future.
6768
6869
Local environment variable used is:
6970
- GCLOUD_DATASET_ID
71+
72+
:type dataset_id: :class:`str`.
73+
:param dataset_id: Optional. The dataset ID to use for the default
74+
dataset.
7075
"""
71-
local_dataset_id = os.getenv(_DATASET_ENV_VAR_NAME)
72-
if local_dataset_id is not None:
73-
_implicit_environ.DATASET = get_dataset(local_dataset_id)
76+
if dataset_id is None:
77+
dataset_id = os.getenv(_DATASET_ENV_VAR_NAME)
78+
79+
if dataset_id is not None:
80+
_implicit_environ.DATASET = get_dataset(dataset_id)
7481

7582

7683
def get_connection():
@@ -127,7 +134,7 @@ def _require_dataset():
127134
:raises: :class:`EnvironmentError` if DATASET is not set.
128135
"""
129136
if _implicit_environ.DATASET is None:
130-
raise EnvironmentError('Dataset could not be implied.')
137+
raise EnvironmentError('Dataset could not be inferred.')
131138
return _implicit_environ.DATASET
132139

133140

@@ -168,7 +175,3 @@ def allocate_ids(incomplete_key, num_ids):
168175
:return: The (complete) keys allocated with `incomplete_key` as root.
169176
"""
170177
return _require_dataset().allocate_ids(incomplete_key, num_ids)
171-
172-
173-
# Set DATASET if it can be implied from the environment.
174-
_set_dataset_from_environ()

gcloud/datastore/entity.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ class Entity(dict):
9696

9797
def __init__(self, dataset=None, kind=None, exclude_from_indexes=()):
9898
super(Entity, self).__init__()
99-
# Does not inherit from object, so we don't use
99+
# Does not inherit directly from object, so we don't use
100100
# _implicit_environ._DatastoreBase to avoid split MRO.
101101
self._dataset = dataset or _implicit_environ.DATASET
102102
if kind:

gcloud/datastore/test___init__.py

Lines changed: 21 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,22 @@ def test_it(self):
3535
self.assertTrue(client._get_app_default_called)
3636

3737

38-
class Test__set_dataset_from_environ(unittest2.TestCase):
38+
class Test_set_default_dataset(unittest2.TestCase):
3939

40-
def _callFUT(self):
41-
from gcloud.datastore import _set_dataset_from_environ
42-
return _set_dataset_from_environ()
40+
def setUp(self):
41+
from gcloud.datastore import _implicit_environ
42+
self._replaced_dataset = _implicit_environ.DATASET
43+
_implicit_environ.DATASET = None
44+
45+
def tearDown(self):
46+
from gcloud.datastore import _implicit_environ
47+
_implicit_environ.DATASET = self._replaced_dataset
4348

44-
def _test_with_environ(self, environ, expected_result):
49+
def _callFUT(self, dataset_id=None):
50+
from gcloud.datastore import set_default_dataset
51+
return set_default_dataset(dataset_id=dataset_id)
52+
53+
def _test_with_environ(self, environ, expected_result, dataset_id=None):
4554
import os
4655
from gcloud._testing import _Monkey
4756
from gcloud import datastore
@@ -53,12 +62,12 @@ def _test_with_environ(self, environ, expected_result):
5362
def custom_getenv(key):
5463
return environ.get(key)
5564

56-
def custom_get_dataset(dataset_id):
57-
return dataset_id
65+
def custom_get_dataset(local_dataset_id):
66+
return local_dataset_id
5867

5968
with _Monkey(os, getenv=custom_getenv):
6069
with _Monkey(datastore, get_dataset=custom_get_dataset):
61-
self._callFUT()
70+
self._callFUT(dataset_id=dataset_id)
6271

6372
self.assertEqual(_implicit_environ.DATASET, expected_result)
6473

@@ -75,6 +84,10 @@ def test_set_from_env_var(self):
7584
def test_no_env_var_set(self):
7685
self._test_with_environ({}, None)
7786

87+
def test_set_explicit(self):
88+
DATASET_ID = 'DATASET'
89+
self._test_with_environ({}, DATASET_ID, dataset_id=DATASET_ID)
90+
7891

7992
class Test_get_dataset(unittest2.TestCase):
8093

@@ -161,40 +174,3 @@ def test_allocate_ids(self):
161174

162175
# Check the IDs returned.
163176
self.assertEqual([key.id() for key in result], range(1, NUM_IDS + 1))
164-
165-
def test_set_DATASET(self):
166-
import os
167-
from gcloud._testing import _Monkey
168-
from gcloud.test_credentials import _Client
169-
from gcloud import credentials
170-
from gcloud.datastore import _implicit_environ
171-
172-
# Make custom client for doing auth. Have to fake auth since we
173-
# can't monkey patch `datastore.get_dataset` while reloading the
174-
# `datastore.__init__` module.
175-
client = _Client()
176-
177-
# Fake auth variables.
178-
DATASET = 'dataset'
179-
180-
# Make a custom getenv function to Monkey.
181-
VALUES = {
182-
'GCLOUD_DATASET_ID': DATASET,
183-
}
184-
185-
def custom_getenv(key):
186-
return VALUES.get(key)
187-
188-
# Perform the import again with our test patches.
189-
with _Monkey(credentials, client=client):
190-
with _Monkey(os, getenv=custom_getenv):
191-
import gcloud.datastore
192-
reload(gcloud.datastore)
193-
194-
# Check that the DATASET was correctly implied from the environ.
195-
implicit_dataset = _implicit_environ.DATASET
196-
self.assertEqual(implicit_dataset.id(), DATASET)
197-
# Check that the credentials on the implicit DATASET was set on the
198-
# fake client.
199-
cnxn_credentials = implicit_dataset.connection().credentials
200-
self.assertTrue(cnxn_credentials is client._signed)

gcloud/datastore/test_helpers.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,18 @@ class Test_entity_from_protobuf(unittest2.TestCase):
1919

2020
_MARKER = object()
2121

22-
def _callFUT(self, val, dataset=_MARKER):
22+
def setUp(self):
2323
from gcloud.datastore import _implicit_environ
24-
from gcloud.datastore.helpers import entity_from_protobuf
25-
24+
self._replaced_dataset = _implicit_environ.DATASET
2625
_implicit_environ.DATASET = None
2726

27+
def tearDown(self):
28+
from gcloud.datastore import _implicit_environ
29+
_implicit_environ.DATASET = self._replaced_dataset
30+
31+
def _callFUT(self, val, dataset=_MARKER):
32+
from gcloud.datastore.helpers import entity_from_protobuf
33+
2834
if dataset is self._MARKER:
2935
return entity_from_protobuf(val)
3036

gcloud/datastore/test_query.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,17 @@
1717

1818
class TestQuery(unittest2.TestCase):
1919

20-
def _getTargetClass(self):
20+
def setUp(self):
2121
from gcloud.datastore import _implicit_environ
22-
from gcloud.datastore.query import Query
23-
22+
self._replaced_dataset = _implicit_environ.DATASET
2423
_implicit_environ.DATASET = None
24+
25+
def tearDown(self):
26+
from gcloud.datastore import _implicit_environ
27+
_implicit_environ.DATASET = self._replaced_dataset
28+
29+
def _getTargetClass(self):
30+
from gcloud.datastore.query import Query
2531
return Query
2632

2733
def _makeOne(self, kind=None, dataset=None, namespace=None):

regression/datastore.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,20 @@
1313
# limitations under the License.
1414

1515
import datetime
16+
import os
1617
import pytz
1718
import unittest2
1819

1920
from gcloud import datastore
20-
datastore._DATASET_ENV_VAR_NAME = 'GCLOUD_TESTS_DATASET_ID'
21-
datastore._set_dataset_from_environ()
2221
# This assumes the command is being run via tox hence the
2322
# repository root is the current directory.
2423
from regression import populate_datastore
2524

2625

26+
DATASET_ID = os.getenv('GCLOUD_TESTS_DATASET_ID')
27+
datastore.set_default_dataset(dataset_id=DATASET_ID)
28+
29+
2730
class TestDatastore(unittest2.TestCase):
2831

2932
def setUp(self):

0 commit comments

Comments
 (0)