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
56 lines
2.0 KiB
Python
56 lines
2.0 KiB
Python
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]
|