feat(core): clone commands and actions when binding runtimes
Add clone support across Action types and Command so commands can be safely registered or runner-bound without mutating the original instances. - clone BaseAction implementations across simple, composite, IO, prompt, file, HTTP, process, and signal actions - bind cloned commands in Falyx.add_command_from_command() and CommandRunner - preserve local never_prompt settings when cloning actions - rename shared runtime state from options to options_manager for consistency - seed root and execution option namespaces consistently - apply scoped root and namespace option overrides during routing and dispatch - improve namespace completion by delegating option suggestions to FalyxParser - enrich missing-value errors and error hints
This commit is contained in:
55
tests/test_falyx/test_builtin_root_options.py
Normal file
55
tests/test_falyx/test_builtin_root_options.py
Normal file
@@ -0,0 +1,55 @@
|
||||
import logging
|
||||
|
||||
from falyx import Falyx
|
||||
from falyx.action import Action
|
||||
from falyx.debug import log_after, log_before, log_error, log_success
|
||||
from falyx.hook_manager import HookType
|
||||
|
||||
|
||||
def test_apply_root_options_sets_falyx_logger_level_from_root_verbose():
|
||||
flx = Falyx()
|
||||
|
||||
falyx_logger = logging.getLogger("falyx")
|
||||
original_level = falyx_logger.level
|
||||
try:
|
||||
flx.options_manager.set("verbose", True, "root")
|
||||
flx._apply_root_options()
|
||||
assert falyx_logger.level == logging.DEBUG
|
||||
|
||||
flx.options_manager.set("verbose", False, "root")
|
||||
flx._apply_root_options()
|
||||
assert falyx_logger.level == logging.WARNING
|
||||
finally:
|
||||
falyx_logger.setLevel(original_level)
|
||||
|
||||
|
||||
def test_apply_root_options_registers_debug_hooks_across_command_and_action_graph():
|
||||
action = Action("deploy-action", lambda: "ok")
|
||||
flx = Falyx()
|
||||
command = flx.add_command(
|
||||
key="D",
|
||||
description="Deploy",
|
||||
action=action,
|
||||
)
|
||||
|
||||
assert flx.hooks._hooks[HookType.BEFORE] == []
|
||||
assert command.hooks._hooks[HookType.BEFORE] == []
|
||||
assert action.hooks._hooks[HookType.BEFORE] == []
|
||||
|
||||
flx.options_manager.set("debug_hooks", True, "root")
|
||||
flx._apply_root_options()
|
||||
|
||||
assert flx.hooks._hooks[HookType.BEFORE] == [log_before]
|
||||
assert flx.hooks._hooks[HookType.ON_SUCCESS] == [log_success]
|
||||
assert flx.hooks._hooks[HookType.ON_ERROR] == [log_error]
|
||||
assert flx.hooks._hooks[HookType.AFTER] == [log_after]
|
||||
|
||||
assert command.hooks._hooks[HookType.BEFORE] == [log_before]
|
||||
assert command.hooks._hooks[HookType.ON_SUCCESS] == [log_success]
|
||||
assert command.hooks._hooks[HookType.ON_ERROR] == [log_error]
|
||||
assert command.hooks._hooks[HookType.AFTER] == [log_after]
|
||||
|
||||
assert action.hooks._hooks[HookType.BEFORE] == [log_before]
|
||||
assert action.hooks._hooks[HookType.ON_SUCCESS] == [log_success]
|
||||
assert action.hooks._hooks[HookType.ON_ERROR] == [log_error]
|
||||
assert action.hooks._hooks[HookType.AFTER] == [log_after]
|
||||
Reference in New Issue
Block a user