From 9a04a529d27943e4e77d99524e8f3cc6217a31fb Mon Sep 17 00:00:00 2001 From: Matthew Mosby Date: Thu, 18 Dec 2025 15:27:20 -0700 Subject: [PATCH 1/3] add hook for `canary init` to setup defaults in a workspace on initialization --- src/_canary/hookspec.py | 13 +++++++++++++ src/_canary/plugins/subcommands/init.py | 9 ++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/_canary/hookspec.py b/src/_canary/hookspec.py index eae85f79..c1d00130 100644 --- a/src/_canary/hookspec.py +++ b/src/_canary/hookspec.py @@ -28,6 +28,7 @@ from .select import Selector from .testcase import TestCase from .workspace import Session + from .workspace import Workspace project_name = "canary" @@ -129,6 +130,18 @@ def canary_configure(config: "CanaryConfig") -> None: """ +@hookspec +def canary_initfinish(workspace: "Workspace") -> None: + """Allow plugins to modify the newly initialized workspace without additional user commands/steps. + + This hook is called by `canary init` just before exit. + + Args: + workspace: The canary Workspace object. + + """ + + @hookspec def canary_sessionstart(session: "Session") -> None: ... diff --git a/src/_canary/plugins/subcommands/init.py b/src/_canary/plugins/subcommands/init.py index 4055fa13..04faca7a 100644 --- a/src/_canary/plugins/subcommands/init.py +++ b/src/_canary/plugins/subcommands/init.py @@ -7,6 +7,7 @@ from pathlib import Path from typing import TYPE_CHECKING +from ... import config from ...hookspec import hookimpl from ...util import logging from ...workspace import Workspace @@ -23,6 +24,11 @@ def canary_addcommand(parser: "Parser") -> None: parser.add_command(Init()) +@hookimpl(trylast=True) +def canary_initfinish(workspace: Workspace) -> None: + logger.info(f"[bold]Finished[/] initializing canary workspace at {workspace.root.parent}") + + class Init(CanarySubcommand): name = "init" description = "Initialize a Canary session" @@ -37,5 +43,6 @@ def setup_parser(self, parser: "Parser"): ) def execute(self, args: "argparse.Namespace") -> int: - Workspace.create(Path(args.path).absolute(), force=args.w) + ws = Workspace.create(Path(args.path).absolute(), force=args.w) + config.pluginmanager.hook.canary_initfinish(workspace=ws) return 0 From 0a0c3c8dd5bd049d0e7224e075991ba16709bae4 Mon Sep 17 00:00:00 2001 From: Matthew Mosby Date: Thu, 18 Dec 2025 15:45:14 -0700 Subject: [PATCH 2/3] add option to skip any plugin modifications --- src/_canary/plugins/subcommands/init.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/_canary/plugins/subcommands/init.py b/src/_canary/plugins/subcommands/init.py index 04faca7a..12c8e007 100644 --- a/src/_canary/plugins/subcommands/init.py +++ b/src/_canary/plugins/subcommands/init.py @@ -41,8 +41,16 @@ def setup_parser(self, parser: "Parser"): nargs="?", help="Initialize session in this directory [default: %(default)s]", ) + parser.add_argument( + "--no-post-actions", + action="store_false", + dest="post_actions", + help="Do not run post-initialization actions on the workspace", + ) + parser.set_defaults(post_actions=True) def execute(self, args: "argparse.Namespace") -> int: ws = Workspace.create(Path(args.path).absolute(), force=args.w) - config.pluginmanager.hook.canary_initfinish(workspace=ws) + if args.post_actions: + config.pluginmanager.hook.canary_initfinish(workspace=ws) return 0 From 2ab95e5bd50985d55a20baf07d88030beafd2140 Mon Sep 17 00:00:00 2001 From: Matthew Mosby Date: Thu, 18 Dec 2025 17:38:29 -0700 Subject: [PATCH 3/3] short option to skip plugin actions --- src/_canary/plugins/subcommands/init.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_canary/plugins/subcommands/init.py b/src/_canary/plugins/subcommands/init.py index 12c8e007..43361a07 100644 --- a/src/_canary/plugins/subcommands/init.py +++ b/src/_canary/plugins/subcommands/init.py @@ -42,7 +42,7 @@ def setup_parser(self, parser: "Parser"): help="Initialize session in this directory [default: %(default)s]", ) parser.add_argument( - "--no-post-actions", + "-n,--no-post-actions", action="store_false", dest="post_actions", help="Do not run post-initialization actions on the workspace",