Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Making datastore client inherit from base class.
Browse files Browse the repository at this point in the history
This required lots of changes since the tests assume
a client only optionally has a connection attached.
dhermes committed Jun 26, 2015

Verified

This commit was signed with the committer’s verified signature.
snyk-bot Snyk bot
1 parent a65c4ab commit 793d7a8
Showing 2 changed files with 97 additions and 196 deletions.
26 changes: 19 additions & 7 deletions gcloud/datastore/client.py
Original file line number Diff line number Diff line change
@@ -13,19 +13,21 @@
# limitations under the License.
"""Convenience wrapper for invoking APIs/factories w/ a dataset ID."""

from gcloud.client import Client as BaseClient
from gcloud.datastore.api import delete
from gcloud.datastore.api import delete_multi
from gcloud.datastore.api import get
from gcloud.datastore.api import get_multi
from gcloud.datastore.api import put
from gcloud.datastore.api import put_multi
from gcloud.datastore.batch import Batch
from gcloud.datastore.connection import Connection
from gcloud.datastore.key import Key
from gcloud.datastore.query import Query
from gcloud.datastore.transaction import Transaction


class Client(object):
class Client(BaseClient):
"""Convenience wrapper for invoking APIs/factories w/ a dataset ID.
:type dataset_id: string
@@ -34,16 +36,26 @@ class Client(object):
:type namespace: string
:param namespace: (optional) namespace to pass to proxied API methods.
:type connection: :class:`gcloud.datastore.connection.Connection`, or None
:param connection: (optional) connection to pass to proxied API methods
:type credentials: :class:`oauth2client.client.OAuth2Credentials` or
:class:`NoneType`
:param credentials: The OAuth2 Credentials to use for the connection
owned by this client. If not passed (and if no ``http``
object is passed), falls back to the default inferred
from the environment.
:type http: :class:`httplib2.Http` or class that defines ``request()``.
:param http: An optional HTTP object to make requests. If not passed, an
``http`` object is created that is bound to the
``credentials`` for the current object.
"""

def __init__(self, dataset_id, namespace=None, connection=None):
if dataset_id is None:
raise ValueError('dataset_id required')
_connection_class = Connection

def __init__(self, dataset_id, namespace=None,
credentials=None, http=None):
self.dataset_id = dataset_id
self.namespace = namespace
self.connection = connection
super(Client, self).__init__(credentials=credentials, http=http)

