Skip to content

Commit 1429c1a

Browse files
Merge pull request #1114 from tiran/move-cooldown
refactor: move Cooldown class from context to candidate module
2 parents bc300d4 + a11cb19 commit 1429c1a

6 files changed

Lines changed: 29 additions & 29 deletions

File tree

src/fromager/__main__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import click
99

1010
from . import (
11+
candidate,
1112
clickext,
1213
commands,
1314
context,
@@ -258,7 +259,7 @@ def main(
258259
max_jobs=jobs,
259260
settings_dir=settings_dir,
260261
cooldown=(
261-
context.Cooldown(min_age=datetime.timedelta(days=min_release_age))
262+
candidate.Cooldown(min_age=datetime.timedelta(days=min_release_age))
262263
if min_release_age > 0
263264
else None
264265
),

src/fromager/candidate.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,20 @@
1515
logger = logging.getLogger(__name__)
1616

1717

18+
@dataclasses.dataclass
19+
class Cooldown:
20+
"""Policy for rejecting recently-published package versions.
21+
22+
bootstrap_time is fixed at construction so all resolutions in a single run
23+
share the same cutoff.
24+
"""
25+
26+
min_age: datetime.timedelta
27+
bootstrap_time: datetime.datetime = dataclasses.field(
28+
default_factory=lambda: datetime.datetime.now(datetime.UTC)
29+
)
30+
31+
1832
@dataclasses.dataclass(frozen=True, order=True, slots=True, repr=False, kw_only=True)
1933
class Candidate:
2034
name: str

src/fromager/context.py

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from __future__ import annotations
22

33
import collections
4-
import dataclasses
54
import datetime
65
import logging
76
import os
@@ -24,7 +23,7 @@
2423
)
2524

2625
if typing.TYPE_CHECKING:
27-
from . import build_environment
26+
from . import build_environment, candidate
2827

2928
logger = logging.getLogger(__name__)
3029

@@ -33,20 +32,6 @@
3332
ROOT_BUILD_REQUIREMENT = canonicalize_name("", validate=False)
3433

3534

36-
@dataclasses.dataclass
37-
class Cooldown:
38-
"""Policy for rejecting recently-published package versions.
39-
40-
bootstrap_time is fixed at construction so all resolutions in a single run
41-
share the same cutoff.
42-
"""
43-
44-
min_age: datetime.timedelta
45-
bootstrap_time: datetime.datetime = dataclasses.field(
46-
default_factory=lambda: datetime.datetime.now(datetime.UTC)
47-
)
48-
49-
5035
class WorkContext:
5136
def __init__(
5237
self,
@@ -62,7 +47,7 @@ def __init__(
6247
max_jobs: int | None = None,
6348
settings_dir: pathlib.Path | None = None,
6449
wheel_server_url: str = "",
65-
cooldown: Cooldown | None = None,
50+
cooldown: candidate.Cooldown | None = None,
6651
max_release_age: datetime.timedelta | None = None,
6752
):
6853
if active_settings is None:
@@ -113,7 +98,7 @@ def __init__(
11398

11499
self._parallel_builds = False
115100

116-
self.cooldown: Cooldown | None = cooldown
101+
self.cooldown: candidate.Cooldown | None = cooldown
117102
self._max_release_age: datetime.timedelta | None = max_release_age
118103

119104
@property

src/fromager/packagesettings/_pbi.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ def resolver_min_release_age(self) -> int | None:
257257
258258
Returns None (inherit global), 0 (disabled), or a positive integer
259259
(override days). The caller is responsible for converting to a
260-
:class:`~fromager.context.Cooldown` instance.
260+
:class:`~fromager.candidate.Cooldown` instance.
261261
"""
262262
return self._ps.resolver_dist.min_release_age
263263

src/fromager/resolver.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,8 @@
3131
from resolvelib.resolvers import RequirementInformation
3232

3333
from . import overrides
34-
from .candidate import Candidate
34+
from .candidate import Candidate, Cooldown
3535
from .constraints import Constraints
36-
from .context import Cooldown
3736
from .extras_provider import ExtrasProvider
3837
from .http_retry import RETRYABLE_EXCEPTIONS, retry_on_exception
3938
from .request_session import session

tests/test_cooldown.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@
1919
from packaging.requirements import Requirement
2020
from packaging.version import Version
2121

22-
from fromager import context, packagesettings, resolver, sources, wheels
23-
from fromager.context import Cooldown
22+
from fromager import candidate, context, packagesettings, resolver, sources, wheels
2423

2524
_BOOTSTRAP_TIME = datetime.datetime(2026, 3, 26, 0, 0, 0, tzinfo=datetime.UTC)
2625
_COOLDOWN_7_DAYS = datetime.timedelta(days=7)
@@ -77,7 +76,7 @@
7776
],
7877
}
7978

80-
_COOLDOWN = Cooldown(
79+
_COOLDOWN = candidate.Cooldown(
8180
min_age=_COOLDOWN_7_DAYS,
8281
bootstrap_time=_BOOTSTRAP_TIME,
8382
)
@@ -327,7 +326,7 @@ def test_non_pypi_index_allows_without_upload_time(
327326
def _make_ctx(
328327
tmp_path: pathlib.Path,
329328
*,
330-
cooldown: Cooldown | None,
329+
cooldown: candidate.Cooldown | None,
331330
min_release_age: int | None = None,
332331
) -> context.WorkContext:
333332
"""Build a WorkContext with an optional per-package min_release_age setting."""
@@ -457,7 +456,7 @@ def test_per_package_cooldown_disable_via_ctx(tmp_path: pathlib.Path) -> None:
457456
# ---------------------------------------------------------------------------
458457

459458
_GITLAB_BOOTSTRAP_TIME = datetime.datetime(2025, 5, 20, 0, 0, 0, tzinfo=datetime.UTC)
460-
_GITLAB_COOLDOWN = Cooldown(
459+
_GITLAB_COOLDOWN = candidate.Cooldown(
461460
min_age=datetime.timedelta(days=7),
462461
bootstrap_time=_GITLAB_BOOTSTRAP_TIME,
463462
)
@@ -507,7 +506,9 @@ def test_per_package_cooldown_disable_via_ctx(tmp_path: pathlib.Path) -> None:
507506
"""
508507

509508

510-
def _make_gitlab_provider(cooldown: Cooldown | None) -> resolver.GitLabTagProvider:
509+
def _make_gitlab_provider(
510+
cooldown: candidate.Cooldown | None,
511+
) -> resolver.GitLabTagProvider:
511512
return resolver.GitLabTagProvider(
512513
project_path="test/pkg",
513514
server_url="https://gitlab.com",
@@ -832,7 +833,7 @@ def test_compute_max_age_cutoff_with_cooldown(
832833
tmp_context: context.WorkContext,
833834
) -> None:
834835
"""_compute_max_age_cutoff uses cooldown's bootstrap_time when available."""
835-
tmp_context.cooldown = Cooldown(
836+
tmp_context.cooldown = candidate.Cooldown(
836837
min_age=datetime.timedelta(days=7),
837838
bootstrap_time=_BOOTSTRAP_TIME,
838839
)

0 commit comments

Comments
 (0)