Skip to content

Commit 00fcd5c

Browse files
authored
Remove all usage of pkg_resources (#41701)
* remove all usage of deprecating pkg_resources except for within `common/smoketest/dependencies.py` and `scripts/devops_tasks/common_tasks.py` * a follow-up PR will resolve those two files
1 parent b15a96a commit 00fcd5c

18 files changed

+57
-67
lines changed

eng/tox/install_depend_packages.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313

1414
from subprocess import check_call
1515
from typing import TYPE_CHECKING, Callable, Optional
16-
from pkg_resources import parse_version, Requirement
1716
from pypi_tools.pypi import PyPIClient
1817
from packaging.specifiers import SpecifierSet
1918
from packaging.version import Version
19+
from packaging.requirements import Requirement
2020

2121
from ci_tools.parsing import ParsedSetup, parse_require
2222
from ci_tools.functions import compare_python_version, handle_incompatible_minimum_dev_reqs, get_pip_command
@@ -186,7 +186,7 @@ def process_bounded_versions(originating_pkg_name: str, pkg_name: str, versions:
186186
# lower bound general
187187
if pkg_name in MINIMUM_VERSION_GENERIC_OVERRIDES:
188188
versions = [
189-
v for v in versions if parse_version(v) >= parse_version(MINIMUM_VERSION_GENERIC_OVERRIDES[pkg_name])
189+
v for v in versions if Version(v) >= Version(MINIMUM_VERSION_GENERIC_OVERRIDES[pkg_name])
190190
]
191191

192192
# lower bound platform-specific
@@ -195,7 +195,7 @@ def process_bounded_versions(originating_pkg_name: str, pkg_name: str, versions:
195195
restrictions = PLATFORM_SPECIFIC_MINIMUM_OVERRIDES[platform_bound]
196196

197197
if pkg_name in restrictions:
198-
versions = [v for v in versions if parse_version(v) >= parse_version(restrictions[pkg_name])]
198+
versions = [v for v in versions if Version(v) >= Version(restrictions[pkg_name])]
199199

200200
# lower bound package-specific
201201
if (
@@ -205,13 +205,13 @@ def process_bounded_versions(originating_pkg_name: str, pkg_name: str, versions:
205205
versions = [
206206
v
207207
for v in versions
208-
if parse_version(v) >= parse_version(MINIMUM_VERSION_SPECIFIC_OVERRIDES[originating_pkg_name][pkg_name])
208+
if Version(v) >= Version(MINIMUM_VERSION_SPECIFIC_OVERRIDES[originating_pkg_name][pkg_name])
209209
]
210210

211211
# upper bound general
212212
if pkg_name in MAXIMUM_VERSION_GENERIC_OVERRIDES:
213213
versions = [
214-
v for v in versions if parse_version(v) <= parse_version(MAXIMUM_VERSION_GENERIC_OVERRIDES[pkg_name])
214+
v for v in versions if Version(v) <= Version(MAXIMUM_VERSION_GENERIC_OVERRIDES[pkg_name])
215215
]
216216

217217
# upper bound platform
@@ -220,7 +220,7 @@ def process_bounded_versions(originating_pkg_name: str, pkg_name: str, versions:
220220
restrictions = PLATFORM_SPECIFIC_MAXIMUM_OVERRIDES[platform_bound]
221221

222222
if pkg_name in restrictions:
223-
versions = [v for v in versions if parse_version(v) <= parse_version(restrictions[pkg_name])]
223+
versions = [v for v in versions if Version(v) <= Version(restrictions[pkg_name])]
224224

225225
# upper bound package-specific
226226
if (
@@ -230,7 +230,7 @@ def process_bounded_versions(originating_pkg_name: str, pkg_name: str, versions:
230230
versions = [
231231
v
232232
for v in versions
233-
if parse_version(v) <= parse_version(MAXIMUM_VERSION_SPECIFIC_OVERRIDES[originating_pkg_name][pkg_name])
233+
if Version(v) <= Version(MAXIMUM_VERSION_SPECIFIC_OVERRIDES[originating_pkg_name][pkg_name])
234234
]
235235

236236
return versions
@@ -241,7 +241,7 @@ def process_requirement(req, dependency_type, orig_pkg_name):
241241

242242
# find package name and requirement specifier from requires
243243
requirement = parse_require(req)
244-
pkg_name = requirement.key
244+
pkg_name = requirement.name
245245
spec = requirement.specifier if len(requirement.specifier) else None
246246

247247
# Filter out requirements with environment markers that don't match the current environment
@@ -334,7 +334,7 @@ def filter_dev_requirements(
334334
# filter out any package available on PyPI (released_packages)
335335
# include packages without relative reference and packages not available on PyPI
336336
released_packages = [parse_require(p) for p in released_packages]
337-
released_package_names = [p.key for p in released_packages]
337+
released_package_names = [p.name for p in released_packages]
338338
# find prebuilt whl paths in dev requiremente
339339
prebuilt_dev_reqs = [os.path.basename(req.replace("\n", "")) for req in requirements if os.path.sep in req]
340340
# filter any req if wheel is for a released package

eng/tox/prep_sphinx_env.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,7 @@
1212
import logging
1313
import shutil
1414
import argparse
15-
from pkg_resources import Requirement
16-
import ast
1715
import os
18-
import textwrap
19-
import io
2016
from tox_helper_tasks import (
2117
unzip_sdist_to_directory,
2218
move_and_rename
@@ -55,6 +51,7 @@ def should_build_docs(package_name):
5551
def create_index_file(readme_location, package_rst):
5652
readme_ext = os.path.splitext(readme_location)[1]
5753

54+
output = ""
5855
if readme_ext == ".md":
5956
with open(readme_location, "r") as file:
6057
output = file.read()

eng/tox/run_sphinx_build.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,9 @@
1212
import argparse
1313
import os
1414
import logging
15-
import sys
1615
from prep_sphinx_env import should_build_docs
1716
from run_sphinx_apidoc import is_mgmt_package
18-
from pkg_resources import Requirement
19-
import ast
2017
import os
21-
import textwrap
22-
import io
2318
import shutil
2419

2520
from ci_tools.parsing import ParsedSetup

eng/tox/verify_installed_packages.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ def verify_packages(package_file_path):
3838
for p in get_installed_packages():
3939
if "==" in p:
4040
[package, version] = p.split("==")
41-
installed[package.upper()] = version
41+
installed[package.upper().replace("_","-")] = version
4242
expected = {}
4343
for p in packages:
4444
[package, version] = p.split("==")
45-
expected[package.upper()] = version
45+
expected[package.upper().replace("_","-")] = version
4646

4747
missing_packages = [pkg for pkg in expected.keys() if installed.get(pkg) != expected.get(pkg)]
4848

scripts/devops_tasks/test_regression.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ def find_package_dependency(glob_string, repo_root_dir, dependent_service):
328328
parsed = ParsedSetup.from_path(pkg_root)
329329

330330
# Get a list of package names from install requires
331-
required_pkgs = [parse_require(r).key for r in parsed.requires]
331+
required_pkgs = [parse_require(r).name for r in parsed.requires]
332332
required_pkgs = [p for p in required_pkgs if p.startswith("azure")]
333333

334334
for req_pkg in required_pkgs:

scripts/devops_tasks/tox_harness.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from ci_tools.scenario.generation import replace_dev_reqs
2222
from ci_tools.functions import cleanup_directory
2323
from ci_tools.parsing import ParsedSetup
24-
from pkg_resources import parse_requirements, RequirementParseError
24+
from packaging.requirements import Requirement
2525
import logging
2626

2727
logging.getLogger().setLevel(logging.INFO)
@@ -58,7 +58,7 @@ def compare_req_to_injected_reqs(parsed_req, injected_packages):
5858

5959
return any(parsed_req.name in req for req in injected_packages)
6060

61-
61+
# todo: verify this code
6262
def inject_custom_reqs(file, injected_packages, package_dir):
6363
req_lines = []
6464
injected_packages = [p for p in re.split(r"[\s,]", injected_packages) if p]
@@ -69,7 +69,7 @@ def inject_custom_reqs(file, injected_packages, package_dir):
6969
for line in f:
7070
logging.info("Attempting to parse {}".format(line))
7171
try:
72-
parsed_req = [req for req in parse_requirements(line)]
72+
parsed_req = Requirement(line.strip())
7373
except Exception as e:
7474
logging.error(e)
7575
parsed_req = [None]

scripts/devops_tasks/update_regression_services.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import pdb
1010
import json
1111

12-
import pkg_resources
1312
from test_regression import find_package_dependency, AZURE_GLOB_STRING
1413

1514
from ci_tools.functions import discover_targeted_packages
@@ -85,7 +84,7 @@ def parse_service(pkg_path):
8584
print("The json file {} cannot be loaded.".format(args.json))
8685
exit(1)
8786

88-
if len(service_list) > 0:
87+
if len(service_list) > 0:
8988
settings = json.loads(settings_json)
9089
settings["matrix"]["DependentService"] = list(service_list)
9190
json_result = json.dumps(settings)

scripts/multiapi_init_gen.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,10 @@
4040
)
4141
import azure.common
4242

43-
import pkg_resources
44-
45-
pkg_resources.declare_namespace("azure")
43+
# all of the azure packages that are namespace packages have a __init__ that looks like:
44+
# __path__ = __import__("pkgutil").extend_path(__path__, __name__) # type: ignore
45+
# so we can use the namespace package without explicitly declaring a parent azure namespace. At least according
46+
# to the docs.
4647

4748
_LOGGER = logging.getLogger(__name__)
4849

sdk/core/azure-core/dev_requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ azure-data-tables
1212
opentelemetry-sdk~=1.26
1313
opentelemetry-instrumentation-requests>=0.50b0
1414
../../identity/azure-identity
15+
packaging # for version parsing in test_basic_transport_async.py

sdk/core/azure-core/tests/async_tests/test_basic_transport_async.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import sys
2727
import asyncio
2828
from unittest.mock import Mock
29-
from pkg_resources import parse_version
29+
from packaging.version import Version
3030
import aiohttp
3131

3232

@@ -1050,7 +1050,7 @@ async def test_close_too_soon_works_fine(caplog, port, http_request):
10501050

10511051

10521052
@pytest.mark.skipif(
1053-
parse_version(aiohttp.__version__) >= parse_version("3.10"),
1053+
Version(aiohttp.__version__) >= Version("3.10"),
10541054
reason="aiohttp 3.10 introduced separate connection timeout",
10551055
)
10561056
@pytest.mark.parametrize("http_request", HTTP_REQUESTS)
@@ -1073,7 +1073,7 @@ async def test_aiohttp_timeout_response(http_request):
10731073

10741074

10751075
@pytest.mark.skipif(
1076-
parse_version(aiohttp.__version__) < parse_version("3.10"),
1076+
Version(aiohttp.__version__) < Version("3.10"),
10771077
reason="aiohttp 3.10 introduced separate connection timeout",
10781078
)
10791079
@pytest.mark.parametrize("http_request", HTTP_REQUESTS)

0 commit comments

Comments
 (0)