Skip to content

Commit 4c9f9fb

Browse files
committed
feat: source resolver configuration
Introduce new configuration for source resolver and downloads. The new system uses profiles for common tasks: - `pypi-sdist`: resolve versions of sdists from PyPI, download sdist - `pypi-prebuilt`: resolve versions of platform wheels from PyPI, download pre-built wheel from PyPI. - `pypi-download`: resolve versions of any package from PyPI, download from external URL (with `{version}` variable) - `pypi-git`: resolve versions for any package from PyPI, git clone (with `{version}` variable) - `versionmap-git`: resolve with a version map, git clone - `github-tag-download`: resolve from GitHub tag, download tarball - `github-tag-git`: resolve from GitHub tag, git clone - `gitlab-tag-download`: resolve from GitLab tag, download tarball - `gitlab-tag-git`: resolve from GitLab tag, git clone - `not-available`: block resolving - `hook`: call Fromager hooks The new settings will eventually replace `download_source`, `resolver_dist`, and `git_options` top-level options as well as `wheel_server_url` and `pre_built` flags for variants. Signed-off-by: Christian Heimes <cheimes@redhat.com>
1 parent 1429c1a commit 4c9f9fb

15 files changed

Lines changed: 805 additions & 4 deletions

docs/reference/config-reference.rst

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
Configuration Reference
22
=======================
33

4+
.. currentmodule:: fromager.packagesettings
5+
46
Per-package Settings
57
--------------------
68

@@ -24,6 +26,45 @@ For example `flash_attn.yaml`.
2426

2527
.. autopydantic_model:: fromager.packagesettings.SbomSettings
2628

29+
Source Resolver
30+
^^^^^^^^^^^^^^^
31+
32+
.. autopydantic_model:: fromager.packagesettings.PyPISDistResolver
33+
:inherited-members: AbstractPyPIResolver
34+
35+
.. autopydantic_model:: fromager.packagesettings.PyPIPrebuiltResolver
36+
:inherited-members: AbstractPyPIResolver
37+
38+
.. autopydantic_model:: fromager.packagesettings.PyPIDownloadResolver
39+
:inherited-members: AbstractPyPIResolver
40+
41+
.. autopydantic_model:: fromager.packagesettings.PyPIGitResolver
42+
:inherited-members: AbstractPyPIResolver
43+
44+
.. autopydantic_model:: fromager.packagesettings.VersionMapResolver
45+
46+
.. autopydantic_model:: fromager.packagesettings.GitHubTagDownloadResolver
47+
:inherited-members: AbstractGitSourceResolver
48+
49+
.. autopydantic_model:: fromager.packagesettings.GitHubTagCloneResolver
50+
:inherited-members: AbstractGitSourceResolver
51+
52+
.. autopydantic_model:: fromager.packagesettings.GitLabTagDownloadResolver
53+
:inherited-members: AbstractGitSourceResolver
54+
55+
.. autopydantic_model:: fromager.packagesettings.GitLabTagCloneResolver
56+
:inherited-members: AbstractGitSourceResolver
57+
58+
.. autopydantic_model:: fromager.packagesettings.NotAvailableResolver
59+
60+
.. autopydantic_model:: fromager.packagesettings.HookResolver
61+
62+
.. autoclass:: fromager.packagesettings.BuildSDist
63+
64+
.. autoattribute:: pep517
65+
.. autoattribute:: tarball
66+
67+
2768
Global Settings
2869
---------------
2970

src/fromager/packagesettings/__init__.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,21 @@
1313
VariantInfo,
1414
)
1515
from ._pbi import PackageBuildInfo
16+
from ._resolver import (
17+
DEFAULT_TAG_MATCHER,
18+
BuildSDist,
19+
GitHubTagCloneResolver,
20+
GitHubTagDownloadResolver,
21+
GitLabTagCloneResolver,
22+
GitLabTagDownloadResolver,
23+
HookResolver,
24+
NotAvailableResolver,
25+
PyPIDownloadResolver,
26+
PyPIGitResolver,
27+
PyPIPrebuiltResolver,
28+
PyPISDistResolver,
29+
VersionMapResolver,
30+
)
1631
from ._settings import Settings, SettingsFile
1732
from ._templates import substitute_template
1833
from ._typedefs import (
@@ -32,22 +47,34 @@
3247
)
3348

