Skip to content

Commit 1812a25

Browse files
committed
add and fix tests for Policy.minimum_version
1 parent 16ce177 commit 1812a25

File tree

2 files changed

+67
-10
lines changed

2 files changed

+67
-10
lines changed

minimum_versions.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,22 @@ class Policy:
3838
default_months: int
3939
overrides: dict[str, Version] = field(default_factory=dict)
4040

41-
def minimum_version(self, package_name, releases):
41+
def minimum_version(self, today, package_name, releases):
4242
if (override := self.overrides.get(package_name)) is not None:
43-
return override
43+
return find_release(releases, version=override)
44+
45+
suitable_releases = [
46+
release for release in releases if is_suitable_release(release)
47+
]
4448

4549
policy_months = self.package_months.get(package_name, self.default_months)
46-
today = datetime.date.today()
4750

4851
cutoff_date = today - relativedelta(months=policy_months)
4952

5053
index = bisect.bisect_left(
51-
releases, cutoff_date, key=lambda x: x.timestamp.date()
54+
suitable_releases, cutoff_date, key=lambda x: x.timestamp.date()
5255
)
53-
return releases[index - 1 if index > 0 else 0]
56+
return suitable_releases[index - 1 if index > 0 else 0]
5457

5558

5659
@dataclass
@@ -134,6 +137,11 @@ def filter_releases(predicate, releases):
134137
}
135138

136139

140+
def find_release(releases, version):
141+
index = bisect.bisect_left(releases, version, key=lambda x: x.version)
142+
return releases[index]
143+
144+
137145
def deduplicate_releases(package_info):
138146
def deduplicate(releases):
139147
return min(releases, key=lambda p: p.timestamp)
@@ -144,9 +152,9 @@ def deduplicate(releases):
144152
}
145153

146154

147-
def find_policy_versions(policy, releases):
155+
def find_policy_versions(policy, today, releases):
148156
return {
149-
name: policy.minimum_version(name, package_releases)
157+
name: policy.minimum_version(today, name, package_releases)
150158
for name, package_releases in releases.items()
151159
}
152160

@@ -286,6 +294,7 @@ def main(environment_paths):
286294
query = gateway.query(channels, platforms, all_packages, recursive=False)
287295
records = asyncio.run(query)
288296

297+
today = datetime.date.today()
289298
package_releases = pipe(
290299
records,
291300
concat,
@@ -295,8 +304,7 @@ def main(environment_paths):
295304
)
296305
policy_versions = pipe(
297306
package_releases,
298-
curry(filter_releases, is_suitable_release),
299-
curry(find_policy_versions, policy),
307+
curry(find_policy_versions, policy, today),
300308
)
301309
status = compare_versions(environments, policy_versions)
302310

test_script.py

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
import datetime as dt
2+
13
import pytest
24
from rattler import Version
35

4-
from minimum_versions import Spec
6+
from minimum_versions import Policy, Release, Spec
57

68

79
@pytest.mark.parametrize(
@@ -23,3 +25,50 @@ def test_spec_parse(text, expected_spec, expected_name, expected_warnings):
2325
assert actual_spec == expected_spec
2426
assert actual_name == expected_name
2527
assert actual_warnings == expected_warnings
28+
29+
30+
@pytest.mark.parametrize(
31+
["package_name", "policy", "today", "expected"],
32+
(
33+
(
34+
"numpy",
35+
Policy({"numpy": 6}, 12, {}),
36+
dt.date(2023, 12, 12),
37+
Release(Version("1.23.0"), 0, dt.datetime(2023, 6, 9)),
38+
),
39+
(
40+
"scipy",
41+
Policy({"numpy": 6}, 8, {}),
42+
dt.date(2024, 9, 5),
43+
Release(Version("1.2.0"), 0, dt.datetime(2024, 1, 3)),
44+
),
45+
(
46+
"scipy",
47+
Policy({"numpy": 6}, 8, {"scipy": Version("1.1.1")}),
48+
dt.date(2024, 9, 5),
49+
Release(Version("1.1.1"), 0, dt.datetime(2023, 12, 1)),
50+
),
51+
),
52+
)
53+
def test_policy_minimum_version(package_name, policy, today, expected):
54+
releases = {
55+
"numpy": [
56+
Release(Version("1.22.0"), 0, dt.datetime(2022, 12, 1)),
57+
Release(Version("1.22.1"), 0, dt.datetime(2023, 2, 5)),
58+
Release(Version("1.23.0"), 0, dt.datetime(2023, 6, 9)),
59+
Release(Version("1.23.1"), 0, dt.datetime(2023, 8, 12)),
60+
Release(Version("1.23.2"), 0, dt.datetime(2023, 12, 5)),
61+
],
62+
"scipy": [
63+
Release(Version("1.0.0"), 0, dt.datetime(2022, 11, 10)),
64+
Release(Version("1.0.1"), 0, dt.datetime(2023, 1, 13)),
65+
Release(Version("1.1.0"), 0, dt.datetime(2023, 9, 21)),
66+
Release(Version("1.1.1"), 0, dt.datetime(2023, 12, 1)),
67+
Release(Version("1.2.0"), 0, dt.datetime(2024, 1, 3)),
68+
Release(Version("1.2.1"), 0, dt.datetime(2024, 2, 5)),
69+
],
70+
}
71+
72+
actual = policy.minimum_version(today, package_name, releases[package_name])
73+
74+
assert actual == expected

0 commit comments

Comments
 (0)