Remove additional packages (#154)
diff --git a/additional_packages/README.md b/additional_packages/README.md
deleted file mode 100644
index 827c548..0000000
--- a/additional_packages/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# Additional packages for Google Auth Library Python
-
-This folder contains seperately distributed auxilliary packages for use
-with google-auth.
diff --git a/additional_packages/google_auth_httplib2/.coveragerc b/additional_packages/google_auth_httplib2/.coveragerc
deleted file mode 100644
index c44dd8e..0000000
--- a/additional_packages/google_auth_httplib2/.coveragerc
+++ /dev/null
@@ -1,13 +0,0 @@
-[run]
-branch = True
-
-[report]
-omit =
- */conftest.py
-exclude_lines =
- # Re-enable the standard pragma
- pragma: NO COVER
- # Ignore debug-only repr
- def __repr__
- # Don't complain if tests don't hit defensive assertion code:
- raise NotImplementedError
diff --git a/additional_packages/google_auth_httplib2/LICENSE b/additional_packages/google_auth_httplib2/LICENSE
deleted file mode 100644
index 261eeb9..0000000
--- a/additional_packages/google_auth_httplib2/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- 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.
diff --git a/additional_packages/google_auth_httplib2/MANIFEST.in b/additional_packages/google_auth_httplib2/MANIFEST.in
deleted file mode 100644
index aac7fe1..0000000
--- a/additional_packages/google_auth_httplib2/MANIFEST.in
+++ /dev/null
@@ -1,2 +0,0 @@
-include README.rst LICENSE
-recursive-include tests *
diff --git a/additional_packages/google_auth_httplib2/README.rst b/additional_packages/google_auth_httplib2/README.rst
deleted file mode 100644
index 15477d0..0000000
--- a/additional_packages/google_auth_httplib2/README.rst
+++ /dev/null
@@ -1,33 +0,0 @@
-Httplib2 Transport for Google Auth
-==================================
-
-|pypi|
-
-This library provides an `httplib2`_ transport for `google-auth`_.
-
-.. note:: ``httplib`` has lots of problems such as lack of threadsafety and
- and insecure usage of TLS. Using it is highly discouraged. This
- library is intended to help existing users of ``oauth2client`` migrate to
- ``google-auth``.
-
-.. |pypi| image:: https://img.shields.io/pypi/v/google-auth-httplib2.svg
- :target: https://pypi.python.org/pypi/google-auth-httplib2
-
-.. _httplib2: https://github.com/httplib2/httplib2
-.. _google-auth: https://github.com/GoogleCloudPlatform/google-auth
-
-Installing
-----------
-
-You can install using `pip`_::
-
- $ pip install google-auth-httplib2
-
-.. _pip: https://pip.pypa.io/en/stable/
-
-License
--------
-
-Apache 2.0 - See `the LICENSE`_ for more information.
-
-.. _the LICENSE: https://github.com/GoogleCloudPlatform/google-auth-library-python/blob/master/LICENSE
diff --git a/additional_packages/google_auth_httplib2/google_auth_httplib2.py b/additional_packages/google_auth_httplib2/google_auth_httplib2.py
deleted file mode 100644
index 866841b..0000000
--- a/additional_packages/google_auth_httplib2/google_auth_httplib2.py
+++ /dev/null
@@ -1,235 +0,0 @@
-# Copyright 2016 Google Inc.
-#
-# 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.
-
-"""Transport adapter for httplib2."""
-
-from __future__ import absolute_import
-
-import logging
-
-from google.auth import exceptions
-from google.auth import transport
-import httplib2
-
-
-_LOGGER = logging.getLogger(__name__)
-# Properties present in file-like streams / buffers.
-_STREAM_PROPERTIES = ('read', 'seek', 'tell')
-
-
-class _Response(transport.Response):
- """httplib2 transport response adapter.
-
- Args:
- response (httplib2.Response): The raw httplib2 response.
- data (bytes): The response body.
- """
- def __init__(self, response, data):
- self._response = response
- self._data = data
-
- @property
- def status(self):
- """int: The HTTP status code."""
- return self._response.status
-
- @property
- def headers(self):
- """Mapping[str, str]: The HTTP response headers."""
- return dict(self._response)
-
- @property
- def data(self):
- """bytes: The response body."""
- return self._data
-
-
-class Request(transport.Request):
- """httplib2 request adapter.
-
- This class is used internally for making requests using various transports
- in a consistent way. If you use :class:`AuthorizedHttp` you do not need
- to construct or use this class directly.
-
- This class can be useful if you want to manually refresh a
- :class:`~google.auth.credentials.Credentials` instance::
-
- import google.auth.transport.httplib2
- import httplib2
-
- http = httplib2.Http()
- request = google.auth.transport.httplib2.Request(http)
-
- credentials.refresh(request)
-
- Args:
- http (httplib2.Http): The underlying http object to use to make
- requests.
-
- .. automethod:: __call__
- """
- def __init__(self, http):
- self.http = http
-
- def __call__(self, url, method='GET', body=None, headers=None,
- timeout=None, **kwargs):
- """Make an HTTP request using httplib2.
-
- Args:
- url (str): The URI to be requested.
- method (str): The HTTP method to use for the request. Defaults
- to 'GET'.
- body (bytes): The payload / body in HTTP request.
- headers (Mapping[str, str]): Request headers.
- timeout (Optional[int]): The number of seconds to wait for a
- response from the server. This is ignored by httplib2 and will
- issue a warning.
- kwargs: Additional arguments passed throught to the underlying
- :meth:`httplib2.Http.request` method.
-
- Returns:
- google.auth.transport.Response: The HTTP response.
-
- Raises:
- google.auth.exceptions.TransportError: If any exception occurred.
- """
- if timeout is not None:
- _LOGGER.warning(
- 'httplib2 transport does not support per-request timeout. '
- 'Set the timeout when constructing the httplib2.Http instance.'
- )
-
- try:
- _LOGGER.debug('Making request: %s %s', method, url)
- response, data = self.http.request(
- url, method=method, body=body, headers=headers, **kwargs)
- return _Response(response, data)
- except httplib2.HttpLib2Error as exc:
- raise exceptions.TransportError(exc)
-
-
-def _make_default_http():
- """Returns a default httplib2.Http instance."""
- return httplib2.Http()
-
-
-class AuthorizedHttp(object):
- """A httplib2 HTTP class with credentials.
-
- This class is used to perform requests to API endpoints that require
- authorization::
-
- from google.auth.transport._httplib2 import AuthorizedHttp
-
- authed_http = AuthorizedHttp(credentials)
-
- response = authed_http.request(
- 'https://www.googleapis.com/storage/v1/b')
-
- This class implements :meth:`request` in the same way as
- :class:`httplib2.Http` and can usually be used just like any other
- instance of :class:``httplib2.Http`.
-
- The underlying :meth:`request` implementation handles adding the
- credentials' headers to the request and refreshing credentials as needed.
- """
- def __init__(self, credentials, http=None,
- refresh_status_codes=transport.DEFAULT_REFRESH_STATUS_CODES,
- max_refresh_attempts=transport.DEFAULT_MAX_REFRESH_ATTEMPTS):
- """
- Args:
- credentials (google.auth.credentials.Credentials): The credentials
- to add to the request.
- http (httplib2.Http): The underlying HTTP object to
- use to make requests. If not specified, a
- :class:`httplib2.Http` instance will be constructed.
- refresh_status_codes (Sequence[int]): Which HTTP status codes
- indicate that credentials should be refreshed and the request
- should be retried.
- max_refresh_attempts (int): The maximum number of times to attempt
- to refresh the credentials and retry the request.
- """
-
- if http is None:
- http = _make_default_http()
-
- self.http = http
- self.credentials = credentials
- self._refresh_status_codes = refresh_status_codes
- self._max_refresh_attempts = max_refresh_attempts
- # Request instance used by internal methods (for example,
- # credentials.refresh).
- self._request = Request(self.http)
-
- def request(self, uri, method='GET', body=None, headers=None,
- **kwargs):
- """Implementation of httplib2's Http.request."""
-
- _credential_refresh_attempt = kwargs.pop(
- '_credential_refresh_attempt', 0)
-
- # Make a copy of the headers. They will be modified by the credentials
- # and we want to pass the original headers if we recurse.
- request_headers = headers.copy() if headers is not None else {}
-
- self.credentials.before_request(
- self._request, method, uri, request_headers)
-
- # Check if the body is a file-like stream, and if so, save the body
- # stream position so that it can be restored in case of refresh.
- body_stream_position = None
- if all(getattr(body, stream_prop, None) for stream_prop in
- _STREAM_PROPERTIES):
- body_stream_position = body.tell()
-
- # Make the request.
- response, content = self.http.request(
- uri, method, body=body, headers=request_headers, **kwargs)
-
- # If the response indicated that the credentials needed to be
- # refreshed, then refresh the credentials and re-attempt the
- # request.
- # A stored token may expire between the time it is retrieved and
- # the time the request is made, so we may need to try twice.
- if (response.status in self._refresh_status_codes
- and _credential_refresh_attempt < self._max_refresh_attempts):
-
- _LOGGER.info(
- 'Refreshing credentials due to a %s response. Attempt %s/%s.',
- response.status, _credential_refresh_attempt + 1,
- self._max_refresh_attempts)
-
- self.credentials.refresh(self._request)
-
- # Restore the body's stream position if needed.
- if body_stream_position is not None:
- body.seek(body_stream_position)
-
- # Recurse. Pass in the original headers, not our modified set.
- return self.request(
- uri, method, body=body, headers=headers,
- _credential_refresh_attempt=_credential_refresh_attempt + 1,
- **kwargs)
-
- return response, content
-
- @property
- def connections(self):
- """Proxy to httplib2.Http.connections."""
- return self.http.connections
-
- @connections.setter
- def connections(self, value):
- """Proxy to httplib2.Http.connections."""
- self.http.connections = value
diff --git a/additional_packages/google_auth_httplib2/setup.cfg b/additional_packages/google_auth_httplib2/setup.cfg
deleted file mode 100644
index 2a9acf1..0000000
--- a/additional_packages/google_auth_httplib2/setup.cfg
+++ /dev/null
@@ -1,2 +0,0 @@
-[bdist_wheel]
-universal = 1
diff --git a/additional_packages/google_auth_httplib2/setup.py b/additional_packages/google_auth_httplib2/setup.py
deleted file mode 100644
index ec04881..0000000
--- a/additional_packages/google_auth_httplib2/setup.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2014 Google Inc.
-#
-# 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 io
-
-from setuptools import setup
-
-
-DEPENDENCIES = (
- 'google-auth'
-)
-
-
-with io.open('README.rst', 'r') as fh:
- long_description = fh.read()
-
-
-setup(
- name='google-auth-httplib2',
- version='0.0.2',
- author='Google Cloud Platform',
- author_email='jonwayne+google-auth@google.com',
- description='Google Authentication Library',
- long_description=long_description,
- url='https://github.com/GoogleCloudPlatform/google-auth-library-python',
- py_modules=['google_auth_httplib2'],
- install_requires=DEPENDENCIES,
- license='Apache 2.0',
- keywords='google auth oauth client',
- classifiers=(
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.7',
- 'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.4',
- 'Programming Language :: Python :: 3.5',
- 'Programming Language :: Python :: 3.6',
- 'Development Status :: 3 - Alpha',
- 'Intended Audience :: Developers',
- 'License :: OSI Approved :: Apache Software License',
- 'Operating System :: POSIX',
- 'Operating System :: Microsoft :: Windows',
- 'Operating System :: MacOS :: MacOS X',
- 'Operating System :: OS Independent',
- 'Topic :: Internet :: WWW/HTTP',
- ),
-)
diff --git a/additional_packages/google_auth_httplib2/tests/__init__.py b/additional_packages/google_auth_httplib2/tests/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/additional_packages/google_auth_httplib2/tests/__init__.py
+++ /dev/null
diff --git a/additional_packages/google_auth_httplib2/tests/compliance.py b/additional_packages/google_auth_httplib2/tests/compliance.py
deleted file mode 100644
index a97a11b..0000000
--- a/additional_packages/google_auth_httplib2/tests/compliance.py
+++ /dev/null
@@ -1,92 +0,0 @@
-# Copyright 2016 Google Inc.
-#
-# 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 flask
-from google.auth import exceptions
-import pytest
-from pytest_localserver.http import WSGIServer
-from six.moves import http_client
-
-# .invalid will never resolve, see https://tools.ietf.org/html/rfc2606
-NXDOMAIN = 'test.invalid'
-
-
-class RequestResponseTests(object):
-
- @pytest.fixture(scope='module')
- def server(self):
- """Provides a test HTTP server.
-
- The test server is automatically created before
- a test and destroyed at the end. The server is serving a test
- application that can be used to verify requests.
- """
- app = flask.Flask(__name__)
- app.debug = True
-
- # pylint: disable=unused-variable
- # (pylint thinks the flask routes are unusued.)
- @app.route('/basic')
- def index():
- header_value = flask.request.headers.get('x-test-header', 'value')
- headers = {'X-Test-Header': header_value}
- return 'Basic Content', http_client.OK, headers
-
- @app.route('/server_error')
- def server_error():
- return 'Error', http_client.INTERNAL_SERVER_ERROR
- # pylint: enable=unused-variable
-
- server = WSGIServer(application=app.wsgi_app)
- server.start()
- yield server
- server.stop()
-
- def test_request_basic(self, server):
- request = self.make_request()
- response = request(url=server.url + '/basic', method='GET')
-
- assert response.status == http_client.OK
- assert response.headers['x-test-header'] == 'value'
- assert response.data == b'Basic Content'
-
- def test_request_timeout(self, server):
- request = self.make_request()
- response = request(url=server.url + '/basic', method='GET', timeout=2)
-
- assert response.status == http_client.OK
- assert response.headers['x-test-header'] == 'value'
- assert response.data == b'Basic Content'
-
- def test_request_headers(self, server):
- request = self.make_request()
- response = request(
- url=server.url + '/basic', method='GET', headers={
- 'x-test-header': 'hello world'})
-
- assert response.status == http_client.OK
- assert response.headers['x-test-header'] == 'hello world'
- assert response.data == b'Basic Content'
-
- def test_request_error(self, server):
- request = self.make_request()
- response = request(url=server.url + '/server_error', method='GET')
-
- assert response.status == http_client.INTERNAL_SERVER_ERROR
- assert response.data == b'Error'
-
- def test_connection_error(self):
- request = self.make_request()
- with pytest.raises(exceptions.TransportError):
- request(url='http://{}'.format(NXDOMAIN), method='GET')
diff --git a/additional_packages/google_auth_httplib2/tests/test_google_auth_httplib2.py b/additional_packages/google_auth_httplib2/tests/test_google_auth_httplib2.py
deleted file mode 100644
index 635965f..0000000
--- a/additional_packages/google_auth_httplib2/tests/test_google_auth_httplib2.py
+++ /dev/null
@@ -1,157 +0,0 @@
-# Copyright 2016 Google Inc.
-#
-# 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 httplib2
-import mock
-import six
-from six.moves import http_client
-
-import google_auth_httplib2
-from tests import compliance
-
-
-class MockHttp(object):
- def __init__(self, responses, headers=None):
- self.responses = responses
- self.requests = []
- self.headers = headers or {}
-
- def request(self, url, method='GET', body=None, headers=None, **kwargs):
- self.requests.append((method, url, body, headers, kwargs))
- return self.responses.pop(0)
-
-
-class MockResponse(object):
- def __init__(self, status=http_client.OK, data=b''):
- self.status = status
- self.data = data
-
- def __iter__(self):
- yield self
- yield self.data
-
-
-class TestRequestResponse(compliance.RequestResponseTests):
- def make_request(self):
- http = httplib2.Http()
- return google_auth_httplib2.Request(http)
-
- def test_timeout(self):
- url = 'http://example.com'
- http = MockHttp(responses=[MockResponse()])
- request = google_auth_httplib2.Request(http)
- request(url=url, method='GET', timeout=5)
-
- assert http.requests[0] == (
- 'GET', url, None, None, {})
-
-
-def test__make_default_http():
- http = google_auth_httplib2._make_default_http()
- assert isinstance(http, httplib2.Http)
-
-
-class MockCredentials(object):
- def __init__(self, token='token'):
- self.token = token
-
- def apply(self, headers):
- headers['authorization'] = self.token
-
- def before_request(self, request, method, url, headers):
- self.apply(headers)
-
- def refresh(self, request):
- self.token += '1'
-
-
-class TestAuthorizedHttp(object):
- TEST_URL = 'http://example.com'
-
- def test_authed_http_defaults(self):
- authed_http = google_auth_httplib2.AuthorizedHttp(
- mock.sentinel.credentials)
-
- assert authed_http.credentials == mock.sentinel.credentials
- assert isinstance(authed_http.http, httplib2.Http)
-
- def test_connections(self):
- authed_http = google_auth_httplib2.AuthorizedHttp(
- mock.sentinel.credentials)
-
- assert authed_http.connections == authed_http.http.connections
-
- authed_http.connections = mock.sentinel.connections
- assert authed_http.http.connections == mock.sentinel.connections
-
- def test_request_no_refresh(self):
- mock_credentials = mock.Mock(wraps=MockCredentials())
- mock_response = MockResponse()
- mock_http = MockHttp([mock_response])
-
- authed_http = google_auth_httplib2.AuthorizedHttp(
- mock_credentials, http=mock_http)
-
- response, data = authed_http.request(self.TEST_URL)
-
- assert response == mock_response
- assert data == mock_response.data
- assert mock_credentials.before_request.called
- assert not mock_credentials.refresh.called
- assert mock_http.requests == [
- ('GET', self.TEST_URL, None, {'authorization': 'token'}, {})]
-
- def test_request_refresh(self):
- mock_credentials = mock.Mock(wraps=MockCredentials())
- mock_final_response = MockResponse(status=http_client.OK)
- # First request will 401, second request will succeed.
- mock_http = MockHttp([
- MockResponse(status=http_client.UNAUTHORIZED),
- mock_final_response])
-
- authed_http = google_auth_httplib2.AuthorizedHttp(
- mock_credentials, http=mock_http)
-
- response, data = authed_http.request(self.TEST_URL)
-
- assert response == mock_final_response
- assert data == mock_final_response.data
- assert mock_credentials.before_request.call_count == 2
- assert mock_credentials.refresh.called
- assert mock_http.requests == [
- ('GET', self.TEST_URL, None, {'authorization': 'token'}, {}),
- ('GET', self.TEST_URL, None, {'authorization': 'token1'}, {})]
-
- def test_request_stream_body(self):
- mock_credentials = mock.Mock(wraps=MockCredentials())
- mock_response = MockResponse()
- # Refresh is needed to cover the resetting of the body position.
- mock_http = MockHttp([
- MockResponse(status=http_client.UNAUTHORIZED),
- mock_response])
-
- body = six.StringIO('body')
- body.seek(1)
-
- authed_http = google_auth_httplib2.AuthorizedHttp(
- mock_credentials, http=mock_http)
-
- response, data = authed_http.request(
- self.TEST_URL, method='POST', body=body)
-
- assert response == mock_response
- assert data == mock_response.data
- assert mock_http.requests == [
- ('POST', self.TEST_URL, body, {'authorization': 'token'}, {}),
- ('POST', self.TEST_URL, body, {'authorization': 'token1'}, {})]
diff --git a/additional_packages/google_auth_httplib2/tox.ini b/additional_packages/google_auth_httplib2/tox.ini
deleted file mode 100644
index 95f3454..0000000
--- a/additional_packages/google_auth_httplib2/tox.ini
+++ /dev/null
@@ -1,38 +0,0 @@
-[tox]
-envlist = lint,py27,py34,py35,py36,pypy,cover
-
-[testenv]
-deps =
- flask
- mock
- pytest
- pytest-cov
- pytest-localserver
- httplib2
-commands =
- py.test --cov=google_auth_httplib2 --cov=tests {posargs:tests}
-
-[testenv:cover]
-basepython = python3.6
-commands =
- py.test --cov=google_auth_httplib2 --cov=tests --cov-report= tests
- coverage report --show-missing --fail-under=100
-deps =
- {[testenv]deps}
-
-[testenv:lint]
-basepython = python3.5
-commands =
- python setup.py check --metadata --restructuredtext --strict
- flake8 \
- --import-order-style=google \
- --application-import-names="google_auth_httplib2,tests" \
- google_auth_httplib2.py tests
- python {toxinidir}/../../scripts/run_pylint.py \
- --library-filesets google_auth_httplib2.py \
- --test-filesets tests
-deps =
- flake8
- flake8-import-order
- pylint
- docutils
diff --git a/additional_packages/google_auth_oauthlib/.coveragerc b/additional_packages/google_auth_oauthlib/.coveragerc
deleted file mode 100644
index c44dd8e..0000000
--- a/additional_packages/google_auth_oauthlib/.coveragerc
+++ /dev/null
@@ -1,13 +0,0 @@
-[run]
-branch = True
-
-[report]
-omit =
- */conftest.py
-exclude_lines =
- # Re-enable the standard pragma
- pragma: NO COVER
- # Ignore debug-only repr
- def __repr__
- # Don't complain if tests don't hit defensive assertion code:
- raise NotImplementedError
diff --git a/additional_packages/google_auth_oauthlib/CHANGELOG.rst b/additional_packages/google_auth_oauthlib/CHANGELOG.rst
deleted file mode 100644
index dbb95df..0000000
--- a/additional_packages/google_auth_oauthlib/CHANGELOG.rst
+++ /dev/null
@@ -1,4 +0,0 @@
-v0.0.1
-------
-
-Initial release. This package contains the functionality previously located in `google.oauth2.oauthlib` and `google.oauth2.flows`.
diff --git a/additional_packages/google_auth_oauthlib/LICENSE b/additional_packages/google_auth_oauthlib/LICENSE
deleted file mode 100644
index 261eeb9..0000000
--- a/additional_packages/google_auth_oauthlib/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- 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.
diff --git a/additional_packages/google_auth_oauthlib/MANIFEST.in b/additional_packages/google_auth_oauthlib/MANIFEST.in
deleted file mode 100644
index aac7fe1..0000000
--- a/additional_packages/google_auth_oauthlib/MANIFEST.in
+++ /dev/null
@@ -1,2 +0,0 @@
-include README.rst LICENSE
-recursive-include tests *
diff --git a/additional_packages/google_auth_oauthlib/README.rst b/additional_packages/google_auth_oauthlib/README.rst
deleted file mode 100644
index 44c478b..0000000
--- a/additional_packages/google_auth_oauthlib/README.rst
+++ /dev/null
@@ -1,28 +0,0 @@
-oauthlib integration for Google Auth
-====================================
-
-|pypi|
-
-This library provides `oauthlib`_ integration with `google-auth`_.
-
-.. |pypi| image:: https://img.shields.io/pypi/v/google-auth-oauthlib.svg
- :target: https://pypi.python.org/pypi/google-auth-oauthlib
-
-.. _oauthlib: https://github.com/idan/oauthlib
-.. _google-auth: https://github.com/GoogleCloudPlatform/google-auth
-
-Installing
-----------
-
-You can install using `pip`_::
-
- $ pip install google-auth-oauthlib
-
-.. _pip: https://pip.pypa.io/en/stable/
-
-License
--------
-
-Apache 2.0 - See `the LICENSE`_ for more information.
-
-.. _the LICENSE: https://github.com/GoogleCloudPlatform/google-auth-library-python/blob/master/LICENSE
diff --git a/additional_packages/google_auth_oauthlib/google_auth_oauthlib/__init__.py b/additional_packages/google_auth_oauthlib/google_auth_oauthlib/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/additional_packages/google_auth_oauthlib/google_auth_oauthlib/__init__.py
+++ /dev/null
diff --git a/additional_packages/google_auth_oauthlib/google_auth_oauthlib/flow.py b/additional_packages/google_auth_oauthlib/google_auth_oauthlib/flow.py
deleted file mode 100644
index 0df96c0..0000000
--- a/additional_packages/google_auth_oauthlib/google_auth_oauthlib/flow.py
+++ /dev/null
@@ -1,458 +0,0 @@
-# Copyright 2016 Google Inc.
-#
-# 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.
-
-"""OAuth 2.0 Authorization Flow
-
-This module provides integration with `requests-oauthlib`_ for running the
-`OAuth 2.0 Authorization Flow`_ and acquiring user credentials.
-
-Here's an example of using :class:`Flow` with the installed application
-authorization flow::
-
- from google_auth_oauthlib.flow import Flow
-
- # Create the flow using the client secrets file from the Google API
- # Console.
- flow = Flow.from_client_secrets_file(
- 'path/to/client_secrets.json',
- scopes=['profile', 'email'],
- redirect_uri='urn:ietf:wg:oauth:2.0:oob')
-
- # Tell the user to go to the authorization URL.
- auth_url, _ = flow.authorization_url(prompt='consent')
-
- print('Please go to this URL: {}'.format(auth_url))
-
- # The user will get an authorization code. This code is used to get the
- # access token.
- code = input('Enter the authorization code: ')
- flow.fetch_token(code=code)
-
- # You can use flow.credentials, or you can just get a requests session
- # using flow.authorized_session.
- session = flow.authorized_session()
- print(session.get('https://www.googleapis.com/userinfo/v2/me').json())
-
-This particular flow can be handled entirely by using
-:class:`InstalledAppFlow`.
-
-.. _requests-oauthlib: http://requests-oauthlib.readthedocs.io/en/stable/
-.. _OAuth 2.0 Authorization Flow:
- https://tools.ietf.org/html/rfc6749#section-1.2
-"""
-
-import json
-import logging
-import webbrowser
-import wsgiref.simple_server
-import wsgiref.util
-
-import google.auth.transport.requests
-import google.oauth2.credentials
-from six.moves import input
-
-import google_auth_oauthlib.helpers
-
-
-_LOGGER = logging.getLogger(__name__)
-
-
-class Flow(object):
- """OAuth 2.0 Authorization Flow
-
- This class uses a :class:`requests_oauthlib.OAuth2Session` instance at
- :attr:`oauth2session` to perform all of the OAuth 2.0 logic. This class
- just provides convenience methods and sane defaults for doing Google's
- particular flavors of OAuth 2.0.
-
- Typically you'll construct an instance of this flow using
- :meth:`from_client_secrets_file` and a `client secrets file`_ obtained
- from the `Google API Console`_.
-
- .. _client secrets file:
- https://developers.google.com/identity/protocols/OAuth2WebServer
- #creatingcred
- .. _Google API Console:
- https://console.developers.google.com/apis/credentials
- """
-
- def __init__(self, oauth2session, client_type, client_config):
- """
- Args:
- oauth2session (requests_oauthlib.OAuth2Session):
- The OAuth 2.0 session from ``requests-oauthlib``.
- client_type (str): The client type, either ``web`` or
- ``installed``.
- client_config (Mapping[str, Any]): The client
- configuration in the Google `client secrets`_ format.
-
- .. _client secrets:
- https://developers.google.com/api-client-library/python/guide
- /aaa_client_secrets
- """
- self.client_type = client_type
- """str: The client type, either ``'web'`` or ``'installed'``"""
- self.client_config = client_config[client_type]
- """Mapping[str, Any]: The OAuth 2.0 client configuration."""
- self.oauth2session = oauth2session
- """requests_oauthlib.OAuth2Session: The OAuth 2.0 session."""
-
- @classmethod
- def from_client_config(cls, client_config, scopes, **kwargs):
- """Creates a :class:`requests_oauthlib.OAuth2Session` from client
- configuration loaded from a Google-format client secrets file.
-
- Args:
- client_config (Mapping[str, Any]): The client
- configuration in the Google `client secrets`_ format.
- scopes (Sequence[str]): The list of scopes to request during the
- flow.
- kwargs: Any additional parameters passed to
- :class:`requests_oauthlib.OAuth2Session`
-
- Returns:
- Flow: The constructed Flow instance.
-
- Raises:
- ValueError: If the client configuration is not in the correct
- format.
-
- .. _client secrets:
- https://developers.google.com/api-client-library/python/guide
- /aaa_client_secrets
- """
- if 'web' in client_config:
- client_type = 'web'
- elif 'installed' in client_config:
- client_type = 'installed'
- else:
- raise ValueError(
- 'Client secrets must be for a web or installed app.')
-
- session, client_config = (
- google_auth_oauthlib.helpers.session_from_client_config(
- client_config, scopes, **kwargs))
-
- return cls(session, client_type, client_config)
-
- @classmethod
- def from_client_secrets_file(cls, client_secrets_file, scopes, **kwargs):
- """Creates a :class:`Flow` instance from a Google client secrets file.
-
- Args:
- client_secrets_file (str): The path to the client secrets .json
- file.
- scopes (Sequence[str]): The list of scopes to request during the
- flow.
- kwargs: Any additional parameters passed to
- :class:`requests_oauthlib.OAuth2Session`
-
- Returns:
- Flow: The constructed Flow instance.
- """
- with open(client_secrets_file, 'r') as json_file:
- client_config = json.load(json_file)
-
- return cls.from_client_config(client_config, scopes=scopes, **kwargs)
-
- @property
- def redirect_uri(self):
- """The OAuth 2.0 redirect URI. Pass-through to
- ``self.oauth2session.redirect_uri``."""
- return self.oauth2session.redirect_uri
-
- @redirect_uri.setter
- def redirect_uri(self, value):
- self.oauth2session.redirect_uri = value
-
- def authorization_url(self, **kwargs):
- """Generates an authorization URL.
-
- This is the first step in the OAuth 2.0 Authorization Flow. The user's
- browser should be redirected to the returned URL.
-
- This method calls
- :meth:`requests_oauthlib.OAuth2Session.authorization_url`
- and specifies the client configuration's authorization URI (usually
- Google's authorization server) and specifies that "offline" access is
- desired. This is required in order to obtain a refresh token.
-
- Args:
- kwargs: Additional arguments passed through to
- :meth:`requests_oauthlib.OAuth2Session.authorization_url`
-
- Returns:
- Tuple[str, str]: The generated authorization URL and state. The
- user must visit the URL to complete the flow. The state is used
- when completing the flow to verify that the request originated
- from your application. If your application is using a different
- :class:`Flow` instance to obtain the token, you will need to
- specify the ``state`` when constructing the :class:`Flow`.
- """
- url, state = self.oauth2session.authorization_url(
- self.client_config['auth_uri'],
- access_type='offline', **kwargs)
-
- return url, state
-
- def fetch_token(self, **kwargs):
- """Completes the Authorization Flow and obtains an access token.
-
- This is the final step in the OAuth 2.0 Authorization Flow. This is
- called after the user consents.
-
- This method calls
- :meth:`requests_oauthlib.OAuth2Session.fetch_token`
- and specifies the client configuration's token URI (usually Google's
- token server).
-
- Args:
- kwargs: Arguments passed through to
- :meth:`requests_oauthlib.OAuth2Session.fetch_token`. At least
- one of ``code`` or ``authorization_response`` must be
- specified.
-
- Returns:
- Mapping[str, str]: The obtained tokens. Typically, you will not use
- return value of this function and instead and use
- :meth:`credentials` to obtain a
- :class:`~google.auth.credentials.Credentials` instance.
- """
- return self.oauth2session.fetch_token(
- self.client_config['token_uri'],
- client_secret=self.client_config['client_secret'],
- **kwargs)
-
- @property
- def credentials(self):
- """Returns credentials from the OAuth 2.0 session.
-
- :meth:`fetch_token` must be called before accessing this. This method
- constructs a :class:`google.oauth2.credentials.Credentials` class using
- the session's token and the client config.
-
- Returns:
- google.oauth2.credentials.Credentials: The constructed credentials.
-
- Raises:
- ValueError: If there is no access token in the session.
- """
- return google_auth_oauthlib.helpers.credentials_from_session(
- self.oauth2session, self.client_config)
-
- def authorized_session(self):
- """Returns a :class:`requests.Session` authorized with credentials.
-
- :meth:`fetch_token` must be called before this method. This method
- constructs a :class:`google.auth.transport.requests.AuthorizedSession`
- class using this flow's :attr:`credentials`.
-
- Returns:
- google.auth.transport.requests.AuthorizedSession: The constructed
- session.
- """
- return google.auth.transport.requests.AuthorizedSession(
- self.credentials)
-
-
-class InstalledAppFlow(Flow):
- """Authorization flow helper for installed applications.
-
- This :class:`Flow` subclass makes it easier to perform the
- `Installed Application Authorization Flow`_. This flow is useful for
- local development or applications that are installed on a desktop operating
- system.
-
- This flow has two strategies: The console strategy provided by
- :meth:`run_console` and the local server strategy provided by
- :meth:`run_local_server`.
-
- Example::
-
- from google_auth_oauthlib.flow import InstalledAppFlow
-
- flow = InstalledAppFlow.from_client_secrets_file(
- 'client_secrets.json',
- scopes=['profile', 'email'])
-
- flow.run_local_server()
-
- session = flow.authorized_session()
-
- profile_info = session.get(
- 'https://www.googleapis.com/userinfo/v2/me').json()
-
- print(profile_info)
- # {'name': '...', 'email': '...', ...}
-
-
- Note that these aren't the only two ways to accomplish the installed
- application flow, they are just the most common ways. You can use the
- :class:`Flow` class to perform the same flow with different methods of
- presenting the authorization URL to the user or obtaining the authorization
- response, such as using an embedded web view.
-
- .. _Installed Application Authorization Flow:
- https://developers.google.com/api-client-library/python/auth
- /installed-app
- """
- _OOB_REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob'
-
- _DEFAULT_AUTH_PROMPT_MESSAGE = (
- 'Please visit this URL to authorize this application: {url}')
- """str: The message to display when prompting the user for
- authorization."""
- _DEFAULT_AUTH_CODE_MESSAGE = (
- 'Enter the authorization code: ')
- """str: The message to display when prompting the user for the
- authorization code. Used only by the console strategy."""
-
- _DEFAULT_WEB_SUCCESS_MESSAGE = (
- 'The authentication flow has completed, you may close this window.')
-
- def run_console(
- self,
- authorization_prompt_message=_DEFAULT_AUTH_PROMPT_MESSAGE,
- authorization_code_message=_DEFAULT_AUTH_CODE_MESSAGE,
- **kwargs):
- """Run the flow using the console strategy.
-
- The console strategy instructs the user to open the authorization URL
- in their browser. Once the authorization is complete the authorization
- server will give the user a code. The user then must copy & paste this
- code into the application. The code is then exchanged for a token.
-
- Args:
- authorization_prompt_message (str): The message to display to tell
- the user to navigate to the authorization URL.
- authorization_code_message (str): The message to display when
- prompting the user for the authorization code.
- kwargs: Additional keyword arguments passed through to
- :meth:`authorization_url`.
-
- Returns:
- google.oauth2.credentials.Credentials: The OAuth 2.0 credentials
- for the user.
- """
- kwargs.setdefault('prompt', 'consent')
-
- self.redirect_uri = self._OOB_REDIRECT_URI
-
- auth_url, _ = self.authorization_url(**kwargs)
-
- print(authorization_prompt_message.format(url=auth_url))
-
- code = input(authorization_code_message)
-
- self.fetch_token(code=code)
-
- return self.credentials
-
- def run_local_server(
- self, host='localhost', port=8080,
- authorization_prompt_message=_DEFAULT_AUTH_PROMPT_MESSAGE,
- success_message=_DEFAULT_WEB_SUCCESS_MESSAGE,
- open_browser=True,
- **kwargs):
- """Run the flow using the server strategy.
-
- The server strategy instructs the user to open the authorization URL in
- their browser and will attempt to automatically open the URL for them.
- It will start a local web server to listen for the authorization
- response. Once authorization is complete the authorization server will
- redirect the user's browser to the local web server. The web server
- will get the authorization code from the response and shutdown. The
- code is then exchanged for a token.
-
- Args:
- host (str): The hostname for the local redirect server. This will
- be served over http, not https.
- port (int): The port for the local redirect server.
- authorization_prompt_message (str): The message to display to tell
- the user to navigate to the authorization URL.
- success_message (str): The message to display in the web browser
- the authorization flow is complete.
- open_browser (bool): Whether or not to open the authorization URL
- in the user's browser.
- kwargs: Additional keyword arguments passed through to
- :meth:`authorization_url`.
-
- Returns:
- google.oauth2.credentials.Credentials: The OAuth 2.0 credentials
- for the user.
- """
- self.redirect_uri = 'http://{}:{}/'.format(host, port)
-
- auth_url, _ = self.authorization_url(**kwargs)
-
- wsgi_app = _RedirectWSGIApp(success_message)
- local_server = wsgiref.simple_server.make_server(
- host, port, wsgi_app, handler_class=_WSGIRequestHandler)
-
- if open_browser:
- webbrowser.open(auth_url, new=1, autoraise=True)
-
- print(authorization_prompt_message.format(url=auth_url))
-
- local_server.handle_request()
-
- # Note: using https here because oauthlib is very picky that
- # OAuth 2.0 should only occur over https.
- authorization_response = wsgi_app.last_request_uri.replace(
- 'http', 'https')
- self.fetch_token(authorization_response=authorization_response)
-
- return self.credentials
-
-
-class _WSGIRequestHandler(wsgiref.simple_server.WSGIRequestHandler):
- """Custom WSGIRequestHandler.
-
- Uses a named logger instead of printing to stderr.
- """
- def log_message(self, format, *args, **kwargs):
- # pylint: disable=redefined-builtin
- # (format is the argument name defined in the superclass.)
- _LOGGER.info(format, *args, **kwargs)
-
-
-class _RedirectWSGIApp(object):
- """WSGI app to handle the authorization redirect.
-
- Stores the request URI and displays the given success message.
- """
-
- def __init__(self, success_message):
- """
- Args:
- success_message (str): The message to display in the web browser
- the authorization flow is complete.
- """
- self.last_request_uri = None
- self._success_message = success_message
-
- def __call__(self, environ, start_response):
- """WSGI Callable.
-
- Args:
- environ (Mapping[str, Any]): The WSGI environment.
- start_response (Callable[str, list]): The WSGI start_response
- callable.
-
- Returns:
- Iterable[bytes]: The response body.
- """
- start_response('200 OK', [('Content-type', 'text/plain')])
- self.last_request_uri = wsgiref.util.request_uri(environ)
- return [self._success_message.encode('utf-8')]
diff --git a/additional_packages/google_auth_oauthlib/google_auth_oauthlib/helpers.py b/additional_packages/google_auth_oauthlib/google_auth_oauthlib/helpers.py
deleted file mode 100644
index 41866d6..0000000
--- a/additional_packages/google_auth_oauthlib/google_auth_oauthlib/helpers.py
+++ /dev/null
@@ -1,137 +0,0 @@
-# Copyright 2017 Google Inc.
-#
-# 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.
-
-"""Integration helpers.
-
-This module provides helpers for integrating with `requests-oauthlib`_.
-Typically, you'll want to use the higher-level helpers in
-:mod:`google_auth_oauthlib.flow`.
-
-.. _requests-oauthlib: http://requests-oauthlib.readthedocs.io/en/stable/
-"""
-
-import json
-
-import google.oauth2.credentials
-import requests_oauthlib
-
-_REQUIRED_CONFIG_KEYS = frozenset(('auth_uri', 'token_uri', 'client_id'))
-
-
-def session_from_client_config(client_config, scopes, **kwargs):
- """Creates a :class:`requests_oauthlib.OAuth2Session` from client
- configuration loaded from a Google-format client secrets file.
-
- Args:
- client_config (Mapping[str, Any]): The client
- configuration in the Google `client secrets`_ format.
- scopes (Sequence[str]): The list of scopes to request during the
- flow.
- kwargs: Any additional parameters passed to
- :class:`requests_oauthlib.OAuth2Session`
-
- Raises:
- ValueError: If the client configuration is not in the correct
- format.
-
- Returns:
- Tuple[requests_oauthlib.OAuth2Session, Mapping[str, Any]]: The new
- oauthlib session and the validated client configuration.
-
- .. _client secrets:
- https://developers.google.com/api-client-library/python/guide
- /aaa_client_secrets
- """
-
- if 'web' in client_config:
- config = client_config['web']
- elif 'installed' in client_config:
- config = client_config['installed']
- else:
- raise ValueError(
- 'Client secrets must be for a web or installed app.')
-
- if not _REQUIRED_CONFIG_KEYS.issubset(config.keys()):
- raise ValueError('Client secrets is not in the correct format.')
-
- session = requests_oauthlib.OAuth2Session(
- client_id=config['client_id'],
- scope=scopes,
- **kwargs)
-
- return session, client_config
-
-
-def session_from_client_secrets_file(client_secrets_file, scopes, **kwargs):
- """Creates a :class:`requests_oauthlib.OAuth2Session` instance from a
- Google-format client secrets file.
-
- Args:
- client_secrets_file (str): The path to the `client secrets`_ .json
- file.
- scopes (Sequence[str]): The list of scopes to request during the
- flow.
- kwargs: Any additional parameters passed to
- :class:`requests_oauthlib.OAuth2Session`
-
- Returns:
- Tuple[requests_oauthlib.OAuth2Session, Mapping[str, Any]]: The new
- oauthlib session and the validated client configuration.
-
- .. _client secrets:
- https://developers.google.com/api-client-library/python/guide
- /aaa_client_secrets
- """
- with open(client_secrets_file, 'r') as json_file:
- client_config = json.load(json_file)
-
- return session_from_client_config(client_config, scopes, **kwargs)
-
-
-def credentials_from_session(session, client_config=None):
- """Creates :class:`google.oauth2.credentials.Credentials` from a
- :class:`requests_oauthlib.OAuth2Session`.
-
- :meth:`fetch_token` must be called on the session before before calling
- this. This uses the session's auth token and the provided client
- configuration to create :class:`google.oauth2.credentials.Credentials`.
- This allows you to use the credentials from the session with Google
- API client libraries.
-
- Args:
- session (requests_oauthlib.OAuth2Session): The OAuth 2.0 session.
- client_config (Mapping[str, Any]): The subset of the client
- configuration to use. For example, if you have a web client
- you would pass in `client_config['web']`.
-
- Returns:
- google.oauth2.credentials.Credentials: The constructed credentials.
-
- Raises:
- ValueError: If there is no access token in the session.
- """
- client_config = client_config if client_config is not None else {}
-
- if not session.token:
- raise ValueError(
- 'There is no access token for this session, did you call '
- 'fetch_token?')
-
- return google.oauth2.credentials.Credentials(
- session.token['access_token'],
- refresh_token=session.token.get('refresh_token'),
- token_uri=client_config.get('token_uri'),
- client_id=client_config.get('client_id'),
- client_secret=client_config.get('client_secret'),
- scopes=session.scope)
diff --git a/additional_packages/google_auth_oauthlib/setup.cfg b/additional_packages/google_auth_oauthlib/setup.cfg
deleted file mode 100644
index 2a9acf1..0000000
--- a/additional_packages/google_auth_oauthlib/setup.cfg
+++ /dev/null
@@ -1,2 +0,0 @@
-[bdist_wheel]
-universal = 1
diff --git a/additional_packages/google_auth_oauthlib/setup.py b/additional_packages/google_auth_oauthlib/setup.py
deleted file mode 100644
index 3652470..0000000
--- a/additional_packages/google_auth_oauthlib/setup.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright 2014 Google Inc.
-#
-# 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 io
-
-from setuptools import find_packages
-from setuptools import setup
-
-
-DEPENDENCIES = (
- 'google-auth',
- 'requests-oauthlib>=0.7.0',
-)
-
-
-with io.open('README.rst', 'r') as fh:
- long_description = fh.read()
-
-
-setup(
- name='google-auth-oauthlib',
- version='0.0.1',
- author='Google Cloud Platform',
- author_email='jonwayne+google-auth@google.com',
- description='Google Authentication Library',
- long_description=long_description,
- url='https://github.com/GoogleCloudPlatform/google-auth-library-python',
- packages=find_packages(exclude=('tests*',)),
- install_requires=DEPENDENCIES,
- license='Apache 2.0',
- keywords='google auth oauth client oauthlib',
- classifiers=(
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.7',
- 'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.4',
- 'Programming Language :: Python :: 3.5',
- 'Programming Language :: Python :: 3.6',
- 'Development Status :: 3 - Alpha',
- 'Intended Audience :: Developers',
- 'License :: OSI Approved :: Apache Software License',
- 'Operating System :: POSIX',
- 'Operating System :: Microsoft :: Windows',
- 'Operating System :: MacOS :: MacOS X',
- 'Operating System :: OS Independent',
- 'Topic :: Internet :: WWW/HTTP',
- ),
-)
diff --git a/additional_packages/google_auth_oauthlib/tests/__init__.py b/additional_packages/google_auth_oauthlib/tests/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/additional_packages/google_auth_oauthlib/tests/__init__.py
+++ /dev/null
diff --git a/additional_packages/google_auth_oauthlib/tests/data/client_secrets.json b/additional_packages/google_auth_oauthlib/tests/data/client_secrets.json
deleted file mode 100644
index 1baa499..0000000
--- a/additional_packages/google_auth_oauthlib/tests/data/client_secrets.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "web": {
- "client_id": "example.apps.googleusercontent.com",
- "project_id": "example",
- "auth_uri": "https://accounts.google.com/o/oauth2/auth",
- "token_uri": "https://accounts.google.com/o/oauth2/token",
- "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
- "client_secret": "itsasecrettoeveryone",
- "redirect_uris": [
- "urn:ietf:wg:oauth:2.0:oob",
- "http://localhost"
- ]
- }
-}
diff --git a/additional_packages/google_auth_oauthlib/tests/test_flow.py b/additional_packages/google_auth_oauthlib/tests/test_flow.py
deleted file mode 100644
index 88d283d..0000000
--- a/additional_packages/google_auth_oauthlib/tests/test_flow.py
+++ /dev/null
@@ -1,205 +0,0 @@
-# Copyright 2017 Google Inc.
-#
-# 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 concurrent.futures
-import json
-import os
-
-import mock
-import pytest
-import requests
-from six.moves import urllib
-
-from google_auth_oauthlib import flow
-
-DATA_DIR = os.path.join(os.path.dirname(__file__), 'data')
-CLIENT_SECRETS_FILE = os.path.join(DATA_DIR, 'client_secrets.json')
-
-with open(CLIENT_SECRETS_FILE, 'r') as fh:
- CLIENT_SECRETS_INFO = json.load(fh)
-
-
-class TestFlow(object):
- def test_from_client_secrets_file(self):
- instance = flow.Flow.from_client_secrets_file(
- CLIENT_SECRETS_FILE, scopes=mock.sentinel.scopes)
- assert instance.client_config == CLIENT_SECRETS_INFO['web']
- assert (instance.oauth2session.client_id ==
- CLIENT_SECRETS_INFO['web']['client_id'])
- assert instance.oauth2session.scope == mock.sentinel.scopes
-
- def test_from_client_config_installed(self):
- client_config = {'installed': CLIENT_SECRETS_INFO['web']}
- instance = flow.Flow.from_client_config(
- client_config, scopes=mock.sentinel.scopes)
- assert instance.client_config == client_config['installed']
- assert (instance.oauth2session.client_id ==
- client_config['installed']['client_id'])
- assert instance.oauth2session.scope == mock.sentinel.scopes
-
- def test_from_client_config_bad_format(self):
- with pytest.raises(ValueError):
- flow.Flow.from_client_config({}, scopes=mock.sentinel.scopes)
-
- @pytest.fixture
- def instance(self):
- yield flow.Flow.from_client_config(
- CLIENT_SECRETS_INFO, scopes=mock.sentinel.scopes)
-
- def test_redirect_uri(self, instance):
- instance.redirect_uri = mock.sentinel.redirect_uri
- assert (instance.redirect_uri ==
- instance.oauth2session.redirect_uri ==
- mock.sentinel.redirect_uri)
-
- def test_authorization_url(self, instance):
- scope = 'scope_one'
- instance.oauth2session.scope = [scope]
- authorization_url_patch = mock.patch.object(
- instance.oauth2session, 'authorization_url',
- wraps=instance.oauth2session.authorization_url)
-
- with authorization_url_patch as authorization_url_spy:
- url, _ = instance.authorization_url(prompt='consent')
-
- assert CLIENT_SECRETS_INFO['web']['auth_uri'] in url
- assert scope in url
- authorization_url_spy.assert_called_with(
- CLIENT_SECRETS_INFO['web']['auth_uri'],
- access_type='offline',
- prompt='consent')
-
- def test_fetch_token(self, instance):
- fetch_token_patch = mock.patch.object(
- instance.oauth2session, 'fetch_token', autospec=True,
- return_value=mock.sentinel.token)
-
- with fetch_token_patch as fetch_token_mock:
- token = instance.fetch_token(code=mock.sentinel.code)
-
- assert token == mock.sentinel.token
- fetch_token_mock.assert_called_with(
- CLIENT_SECRETS_INFO['web']['token_uri'],
- client_secret=CLIENT_SECRETS_INFO['web']['client_secret'],
- code=mock.sentinel.code)
-
- def test_credentials(self, instance):
- instance.oauth2session.token = {
- 'access_token': mock.sentinel.access_token,
- 'refresh_token': mock.sentinel.refresh_token
- }
-
- credentials = instance.credentials
-
- assert credentials.token == mock.sentinel.access_token
- assert credentials._refresh_token == mock.sentinel.refresh_token
- assert (credentials._client_id ==
- CLIENT_SECRETS_INFO['web']['client_id'])
- assert (credentials._client_secret ==
- CLIENT_SECRETS_INFO['web']['client_secret'])
- assert (credentials._token_uri ==
- CLIENT_SECRETS_INFO['web']['token_uri'])
-
- def test_authorized_session(self, instance):
- instance.oauth2session.token = {
- 'access_token': mock.sentinel.access_token,
- 'refresh_token': mock.sentinel.refresh_token
- }
-
- session = instance.authorized_session()
-
- assert session.credentials.token == mock.sentinel.access_token
-
-
-class TestInstalledAppFlow(object):
- SCOPES = ['email', 'profile']
- REDIRECT_REQUEST_PATH = '/?code=code&state=state'
-
- @pytest.fixture
- def instance(self):
- yield flow.InstalledAppFlow.from_client_config(
- CLIENT_SECRETS_INFO, scopes=self.SCOPES)
-
- @pytest.fixture
- def mock_fetch_token(self, instance):
- def set_token(*args, **kwargs):
- instance.oauth2session.token = {
- 'access_token': mock.sentinel.access_token,
- 'refresh_token': mock.sentinel.refresh_token
- }
-
- fetch_token_patch = mock.patch.object(
- instance.oauth2session, 'fetch_token', autospec=True,
- side_effect=set_token)
-
- with fetch_token_patch as fetch_token_mock:
- yield fetch_token_mock
-
- @mock.patch('google_auth_oauthlib.flow.input', autospec=True)
- def test_run_console(self, input_mock, instance, mock_fetch_token):
- input_mock.return_value = mock.sentinel.code
-
- credentials = instance.run_console()
-
- assert credentials.token == mock.sentinel.access_token
- assert credentials._refresh_token == mock.sentinel.refresh_token
-
- mock_fetch_token.assert_called_with(
- CLIENT_SECRETS_INFO['web']['token_uri'],
- client_secret=CLIENT_SECRETS_INFO['web']['client_secret'],
- code=mock.sentinel.code)
-
- @mock.patch('google_auth_oauthlib.flow.webbrowser', autospec=True)
- def test_run_local_server(
- self, webbrowser_mock, instance, mock_fetch_token):
- auth_redirect_url = urllib.parse.urljoin(
- 'http://localhost:8080',
- self.REDIRECT_REQUEST_PATH)
-
- with concurrent.futures.ThreadPoolExecutor(max_workers=1) as pool:
- future = pool.submit(instance.run_local_server)
-
- while not future.done():
- try:
- requests.get(auth_redirect_url)
- except requests.ConnectionError: # pragma: NO COVER
- pass
-
- credentials = future.result()
-
- assert credentials.token == mock.sentinel.access_token
- assert credentials._refresh_token == mock.sentinel.refresh_token
- assert webbrowser_mock.open.called
-
- expected_auth_response = auth_redirect_url.replace('http', 'https')
- mock_fetch_token.assert_called_with(
- CLIENT_SECRETS_INFO['web']['token_uri'],
- client_secret=CLIENT_SECRETS_INFO['web']['client_secret'],
- authorization_response=expected_auth_response)
-
- @mock.patch('google_auth_oauthlib.flow.webbrowser', autospec=True)
- @mock.patch('wsgiref.simple_server.make_server', autospec=True)
- def test_run_local_server_no_browser(
- self, make_server_mock, webbrowser_mock, instance,
- mock_fetch_token):
-
- def assign_last_request_uri(host, port, wsgi_app, **kwargs):
- wsgi_app.last_request_uri = self.REDIRECT_REQUEST_PATH
- return mock.Mock()
-
- make_server_mock.side_effect = assign_last_request_uri
-
- instance.run_local_server(open_browser=False)
-
- assert not webbrowser_mock.open.called
diff --git a/additional_packages/google_auth_oauthlib/tests/test_helpers.py b/additional_packages/google_auth_oauthlib/tests/test_helpers.py
deleted file mode 100644
index faae76b..0000000
--- a/additional_packages/google_auth_oauthlib/tests/test_helpers.py
+++ /dev/null
@@ -1,92 +0,0 @@
-# Copyright 2017 Google Inc.
-#
-# 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 json
-import os
-
-import mock
-import pytest
-
-from google_auth_oauthlib import helpers
-
-DATA_DIR = os.path.join(os.path.dirname(__file__), 'data')
-CLIENT_SECRETS_FILE = os.path.join(DATA_DIR, 'client_secrets.json')
-
-with open(CLIENT_SECRETS_FILE, 'r') as fh:
- CLIENT_SECRETS_INFO = json.load(fh)
-
-
-def test_session_from_client_config_web():
- session, config = helpers.session_from_client_config(
- CLIENT_SECRETS_INFO, scopes=mock.sentinel.scopes)
-
- assert config == CLIENT_SECRETS_INFO
- assert session.client_id == CLIENT_SECRETS_INFO['web']['client_id']
- assert session.scope == mock.sentinel.scopes
-
-
-def test_session_from_client_config_installed():
- info = {'installed': CLIENT_SECRETS_INFO['web']}
- session, config = helpers.session_from_client_config(
- info, scopes=mock.sentinel.scopes)
- assert config == info
- assert session.client_id == info['installed']['client_id']
- assert session.scope == mock.sentinel.scopes
-
-
-def test_session_from_client_config_bad_format():
- with pytest.raises(ValueError):
- helpers.session_from_client_config({}, scopes=[])
-
-
-def test_session_from_client_config_missing_keys():
- with pytest.raises(ValueError):
- helpers.session_from_client_config({'web': {}}, scopes=[])
-
-
-def test_session_from_client_secrets_file():
- session, config = helpers.session_from_client_secrets_file(
- CLIENT_SECRETS_FILE, scopes=mock.sentinel.scopes)
- assert config == CLIENT_SECRETS_INFO
- assert session.client_id == CLIENT_SECRETS_INFO['web']['client_id']
- assert session.scope == mock.sentinel.scopes
-
-
-@pytest.fixture
-def session():
- session, _ = helpers.session_from_client_config(
- CLIENT_SECRETS_INFO, scopes=mock.sentinel.scopes)
- yield session
-
-
-def test_credentials_from_session(session):
- session.token = {
- 'access_token': mock.sentinel.access_token,
- 'refresh_token': mock.sentinel.refresh_token
- }
-
- credentials = helpers.credentials_from_session(
- session, CLIENT_SECRETS_INFO['web'])
-
- assert credentials.token == mock.sentinel.access_token
- assert credentials._refresh_token == mock.sentinel.refresh_token
- assert credentials._client_id == CLIENT_SECRETS_INFO['web']['client_id']
- assert (credentials._client_secret ==
- CLIENT_SECRETS_INFO['web']['client_secret'])
- assert credentials._token_uri == CLIENT_SECRETS_INFO['web']['token_uri']
-
-
-def test_bad_credentials(session):
- with pytest.raises(ValueError):
- helpers.credentials_from_session(session)
diff --git a/additional_packages/google_auth_oauthlib/tox.ini b/additional_packages/google_auth_oauthlib/tox.ini
deleted file mode 100644
index c0983f6..0000000
--- a/additional_packages/google_auth_oauthlib/tox.ini
+++ /dev/null
@@ -1,36 +0,0 @@
-[tox]
-envlist = lint,py27,py34,py35,py36,pypy,cover
-
-[testenv]
-deps =
- mock
- pytest
- pytest-cov
- futures
-commands =
- py.test --cov=google_auth_oauthlib --cov=tests {posargs:tests}
-
-[testenv:cover]
-basepython = python3.6
-commands =
- py.test --cov=google_auth_oauthlib --cov=tests --cov-report= tests
- coverage report --show-missing --fail-under=100
-deps =
- {[testenv]deps}
-
-[testenv:lint]
-basepython = python3.5
-commands =
- python setup.py check --metadata --restructuredtext --strict
- flake8 \
- --import-order-style=google \
- --application-import-names="google_auth_oauthlib,tests" \
- google_auth_oauthlib tests
- python {toxinidir}/../../scripts/run_pylint.py \
- --library-filesets google_auth_oauthlib \
- --test-filesets tests
-deps =
- flake8
- flake8-import-order
- pylint
- docutils