Skip to content

Commit 200251a

Browse files
authored
Merge pull request #13749 from sbidoul/use-packaging-pylock-sbi
Use packaging 26.0 pylock
2 parents e9dc2fb + 1d38178 commit 200251a

File tree

3 files changed

+124
-192
lines changed

3 files changed

+124
-192
lines changed

src/pip/_internal/commands/lock.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,22 @@
22
from optparse import Values
33
from pathlib import Path
44

5+
from pip._vendor import tomli_w
6+
from pip._vendor.packaging.pylock import is_valid_pylock_path
7+
58
from pip._internal.cache import WheelCache
69
from pip._internal.cli import cmdoptions
710
from pip._internal.cli.req_command import (
811
RequirementCommand,
912
with_cleanup,
1013
)
1114
from pip._internal.cli.status_codes import SUCCESS
12-
from pip._internal.models.pylock import Pylock, is_valid_pylock_file_name
1315
from pip._internal.operations.build.build_tracker import get_build_tracker
1416
from pip._internal.utils.logging import getLogger
1517
from pip._internal.utils.misc import (
1618
get_pip_version,
1719
)
20+
from pip._internal.utils.pylock import pylock_from_install_requirements
1821
from pip._internal.utils.temp_dir import TempDirectory
1922

2023
logger = getLogger(__name__)
@@ -151,15 +154,16 @@ def run(self, options: Values, args: list[str]) -> int:
151154
base_dir = Path.cwd()
152155
else:
153156
output_file_path = Path(options.output_file)
154-
if not is_valid_pylock_file_name(output_file_path):
157+
if not is_valid_pylock_path(output_file_path):
155158
logger.warning(
156159
"%s is not a valid lock file name.",
157160
output_file_path,
158161
)
159162
base_dir = output_file_path.parent
160-
pylock_toml = Pylock.from_install_requirements(
163+
pylock = pylock_from_install_requirements(
161164
requirement_set.requirements.values(), base_dir=base_dir
162-
).as_toml()
165+
)
166+
pylock_toml = tomli_w.dumps(pylock.to_dict())
163167
if options.output_file == "-":
164168
sys.stdout.write(pylock_toml)
165169
else:

src/pip/_internal/models/pylock.py

Lines changed: 0 additions & 188 deletions
This file was deleted.

src/pip/_internal/utils/pylock.py

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
from collections.abc import Iterable
2+
from pathlib import Path
3+
4+
from pip._vendor.packaging.pylock import (
5+
Package,
6+
PackageArchive,
7+
PackageDirectory,
8+
PackageSdist,
9+
PackageVcs,
10+
PackageWheel,
11+
Pylock,
12+
)
13+
from pip._vendor.packaging.version import Version
14+
15+
from pip._internal.models.direct_url import ArchiveInfo, DirInfo, VcsInfo
16+
from pip._internal.models.link import Link
17+
from pip._internal.req.req_install import InstallRequirement
18+
from pip._internal.utils.urls import url_to_path
19+
20+
21+
def _pylock_package_from_install_requirement(
22+
ireq: InstallRequirement, base_dir: Path
23+
) -> Package:
24+
base_dir = base_dir.resolve()
25+
dist = ireq.get_dist()
26+
download_info = ireq.download_info
27+
assert download_info
28+
package_version = None
29+
package_vcs = None
30+
package_directory = None
31+
package_archive = None
32+
package_sdist = None
33+
package_wheels = None
34+
if ireq.is_direct:
35+
if isinstance(download_info.info, VcsInfo):
36+
package_vcs = PackageVcs(
37+
type=download_info.info.vcs,
38+
url=download_info.url,
39+
path=None,
40+
requested_revision=download_info.info.requested_revision,
41+
commit_id=download_info.info.commit_id,
42+
subdirectory=download_info.subdirectory,
43+
)
44+
elif isinstance(download_info.info, DirInfo):
45+
package_directory = PackageDirectory(
46+
path=(
47+
Path(url_to_path(download_info.url))
48+
.resolve()
49+
.relative_to(base_dir)
50+
.as_posix()
51+
),
52+
editable=(
53+
download_info.info.editable if download_info.info.editable else None
54+
),
55+
subdirectory=download_info.subdirectory,
56+
)
57+
elif isinstance(download_info.info, ArchiveInfo):
58+
if not download_info.info.hashes:
59+
raise NotImplementedError()
60+
package_archive = PackageArchive(
61+
url=download_info.url,
62+
path=None,
63+
hashes=download_info.info.hashes,
64+
subdirectory=download_info.subdirectory,
65+
)
66+
else:
67+
# should never happen
68+
raise NotImplementedError()
69+
else:
70+
package_version = dist.version
71+
if isinstance(download_info.info, ArchiveInfo):
72+
if not download_info.info.hashes:
73+
raise NotImplementedError()
74+
link = Link(download_info.url)
75+
if link.is_wheel:
76+
package_wheels = [
77+
PackageWheel(
78+
name=link.filename,
79+
url=download_info.url,
80+
hashes=download_info.info.hashes,
81+
)
82+
]
83+
else:
84+
package_sdist = PackageSdist(
85+
name=link.filename,
86+
url=download_info.url,
87+
hashes=download_info.info.hashes,
88+
)
89+
else:
90+
# should never happen
91+
raise NotImplementedError()
92+
return Package(
93+
name=dist.canonical_name,
94+
version=package_version,
95+
vcs=package_vcs,
96+
directory=package_directory,
97+
archive=package_archive,
98+
sdist=package_sdist,
99+
wheels=package_wheels,
100+
)
101+
102+
103+
def pylock_from_install_requirements(
104+
install_requirements: Iterable[InstallRequirement], base_dir: Path
105+
) -> Pylock:
106+
return Pylock(
107+
lock_version=Version("1.0"),
108+
created_by="pip",
109+
packages=sorted(
110+
(
111+
_pylock_package_from_install_requirement(ireq, base_dir)
112+
for ireq in install_requirements
113+
),
114+
key=lambda p: p.name,
115+
),
116+
)

0 commit comments

Comments
 (0)