From 9110efe44b604ce8c994f4270530f510265e4731 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Wed, 13 Aug 2025 03:23:33 +0100 Subject: [PATCH 1/2] Remove the ``@subcommand`` decorator --- src/blurb/_add.py | 3 +-- src/blurb/_cli.py | 40 ++++++++++++++++++++++++++-------------- src/blurb/_export.py | 3 --- src/blurb/_merge.py | 3 +-- src/blurb/_populate.py | 2 -- src/blurb/_release.py | 3 +-- 6 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/blurb/_add.py b/src/blurb/_add.py index 001086d..c70fd42 100644 --- a/src/blurb/_add.py +++ b/src/blurb/_add.py @@ -9,7 +9,7 @@ import tempfile from blurb._blurb_file import BlurbError, Blurbs -from blurb._cli import error, prompt, subcommand +from blurb._cli import error, prompt from blurb._git import flush_git_add_files, git_add_files from blurb._template import sections, template @@ -23,7 +23,6 @@ FALLBACK_EDITORS = ('/etc/alternatives/editor', 'nano') -@subcommand def add(*, issue: str | None = None, section: str | None = None): """Add a blurb (a Misc/NEWS.d/next entry) to the current CPython repo. diff --git a/src/blurb/_cli.py b/src/blurb/_cli.py index 839c4e8..07695d7 100644 --- a/src/blurb/_cli.py +++ b/src/blurb/_cli.py @@ -19,6 +19,31 @@ readme_re = re.compile(r'This is \w+ version \d+\.\d+').match +def initialise_subcommands() -> None: + global subcommands + + from blurb._add import add + from blurb._export import export + from blurb._merge import merge + from blurb._populate import populate + from blurb._release import release + + subcommands = { + 'version': version, + 'help': help, + 'add': add, + 'export': export, + 'merge': merge, + 'populate': populate, + 'release': release, + + # Make 'blurb --help/--version/-V' work. + '--help': help, + '--version': version, + '-V': version, + } + + def error(msg: str, /) -> NoReturn: raise SystemExit(f'Error: {msg}') @@ -35,12 +60,6 @@ def require_ok(prompt: str, /) -> str: return s -def subcommand(fn: CommandFunc): - global subcommands - subcommands[fn.__name__] = fn - return fn - - def get_subcommand(subcommand: str, /) -> CommandFunc: fn = subcommands.get(subcommand) if not fn: @@ -48,13 +67,11 @@ def get_subcommand(subcommand: str, /) -> CommandFunc: return fn -@subcommand def version() -> None: """Print blurb version.""" print('blurb version', blurb.__version__) -@subcommand def help(subcommand: str | None = None) -> None: """Print help for subcommands. @@ -102,12 +119,6 @@ def help(subcommand: str | None = None) -> None: raise SystemExit(0) -# Make 'blurb --help/--version/-V' work. -subcommands['--help'] = help -subcommands['--version'] = version -subcommands['-V'] = version - - def _blurb_help() -> None: """Print default help for blurb.""" @@ -157,6 +168,7 @@ def main() -> None: subcommand = args[0] args = args[1:] + initialise_subcommands() fn = get_subcommand(subcommand) # hack diff --git a/src/blurb/_export.py b/src/blurb/_export.py index 9d48282..1215977 100644 --- a/src/blurb/_export.py +++ b/src/blurb/_export.py @@ -1,10 +1,7 @@ import os import shutil -from blurb._cli import subcommand - -@subcommand def export() -> None: """Removes blurb data files, for building release tarballs/installers.""" os.chdir('Misc') diff --git a/src/blurb/_merge.py b/src/blurb/_merge.py index 2ff2e4f..fa44ed4 100644 --- a/src/blurb/_merge.py +++ b/src/blurb/_merge.py @@ -3,7 +3,7 @@ from pathlib import Path from blurb._blurb_file import Blurbs -from blurb._cli import require_ok, subcommand +from blurb._cli import require_ok from blurb._utils.globs import glob_blurbs from blurb._utils.text import textwrap_body from blurb._versions import glob_versions, printable_version @@ -11,7 +11,6 @@ original_dir: str = os.getcwd() -@subcommand def merge(output: str | None = None, *, forced: bool = False) -> None: """Merge all blurbs together into a single Misc/NEWS file. diff --git a/src/blurb/_populate.py b/src/blurb/_populate.py index 2e23a5c..cab98ab 100644 --- a/src/blurb/_populate.py +++ b/src/blurb/_populate.py @@ -1,11 +1,9 @@ import os -from blurb._cli import subcommand from blurb._git import flush_git_add_files, git_add_files from blurb._template import sanitize_section, sections -@subcommand def populate() -> None: """Creates and populates the Misc/NEWS.d directory tree.""" os.chdir('Misc') diff --git a/src/blurb/_release.py b/src/blurb/_release.py index 3da5f41..148d56f 100644 --- a/src/blurb/_release.py +++ b/src/blurb/_release.py @@ -5,7 +5,7 @@ import blurb._blurb_file from blurb._blurb_file import Blurbs -from blurb._cli import error, subcommand +from blurb._cli import error from blurb._git import ( flush_git_add_files, flush_git_rm_files, @@ -16,7 +16,6 @@ from blurb._utils.text import generate_nonce -@subcommand def release(version: str) -> None: """Move all new blurbs to a single blurb file for the release. From 946f71d66fd54bedf42f8335afd4d87f8fa22ab2 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Wed, 13 Aug 2025 03:28:51 +0100 Subject: [PATCH 2/2] fixup! Remove the ``@subcommand`` decorator --- src/blurb/__main__.py | 2 ++ src/blurb/_export.py | 2 ++ src/blurb/_git.py | 2 ++ src/blurb/_merge.py | 2 ++ src/blurb/_populate.py | 2 ++ src/blurb/_utils/globs.py | 2 ++ src/blurb/_versions.py | 2 ++ 7 files changed, 14 insertions(+) diff --git a/src/blurb/__main__.py b/src/blurb/__main__.py index de13566..ee9eeb5 100644 --- a/src/blurb/__main__.py +++ b/src/blurb/__main__.py @@ -1,5 +1,7 @@ """Run blurb using ``python3 -m blurb``.""" +from __future__ import annotations + from blurb._cli import main if __name__ == '__main__': diff --git a/src/blurb/_export.py b/src/blurb/_export.py index 1215977..73328ea 100644 --- a/src/blurb/_export.py +++ b/src/blurb/_export.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import shutil diff --git a/src/blurb/_git.py b/src/blurb/_git.py index 3311e02..4ee1c01 100644 --- a/src/blurb/_git.py +++ b/src/blurb/_git.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import subprocess diff --git a/src/blurb/_merge.py b/src/blurb/_merge.py index fa44ed4..b18f483 100644 --- a/src/blurb/_merge.py +++ b/src/blurb/_merge.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import sys from pathlib import Path diff --git a/src/blurb/_populate.py b/src/blurb/_populate.py index cab98ab..10fde1e 100644 --- a/src/blurb/_populate.py +++ b/src/blurb/_populate.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from blurb._git import flush_git_add_files, git_add_files diff --git a/src/blurb/_utils/globs.py b/src/blurb/_utils/globs.py index ae06154..d4852bd 100644 --- a/src/blurb/_utils/globs.py +++ b/src/blurb/_utils/globs.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import glob import os diff --git a/src/blurb/_versions.py b/src/blurb/_versions.py index 2b56cd0..c3e03eb 100644 --- a/src/blurb/_versions.py +++ b/src/blurb/_versions.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import glob import sys