From 189212db5914ad72a516e6a0cf9e37db000b0aa1 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Thu, 1 Oct 2015 11:24:42 -0400 Subject: [PATCH 1/5] Add search connection. --- gcloud/search/__init__.py | 21 +++++++++++++++ gcloud/search/connection.py | 33 +++++++++++++++++++++++ gcloud/search/test_connection.py | 46 ++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 gcloud/search/__init__.py create mode 100644 gcloud/search/connection.py create mode 100644 gcloud/search/test_connection.py diff --git a/gcloud/search/__init__.py b/gcloud/search/__init__.py new file mode 100644 index 000000000000..066fa972af4c --- /dev/null +++ b/gcloud/search/__init__.py @@ -0,0 +1,21 @@ +# Copyright 2015 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Google Cloud Search API wrapper. +""" + +from gcloud.search.connection import Connection + + +SCOPE = Connection.SCOPE diff --git a/gcloud/search/connection.py b/gcloud/search/connection.py new file mode 100644 index 000000000000..b989a295755d --- /dev/null +++ b/gcloud/search/connection.py @@ -0,0 +1,33 @@ +# Copyright 2015 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Create / interact with gcloud search connections.""" + +from gcloud import connection as base_connection + + +class Connection(base_connection.JSONConnection): + """A connection to Google Cloud Search via the JSON REST API.""" + + API_BASE_URL = 'https://cloudsearch.googleapis.com' + """The base of the API call URL.""" + + API_VERSION = 'v1' + """The version of the API, used in building the API call's URL.""" + + API_URL_TEMPLATE = '{api_base_url}/{api_version}{path}' + """A template for the URL of a particular API call.""" + + SCOPE = ('https://www.googleapis.com/auth/ndev.cloudsearch',) + """The scopes required for authenticating as a Cloud Search consumer.""" diff --git a/gcloud/search/test_connection.py b/gcloud/search/test_connection.py new file mode 100644 index 000000000000..5b41154e7073 --- /dev/null +++ b/gcloud/search/test_connection.py @@ -0,0 +1,46 @@ +# Copyright 2015 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest2 + + +class TestConnection(unittest2.TestCase): + + def _getTargetClass(self): + from gcloud.search.connection import Connection + return Connection + + def _makeOne(self, *args, **kw): + return self._getTargetClass()(*args, **kw) + + def test_build_api_url_no_extra_query_params(self): + conn = self._makeOne() + URI = '/'.join([ + conn.API_BASE_URL, + conn.API_VERSION, + 'foo', + ]) + self.assertEqual(conn.build_api_url('/foo'), URI) + + def test_build_api_url_w_extra_query_params(self): + from six.moves.urllib.parse import parse_qsl + from six.moves.urllib.parse import urlsplit + conn = self._makeOne() + uri = conn.build_api_url('/foo', {'bar': 'baz'}) + scheme, netloc, path, qs, _ = urlsplit(uri) + self.assertEqual('%s://%s' % (scheme, netloc), conn.API_BASE_URL) + self.assertEqual(path, + '/'.join(['', conn.API_VERSION, 'foo'])) + parms = dict(parse_qsl(qs)) + self.assertEqual(parms['bar'], 'baz') From 47264a07dfd5d34b04fd4e3596bf85564faeab93 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Thu, 1 Oct 2015 11:28:15 -0400 Subject: [PATCH 2/5] Add search client. --- gcloud/search/__init__.py | 1 + gcloud/search/client.py | 43 ++++++++++++++++++++++++++++++++ gcloud/search/test_client.py | 48 ++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 gcloud/search/client.py create mode 100644 gcloud/search/test_client.py diff --git a/gcloud/search/__init__.py b/gcloud/search/__init__.py index 066fa972af4c..df5b3d6ee5b6 100644 --- a/gcloud/search/__init__.py +++ b/gcloud/search/__init__.py @@ -15,6 +15,7 @@ """Google Cloud Search API wrapper. """ +from gcloud.search.client import Client from gcloud.search.connection import Connection diff --git a/gcloud/search/client.py b/gcloud/search/client.py new file mode 100644 index 000000000000..576b48eb3de1 --- /dev/null +++ b/gcloud/search/client.py @@ -0,0 +1,43 @@ +# Copyright 2015 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""gcloud dns client for interacting with API.""" + + +from gcloud.client import JSONClient +from gcloud.search.connection import Connection + + +class Client(JSONClient): + """Client to bundle configuration needed for API requests. + + :type project: string + :param project: the project which the client acts on behalf of. Will be + passed when creating a zone. If not passed, + falls back to the default inferred from the environment. + + :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. + """ + + _connection_class = Connection diff --git a/gcloud/search/test_client.py b/gcloud/search/test_client.py new file mode 100644 index 000000000000..e128eb128f75 --- /dev/null +++ b/gcloud/search/test_client.py @@ -0,0 +1,48 @@ +# Copyright 2015 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest2 + + +class TestClient(unittest2.TestCase): + + def _getTargetClass(self): + from gcloud.search.client import Client + return Client + + def _makeOne(self, *args, **kw): + return self._getTargetClass()(*args, **kw) + + def test_ctor(self): + from gcloud.search.connection import Connection + PROJECT = 'PROJECT' + creds = _Credentials() + http = object() + client = self._makeOne(project=PROJECT, credentials=creds, http=http) + self.assertTrue(isinstance(client.connection, Connection)) + self.assertTrue(client.connection.credentials is creds) + self.assertTrue(client.connection.http is http) + + +class _Credentials(object): + + _scopes = None + + @staticmethod + def create_scoped_required(): + return True + + def create_scoped(self, scope): + self._scopes = scope + return self From dad3221ed63e24377621c4884f1c0cf7fa58feb6 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Thu, 1 Oct 2015 13:42:37 -0400 Subject: [PATCH 3/5] One-line docstring. --- gcloud/search/__init__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gcloud/search/__init__.py b/gcloud/search/__init__.py index df5b3d6ee5b6..97ffb55ad822 100644 --- a/gcloud/search/__init__.py +++ b/gcloud/search/__init__.py @@ -12,8 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Google Cloud Search API wrapper. -""" +"""Google Cloud Search API wrapper.""" from gcloud.search.client import Client from gcloud.search.connection import Connection From f4d3fb6b1ba40449e1a567551338caf98b5f230d Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Mon, 5 Oct 2015 14:31:05 -0400 Subject: [PATCH 4/5] Fix copy-pasta: 'dns' -> 'search'. --- gcloud/search/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcloud/search/client.py b/gcloud/search/client.py index 576b48eb3de1..f32f0095057e 100644 --- a/gcloud/search/client.py +++ b/gcloud/search/client.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""gcloud dns client for interacting with API.""" +"""gcloud search client for interacting with API.""" from gcloud.client import JSONClient From 8d86dbf35719e0625f8748c97e97c519271790ce Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Tue, 6 Oct 2015 00:23:12 -0400 Subject: [PATCH 5/5] Sync module docstring with #1172. Addresses: https://github.com/GoogleCloudPlatform/gcloud-python/pull/1164#discussion_r41217883 --- gcloud/search/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcloud/search/client.py b/gcloud/search/client.py index f32f0095057e..30a598d3c5a6 100644 --- a/gcloud/search/client.py +++ b/gcloud/search/client.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""gcloud search client for interacting with API.""" +"""Client for interacting with the Google Cloud search API.""" from gcloud.client import JSONClient