diff --git a/.coveragerc b/.coveragerc index ce75f60..c6430d3 100644 --- a/.coveragerc +++ b/.coveragerc @@ -3,9 +3,9 @@ branch = True [report] omit = - google/cloud/_testing.py google/cloud/__init__.py - google/cloud/environment_vars.py + google/cloud/_testing/__init__.py + google/cloud/environment_vars/__init__.py fail_under = 100 show_missing = True exclude_lines = diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index ee94722..108063d 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -1,3 +1,3 @@ docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:6e7328583be8edd3ba8f35311c76a1ecbc823010279ccb6ab46b7a76e25eafcc + digest: sha256:4ee57a76a176ede9087c14330c625a71553cf9c72828b2c0ca12f5338171ba60 diff --git a/.kokoro/docs/common.cfg b/.kokoro/docs/common.cfg index 10be942..ff5ab7e 100644 --- a/.kokoro/docs/common.cfg +++ b/.kokoro/docs/common.cfg @@ -30,6 +30,7 @@ env_vars: { env_vars: { key: "V2_STAGING_BUCKET" + # Push google cloud library docs to the Cloud RAD bucket `docs-staging-v2` value: "docs-staging-v2" } diff --git a/.kokoro/samples/python3.10/common.cfg b/.kokoro/samples/python3.10/common.cfg new file mode 100644 index 0000000..0bce697 --- /dev/null +++ b/.kokoro/samples/python3.10/common.cfg @@ -0,0 +1,40 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Build logs will be here +action { + define_artifacts { + regex: "**/*sponge_log.xml" + } +} + +# Specify which tests to run +env_vars: { + key: "RUN_TESTS_SESSION" + value: "py-3.10" +} + +# Declare build specific Cloud project. +env_vars: { + key: "BUILD_SPECIFIC_GCLOUD_PROJECT" + value: "python-docs-samples-tests-310" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/python-cloud-core/.kokoro/test-samples.sh" +} + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/python-samples-testing-docker" +} + +# Download secrets for samples +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/python-docs-samples" + +# Download trampoline resources. +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" + +# Use the trampoline script to run in docker. +build_file: "python-cloud-core/.kokoro/trampoline_v2.sh" \ No newline at end of file diff --git a/.kokoro/samples/python3.10/continuous.cfg b/.kokoro/samples/python3.10/continuous.cfg new file mode 100644 index 0000000..a1c8d97 --- /dev/null +++ b/.kokoro/samples/python3.10/continuous.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} \ No newline at end of file diff --git a/.kokoro/samples/python3.10/periodic-head.cfg b/.kokoro/samples/python3.10/periodic-head.cfg new file mode 100644 index 0000000..f9e9e94 --- /dev/null +++ b/.kokoro/samples/python3.10/periodic-head.cfg @@ -0,0 +1,11 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/python-cloud-core/.kokoro/test-samples-against-head.sh" +} diff --git a/.kokoro/samples/python3.10/periodic.cfg b/.kokoro/samples/python3.10/periodic.cfg new file mode 100644 index 0000000..71cd1e5 --- /dev/null +++ b/.kokoro/samples/python3.10/periodic.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "False" +} diff --git a/.kokoro/samples/python3.10/presubmit.cfg b/.kokoro/samples/python3.10/presubmit.cfg new file mode 100644 index 0000000..a1c8d97 --- /dev/null +++ b/.kokoro/samples/python3.10/presubmit.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bd179a..01e2c7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ [1]: https://pypi.org/project/google-cloud-core/#history +## [2.2.0](https://www.github.com/googleapis/python-cloud-core/compare/v2.1.0...v2.2.0) (2021-11-09) + + +### Features + +* add mypy checking + 'py.typed' files ([#149](https://www.github.com/googleapis/python-cloud-core/issues/149)) ([f20ef60](https://www.github.com/googleapis/python-cloud-core/commit/f20ef60abaff13520d2e7b9719741746bd0d1c7b)) ## [2.1.0](https://www.github.com/googleapis/python-cloud-core/compare/v2.0.0...v2.1.0) (2021-10-05) diff --git a/google/__init__.py b/google/__init__.py index 0d0a4c3..70a7bd9 100644 --- a/google/__init__.py +++ b/google/__init__.py @@ -21,4 +21,4 @@ except ImportError: import pkgutil - __path__ = pkgutil.extend_path(__path__, __name__) + __path__ = pkgutil.extend_path(__path__, __name__) # type: ignore diff --git a/google/cloud/__init__.py b/google/cloud/__init__.py index f281ec0..ef78099 100644 --- a/google/cloud/__init__.py +++ b/google/cloud/__init__.py @@ -21,4 +21,4 @@ except ImportError: import pkgutil - __path__ = pkgutil.extend_path(__path__, __name__) + __path__ = pkgutil.extend_path(__path__, __name__) # type: ignore diff --git a/google/cloud/_helpers.py b/google/cloud/_helpers/__init__.py similarity index 99% rename from google/cloud/_helpers.py rename to google/cloud/_helpers/__init__.py index d8f2851..291f587 100644 --- a/google/cloud/_helpers.py +++ b/google/cloud/_helpers/__init__.py @@ -25,6 +25,7 @@ import os import re from threading import local as Local +from typing import Union import google.auth import google.auth.transport.requests @@ -62,6 +63,7 @@ ) # NOTE: Catching this ImportError is a workaround for GAE not supporting the # "pwd" module which is imported lazily when "expanduser" is called. +_USER_ROOT: Union[str, None] try: _USER_ROOT = os.path.expanduser("~") except ImportError: # pragma: NO COVER diff --git a/google/cloud/_helpers/py.typed b/google/cloud/_helpers/py.typed new file mode 100644 index 0000000..dfc5374 --- /dev/null +++ b/google/cloud/_helpers/py.typed @@ -0,0 +1,2 @@ +# Marker file for PEP 561. +# This package uses inline types. diff --git a/google/cloud/_http.py b/google/cloud/_http/__init__.py similarity index 100% rename from google/cloud/_http.py rename to google/cloud/_http/__init__.py diff --git a/google/cloud/_http/py.typed b/google/cloud/_http/py.typed new file mode 100644 index 0000000..dfc5374 --- /dev/null +++ b/google/cloud/_http/py.typed @@ -0,0 +1,2 @@ +# Marker file for PEP 561. +# This package uses inline types. diff --git a/google/cloud/_testing.py b/google/cloud/_testing/__init__.py similarity index 100% rename from google/cloud/_testing.py rename to google/cloud/_testing/__init__.py diff --git a/google/cloud/_testing/py.typed b/google/cloud/_testing/py.typed new file mode 100644 index 0000000..dfc5374 --- /dev/null +++ b/google/cloud/_testing/py.typed @@ -0,0 +1,2 @@ +# Marker file for PEP 561. +# This package uses inline types. diff --git a/google/cloud/client.py b/google/cloud/client/__init__.py similarity index 99% rename from google/cloud/client.py rename to google/cloud/client/__init__.py index e058c2d..b3ca4b8 100644 --- a/google/cloud/client.py +++ b/google/cloud/client/__init__.py @@ -18,6 +18,8 @@ import json import os from pickle import PicklingError +from typing import Tuple +from typing import Union import google.api_core.client_options import google.api_core.exceptions @@ -142,7 +144,7 @@ class Client(_ClientFactoryMixin): to acquire default credentials. """ - SCOPE = None + SCOPE: Union[Tuple[str], None] = None """The scopes required for authenticating with a service. Needs to be set by subclasses. diff --git a/google/cloud/client/py.typed b/google/cloud/client/py.typed new file mode 100644 index 0000000..dfc5374 --- /dev/null +++ b/google/cloud/client/py.typed @@ -0,0 +1,2 @@ +# Marker file for PEP 561. +# This package uses inline types. diff --git a/google/cloud/environment_vars.py b/google/cloud/environment_vars/__init__.py similarity index 100% rename from google/cloud/environment_vars.py rename to google/cloud/environment_vars/__init__.py diff --git a/google/cloud/environment_vars/py.typed b/google/cloud/environment_vars/py.typed new file mode 100644 index 0000000..dfc5374 --- /dev/null +++ b/google/cloud/environment_vars/py.typed @@ -0,0 +1,2 @@ +# Marker file for PEP 561. +# This package uses inline types. diff --git a/google/cloud/exceptions.py b/google/cloud/exceptions/__init__.py similarity index 100% rename from google/cloud/exceptions.py rename to google/cloud/exceptions/__init__.py diff --git a/google/cloud/exceptions/py.typed b/google/cloud/exceptions/py.typed new file mode 100644 index 0000000..dfc5374 --- /dev/null +++ b/google/cloud/exceptions/py.typed @@ -0,0 +1,2 @@ +# Marker file for PEP 561. +# This package uses inline types. diff --git a/google/cloud/obsolete.py b/google/cloud/obsolete/__init__.py similarity index 100% rename from google/cloud/obsolete.py rename to google/cloud/obsolete/__init__.py diff --git a/google/cloud/obsolete/py.typed b/google/cloud/obsolete/py.typed new file mode 100644 index 0000000..dfc5374 --- /dev/null +++ b/google/cloud/obsolete/py.typed @@ -0,0 +1,2 @@ +# Marker file for PEP 561. +# This package uses inline types. diff --git a/google/cloud/operation.py b/google/cloud/operation/__init__.py similarity index 99% rename from google/cloud/operation.py rename to google/cloud/operation/__init__.py index 28ac8cf..4fd1f27 100644 --- a/google/cloud/operation.py +++ b/google/cloud/operation/__init__.py @@ -14,13 +14,15 @@ """Wrap long-running operations returned from Google Cloud APIs.""" +from typing import Dict + from google.longrunning import operations_pb2 from google.protobuf import json_format _GOOGLE_APIS_PREFIX = "type.googleapis.com" -_TYPE_URL_MAP = {} +_TYPE_URL_MAP: Dict[str, type] = {} def _compute_type_url(klass, prefix=_GOOGLE_APIS_PREFIX): diff --git a/google/cloud/operation/py.typed b/google/cloud/operation/py.typed new file mode 100644 index 0000000..dfc5374 --- /dev/null +++ b/google/cloud/operation/py.typed @@ -0,0 +1,2 @@ +# Marker file for PEP 561. +# This package uses inline types. diff --git a/google/cloud/version.py b/google/cloud/version.py index 8b5d332..bd0f8e5 100644 --- a/google/cloud/version.py +++ b/google/cloud/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.1.0" +__version__ = "2.2.0" diff --git a/mypy.ini b/mypy.ini new file mode 100644 index 0000000..5663b40 --- /dev/null +++ b/mypy.ini @@ -0,0 +1,7 @@ +[mypy] +python_version = 3.6 +namespace_packages = True +ignore_missing_imports = True + +[mypy-google.protobuf] +ignore_missing_imports = True diff --git a/noxfile.py b/noxfile.py index c29d0f3..8fc781f 100644 --- a/noxfile.py +++ b/noxfile.py @@ -38,6 +38,16 @@ def lint(session): session.run("flake8", "google", "tests") +@nox.session(python=DEFAULT_PYTHON_VERSION) +def mypy(session): + """Run type-checking.""" + session.install(".", "mypy") + session.install( + "types-setuptools", "types-requests", "types-mock", "types-protobuf", + ) + session.run("mypy", "google", "tests") + + @nox.session(python=DEFAULT_PYTHON_VERSION) def blacken(session): """Run black.