|
1 | 1 | from packaging.specifiers import SpecifierSet |
2 | | -from typing import Sequence, cast |
| 2 | +from typing import Sequence, Dict |
3 | 3 | import datetime |
4 | 4 |
|
5 | 5 | from spec0_action.versions import repr_spec_set, tighten_lower_bound |
|
15 | 15 | ) |
16 | 16 | from packaging.version import Version |
17 | 17 |
|
18 | | - |
19 | 18 | __all__ = ["read_schedule", "read_toml", "write_toml", "update_pyproject_toml"] |
20 | 19 |
|
21 | | - |
22 | | -def update_pyproject_dependencies(dependencies: dict, schedule: SupportSchedule): |
| 20 | +def update_pyproject_dependencies(dependencies: dict, schedule: Dict[str, str]): |
23 | 21 | # Iterate by idx because we want to update it inplace |
24 | 22 | for i in range(len(dependencies)): |
25 | 23 | dep_str = dependencies[i] |
26 | 24 | pkg, extras, spec, env = parse_pep_dependency(dep_str) |
27 | 25 |
|
28 | | - if isinstance(spec, Url) or pkg not in schedule["packages"]: |
| 26 | + if isinstance(spec, Url) or pkg not in schedule: |
29 | 27 | continue |
30 | 28 |
|
31 | | - new_lower_bound = Version(schedule["packages"][pkg]) |
| 29 | + new_lower_bound = Version(schedule[pkg]) |
32 | 30 | try: |
33 | 31 | spec = tighten_lower_bound(spec or SpecifierSet(), new_lower_bound) |
34 | 32 | # Will raise a value error if bound is already tighter, in this case we just do nothing and continue |
@@ -75,42 +73,43 @@ def update_dependency_table(dep_table: dict, new_versions: dict): |
75 | 73 | pkg_data["version"] = repr_spec_set(spec) |
76 | 74 |
|
77 | 75 |
|
78 | | -def update_pixi_dependencies(pixi_tables: dict, schedule: SupportSchedule): |
79 | | - if "pypi-dependencies" in pixi_tables: |
80 | | - update_dependency_table(pixi_tables["pypi-dependencies"], schedule["packages"]) |
81 | | - if "dependencies" in pixi_tables: |
82 | | - update_dependency_table(pixi_tables["dependencies"], schedule["packages"]) |
| 76 | +def update_pixi_dependencies(pixi_tables: dict, schedule: Dict[str, str]): |
| 77 | + if "pypi-dependencies" in pixi_tables: |
| 78 | + update_dependency_table(pixi_tables["pypi-dependencies"], schedule) |
| 79 | + if "dependencies" in pixi_tables: |
| 80 | + update_dependency_table(pixi_tables["dependencies"], schedule) |
83 | 81 |
|
84 | 82 | if "feature" in pixi_tables: |
85 | 83 | for _, feature_data in pixi_tables["feature"].items(): |
86 | 84 | if "dependencies" in feature_data: |
87 | | - update_dependency_table( |
88 | | - feature_data["dependencies"], schedule["packages"] |
89 | | - ) |
| 85 | + update_dependency_table(feature_data["dependencies"], schedule) |
90 | 86 |
|
91 | 87 |
|
92 | 88 | def update_pyproject_toml( |
93 | 89 | pyproject_data: dict, schedule_data: Sequence[SupportSchedule] |
94 | 90 | ): |
95 | 91 | now = datetime.datetime.now(datetime.UTC) |
96 | | - try: |
97 | | - new_version = cast( |
98 | | - SupportSchedule, |
99 | | - next( |
100 | | - filter( |
101 | | - lambda s: now >= datetime.datetime.fromisoformat(s["start_date"]), |
102 | | - schedule_data, |
103 | | - ) |
104 | | - ), |
105 | | - ) |
106 | | - except StopIteration: |
| 92 | + applicable = sorted( |
| 93 | + filter( |
| 94 | + lambda s: now >= datetime.datetime.fromisoformat(s["start_date"]), |
| 95 | + schedule_data, |
| 96 | + ), |
| 97 | + key=lambda s: datetime.datetime.fromisoformat(s["start_date"]), |
| 98 | + ) |
| 99 | + new_version = {} |
| 100 | + for schedule in applicable: |
| 101 | + # Fill in the latest known requirement (schedule is sorted, newer entries overwrite older) |
| 102 | + for pkg, version in schedule["packages"].items(): |
| 103 | + new_version[pkg] = version |
| 104 | + |
| 105 | + if not new_version: |
107 | 106 | raise RuntimeError( |
108 | 107 | "Could not find schedule that applies to current time, perhaps your schedule is outdated." |
109 | 108 | ) |
110 | 109 |
|
111 | | - if "python" in new_version["packages"]: |
| 110 | + if "python" in new_version: |
112 | 111 | pyproject_data["project"]["requires-python"] = repr_spec_set( |
113 | | - parse_version_spec(new_version["packages"]["python"]) |
| 112 | + parse_version_spec(new_version["python"]) |
114 | 113 | ) |
115 | 114 | update_pyproject_dependencies( |
116 | 115 | pyproject_data["project"]["dependencies"], new_version |
|
0 commit comments