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..43361a07 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" @@ -35,7 +41,16 @@ def setup_parser(self, parser: "Parser"): nargs="?", help="Initialize session in this directory [default: %(default)s]", ) + parser.add_argument( + "-n,--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: - Workspace.create(Path(args.path).absolute(), force=args.w) + ws = Workspace.create(Path(args.path).absolute(), force=args.w) + if args.post_actions: + config.pluginmanager.hook.canary_initfinish(workspace=ws) return 0