Skip to content

Add PEP 723 inline script metadata support#452

Open
gilgamezh wants to merge 1 commit into
change_run_oldfrom
pep723-support
Open

Add PEP 723 inline script metadata support#452
gilgamezh wants to merge 1 commit into
change_run_oldfrom
pep723-support

Conversation

@gilgamezh

@gilgamezh gilgamezh commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Requires #451 pointing to it until it's merged

Closes #423.

PEP 723 defines a standard # /// script comment block (TOML) for declaring a single-file script's dependencies and requires-python. It's implemented by pipx, pip-run and uv. This adds support to fades so it can run scripts written for other runners — and so scripts written for fades can run on them.

What it does

  • dependencies: parsed from the block and merged like every other dependency source (inline # fades marks, docstrings, -r files, -d flags).
  • requires-python: honored by selecting a suitable interpreter — the currently selected one (--python or fades' own) if it satisfies the specifier, otherwise an auto-discovered pythonX.Y on PATH, failing cleanly if none is available. An explicit --python that conflicts is reported rather than silently overridden, so the user stays in control.
  • TOML parsing: stdlib tomllib on Python 3.11+, falling back to tomli on older versions (conditional dependency in setup.py).
  • Robust errors: malformed metadata (bad TOML, invalid requirement string, bad/non-string requires-python, non-list dependencies, multiple script blocks) raises a clean FadesError with an explanatory log line instead of dumping a traceback.

Example:

# /// script
# requires-python = ">=3.11"
# dependencies = [
#   "requests<3",
#   "rich",
# ]
# ///

import requests
from rich.pretty import pprint

⚠️ Point for review: requires-python behavior

This goes beyond pipx and pip-run, which both ignore requires-python (only uv honors it, via its own interpreter management). Since fades has no interpreter management, the chosen behavior is:

  • selected interpreter satisfies the specifier → use it;
  • it doesn't, and no explicit --python → discover a matching pythonX.Y on PATH, else fail;
  • it doesn't, and --python was given → fail (don't override the user's explicit choice).

Discovery is best-effort over PATH (python3.6python3.29, python3, python). Happy to dial this back to validate-only if preferred.

Tests

New tests/test_parsing/test_pep723.py plus fixtures, interpreter-selection/version-probe tests in test_helpers.py, and a consolidate_dependencies test in test_main.py. Full suite green (./test), flake8 clean. Docs updated in README.rst and man/fades.1.

🤖 Generated with Claude Code

Closes #423.

fades now understands the PEP 723 `# /// script` metadata block, so it can
run scripts written for other runners (pipx, pip-run, uv) and vice versa.

- parse the block's `dependencies` and merge them like any other source
- honor `requires-python`: keep the selected interpreter if it satisfies the
  specifier, otherwise auto-discover a suitable one on PATH (failing cleanly if
  none is available); an explicit --python that conflicts is reported instead
  of being silently overridden
- malformed metadata (bad TOML, bad requirement, bad/non-string requires-python,
  non-list dependencies, multiple script blocks) raises a clean FadesError with
  an explanatory log line instead of dumping a traceback
- use stdlib tomllib on 3.11+, falling back to tomli on older Pythons

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@gilgamezh gilgamezh requested a review from facundobatista June 18, 2026 09:36
@gilgamezh gilgamezh changed the base branch from master to change_run_old June 18, 2026 09:37
@gilgamezh

Copy link
Copy Markdown
Contributor Author

Did run tests here because we only run them when target is master

https://github.com/PyAr/fades/actions/runs/27750679594

should be executed when we change the target branch

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PEP 723 support

1 participant