Skip to content

Commit 9519194

Browse files
authored
➖ Deprecate pkg_resources (#165)
* ➖ Deprecate pkg_resources * 🔥 Remove unnecessary wheels * Fix lint
1 parent 7357809 commit 9519194

14 files changed

Lines changed: 63 additions & 74 deletions

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ repos:
3636
'flake8-cognitive-complexity~=0.1.0',
3737
'flake8-comprehensions~=3.14.0',
3838
# 'flake8-docstrings~=1.7.0',
39-
'flake8-logging-format~=0.9.0',
39+
# 'flake8-logging-format~=0.9.0',
4040
'flake8-mutable~=1.2.0',
4141
'flake8-print~=4.0.0',
4242
'flake8-printf-formatting~=1.1.2',

README.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,11 @@ Exhaustive dependency trees without the need to install any packages ([at most b
129129
```
130130
$ pipgrip --tree pipgrip
131131
132-
pipgrip (0.12.0)
132+
pipgrip (0.13.0)
133133
├── anytree>=2.4.1 (2.13.0)
134134
├── click>=7 (8.3.1)
135135
├── packaging>=17 (26.0)
136-
├── pip>=22.2 (26.0)
137-
├── setuptools<81,>=38.3 (80.10.2)
136+
├── pip>=22.2 (26.0.1)
138137
└── wheel (0.46.3)
139138
└── packaging>=24.0 (26.0)
140139
```

requirements/prod.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
anytree>=2.4.1
22
click>=7
33
packaging>=17
4-
setuptools>=38.3,<81 # for pkg_resources ref https://github.com/pypa/setuptools/commit/9c28cdffd423f83e43dbfd39fc793c251da48585
54
wheel
65
pip>=22.2; python_version>'3.6' # >=22.2 for --dry-run --report ref ddelange/pipgrip#114
76
pip>=7.1.0; python_version<='3.6' # >=7.1.0 for --constraint

src/pipgrip/__init__.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,4 @@
3131
#
3232
# SPDX-License-Identifier: BSD-3-Clause
3333
# version based on .git/refs/tags - make a tag/release locally, or on GitHub (and pull)
34-
import warnings
35-
3634
from pipgrip._repo_version import version as __version__ # noqa:F401
37-
38-
warnings.filterwarnings(
39-
action="ignore",
40-
message=".*pkg_resources",
41-
category=UserWarning,
42-
)

src/pipgrip/cli.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
from anytree.exporter import DictExporter
4747
from packaging.markers import default_environment
4848
from packaging.requirements import InvalidRequirement
49-
from pkg_resources import RequirementParseError
5049

5150
from pipgrip import __version__
5251
from pipgrip.compat import PIP_VERSION
@@ -624,7 +623,7 @@ def main(
624623
for root_dependency in dependencies:
625624
try:
626625
source.root_dep(root_dependency)
627-
except (InvalidRequirement, RequirementParseError) as e:
626+
except InvalidRequirement as e:
628627
if skip_invalid_input:
629628
logger.warning(
630629
"Skipping invalid requirement '%s': %s", root_dependency, str(e)

src/pipgrip/compat.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@
3131
#
3232
# SPDX-License-Identifier: BSD-3-Clause
3333
import pip
34-
from pkg_resources import parse_version
34+
from packaging.version import Version
3535

3636
try:
3737
from urllib.parse import urlparse
3838
except ImportError:
3939
# Python 2
4040
from urlparse import urlparse # noqa:F401
4141

42-
PIP_VERSION = list(parse_version(pip.__version__)._version.release)
42+
PIP_VERSION = list(Version(pip.__version__).release)

src/pipgrip/libs/mixology/package.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,7 @@
3030
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3131
#
3232
# SPDX-License-Identifier: BSD-3-Clause
33-
import pkg_resources
34-
35-
from pipgrip.pipper import parse_req
33+
from pipgrip.pipper import ParsedRequirement, parse_req
3634

3735

3836
class Package(object):
@@ -52,7 +50,7 @@ def name(self): # type: () -> str
5250
return self._name
5351

5452
@property
55-
def req(self): # type: () -> pkg_resources.Requirement
53+
def req(self): # type: () -> ParsedRequirement
5654
return self._req
5755

5856
def __eq__(self, other): # type: () -> bool

src/pipgrip/pipper.py

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@
4040
import sys
4141
from tempfile import NamedTemporaryFile, mkdtemp
4242

43-
import pkg_resources
4443
from click import echo as _echo
4544
from packaging.markers import default_environment
45+
from packaging.requirements import Requirement as PkgRequirement
4646
from packaging.utils import canonicalize_name
4747

4848
from pipgrip.compat import PIP_VERSION, urlparse
@@ -65,6 +65,34 @@ def read_requirements(path):
6565
raise RuntimeError("{} is broken".format(path))
6666

6767

68+
class ParsedRequirement(object):
69+
"""Parsed requirement with attributes compatible with the old pkg_resources interface."""
70+
71+
__slots__ = (
72+
"key",
73+
"name",
74+
"extras",
75+
"extras_name",
76+
"specs",
77+
"url",
78+
"marker",
79+
"_str",
80+
)
81+
82+
def __init__(self, key, name, extras, extras_name, specs, url, marker, full_str):
83+
self.key = key
84+
self.name = name
85+
self.extras = extras
86+
self.extras_name = extras_name
87+
self.specs = specs
88+
self.url = url
89+
self.marker = marker
90+
self._str = full_str
91+
92+
def __str__(self):
93+
return self._str
94+
95+
6896
_parse_req_cache = {}
6997

7098

@@ -74,32 +102,37 @@ def parse_req(requirement, extras=None):
74102
if cache_key in _parse_req_cache:
75103
return _parse_req_cache[cache_key]
76104
if requirement == "_root_" or requirement == "." or requirement.startswith(".["):
77-
req = pkg_resources.Requirement.parse(
105+
parsed = PkgRequirement(
78106
requirement.replace(".", "rubbish", 1)
79107
if requirement.startswith(".[")
80108
else "rubbish"
81109
)
82110
if extras:
83-
req.extras = extras
84-
req.key = "." if requirement.startswith(".[") else requirement
85-
full_str = req.__str__().replace(req.name, req.key)
86-
req.name = req.key
111+
parsed.extras = extras
112+
key = "." if requirement.startswith(".[") else requirement
113+
full_str = str(parsed).replace(parsed.name, key)
87114
else:
88-
req = pkg_resources.Requirement.parse(requirement)
115+
parsed = PkgRequirement(requirement)
89116
if extras:
90-
req.extras = extras
91-
req.key = canonicalize_name(req.key)
92-
req.name = req.key
93-
full_str = req.__str__() # .replace(req.name, req.key)
117+
parsed.extras = extras
118+
key = canonicalize_name(parsed.name)
119+
full_str = str(parsed).replace(parsed.name, key, 1)
94120

95-
def __str__():
96-
return full_str
97-
98-
req.__str__ = __str__
99-
req.extras_name = (
100-
req.name + "[" + ",".join(sorted(req.extras)) + "]" if req.extras else req.name
121+
extras_frozen = frozenset(parsed.extras)
122+
extras_name = (
123+
key + "[" + ",".join(sorted(extras_frozen)) + "]" if extras_frozen else key
124+
)
125+
specs = [(s.operator, s.version) for s in parsed.specifier]
126+
req = ParsedRequirement(
127+
key=key,
128+
name=key,
129+
extras=extras_frozen,
130+
extras_name=extras_name,
131+
specs=specs,
132+
url=parsed.url,
133+
marker=parsed.marker,
134+
full_str=full_str,
101135
)
102-
req.extras = frozenset(req.extras)
103136
_parse_req_cache[cache_key] = req
104137
return req
105138

-37.7 KB
Binary file not shown.
-36 KB
Binary file not shown.

0 commit comments

Comments
 (0)