From 8e9f0bef3ad042ba93d46a9ff0f5a7a0fd1ced16 Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Wed, 29 Nov 2023 17:02:16 -0500 Subject: [PATCH] feat: Introduce compatibility with native namespace packages (#232) * feat: Introduce compatibility with native namespace packages * Add missing files * lint --- google/cloud/__init__.py | 22 ------------ google/cloud/dns/__init__.py | 6 +--- google/{__init__.py => cloud/dns/version.py} | 14 +++----- setup.py | 24 +++++++------ tests/unit/test_packaging.py | 37 ++++++++++++++++++++ 5 files changed, 56 insertions(+), 47 deletions(-) delete mode 100644 google/cloud/__init__.py rename google/{__init__.py => cloud/dns/version.py} (73%) create mode 100644 tests/unit/test_packaging.py diff --git a/google/cloud/__init__.py b/google/cloud/__init__.py deleted file mode 100644 index 0e1bc51..0000000 --- a/google/cloud/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright 2016 Google LLC -# -# 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. - -try: - import pkg_resources - - pkg_resources.declare_namespace(__name__) -except ImportError: - import pkgutil - - __path__ = pkgutil.extend_path(__path__, __name__) diff --git a/google/cloud/dns/__init__.py b/google/cloud/dns/__init__.py index dc3754e..d26ba70 100644 --- a/google/cloud/dns/__init__.py +++ b/google/cloud/dns/__init__.py @@ -24,11 +24,7 @@ (adding/deleting resource record sets) to a zone. """ - -from pkg_resources import get_distribution - -__version__ = get_distribution("google-cloud-dns").version - +from google.cloud.dns.version import __version__ from google.cloud.dns.zone import Changes from google.cloud.dns.client import Client from google.cloud.dns.zone import ManagedZone diff --git a/google/__init__.py b/google/cloud/dns/version.py similarity index 73% rename from google/__init__.py rename to google/cloud/dns/version.py index 0e1bc51..a8a437c 100644 --- a/google/__init__.py +++ b/google/cloud/dns/version.py @@ -1,4 +1,5 @@ -# Copyright 2016 Google LLC +# -*- coding: utf-8 -*- +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -11,12 +12,5 @@ # 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. - -try: - import pkg_resources - - pkg_resources.declare_namespace(__name__) -except ImportError: - import pkgutil - - __path__ = pkgutil.extend_path(__path__, __name__) +# +__version__ = "0.34.2" diff --git a/setup.py b/setup.py index 9c123db..eb2be22 100644 --- a/setup.py +++ b/setup.py @@ -14,6 +14,7 @@ import io import os +import re import setuptools @@ -22,7 +23,16 @@ name = "google-cloud-dns" description = "Google Cloud DNS API client library" -version = "0.34.2" + +package_root = os.path.abspath(os.path.dirname(__file__)) + +version = None + +with open(os.path.join(package_root, "google/cloud/dns/version.py")) as fp: + version_candidates = re.findall(r"(?<=\")\d+.\d+.\d+(?=\")", fp.read()) + assert len(version_candidates) == 1 + version = version_candidates[0] + # Should be one of: # 'Development Status :: 3 - Alpha' # 'Development Status :: 4 - Beta' @@ -39,7 +49,6 @@ # Setup boilerplate below this line. -package_root = os.path.abspath(os.path.dirname(__file__)) readme_filename = os.path.join(package_root, "README.rst") with io.open(readme_filename, encoding="utf-8") as readme_file: @@ -48,15 +57,11 @@ # Only include packages under the 'google' namespace. Do not include tests, # benchmarks, etc. packages = [ - package for package in setuptools.find_packages() if package.startswith("google") + package + for package in setuptools.find_namespace_packages() + if package.startswith("google") ] -# Determine which namespaces are needed. -namespaces = ["google"] -if "google.cloud" in packages: - namespaces.append("google.cloud") - - setuptools.setup( name=name, version=version, @@ -81,7 +86,6 @@ ], platforms="Posix; MacOS X; Windows", packages=packages, - namespace_packages=namespaces, install_requires=dependencies, extras_require=extras, python_requires=">=3.7", diff --git a/tests/unit/test_packaging.py b/tests/unit/test_packaging.py new file mode 100644 index 0000000..c9adb6e --- /dev/null +++ b/tests/unit/test_packaging.py @@ -0,0 +1,37 @@ +# Copyright 2023 Google LLC +# +# 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 os +import subprocess +import sys + + +def test_namespace_package_compat(tmp_path): + # The ``google`` namespace package should not be masked + # by the presence of ``google-cloud-dns``. + google = tmp_path / "google" + google.mkdir() + google.joinpath("othermod.py").write_text("") + env = dict(os.environ, PYTHONPATH=str(tmp_path)) + cmd = [sys.executable, "-m", "google.othermod"] + subprocess.check_call(cmd, env=env) + + # The ``google.cloud`` namespace package should not be masked + # by the presence of ``google-cloud-dns``. + google_cloud = tmp_path / "google" / "cloud" + google_cloud.mkdir() + google_cloud.joinpath("othermod.py").write_text("") + env = dict(os.environ, PYTHONPATH=str(tmp_path)) + cmd = [sys.executable, "-m", "google.cloud.othermod"] + subprocess.check_call(cmd, env=env)