pyinfra
pyinfra copied to clipboard
Improve error message when deploy name is missing in pyinfra v3
Describe the bug
I upgraded to v3 the other day, and started getting a somewhat cryptic error for all my deploys. I went for the v3 docs and figured I need to add the deploy name now in the decorator, but perhaps it's worth improving error message to aid migration.
To Reproduce
minimal example
from pyinfra.api import deploy
@deploy
def mydeploy(**kwargs):
print("some dummy deploy")
Results in:
[pyinfra_cli.exceptions] File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra_cli/main.py", line 222, in cli
_main(*args, **kwargs)
File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra_cli/main.py", line 352, in _main
can_diff, state, config = _handle_commands(
^^^^^^^^^^^^^^^^^
File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra_cli/main.py", line 665, in _handle_commands
state, kwargs = _prepare_func_operations(
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra_cli/main.py", line 737, in _prepare_func_operations
load_func(state, op, *args, **kwargs)
File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra_cli/util.py", line 230, in load_func
_parallel_load_hosts(state, lambda: op_func(*args, **kwargs), op_func.__name__)
File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra_cli/util.py", line 220, in _parallel_load_hosts
raise result
File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra_cli/util.py", line 200, in load_file
callback()
File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra_cli/util.py", line 230, in <lambda>
_parallel_load_hosts(state, lambda: op_func(*args, **kwargs), op_func.__name__)
^^^^^^^^^^^^^^^^^^^^^^^^
[pyinfra_cli.exceptions] TypeError: deploy.<locals>.decorator() missing 1 required positional argument: 'func'
Expected behavior
Show an error message suggesting to add deploy name and a link to the v2 migration guide.
Meta
System: Linux
Platform: Linux-6.8.0-38-generic-x86_64-with-glibc2.39
Release: 6.8.0-38-generic
Machine: x86_64
pyinfra: v3.0.2
Executable: /home/karlicos/.local/bin/pyinfra
Python: 3.12.3 (CPython, GCC 13.2.0)
also a slightly different stack trace I managed to get for the same issue (but can't reproduce in isolation for some reason)
[pyinfra_cli.exceptions] File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra_cli/main.py", line 222, in cli
_main(*args, **kwargs)
File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra_cli/main.py", line 352, in _main
can_diff, state, config = _handle_commands(
^^^^^^^^^^^^^^^^^
File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra_cli/main.py", line 665, in _handle_commands
state, kwargs = _prepare_func_operations(
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra_cli/main.py", line 737, in _prepare_func_operations
load_func(state, op, *args, **kwargs)
File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra_cli/util.py", line 230, in load_func
_parallel_load_hosts(state, lambda: op_func(*args, **kwargs), op_func.__name__)
File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra_cli/util.py", line 220, in _parallel_load_hosts
raise result
File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra_cli/util.py", line 200, in load_file
callback()
File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra_cli/util.py", line 230, in <lambda>
_parallel_load_hosts(state, lambda: op_func(*args, **kwargs), op_func.__name__)
^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra/api/deploy.py", line 84, in decorated_func
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
...
gg
File "/home/karlicos/.local/share/pipx/venvs/pyinfra/lib/python3.12/site-packages/pyinfra/api/deploy.py", line 64, in decorator
func.deploy_name = name or func.__name__ # type: ignore[attr-defined]
^^^^^^^^^^^^^^^^
[pyinfra_cli.exceptions] AttributeError: 'str' object has no attribute 'deploy_name'
Finally got round to making this better: https://github.com/pyinfra-dev/pyinfra/commit/0b4572294a30c0ac72ad0c3710a38dd8fc5c3d18