3449
__all__ = (
50+
"DEFAULT_TAG_MATCHER",
3551
"MODEL_CONFIG",
3652
"Annotations",
3753
"BuildDirectory",
3854
"BuildOptions",
55+
"BuildSDist",
3956
"DownloadSource",
4057
"EnvKey",
4158
"EnvVars",
59+
"GitHubTagCloneResolver",
60+
"GitHubTagDownloadResolver",
61+
"GitLabTagCloneResolver",
62+
"GitLabTagDownloadResolver",
4263
"GitOptions",
4364
"GlobalChangelog",
65+
"HookResolver",
66+
"NotAvailableResolver",
4467
"Package",
4568
"PackageBuildInfo",
4669
"PackageSettings",
4770
"PackageVersion",
4871
"PatchMap",
4972
"ProjectOverride",
5073
"PurlConfig",
74+
"PyPIDownloadResolver",
75+
"PyPIGitResolver",
76+
"PyPIPrebuiltResolver",
77+
"PyPISDistResolver",
5178
"RawAnnotations",
5279
"ResolverDist",
5380
"SbomSettings",
@@ -57,6 +84,7 @@
5784
"Variant",
5885
"VariantChangelog",
5986
"VariantInfo",
87+
"VersionMapResolver",
6088
"default_update_extra_environ",
6189
"get_extra_environ",
6290
"substitute_template",

src/fromager/packagesettings/_models.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from pydantic import Field
1717
from pydantic_core import core_schema
1818

19+
from ._resolver import SourceResolver
1920
from ._typedefs import (
2021
MODEL_CONFIG,
2122
BuildDirectory,
@@ -313,7 +314,7 @@ class VariantInfo(pydantic.BaseModel):
313314
VAR1: "value 1"
314315
VAR2: "2.0
315316
wheel_server_url: https://pypi.org/simple/
316-
pre_build: False
317+
pre_built: False
317318
"""
318319

319320
model_config = MODEL_CONFIG
@@ -334,6 +335,12 @@ class VariantInfo(pydantic.BaseModel):
334335
pre_built: bool = False
335336
"""Use pre-built wheel from index server?"""
336337

338+
source: typing.Annotated[
339+
SourceResolver | None,
340+
pydantic.Field(default=None, discriminator="provider"),
341+
]
342+
"""Source resolver and downloader"""
343+
337344

338345
class GitOptions(pydantic.BaseModel):
339346
"""Git repository cloning options
@@ -458,6 +465,12 @@ class PackageSettings(pydantic.BaseModel):
458465
project_override: ProjectOverride = Field(default_factory=ProjectOverride)
459466
"""Patch project settings"""
460467

468+
source: typing.Annotated[
469+
SourceResolver | None,
470+
pydantic.Field(default=None, discriminator="provider"),
471+
]
472+
"""Source resolver and downloader"""
473+
461474
variants: Mapping[Variant, VariantInfo] = Field(default_factory=dict)
462475
"""Variant configuration"""
463476

src/fromager/packagesettings/_pbi.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
PurlConfig,
2222
VariantInfo,
2323
)
24+
from ._resolver import SourceResolver
2425
from ._templates import _resolve_template, substitute_template
2526
from ._typedefs import Annotations, PackageVersion, PatchMap, Template, Variant
2627

@@ -176,6 +177,14 @@ def pre_built(self) -> bool:
176177
return vi.pre_built
177178
return False
178179

180+
@property
181+
def source_resolver(self) -> SourceResolver | None:
182+
"""Get source resolver settings (variant or global)"""
183+
vi = self._ps.variants.get(self.variant)
184+
if vi is not None and vi.source is not None:
185+
return vi.source
186+
return self._ps.source
187+
179188
@property
180189
def wheel_server_url(self) -> str | None:
181190
"""Alternative package index for pre-build wheel"""

0 commit comments

Comments
 (0)