def get(self, key, missing=None, deferred=None):
"""Proxy to :func:`gcloud.datastore.api.get`.
267 changes: 78 additions & 189 deletions gcloud/datastore/test_client.py
Original file line number Diff line number Diff line change
@@ -23,26 +23,27 @@ def _getTargetClass(self):
from gcloud.datastore.client import Client
return Client

def _makeOne(self, dataset_id=DATASET_ID, namespace=None, connection=None):
def _makeOne(self, dataset_id=DATASET_ID, namespace=None,
credentials=None, http=None):
return self._getTargetClass()(dataset_id, namespace=namespace,
connection=connection)
credentials=credentials, http=http)

def test_ctor_w_dataset_id_None(self):
self.assertRaises(ValueError, self._makeOne, None)

def test_ctor_w_dataset_id_no_connection(self):
client = self._makeOne()
def test_ctor_w_dataset_id(self):
credentials = _Credentials()
client = self._makeOne(credentials=credentials)
self.assertEqual(client.dataset_id, self.DATASET_ID)

def test_ctor_w_explicit_inputs(self):
conn = object()
from gcloud.datastore.connection import Connection
credentials = _Credentials()
namespace = object()
client = self._makeOne(namespace=namespace, connection=conn)
client = self._makeOne(namespace=namespace, credentials=credentials)
self.assertEqual(client.dataset_id, self.DATASET_ID)
self.assertTrue(client.connection is conn)
self.assertTrue(isinstance(client.connection, Connection))
self.assertTrue(client.connection.credentials is credentials)
self.assertTrue(client.namespace is namespace)

def test_get_defaults(self):
def test_get(self):
from gcloud.datastore import client as MUT
from gcloud._testing import _Monkey

@@ -51,7 +52,8 @@ def test_get_defaults(self):
def _get(*args, **kw):
_called_with.append((args, kw))

client = self._makeOne()
credentials = _Credentials()
client = self._makeOne(credentials=credentials)
key = object()

with _Monkey(MUT, get=_get):
@@ -60,32 +62,10 @@ def _get(*args, **kw):
self.assertEqual(_called_with[0][0], (key,))
self.assertTrue(_called_with[0][1]['missing'] is None)
self.assertTrue(_called_with[0][1]['deferred'] is None)
self.assertTrue(_called_with[0][1]['connection'] is None)
self.assertEqual(_called_with[0][1]['dataset_id'], self.DATASET_ID)

def test_get_explicit(self):
from gcloud.datastore import client as MUT
from gcloud._testing import _Monkey

_called_with = []

def _get(*args, **kw):
_called_with.append((args, kw))

conn = object()
client = self._makeOne(connection=conn)
key, missing, deferred = object(), [], []

with _Monkey(MUT, get=_get):
client.get(key, missing, deferred)

self.assertEqual(_called_with[0][0], (key,))
self.assertTrue(_called_with[0][1]['missing'] is missing)
self.assertTrue(_called_with[0][1]['deferred'] is deferred)
self.assertTrue(_called_with[0][1]['connection'] is conn)
self.assertTrue(_called_with[0][1]['connection'] is client.connection)
self.assertEqual(_called_with[0][1]['dataset_id'], self.DATASET_ID)

def test_get_multi_defaults(self):
def test_get_multi(self):
from gcloud.datastore import client as MUT
from gcloud._testing import _Monkey

@@ -94,7 +74,8 @@ def test_get_multi_defaults(self):
def _get_multi(*args, **kw):
_called_with.append((args, kw))

client = self._makeOne()
credentials = _Credentials()
client = self._makeOne(credentials=credentials)
key = object()

with _Monkey(MUT, get_multi=_get_multi):
@@ -103,32 +84,10 @@ def _get_multi(*args, **kw):
self.assertEqual(_called_with[0][0], ([key],))
self.assertTrue(_called_with[0][1]['missing'] is None)
self.assertTrue(_called_with[0][1]['deferred'] is None)
self.assertTrue(_called_with[0][1]['connection'] is None)
self.assertEqual(_called_with[0][1]['dataset_id'], self.DATASET_ID)

def test_get_multi_explicit(self):
from gcloud.datastore import client as MUT
from gcloud._testing import _Monkey

_called_with = []

def _get_multi(*args, **kw):
_called_with.append((args, kw))

conn = object()
client = self._makeOne(connection=conn)
key, missing, deferred = object(), [], []

with _Monkey(MUT, get_multi=_get_multi):
client.get_multi([key], missing, deferred)

self.assertEqual(_called_with[0][0], ([key],))
self.assertTrue(_called_with[0][1]['missing'] is missing)
self.assertTrue(_called_with[0][1]['deferred'] is deferred)
self.assertTrue(_called_with[0][1]['connection'] is conn)
self.assertTrue(_called_with[0][1]['connection'] is client.connection)
self.assertEqual(_called_with[0][1]['dataset_id'], self.DATASET_ID)

def test_put_wo_connection(self):
def test_put(self):
from gcloud.datastore import client as MUT
from gcloud._testing import _Monkey

@@ -137,36 +96,18 @@ def test_put_wo_connection(self):
def _put(*args, **kw):
_called_with.append((args, kw))

client = self._makeOne()
credentials = _Credentials()
client = self._makeOne(credentials=credentials)
entity = object()

with _Monkey(MUT, put=_put):
client.put(entity)

self.assertEqual(_called_with[0][0], (entity,))
self.assertTrue(_called_with[0][1]['connection'] is None)
self.assertEqual(_called_with[0][1]['dataset_id'], self.DATASET_ID)

def test_put_w_connection(self):
from gcloud.datastore import client as MUT
from gcloud._testing import _Monkey

_called_with = []

def _put(*args, **kw):
_called_with.append((args, kw))

entity, conn = object(), object()
client = self._makeOne(connection=conn)

with _Monkey(MUT, put=_put):
client.put(entity)

self.assertEqual(_called_with[0][0], (entity,))
self.assertTrue(_called_with[0][1]['connection'] is conn)
self.assertTrue(_called_with[0][1]['connection'] is client.connection)
self.assertEqual(_called_with[0][1]['dataset_id'], self.DATASET_ID)

def test_put_multi_wo_connection(self):
def test_put_multi(self):
from gcloud.datastore import client as MUT
from gcloud._testing import _Monkey

@@ -175,36 +116,18 @@ def test_put_multi_wo_connection(self):
def _put_multi(*args, **kw):
_called_with.append((args, kw))

client = self._makeOne()
credentials = _Credentials()
client = self._makeOne(credentials=credentials)
entity = object()

with _Monkey(MUT, put_multi=_put_multi):
client.put_multi([entity])

self.assertEqual(_called_with[0][0], ([entity],))
self.assertTrue(_called_with[0][1]['connection'] is None)
self.assertEqual(_called_with[0][1]['dataset_id'], self.DATASET_ID)

def test_put_multi_w_connection(self):
from gcloud.datastore import client as MUT
from gcloud._testing import _Monkey

_called_with = []

def _put_multi(*args, **kw):
_called_with.append((args, kw))

entity, conn = object(), object()
client = self._makeOne(connection=conn)

with _Monkey(MUT, put_multi=_put_multi):
client.put_multi([entity])

self.assertEqual(_called_with[0][0], ([entity],))
self.assertTrue(_called_with[0][1]['connection'] is conn)
self.assertTrue(_called_with[0][1]['connection'] is client.connection)
self.assertEqual(_called_with[0][1]['dataset_id'], self.DATASET_ID)

def test_delete_wo_connection(self):
def test_delete(self):
from gcloud.datastore import client as MUT
from gcloud._testing import _Monkey

@@ -213,35 +136,18 @@ def test_delete_wo_connection(self):
def _delete(*args, **kw):
_called_with.append((args, kw))

client = self._makeOne()
credentials = _Credentials()
client = self._makeOne(credentials=credentials)
key = object()

with _Monkey(MUT, delete=_delete):
client.delete(key)

self.assertEqual(_called_with[0][0], (key,))
self.assertTrue(_called_with[0][1]['connection'] is None)
self.assertEqual(_called_with[0][1]['dataset_id'], self.DATASET_ID)

def test_delete_w_connection(self):
from gcloud.datastore import client as MUT
from gcloud._testing import _Monkey

_called_with = []

def _delete(*args, **kw):
_called_with.append((args, kw))

key, conn = object(), object()
client = self._makeOne(connection=conn)
with _Monkey(MUT, delete=_delete):
client.delete(key)

self.assertEqual(_called_with[0][0], (key,))
self.assertTrue(_called_with[0][1]['connection'] is conn)
self.assertTrue(_called_with[0][1]['connection'] is client.connection)
self.assertEqual(_called_with[0][1]['dataset_id'], self.DATASET_ID)

def test_delete_multi_wo_connection(self):
def test_delete_multi(self):
from gcloud.datastore import client as MUT
from gcloud._testing import _Monkey

@@ -250,38 +156,22 @@ def test_delete_multi_wo_connection(self):
def _delete_multi(*args, **kw):
_called_with.append((args, kw))

client = self._makeOne()
credentials = _Credentials()
client = self._makeOne(credentials=credentials)
key = object()

with _Monkey(MUT, delete_multi=_delete_multi):
client.delete_multi([key])

self.assertEqual(_called_with[0][0], ([key],))
self.assertTrue(_called_with[0][1]['connection'] is None)
self.assertEqual(_called_with[0][1]['dataset_id'], self.DATASET_ID)

def test_delete_multi_w_connection(self):
from gcloud.datastore import client as MUT
from gcloud._testing import _Monkey

_called_with = []

def _delete_multi(*args, **kw):
_called_with.append((args, kw))

key, conn = object(), object()
client = self._makeOne(connection=conn)
with _Monkey(MUT, delete_multi=_delete_multi):
client.delete_multi([key])

self.assertEqual(_called_with[0][0], ([key],))
self.assertTrue(_called_with[0][1]['connection'] is conn)
self.assertTrue(_called_with[0][1]['connection'] is client.connection)
self.assertEqual(_called_with[0][1]['dataset_id'], self.DATASET_ID)

def test_key_w_dataset_id(self):
KIND = 'KIND'
ID = 1234
client = self._makeOne()
credentials = _Credentials()
client = self._makeOne(credentials=credentials)
self.assertRaises(TypeError,
client.key, KIND, ID, dataset_id=self.DATASET_ID)

@@ -290,7 +180,8 @@ def test_key_wo_dataset_id(self):
from gcloud._testing import _Monkey
KIND = 'KIND'
ID = 1234
client = self._makeOne()
credentials = _Credentials()
client = self._makeOne(credentials=credentials)

with _Monkey(MUT, Key=_Dummy):
key = client.key(KIND, ID)
@@ -310,7 +201,8 @@ def test_key_w_namespace(self):
KIND = 'KIND'
ID = 1234
NAMESPACE = object()
client = self._makeOne(namespace=NAMESPACE)
credentials = _Credentials()
client = self._makeOne(namespace=NAMESPACE, credentials=credentials)
with _Monkey(MUT, Key=_Dummy):
key = client.key(KIND, ID)

@@ -329,7 +221,8 @@ def test_key_w_namespace_collision(self):
ID = 1234
NAMESPACE1 = object()
NAMESPACE2 = object()
client = self._makeOne(namespace=NAMESPACE1)
credentials = _Credentials()
client = self._makeOne(namespace=NAMESPACE1, credentials=credentials)
with _Monkey(MUT, Key=_Dummy):
key = client.key(KIND, ID, namespace=NAMESPACE2)

@@ -340,51 +233,29 @@ def test_key_w_namespace_collision(self):
}
self.assertEqual(key.kwargs, expected_kwargs)

def test_batch_wo_connection(self):
from gcloud.datastore import client as MUT
from gcloud._testing import _Monkey
client = self._makeOne()

with _Monkey(MUT, Batch=_Dummy):
batch = client.batch()

self.assertTrue(isinstance(batch, _Dummy))
self.assertEqual(batch.args, ())
self.assertEqual(batch.kwargs,
{'dataset_id': self.DATASET_ID, 'connection': None})

def test_batch_w_connection(self):
def test_batch(self):
from gcloud.datastore import client as MUT
from gcloud._testing import _Monkey
conn = object()
client = self._makeOne(connection=conn)
credentials = _Credentials()
client = self._makeOne(credentials=credentials)

with _Monkey(MUT, Batch=_Dummy):
batch = client.batch()

self.assertTrue(isinstance(batch, _Dummy))
self.assertEqual(batch.args, ())
self.assertEqual(batch.kwargs,
{'dataset_id': self.DATASET_ID, 'connection': conn})
expected_kwargs = {
'dataset_id': self.DATASET_ID,
'connection': client.connection,
}
self.assertEqual(batch.kwargs, expected_kwargs)

def test_transaction_wo_connection(self):
def test_transaction(self):
from gcloud.datastore import client as MUT
from gcloud._testing import _Monkey
client = self._makeOne()

with _Monkey(MUT, Transaction=_Dummy):
xact = client.transaction()

self.assertTrue(isinstance(xact, _Dummy))
self.assertEqual(xact.args, ())
self.assertEqual(xact.kwargs,
{'dataset_id': self.DATASET_ID, 'connection': None})

def test_transaction_w_connection(self):
from gcloud.datastore import client as MUT
from gcloud._testing import _Monkey
conn = object()
client = self._makeOne(connection=conn)
credentials = _Credentials()
client = self._makeOne(credentials=credentials)

with _Monkey(MUT, Transaction=_Dummy):
xact = client.transaction()
@@ -393,20 +264,22 @@ def test_transaction_w_connection(self):
self.assertEqual(xact.args, ())
expected_kwargs = {
'dataset_id': self.DATASET_ID,
'connection': conn,
'connection': client.connection,
}
self.assertEqual(xact.kwargs, expected_kwargs)

def test_query_w_dataset_id(self):
KIND = 'KIND'
client = self._makeOne()
credentials = _Credentials()
client = self._makeOne(credentials=credentials)
self.assertRaises(TypeError,
client.query, kind=KIND, dataset_id=self.DATASET_ID)

def test_query_w_defaults(self):
from gcloud.datastore import client as MUT
from gcloud._testing import _Monkey
client = self._makeOne()
credentials = _Credentials()
client = self._makeOne(credentials=credentials)

with _Monkey(MUT, Query=_Dummy):
query = client.query()
@@ -429,7 +302,8 @@ def test_query_explicit(self):
PROJECTION = ['__key__']
ORDER = ['PROPERTY']
GROUP_BY = ['GROUPBY']
client = self._makeOne()
credentials = _Credentials()
client = self._makeOne(credentials=credentials)

with _Monkey(MUT, Query=_Dummy):
query = client.query(
@@ -462,7 +336,8 @@ def test_query_w_namespace(self):

KIND = 'KIND'
NAMESPACE = object()
client = self._makeOne(namespace=NAMESPACE)
credentials = _Credentials()
client = self._makeOne(namespace=NAMESPACE, credentials=credentials)
with _Monkey(MUT, Query=_Dummy):
query = client.query(kind=KIND)

@@ -482,7 +357,8 @@ def test_query_w_namespace_collision(self):
KIND = 'KIND'
NAMESPACE1 = object()
NAMESPACE2 = object()
client = self._makeOne(namespace=NAMESPACE1)
credentials = _Credentials()
client = self._makeOne(namespace=NAMESPACE1, credentials=credentials)
with _Monkey(MUT, Query=_Dummy):
query = client.query(kind=KIND, namespace=NAMESPACE2)

@@ -501,3 +377,16 @@ class _Dummy(object):
def __init__(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs


class _Credentials(object):

_scopes = None

@staticmethod
def create_scoped_required():
return True

def create_scoped(self, scope):
self._scopes = scope
return self

0 comments on commit 793d7a8

Please sign in to comment.