From d9ee877980fee21a789c22b0a7a5d903d15f7b60 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 8 Oct 2021 17:16:35 +0000 Subject: [PATCH 1/5] chore(python): Add kokoro configs for python 3.10 samples testing (#147) --- .github/.OwlBot.lock.yaml | 2 +- .kokoro/samples/python3.10/common.cfg | 40 ++++++++++++++++++++ .kokoro/samples/python3.10/continuous.cfg | 6 +++ .kokoro/samples/python3.10/periodic-head.cfg | 11 ++++++ .kokoro/samples/python3.10/periodic.cfg | 6 +++ .kokoro/samples/python3.10/presubmit.cfg | 6 +++ 6 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 .kokoro/samples/python3.10/common.cfg create mode 100644 .kokoro/samples/python3.10/continuous.cfg create mode 100644 .kokoro/samples/python3.10/periodic-head.cfg create mode 100644 .kokoro/samples/python3.10/periodic.cfg create mode 100644 .kokoro/samples/python3.10/presubmit.cfg diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index ee94722..7d98291 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:58f73ba196b5414782605236dd0712a73541b44ff2ff4d3a36ec41092dd6fa5b 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 From 35d78d018977fa33f425368df4b3c5f8ef254579 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Mon, 25 Oct 2021 16:58:01 -0400 Subject: [PATCH 2/5] chore(python): push cloud library docs to staging bucket for Cloud RAD (#150) Source-Link: https://github.com/googleapis/synthtool/commit/7fd61f8efae782a7cfcecc599faf52f9737fe584 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:4ee57a76a176ede9087c14330c625a71553cf9c72828b2c0ca12f5338171ba60 Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 2 +- .kokoro/docs/common.cfg | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 7d98291..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:58f73ba196b5414782605236dd0712a73541b44ff2ff4d3a36ec41092dd6fa5b + 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" } From f20ef60abaff13520d2e7b9719741746bd0d1c7b Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Tue, 9 Nov 2021 10:46:21 -0500 Subject: [PATCH 3/5] fix: add mypy checking + 'py.typed' files (#149) * ci: add mypy checking * chore: add py.typed file. * chore: use DEFAULT_PYTHON_VERSION to run mypy * fix: add typing for 'Client.SCOPE' * fix: cannot have 'py.typed' in the namespace package dir * chore: make top-level modules in 'google/core' into packages FBO typing, which interprets 'py.typed' file as always-inherited in subdirs. * chore: back out converson of 'version.py' to a package Our 'release-please' tooling won't find it there, and nobody is likely to a) import the module, and then b) choke on its lack of typing. * chore: fix thinko --- .coveragerc | 4 ++-- google/__init__.py | 2 +- google/cloud/__init__.py | 2 +- google/cloud/{_helpers.py => _helpers/__init__.py} | 2 ++ google/cloud/_helpers/py.typed | 2 ++ google/cloud/{_http.py => _http/__init__.py} | 0 google/cloud/_http/py.typed | 2 ++ google/cloud/{_testing.py => _testing/__init__.py} | 0 google/cloud/_testing/py.typed | 2 ++ google/cloud/{client.py => client/__init__.py} | 4 +++- google/cloud/client/py.typed | 2 ++ .../__init__.py} | 0 google/cloud/environment_vars/py.typed | 2 ++ google/cloud/{exceptions.py => exceptions/__init__.py} | 0 google/cloud/exceptions/py.typed | 2 ++ google/cloud/{obsolete.py => obsolete/__init__.py} | 0 google/cloud/obsolete/py.typed | 2 ++ google/cloud/{operation.py => operation/__init__.py} | 4 +++- google/cloud/operation/py.typed | 2 ++ mypy.ini | 7 +++++++ noxfile.py | 10 ++++++++++ 21 files changed, 45 insertions(+), 6 deletions(-) rename google/cloud/{_helpers.py => _helpers/__init__.py} (99%) create mode 100644 google/cloud/_helpers/py.typed rename google/cloud/{_http.py => _http/__init__.py} (100%) create mode 100644 google/cloud/_http/py.typed rename google/cloud/{_testing.py => _testing/__init__.py} (100%) create mode 100644 google/cloud/_testing/py.typed rename google/cloud/{client.py => client/__init__.py} (99%) create mode 100644 google/cloud/client/py.typed rename google/cloud/{environment_vars.py => environment_vars/__init__.py} (100%) create mode 100644 google/cloud/environment_vars/py.typed rename google/cloud/{exceptions.py => exceptions/__init__.py} (100%) create mode 100644 google/cloud/exceptions/py.typed rename google/cloud/{obsolete.py => obsolete/__init__.py} (100%) create mode 100644 google/cloud/obsolete/py.typed rename google/cloud/{operation.py => operation/__init__.py} (99%) create mode 100644 google/cloud/operation/py.typed create mode 100644 mypy.ini 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/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/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. From a389fb28e05060764aff674f1af6aba1cfd1807e Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Tue, 9 Nov 2021 12:03:28 -0500 Subject: [PATCH 4/5] chore: bump to semver minor (#153) Release-As: 2.2.0 From debb93af61c4670b0aca1e1230b28ba372127dda Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 9 Nov 2021 12:15:10 -0500 Subject: [PATCH 5/5] chore: release 2.2.0 (#154) --- CHANGELOG.md | 6 ++++++ google/cloud/version.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) 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/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"