From dbdf218076786e49dc2b10d9886a675d84578f60 Mon Sep 17 00:00:00 2001 From: zahid47 Date: Fri, 27 Jan 2023 01:12:40 +0600 Subject: [PATCH 1/7] fix: gracefully exit if no profile exists --- aiida/cmdline/commands/cmd_daemon.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/aiida/cmdline/commands/cmd_daemon.py b/aiida/cmdline/commands/cmd_daemon.py index 857c697e2a..4d0f45cb7a 100644 --- a/aiida/cmdline/commands/cmd_daemon.py +++ b/aiida/cmdline/commands/cmd_daemon.py @@ -89,6 +89,10 @@ def status(all_profiles): profiles = [profile for profile in config.profiles if not profile.is_test_profile] else: profiles = [manager.get_profile()] + + if not profiles: + echo.echo_error('No profiles found') + sys.exit(1) daemons_running = [] for profile in profiles: From 78c6e67184943ec5e10551c745c8087db31ebd39 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 26 Jan 2023 19:18:29 +0000 Subject: [PATCH 2/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- aiida/cmdline/commands/cmd_daemon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aiida/cmdline/commands/cmd_daemon.py b/aiida/cmdline/commands/cmd_daemon.py index 4d0f45cb7a..0de49af2e7 100644 --- a/aiida/cmdline/commands/cmd_daemon.py +++ b/aiida/cmdline/commands/cmd_daemon.py @@ -89,7 +89,7 @@ def status(all_profiles): profiles = [profile for profile in config.profiles if not profile.is_test_profile] else: profiles = [manager.get_profile()] - + if not profiles: echo.echo_error('No profiles found') sys.exit(1) From dfbe7819c9c82c72f6298cecb03f5ed19b16b298 Mon Sep 17 00:00:00 2001 From: zahid47 Date: Sat, 28 Jan 2023 01:25:34 +0600 Subject: [PATCH 3/7] fix: add a decorator for CLI commands that require a profile to be loaded --- aiida/cmdline/commands/cmd_daemon.py | 5 +---- aiida/cmdline/utils/decorators.py | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/aiida/cmdline/commands/cmd_daemon.py b/aiida/cmdline/commands/cmd_daemon.py index 0de49af2e7..1a68efe7e4 100644 --- a/aiida/cmdline/commands/cmd_daemon.py +++ b/aiida/cmdline/commands/cmd_daemon.py @@ -75,6 +75,7 @@ def start(foreground, number): @verdi_daemon.command() @click.option('--all', 'all_profiles', is_flag=True, help='Show status of all daemons.') +@decorators.requires_loaded_profile() def status(all_profiles): """Print the status of the current daemon or all daemons. @@ -90,10 +91,6 @@ def status(all_profiles): else: profiles = [manager.get_profile()] - if not profiles: - echo.echo_error('No profiles found') - sys.exit(1) - daemons_running = [] for profile in profiles: client = get_daemon_client(profile.name) diff --git a/aiida/cmdline/utils/decorators.py b/aiida/cmdline/utils/decorators.py index 3146bf7b2e..a957f4b84a 100644 --- a/aiida/cmdline/utils/decorators.py +++ b/aiida/cmdline/utils/decorators.py @@ -236,3 +236,29 @@ def wrapper(wrapped, _, args, kwargs): return wrapped(*args, **kwargs) return wrapper + +def requires_loaded_profile(): + """Function decorator for CLI command that requires a profile to be loaded. + + Example:: + + @requires_loaded_profile() + def create_node(): + pass + + If no profile has been loaded, the command will exit with a critical error. Most ``verdi`` commands will + automatically load the default profile. So if this error is hit, it is most likely that either no profile have been + defined at all or the default is unspecified. + """ + + @decorator + def wrapper(wrapped, _, args, kwargs): + """If daemon pid file is not found / empty, echo message and call decorated function.""" + from aiida.manage.configuration import get_profile + + if get_profile() is None: + echo.echo_critical('No profile loaded: make sure at least one profile is configured and a default is set.') + + return wrapped(*args, **kwargs) + + return wrapper \ No newline at end of file From d24aeb4aaafe06aaec92f3254862a2feab33467d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 27 Jan 2023 19:27:18 +0000 Subject: [PATCH 4/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- aiida/cmdline/utils/decorators.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aiida/cmdline/utils/decorators.py b/aiida/cmdline/utils/decorators.py index a957f4b84a..9cd10919ac 100644 --- a/aiida/cmdline/utils/decorators.py +++ b/aiida/cmdline/utils/decorators.py @@ -237,6 +237,7 @@ def wrapper(wrapped, _, args, kwargs): return wrapper + def requires_loaded_profile(): """Function decorator for CLI command that requires a profile to be loaded. @@ -261,4 +262,4 @@ def wrapper(wrapped, _, args, kwargs): return wrapped(*args, **kwargs) - return wrapper \ No newline at end of file + return wrapper From 2057e62f619fb7acc9a83ed93ade027bfaedf84a Mon Sep 17 00:00:00 2001 From: zahid47 Date: Sat, 28 Jan 2023 02:03:08 +0600 Subject: [PATCH 5/7] test: add a test for require_profile_loaded decorator --- tests/cmdline/commands/test_daemon.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/cmdline/commands/test_daemon.py b/tests/cmdline/commands/test_daemon.py index ea007faf99..8fa1a2025f 100644 --- a/tests/cmdline/commands/test_daemon.py +++ b/tests/cmdline/commands/test_daemon.py @@ -90,3 +90,9 @@ def test_daemon_status(run_cli_command): assert f'Profile: {get_profile().name}' in result.output assert last_line == 'Use verdi daemon [incr | decr] [num] to increase / decrease the amount of workers' + +@pytest.mark.usefixtures('empty_config') +def test_daemon_status_no_profile(run_cli_command): + """Test ``verdi daemon status`` when no profiles are defined.""" + result = run_cli_command(cmd_daemon.status, raises=True) + assert 'No profile loaded: make sure at least one profile is configured and a default is set.' in result.output \ No newline at end of file From 8ce494c12b0601e1249269d393147fa8242639c3 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 27 Jan 2023 20:05:21 +0000 Subject: [PATCH 6/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/cmdline/commands/test_daemon.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/cmdline/commands/test_daemon.py b/tests/cmdline/commands/test_daemon.py index 8fa1a2025f..9ef7968e2f 100644 --- a/tests/cmdline/commands/test_daemon.py +++ b/tests/cmdline/commands/test_daemon.py @@ -91,8 +91,9 @@ def test_daemon_status(run_cli_command): assert f'Profile: {get_profile().name}' in result.output assert last_line == 'Use verdi daemon [incr | decr] [num] to increase / decrease the amount of workers' + @pytest.mark.usefixtures('empty_config') def test_daemon_status_no_profile(run_cli_command): """Test ``verdi daemon status`` when no profiles are defined.""" result = run_cli_command(cmd_daemon.status, raises=True) - assert 'No profile loaded: make sure at least one profile is configured and a default is set.' in result.output \ No newline at end of file + assert 'No profile loaded: make sure at least one profile is configured and a default is set.' in result.output From b543f4c0e378816b5fd4c4d4ca49201009adcd02 Mon Sep 17 00:00:00 2001 From: Sebastiaan Huber Date: Sat, 28 Jan 2023 16:19:28 +0100 Subject: [PATCH 7/7] Apply suggestions from code review --- aiida/cmdline/utils/decorators.py | 1 - 1 file changed, 1 deletion(-) diff --git a/aiida/cmdline/utils/decorators.py b/aiida/cmdline/utils/decorators.py index 9cd10919ac..5e0cc159e4 100644 --- a/aiida/cmdline/utils/decorators.py +++ b/aiida/cmdline/utils/decorators.py @@ -254,7 +254,6 @@ def create_node(): @decorator def wrapper(wrapped, _, args, kwargs): - """If daemon pid file is not found / empty, echo message and call decorated function.""" from aiida.manage.configuration import get_profile if get_profile() is None: