pyinfra icon indicating copy to clipboard operation
pyinfra copied to clipboard

Improve error message when deploy name is missing in pyinfra v3

Open karlicoss opened this issue 1 year ago • 1 comments

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)

karlicoss avatar Jul 29 '24 17:07 karlicoss

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'

karlicoss avatar Jul 29 '24 17:07 karlicoss

Finally got round to making this better: https://github.com/pyinfra-dev/pyinfra/commit/0b4572294a30c0ac72ad0c3710a38dd8fc5c3d18

Fizzadar avatar Sep 25 '24 21:09 Fizzadar