Skip to content

Commit 3688faa

Browse files
committed
pylock: support package.marker
1 parent 9038de0 commit 3688faa

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

src/pip/_internal/models/pylock.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
)
1818

1919
from pip._vendor import tomli_w
20+
from pip._vendor.packaging.markers import InvalidMarker, Marker
2021
from pip._vendor.packaging.version import InvalidVersion, Version
2122
from pip._vendor.typing_extensions import Self
2223

@@ -48,7 +49,7 @@ def _toml_key(key: str) -> str:
4849

4950

5051
def _toml_value(value: T) -> Union[str, T]:
51-
if isinstance(value, Version):
52+
if isinstance(value, (Version, Marker)):
5253
return str(value)
5354
return value
5455

@@ -98,6 +99,16 @@ def _get_required_version(d: Dict[str, Any], key: str) -> Version:
9899
return value
99100

100101

102+
def _get_marker(d: Dict[str, Any], key: str) -> Optional[Marker]:
103+
value = _get(d, str, key)
104+
if value is None:
105+
return None
106+
try:
107+
return Marker(value)
108+
except InvalidMarker:
109+
raise PylockValidationError(f"invalid marker {value!r}")
110+
111+
101112
def _get_object(
102113
d: Dict[str, Any], expected_type: Type[PylockDataClassT], key: str
103114
) -> Optional[PylockDataClassT]:
@@ -274,7 +285,7 @@ def from_dict(cls, d: Dict[str, Any]) -> Self:
274285
class Package:
275286
name: str
276287
version: Optional[Version] = None
277-
# (not supported) marker: Optional[str]
288+
marker: Optional[Marker] = None
278289
# (not supported) requires_python: Optional[str]
279290
# (not supported) dependencies
280291
vcs: Optional[PackageVcs] = None
@@ -296,6 +307,7 @@ def from_dict(cls, d: Dict[str, Any]) -> Self:
296307
package = cls(
297308
name=_get_required(d, str, "name"),
298309
version=_get_version(d, "version"),
310+
marker=_get_marker(d, "marker"),
299311
vcs=_get_object(d, PackageVcs, "vcs"),
300312
directory=_get_object(d, PackageDirectory, "directory"),
301313
archive=_get_object(d, PackageArchive, "archive"),
@@ -381,6 +393,7 @@ def from_install_requirement(cls, ireq: InstallRequirement, base_dir: Path) -> S
381393
return cls(
382394
name=dist.canonical_name,
383395
version=package_version,
396+
marker=None,
384397
vcs=package_vcs,
385398
directory=package_directory,
386399
archive=package_archive,

tests/unit/test_pylock.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import pytest
22

3+
from pip._vendor.packaging.markers import Marker
4+
from pip._vendor.packaging.version import Version
5+
36
from pip._internal.models.pylock import (
47
Pylock,
58
PylockRequiredKeyError,
@@ -80,3 +83,26 @@ def test_pylock_packages_without_dist() -> None:
8083
str(exc_info.value)
8184
== "Exactly one of vcs, directory, archive, sdist, wheels must be set"
8285
)
86+
87+
88+
def test_pylock_basic_package() -> None:
89+
data = {
90+
"lock-version": "1.0",
91+
"created-by": "pip",
92+
"packages": [
93+
{
94+
"name": "example",
95+
"version": "1.0",
96+
"marker": 'os_name == "posix"',
97+
"directory": {
98+
"path": ".",
99+
"editable": False,
100+
},
101+
}
102+
],
103+
}
104+
pylock = Pylock.from_dict(data)
105+
package = pylock.packages[0]
106+
assert package.version == Version("1.0")
107+
assert package.marker == Marker('os_name == "posix"')
108+
assert pylock.to_dict() == data

0 commit comments

Comments
 (0)