Support required environments in packse (#16873)

Companion change for https://github.com/astral-sh/packse/pull/293,
motivated by
https://github.com/astral-sh/uv/pull/16824#discussion_r2556176057
This commit is contained in:
konsti 2025-11-27 15:17:16 +01:00 committed by GitHub
parent eaa4651df0
commit f02b459d04
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 29 additions and 6 deletions

View File

@ -77,7 +77,9 @@ except ImportError:
exit(1) exit(1)
def main(scenarios: list[Path], snapshot_update: bool = True): def main(
scenarios: list[Path], templates: list[str] | None, snapshot_update: bool = True
):
# Fetch packse version # Fetch packse version
packse_version = importlib.metadata.version("packse") packse_version = importlib.metadata.version("packse")
@ -163,6 +165,10 @@ def main(scenarios: list[Path], snapshot_update: bool = True):
for scenario in data["scenarios"]: for scenario in data["scenarios"]:
resolver_options = scenario["resolver_options"] or {} resolver_options = scenario["resolver_options"] or {}
# Avoid writing the empty `required-environments = []`
resolver_options["has_required_environments"] = bool(
resolver_options["required_environments"]
)
if resolver_options.get("universal"): if resolver_options.get("universal"):
lock_scenarios.append(scenario) lock_scenarios.append(scenario)
elif resolver_options.get("python") is not None: elif resolver_options.get("python") is not None:
@ -170,11 +176,14 @@ def main(scenarios: list[Path], snapshot_update: bool = True):
else: else:
install_scenarios.append(scenario) install_scenarios.append(scenario)
for template, tests, scenarios in [ for template_name, template, tests, scenarios in [
(INSTALL_TEMPLATE, INSTALL_TESTS, install_scenarios), ("install", INSTALL_TEMPLATE, INSTALL_TESTS, install_scenarios),
(COMPILE_TEMPLATE, COMPILE_TESTS, compile_scenarios), ("compile", COMPILE_TEMPLATE, COMPILE_TESTS, compile_scenarios),
(LOCK_TEMPLATE, LOCK_TESTS, lock_scenarios), ("lock", LOCK_TEMPLATE, LOCK_TESTS, lock_scenarios),
]: ]:
if templates and template_name not in templates:
continue
data = {"scenarios": scenarios} data = {"scenarios": scenarios}
ref = "HEAD" if packse_version == "0.0.0" else packse_version ref = "HEAD" if packse_version == "0.0.0" else packse_version
@ -291,6 +300,12 @@ if __name__ == "__main__":
nargs="*", nargs="*",
help="The scenario files to use", help="The scenario files to use",
) )
parser.add_argument(
"--templates",
type=str,
nargs="*",
help="The templates to render. By default, all templates are rendered",
)
parser.add_argument( parser.add_argument(
"-v", "-v",
"--verbose", "--verbose",
@ -320,4 +335,4 @@ if __name__ == "__main__":
logging.basicConfig(level=log_level, format="%(message)s") logging.basicConfig(level=log_level, format="%(message)s")
main(args.scenarios, snapshot_update=not args.no_snapshot_update) main(args.scenarios, args.templates, snapshot_update=not args.no_snapshot_update)

View File

@ -49,6 +49,14 @@ fn {{module_name}}() -> Result<()> {
{{#root.requires_python}} {{#root.requires_python}}
requires-python = "{{.}}" requires-python = "{{.}}"
{{/root.requires_python}} {{/root.requires_python}}
{{#resolver_options.has_required_environments}}
[tool.uv]
required-environments = [
{{#resolver_options.required_environments}}
'''{{.}}''',
{{/resolver_options.required_environments}}
]
{{/resolver_options.has_required_environments}}
"### "###
)?; )?;