Skip to content

Commit

Permalink
fare list dependencies in lockfiles
Browse files Browse the repository at this point in the history
  • Loading branch information
Ben Avrahami committed May 15, 2024
1 parent da154c3 commit 46bb087
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 47 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
# poetry-stale-dependencies changelog
## 0.2.2
### Fixed
* can now parse lockfiles with list-dependencies

## 0.2.1
### Added
* console messages are now colored
Expand Down
3 changes: 2 additions & 1 deletion poetry_stale_dependencies/inspections.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ def inspect_is_stale(
(package_name, package_dep)
for package_name, package_specs in lock_spec.packages.items()
for package_spec in package_specs
if (package_dep := package_spec.dependencies.get(self.package)) is not None
if (package_deps := package_spec.dependencies.get(self.package)) is not None
for package_dep in package_deps
]

for group_name, group in project_spec.dependencies_groups.items():
Expand Down
48 changes: 29 additions & 19 deletions poetry_stale_dependencies/lock_spec.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,28 +39,30 @@ class PackageDependency:
marker: str | None | UnkownMarker

@classmethod
def from_raw(cls, raw: Any) -> PackageDependency | None:
def from_raw(cls, raw: object) -> PackageDependency | None:
if isinstance(raw, str):
return cls(raw, None)
if isinstance(raw, dict):
version = raw.get("version")
if version is None:
return None
raw_marker = raw.get("markers")
is_optional = raw.get("optional", False)
marker: str | None | UnkownMarker
if is_optional and raw_marker is None:
marker = unknown_marker
else:
marker = raw_marker

version = raw.get("version")
if version is None:
return None
raw_marker = raw.get("markers")
is_optional = raw.get("optional", False)
if is_optional and raw_marker is None:
marker = unknown_marker
else:
marker = raw_marker

return cls(version, marker)
return cls(version, marker)
return None


@dataclass
class PackageSpec:
version: str
source: LegacyPackageSource | None
dependencies: Mapping[PackageName, PackageDependency]
dependencies: Mapping[PackageName, Sequence[PackageDependency]]


@dataclass
Expand Down Expand Up @@ -124,13 +126,21 @@ def from_raw_v2(cls, raw: dict[str, Any], com: Command) -> LockSpec:
dependencies = {}
if raw_dependencies := package.get("dependencies"):
for dep_name, dep_raw in raw_dependencies.items():
if dep := PackageDependency.from_raw(dep_raw):
dependencies[dep_name] = dep
if isinstance(dep_raw, list):
deps_raw = dep_raw
else:
com.line_error(
f"Invalid dependency {dep_name!r} for package {name}, ignoring",
verbosity=Verbosity.NORMAL,
)
deps_raw = [dep_raw]
deps = []
for dep_raw_item in deps_raw:
if dep := PackageDependency.from_raw(dep_raw_item):
deps.append(dep)
else:
com.line_error(
f"Invalid dependency {dep_name!r} for package {name}, ignoring",
verbosity=Verbosity.NORMAL,
)
if deps:
dependencies[dep_name] = deps

packages.setdefault(to_package_name(name), []).append(PackageSpec(version, source, dependencies))
return cls(packages)
47 changes: 24 additions & 23 deletions poetry_stale_dependencies/project_spec.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,31 +15,32 @@ class ProjectDependency:
marker: str | None | UnkownMarker

@classmethod
def from_raw(cls, raw: Any) -> ProjectDependency | None:
def from_raw(cls, raw: object) -> ProjectDependency | None:
if isinstance(raw, str):
return cls(raw, None)

version = raw.get("version")
if version is None:
return None
marker_parts = []
raw_marker = raw.get("markers")
if raw_marker is not None:
marker_parts.append(raw_marker)
python = raw.get("python")
if python is not None:
marker_parts.append(f"python_version{python}")

is_optional = raw.get("optional", False)
marker: str | None | UnkownMarker
if is_optional and not marker_parts:
marker = unknown_marker
elif not marker_parts:
marker = None
else:
marker = " and ".join(marker_parts)

return cls(version, marker)
if isinstance(raw, dict):
version = raw.get("version")
if version is None:
return None
marker_parts = []
raw_marker = raw.get("markers")
if raw_marker is not None:
marker_parts.append(raw_marker)
python = raw.get("python")
if python is not None:
marker_parts.append(f"python_version{python}")

is_optional = raw.get("optional", False)
marker: str | None | UnkownMarker
if is_optional and not marker_parts:
marker = unknown_marker
elif not marker_parts:
marker = None
else:
marker = " and ".join(marker_parts)

return cls(version, marker)
return None


@dataclass
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "poetry-stale-dependencies"
version = "0.2.1"
version = "0.2.2"
description = ""
readme = "README.md"
authors = ["Biocatch LTD <[email protected]>"]
Expand Down
11 changes: 8 additions & 3 deletions tests/test_lockspec.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ def test_parse_lock(lock_version):
"baz": {"version": "2.0.0", "markers": "os_name == 'nt'"},
"booz": {"version": "2.1.0", "optional": True},
"zim": {"im": "invalid"},
"sham": [
"1.0.0",
{"version": "2.0.0", "markers": "os_name == 'nt'"},
],
},
},
{
Expand Down Expand Up @@ -59,9 +63,10 @@ def test_parse_lock(lock_version):
"1.0.0",
None,
{
"bar": PackageDependency("1.0.0", None),
"baz": PackageDependency("2.0.0", "os_name == 'nt'"),
"booz": PackageDependency("2.1.0", unknown_marker),
"bar": [PackageDependency("1.0.0", None)],
"baz": [PackageDependency("2.0.0", "os_name == 'nt'")],
"booz": [PackageDependency("2.1.0", unknown_marker)],
"sham": [PackageDependency("1.0.0", None), PackageDependency("2.0.0", "os_name == 'nt'")],
},
),
PackageSpec("5.6.7", None, {}),
Expand Down

0 comments on commit 46bb087

Please sign in to comment.