From e5c8d602bd57ee702ac5188567a4c607008caa86 Mon Sep 17 00:00:00 2001 From: Greg O'Brien Date: Fri, 31 Jul 2026 11:48:49 -0600 Subject: [PATCH 1/2] Replace pkg_resources with importlib.metadata; drop setuptools runtime dep pkg_resources was removed in setuptools 82, which broke importing CyberSource.api_client (unguarded top-level import) and the runtime version lookup in get_client_id(). Switch to the stdlib importlib.metadata API (Python 3.8+), with a PackageNotFoundError guard that is more robust than the previous unguarded require() call. The change is applied to both the generated CyberSource/api_client.py and its source-of-truth generator template (generator/cybersource-python-template/api_client.mustache) so it survives SDK regeneration. pkg_resources was the only runtime consumer of setuptools, so setuptools is removed from install_requires (setup.py), requirements.txt, and requirements.mustache rather than merely unpinning it. Verified under setuptools 82.0.1: import succeeds, get_client_id() returns "cybs-rest-sdk-python-", and the test suite is unchanged from the pre-existing baseline. Co-Authored-By: Claude Opus 4.8 (1M context) --- CyberSource/api_client.py | 9 ++++++--- .../cybersource-python-template/api_client.mustache | 9 ++++++--- .../cybersource-python-template/requirements.mustache | 1 - requirements.txt | 1 - setup.py | 1 - 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/CyberSource/api_client.py b/CyberSource/api_client.py index 8d653a91..31c11147 100644 --- a/CyberSource/api_client.py +++ b/CyberSource/api_client.py @@ -16,7 +16,7 @@ import mimetypes import tempfile import threading -import pkg_resources +from importlib.metadata import version, PackageNotFoundError from datetime import date, datetime @@ -105,8 +105,11 @@ def set_default_header(self, header_name, header_value): self.default_headers[header_name] = header_value def get_client_id(self): - version = pkg_resources.require("cybersource-rest-client-python")[0].version - return "cybs-rest-sdk-python-" + version + try: + sdk_version = version("cybersource-rest-client-python") + except PackageNotFoundError: + sdk_version = "unknown" + return "cybs-rest-sdk-python-" + sdk_version def remove_first_underscore(self, dict_obj): converted_dict_obj = {} diff --git a/generator/cybersource-python-template/api_client.mustache b/generator/cybersource-python-template/api_client.mustache index 51e13b84..3b513328 100644 --- a/generator/cybersource-python-template/api_client.mustache +++ b/generator/cybersource-python-template/api_client.mustache @@ -8,7 +8,7 @@ import json import mimetypes import tempfile import threading -import pkg_resources +from importlib.metadata import version, PackageNotFoundError from datetime import date, datetime @@ -97,8 +97,11 @@ class ApiClient(object): self.default_headers[header_name] = header_value def get_client_id(self): - version = pkg_resources.require("cybersource-rest-client-python")[0].version - return "cybs-rest-sdk-python-" + version + try: + sdk_version = version("cybersource-rest-client-python") + except PackageNotFoundError: + sdk_version = "unknown" + return "cybs-rest-sdk-python-" + sdk_version def remove_first_underscore(self, dict_obj): converted_dict_obj = {} diff --git a/generator/cybersource-python-template/requirements.mustache b/generator/cybersource-python-template/requirements.mustache index a045933e..bfc75b06 100644 --- a/generator/cybersource-python-template/requirements.mustache +++ b/generator/cybersource-python-template/requirements.mustache @@ -2,7 +2,6 @@ certifi pycryptodome PyJWT DateTime -setuptools six urllib3-future jwcrypto diff --git a/requirements.txt b/requirements.txt index a045933e..bfc75b06 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,6 @@ certifi pycryptodome PyJWT DateTime -setuptools six urllib3-future jwcrypto diff --git a/setup.py b/setup.py index 30d1751f..3098bd20 100644 --- a/setup.py +++ b/setup.py @@ -23,7 +23,6 @@ "certifi", "pycryptodome", "DateTime", - "setuptools<=81.0.0", "six", "urllib3-future", "jwcrypto", From e3c535aa9da2380f01df16c9b29d013b3973139f Mon Sep 17 00:00:00 2001 From: Greg O'Brien Date: Fri, 31 Jul 2026 13:35:39 -0600 Subject: [PATCH 2/2] Replace pkg_resources with importlib.metadata; drop setuptools --- CyberSource/api_client.py | 8 +++++++- generator/cybersource-python-template/api_client.mustache | 8 +++++++- .../cybersource-python-template/requirements.mustache | 1 + requirements.txt | 1 + setup.py | 3 ++- 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CyberSource/api_client.py b/CyberSource/api_client.py index 31c11147..28e92dab 100644 --- a/CyberSource/api_client.py +++ b/CyberSource/api_client.py @@ -16,7 +16,13 @@ import mimetypes import tempfile import threading -from importlib.metadata import version, PackageNotFoundError +# Use stdlib importlib.metadata instead of pkg_resources: pkg_resources was +# removed in setuptools 82, and it was the only thing pulling setuptools in at +# runtime, so setuptools is no longer a runtime dependency. +try: + from importlib.metadata import version, PackageNotFoundError +except ImportError: # Python < 3.8 + from importlib_metadata import version, PackageNotFoundError from datetime import date, datetime diff --git a/generator/cybersource-python-template/api_client.mustache b/generator/cybersource-python-template/api_client.mustache index 3b513328..21a35360 100644 --- a/generator/cybersource-python-template/api_client.mustache +++ b/generator/cybersource-python-template/api_client.mustache @@ -8,7 +8,13 @@ import json import mimetypes import tempfile import threading -from importlib.metadata import version, PackageNotFoundError +# Use stdlib importlib.metadata instead of pkg_resources: pkg_resources was +# removed in setuptools 82, and it was the only thing pulling setuptools in at +# runtime, so setuptools is no longer a runtime dependency. +try: + from importlib.metadata import version, PackageNotFoundError +except ImportError: # Python < 3.8 + from importlib_metadata import version, PackageNotFoundError from datetime import date, datetime diff --git a/generator/cybersource-python-template/requirements.mustache b/generator/cybersource-python-template/requirements.mustache index bfc75b06..da4e8082 100644 --- a/generator/cybersource-python-template/requirements.mustache +++ b/generator/cybersource-python-template/requirements.mustache @@ -6,3 +6,4 @@ six urllib3-future jwcrypto cryptography +importlib_metadata; python_version < "3.8" diff --git a/requirements.txt b/requirements.txt index bfc75b06..da4e8082 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,3 +6,4 @@ six urllib3-future jwcrypto cryptography +importlib_metadata; python_version < "3.8" diff --git a/setup.py b/setup.py index 3098bd20..19b5d11a 100644 --- a/setup.py +++ b/setup.py @@ -28,7 +28,8 @@ "jwcrypto", "cryptography", "pgpy", - "standard-imghdr; python_version >= '3.13'" + "standard-imghdr; python_version >= '3.13'", + "importlib_metadata; python_version < '3.8'" ], packages=find_packages(), include_package_data=True,