From 34207a70a622c5343e193e158e952359954df508 Mon Sep 17 00:00:00 2001 From: Aarav Navani <38411399+oofmeister27@users.noreply.github.com> Date: Thu, 9 May 2024 23:15:48 -0700 Subject: [PATCH 01/17] add quiet install --- guardrails/cli/hub/install.py | 74 ++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/guardrails/cli/hub/install.py b/guardrails/cli/hub/install.py index d6c990cb8..c3f994e17 100644 --- a/guardrails/cli/hub/install.py +++ b/guardrails/cli/hub/install.py @@ -237,13 +237,16 @@ def install( package_uri: str = typer.Argument( help="URI to the package to install. Example: hub://guardrails/regex_match." ), + quiet: bool = typer.Option(False, "--quiet", help="Run the command in quiet mode to reduce output verbosity.") ): """Install a validator from the Hub.""" if not package_uri.startswith("hub://"): logger.error("Invalid URI!") sys.exit(1) - console.print(f"\nInstalling {package_uri}...\n") + if not quiet: + console.print(f"\nInstalling {package_uri}...\n") + logger.log( level=LEVELS.get("SPAM"), # type: ignore msg=f"Installing {package_uri}...", @@ -253,46 +256,53 @@ def install( module_name = package_uri.replace("hub://", "") # Prep - with console.status("Fetching manifest", spinner="bouncingBar"): + with console.status("Fetching manifest", spinner="bouncingBar") as status: + if not quiet: + status.update("Fetching manifest") module_manifest = get_validator_manifest(module_name) site_packages = get_site_packages_location() # Install - with console.status("Downloading dependencies", spinner="bouncingBar"): + with console.status("Downloading dependencies", spinner="bouncingBar") as status: + if not quiet: + status.update("Downloading dependencies") install_hub_module(module_manifest, site_packages) # Post-install - with console.status("Running post-install setup", spinner="bouncingBar"): + with console.status("Running post-install setup", spinner="bouncingBar") as status: + if not quiet: + status.update("Running post-install setup") run_post_install(module_manifest, site_packages) add_to_hub_inits(module_manifest, site_packages) - success_message_cli = Template( - """✅Successfully installed ${module_name}! + if not quiet: + success_message_cli = Template( + """✅Successfully installed ${module_name}! -[bold]Import validator:[/bold] -from guardrails.hub import ${export} + [bold]Import validator:[/bold] + from guardrails.hub import ${export} -[bold]Get more info:[/bold] -https://hub.guardrailsai.com/validator/${id} -""" - ).safe_substitute( - module_name=package_uri, - id=module_manifest.id, - export=module_manifest.exports[0], - ) - success_message_logger = Template( - """✅Successfully installed ${module_name}! - -Import validator: -from guardrails.hub import ${export} - -Get more info: -https://hub.guardrailsai.com/validator/${id} -""" - ).safe_substitute( - module_name=package_uri, - id=module_manifest.id, - export=module_manifest.exports[0], - ) - console.print(success_message_cli) # type: ignore - logger.log(level=LEVELS.get("SPAM"), msg=success_message_logger) # type: ignore + [bold]Get more info:[/bold] + https://hub.guardrailsai.com/validator/${id} + """ + ).safe_substitute( + module_name=package_uri, + id=module_manifest.id, + export=module_manifest.exports[0], + ) + success_message_logger = Template( + """✅Successfully installed ${module_name}! + + Import validator: + from guardrails.hub import ${export} + + Get more info: + https://hub.guardrailsai.com/validator/${id} + """ + ).safe_substitute( + module_name=package_uri, + id=module_manifest.id, + export=module_manifest.exports[0], + ) + console.print(success_message_cli) # type: ignore + logger.log(level=LEVELS.get("SPAM"), msg=success_message_logger) # type: ignore From ab464d18679b96a8c62ba7312cbbf277492e9043 Mon Sep 17 00:00:00 2001 From: Aarav Navani <38411399+oofmeister27@users.noreply.github.com> Date: Sun, 12 May 2024 17:30:59 -0700 Subject: [PATCH 02/17] lint + test --- guardrails/cli/hub/install.py | 3 +- tests/unit_tests/cli/hub/test_install.py | 99 +++++++++++++----------- 2 files changed, 56 insertions(+), 46 deletions(-) diff --git a/guardrails/cli/hub/install.py b/guardrails/cli/hub/install.py index c3f994e17..b6ec766dd 100644 --- a/guardrails/cli/hub/install.py +++ b/guardrails/cli/hub/install.py @@ -237,7 +237,8 @@ def install( package_uri: str = typer.Argument( help="URI to the package to install. Example: hub://guardrails/regex_match." ), - quiet: bool = typer.Option(False, "--quiet", help="Run the command in quiet mode to reduce output verbosity.") + quiet: bool = typer.Option(False, "--quiet", + help="Run the command in quiet mode to reduce output verbosity.") ): """Install a validator from the Hub.""" if not package_uri.startswith("hub://"): diff --git a/tests/unit_tests/cli/hub/test_install.py b/tests/unit_tests/cli/hub/test_install.py index bf07e1847..81939c4a3 100644 --- a/tests/unit_tests/cli/hub/test_install.py +++ b/tests/unit_tests/cli/hub/test_install.py @@ -21,67 +21,74 @@ def test_exits_early_if_uri_is_not_valid(self, mocker): sys_exit_spy.assert_called_once_with(1) def test_happy_path(self, mocker): + # Mocking the dependencies mock_logger_log = mocker.patch("guardrails.cli.hub.install.logger.log") - mock_get_validator_manifest = mocker.patch( - "guardrails.cli.hub.install.get_validator_manifest" - ) - manifest = ModuleManifest.from_dict( - { - "id": "id", - "name": "name", - "author": {"name": "me", "email": "me@me.me"}, - "maintainers": [], - "repository": {"url": "some-repo"}, - "namespace": "guardrails", - "package_name": "test-validator", - "module_name": "test_validator", - "exports": ["TestValidator"], - "tags": {}, - } - ) + "guardrails.cli.hub.install.get_validator_manifest") + mock_console_print = mocker.patch("guardrails.cli.hub.console.print") + + manifest = ModuleManifest.from_dict({ + "id": "id", + "name": "name", + "author": {"name": "me", "email": "me@me.me"}, + "maintainers": [], + "repository": {"url": "some-repo"}, + "namespace": "guardrails", + "package_name": "test-validator", + "module_name": "test_validator", + "exports": ["TestValidator"], + "tags": {}, + }) mock_get_validator_manifest.return_value = manifest mock_get_site_packages_location = mocker.patch( - "guardrails.cli.hub.install.get_site_packages_location" - ) + "guardrails.cli.hub.install.get_site_packages_location") site_packages = "./.venv/lib/python3.X/site-packages" mock_get_site_packages_location.return_value = site_packages mock_install_hub_module = mocker.patch( - "guardrails.cli.hub.install.install_hub_module" - ) + "guardrails.cli.hub.install.install_hub_module") mock_run_post_install = mocker.patch( - "guardrails.cli.hub.install.run_post_install" - ) + "guardrails.cli.hub.install.run_post_install") mock_add_to_hub_init = mocker.patch( - "guardrails.cli.hub.install.add_to_hub_inits" - ) + "guardrails.cli.hub.install.add_to_hub_inits") from guardrails.cli.hub.install import install + # Test without quiet mode install("hub://guardrails/test-validator") - - log_calls = [ + normal_mode_log_calls = [ + call(level=5, msg="Installing hub://guardrails/test-validator..."), + call(level=5, msg= + """✅Successfully installed hub://guardrails/test-validator! + + Import validator: + from guardrails.hub import TestValidator + + Get more info: + https://hub.guardrailsai.com/validator/id""", + )] + mock_logger_log.assert_has_calls(normal_mode_log_calls, any_order=True) + assert mock_console_print.call_count > 0 + + mock_logger_log.reset_mock() + mock_console_print.reset_mock() + + install("hub://guardrails/test-validator", quiet=True) + quiet_mode_log_calls = [ call(level=5, msg="Installing hub://guardrails/test-validator..."), - call( - level=5, - msg="✅Successfully installed hub://guardrails/test-validator!\n\nImport validator:\nfrom guardrails.hub import TestValidator\n\nGet more info:\nhttps://hub.guardrailsai.com/validator/id\n", # noqa - ), # noqa ] - assert mock_logger_log.call_count == 2 - print(mock_logger_log) - mock_logger_log.assert_has_calls(log_calls) - - mock_get_validator_manifest.assert_called_once_with("guardrails/test-validator") - - assert mock_get_site_packages_location.call_count == 1 + # Expect no additional log message for the success since it's quiet mode + assert mock_logger_log.call_count == 1 + mock_logger_log.assert_has_calls(quiet_mode_log_calls, any_order=True) + assert mock_console_print.call_count == 0 - mock_install_hub_module.assert_called_once_with(manifest, site_packages) - - mock_run_post_install.assert_called_once_with(manifest, site_packages) - - mock_add_to_hub_init.assert_called_once_with(manifest, site_packages) + # Check that all other mocks are called as expected + assert mock_get_validator_manifest.call_count == 2 + assert mock_get_site_packages_location.call_count == 2 + assert mock_install_hub_module.call_count == 2 + assert mock_run_post_install.call_count == 2 + assert mock_add_to_hub_init.call_count == 2 class TestPipProcess: @@ -113,9 +120,11 @@ def test_no_package_string_format(self, mocker): assert response == "string output" def test_json_format(self, mocker): - mock_logger_debug = mocker.patch("guardrails.cli.hub.install.logger.debug") + mock_logger_debug = mocker.patch( + "guardrails.cli.hub.install.logger.debug") - mock_sys_executable = mocker.patch("guardrails.cli.hub.install.sys.executable") + mock_sys_executable = mocker.patch( + "guardrails.cli.hub.install.sys.executable") mock_subprocess_check_output = mocker.patch( "guardrails.cli.hub.install.subprocess.check_output" From df88639cc4a83280ca6dddf0e29783c0785fbc98 Mon Sep 17 00:00:00 2001 From: Aarav Navani <38411399+oofmeister27@users.noreply.github.com> Date: Sun, 12 May 2024 18:57:24 -0700 Subject: [PATCH 03/17] lint --- guardrails/cli/hub/install.py | 15 ++++--- tests/unit_tests/cli/hub/test_install.py | 57 +++++++++++++----------- 2 files changed, 41 insertions(+), 31 deletions(-) diff --git a/guardrails/cli/hub/install.py b/guardrails/cli/hub/install.py index b6ec766dd..bdb6b3c20 100644 --- a/guardrails/cli/hub/install.py +++ b/guardrails/cli/hub/install.py @@ -237,17 +237,20 @@ def install( package_uri: str = typer.Argument( help="URI to the package to install. Example: hub://guardrails/regex_match." ), - quiet: bool = typer.Option(False, "--quiet", - help="Run the command in quiet mode to reduce output verbosity.") + quiet: bool = typer.Option( + False, + "--quiet", + help="Run the command in quiet mode to reduce output verbosity.", + ), ): """Install a validator from the Hub.""" if not package_uri.startswith("hub://"): logger.error("Invalid URI!") sys.exit(1) - if not quiet: + if not quiet: console.print(f"\nInstalling {package_uri}...\n") - + logger.log( level=LEVELS.get("SPAM"), # type: ignore msg=f"Installing {package_uri}...", @@ -258,7 +261,7 @@ def install( # Prep with console.status("Fetching manifest", spinner="bouncingBar") as status: - if not quiet: + if not quiet: status.update("Fetching manifest") module_manifest = get_validator_manifest(module_name) site_packages = get_site_packages_location() @@ -276,7 +279,7 @@ def install( run_post_install(module_manifest, site_packages) add_to_hub_inits(module_manifest, site_packages) - if not quiet: + if not quiet: success_message_cli = Template( """✅Successfully installed ${module_name}! diff --git a/tests/unit_tests/cli/hub/test_install.py b/tests/unit_tests/cli/hub/test_install.py index 81939c4a3..7c944c8ed 100644 --- a/tests/unit_tests/cli/hub/test_install.py +++ b/tests/unit_tests/cli/hub/test_install.py @@ -24,34 +24,41 @@ def test_happy_path(self, mocker): # Mocking the dependencies mock_logger_log = mocker.patch("guardrails.cli.hub.install.logger.log") mock_get_validator_manifest = mocker.patch( - "guardrails.cli.hub.install.get_validator_manifest") + "guardrails.cli.hub.install.get_validator_manifest" + ) mock_console_print = mocker.patch("guardrails.cli.hub.console.print") - manifest = ModuleManifest.from_dict({ - "id": "id", - "name": "name", - "author": {"name": "me", "email": "me@me.me"}, - "maintainers": [], - "repository": {"url": "some-repo"}, - "namespace": "guardrails", - "package_name": "test-validator", - "module_name": "test_validator", - "exports": ["TestValidator"], - "tags": {}, - }) + manifest = ModuleManifest.from_dict( + { + "id": "id", + "name": "name", + "author": {"name": "me", "email": "me@me.me"}, + "maintainers": [], + "repository": {"url": "some-repo"}, + "namespace": "guardrails", + "package_name": "test-validator", + "module_name": "test_validator", + "exports": ["TestValidator"], + "tags": {}, + } + ) mock_get_validator_manifest.return_value = manifest mock_get_site_packages_location = mocker.patch( - "guardrails.cli.hub.install.get_site_packages_location") + "guardrails.cli.hub.install.get_site_packages_location" + ) site_packages = "./.venv/lib/python3.X/site-packages" mock_get_site_packages_location.return_value = site_packages mock_install_hub_module = mocker.patch( - "guardrails.cli.hub.install.install_hub_module") + "guardrails.cli.hub.install.install_hub_module" + ) mock_run_post_install = mocker.patch( - "guardrails.cli.hub.install.run_post_install") + "guardrails.cli.hub.install.run_post_install" + ) mock_add_to_hub_init = mocker.patch( - "guardrails.cli.hub.install.add_to_hub_inits") + "guardrails.cli.hub.install.add_to_hub_inits" + ) from guardrails.cli.hub.install import install @@ -59,17 +66,19 @@ def test_happy_path(self, mocker): install("hub://guardrails/test-validator") normal_mode_log_calls = [ call(level=5, msg="Installing hub://guardrails/test-validator..."), - call(level=5, msg= - """✅Successfully installed hub://guardrails/test-validator! + call( + level=5, + msg="""✅Successfully installed hub://guardrails/test-validator! Import validator: from guardrails.hub import TestValidator Get more info: https://hub.guardrailsai.com/validator/id""", - )] + ), + ] mock_logger_log.assert_has_calls(normal_mode_log_calls, any_order=True) - assert mock_console_print.call_count > 0 + assert mock_console_print.call_count > 0 mock_logger_log.reset_mock() mock_console_print.reset_mock() @@ -120,11 +129,9 @@ def test_no_package_string_format(self, mocker): assert response == "string output" def test_json_format(self, mocker): - mock_logger_debug = mocker.patch( - "guardrails.cli.hub.install.logger.debug") + mock_logger_debug = mocker.patch("guardrails.cli.hub.install.logger.debug") - mock_sys_executable = mocker.patch( - "guardrails.cli.hub.install.sys.executable") + mock_sys_executable = mocker.patch("guardrails.cli.hub.install.sys.executable") mock_subprocess_check_output = mocker.patch( "guardrails.cli.hub.install.subprocess.check_output" From 458d5270112c58c5cf459b8ba1de7868ef485342 Mon Sep 17 00:00:00 2001 From: Aarav Navani <38411399+oofmeister27@users.noreply.github.com> Date: Sun, 12 May 2024 19:08:59 -0700 Subject: [PATCH 04/17] test install --- tests/unit_tests/cli/hub/test_install.py | 48 ++++++++---------------- 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/tests/unit_tests/cli/hub/test_install.py b/tests/unit_tests/cli/hub/test_install.py index 7c944c8ed..f280bd333 100644 --- a/tests/unit_tests/cli/hub/test_install.py +++ b/tests/unit_tests/cli/hub/test_install.py @@ -21,13 +21,11 @@ def test_exits_early_if_uri_is_not_valid(self, mocker): sys_exit_spy.assert_called_once_with(1) def test_happy_path(self, mocker): - # Mocking the dependencies mock_logger_log = mocker.patch("guardrails.cli.hub.install.logger.log") + mock_get_validator_manifest = mocker.patch( "guardrails.cli.hub.install.get_validator_manifest" ) - mock_console_print = mocker.patch("guardrails.cli.hub.console.print") - manifest = ModuleManifest.from_dict( { "id": "id", @@ -62,42 +60,28 @@ def test_happy_path(self, mocker): from guardrails.cli.hub.install import install - # Test without quiet mode install("hub://guardrails/test-validator") - normal_mode_log_calls = [ + + log_calls = [ call(level=5, msg="Installing hub://guardrails/test-validator..."), call( level=5, - msg="""✅Successfully installed hub://guardrails/test-validator! - - Import validator: - from guardrails.hub import TestValidator - - Get more info: - https://hub.guardrailsai.com/validator/id""", - ), + msg="✅Successfully installed hub://guardrails/test-validator!\n\nImport validator:\nfrom guardrails.hub import TestValidator\n\nGet more info:\nhttps://hub.guardrailsai.com/validator/id\n", # noqa + ), # noqa ] - mock_logger_log.assert_has_calls(normal_mode_log_calls, any_order=True) - assert mock_console_print.call_count > 0 + assert mock_logger_log.call_count == 2 + print(mock_logger_log) + mock_logger_log.assert_has_calls(log_calls) - mock_logger_log.reset_mock() - mock_console_print.reset_mock() + mock_get_validator_manifest.assert_called_once_with("guardrails/test-validator") - install("hub://guardrails/test-validator", quiet=True) - quiet_mode_log_calls = [ - call(level=5, msg="Installing hub://guardrails/test-validator..."), - ] - # Expect no additional log message for the success since it's quiet mode - assert mock_logger_log.call_count == 1 - mock_logger_log.assert_has_calls(quiet_mode_log_calls, any_order=True) - assert mock_console_print.call_count == 0 + assert mock_get_site_packages_location.call_count == 1 + + mock_install_hub_module.assert_called_once_with(manifest, site_packages) + + mock_run_post_install.assert_called_once_with(manifest, site_packages) - # Check that all other mocks are called as expected - assert mock_get_validator_manifest.call_count == 2 - assert mock_get_site_packages_location.call_count == 2 - assert mock_install_hub_module.call_count == 2 - assert mock_run_post_install.call_count == 2 - assert mock_add_to_hub_init.call_count == 2 + mock_add_to_hub_init.assert_called_once_with(manifest, site_packages) class TestPipProcess: @@ -721,4 +705,4 @@ def test_install_hub_module(mocker): call("install", "openai<2"), call("install", "pydash>=7.0.6,<8.0.0"), ] - mock_pip_process.assert_has_calls(pip_calls) + mock_pip_process.assert_has_calls(pip_calls) \ No newline at end of file From fad7a23a905726959eea4e619c5dbafb81e87e6e Mon Sep 17 00:00:00 2001 From: Aarav Navani <38411399+oofmeister27@users.noreply.github.com> Date: Sun, 12 May 2024 19:14:26 -0700 Subject: [PATCH 05/17] test --- tests/unit_tests/cli/hub/test_install.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit_tests/cli/hub/test_install.py b/tests/unit_tests/cli/hub/test_install.py index f280bd333..d3518a6fa 100644 --- a/tests/unit_tests/cli/hub/test_install.py +++ b/tests/unit_tests/cli/hub/test_install.py @@ -705,4 +705,5 @@ def test_install_hub_module(mocker): call("install", "openai<2"), call("install", "pydash>=7.0.6,<8.0.0"), ] - mock_pip_process.assert_has_calls(pip_calls) \ No newline at end of file + mock_pip_process.assert_has_calls(pip_calls) + \ No newline at end of file From 177ee63847e24af0b39997bc833eca7b2c0c55f4 Mon Sep 17 00:00:00 2001 From: Aarav Navani <38411399+oofmeister27@users.noreply.github.com> Date: Sun, 12 May 2024 21:11:46 -0700 Subject: [PATCH 06/17] move log into if statement --- guardrails/cli/hub/install.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/guardrails/cli/hub/install.py b/guardrails/cli/hub/install.py index bdb6b3c20..0b0d12985 100644 --- a/guardrails/cli/hub/install.py +++ b/guardrails/cli/hub/install.py @@ -251,10 +251,10 @@ def install( if not quiet: console.print(f"\nInstalling {package_uri}...\n") - logger.log( - level=LEVELS.get("SPAM"), # type: ignore - msg=f"Installing {package_uri}...", - ) + logger.log( + level=LEVELS.get("SPAM"), # type: ignore + msg=f"Installing {package_uri}...", + ) # Validation module_name = package_uri.replace("hub://", "") From c21cba02cc6ff009706064466bb2bef322f053dc Mon Sep 17 00:00:00 2001 From: Aarav Navani <38411399+oofmeister27@users.noreply.github.com> Date: Sun, 12 May 2024 21:19:37 -0700 Subject: [PATCH 07/17] set quiet to false --- tests/unit_tests/cli/hub/test_install.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/unit_tests/cli/hub/test_install.py b/tests/unit_tests/cli/hub/test_install.py index d3518a6fa..836e3d9b8 100644 --- a/tests/unit_tests/cli/hub/test_install.py +++ b/tests/unit_tests/cli/hub/test_install.py @@ -60,7 +60,7 @@ def test_happy_path(self, mocker): from guardrails.cli.hub.install import install - install("hub://guardrails/test-validator") + install("hub://guardrails/test-validator", quiet=False) log_calls = [ call(level=5, msg="Installing hub://guardrails/test-validator..."), @@ -706,4 +706,3 @@ def test_install_hub_module(mocker): call("install", "pydash>=7.0.6,<8.0.0"), ] mock_pip_process.assert_has_calls(pip_calls) - \ No newline at end of file From 2274990b16567292e84dfb06e3b784e1be020e2b Mon Sep 17 00:00:00 2001 From: Aarav Navani <38411399+oofmeister27@users.noreply.github.com> Date: Sun, 12 May 2024 21:31:00 -0700 Subject: [PATCH 08/17] fix messages --- guardrails/cli/hub/install.py | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/guardrails/cli/hub/install.py b/guardrails/cli/hub/install.py index 0b0d12985..f8b30bcff 100644 --- a/guardrails/cli/hub/install.py +++ b/guardrails/cli/hub/install.py @@ -250,7 +250,6 @@ def install( if not quiet: console.print(f"\nInstalling {package_uri}...\n") - logger.log( level=LEVELS.get("SPAM"), # type: ignore msg=f"Installing {package_uri}...", @@ -281,28 +280,14 @@ def install( if not quiet: success_message_cli = Template( - """✅Successfully installed ${module_name}! - - [bold]Import validator:[/bold] - from guardrails.hub import ${export} - - [bold]Get more info:[/bold] - https://hub.guardrailsai.com/validator/${id} - """ + """✅Successfully installed ${module_name}!\n\n[bold]Import validator:[/bold]\nfrom guardrails.hub import ${export}\n\n[bold]Get more info:[/bold]\nhttps://hub.guardrailsai.com/validator/${id}""" ).safe_substitute( module_name=package_uri, id=module_manifest.id, export=module_manifest.exports[0], ) success_message_logger = Template( - """✅Successfully installed ${module_name}! - - Import validator: - from guardrails.hub import ${export} - - Get more info: - https://hub.guardrailsai.com/validator/${id} - """ + """✅Successfully installed ${module_name}!\n\nImport validator:\nfrom guardrails.hub import ${export}\n\nGet more info:\nhttps://hub.guardrailsai.com/validator/${id}""" ).safe_substitute( module_name=package_uri, id=module_manifest.id, From 7bf141cde08967d838d325da358a71374ccc76cd Mon Sep 17 00:00:00 2001 From: Aarav Navani <38411399+oofmeister27@users.noreply.github.com> Date: Sun, 12 May 2024 21:38:04 -0700 Subject: [PATCH 09/17] remove newline --- guardrails/cli/hub/install.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/guardrails/cli/hub/install.py b/guardrails/cli/hub/install.py index f8b30bcff..706b3da12 100644 --- a/guardrails/cli/hub/install.py +++ b/guardrails/cli/hub/install.py @@ -280,14 +280,22 @@ def install( if not quiet: success_message_cli = Template( - """✅Successfully installed ${module_name}!\n\n[bold]Import validator:[/bold]\nfrom guardrails.hub import ${export}\n\n[bold]Get more info:[/bold]\nhttps://hub.guardrailsai.com/validator/${id}""" + "✅Successfully installed ${module_name}!\n\n" + "[bold]Import validator:[/bold]\n" + "from guardrails.hub import ${export}\n\n" + "[bold]Get more info:[/bold]\n" + "https://hub.guardrailsai.com/validator/${id}" ).safe_substitute( module_name=package_uri, id=module_manifest.id, export=module_manifest.exports[0], - ) + ) success_message_logger = Template( - """✅Successfully installed ${module_name}!\n\nImport validator:\nfrom guardrails.hub import ${export}\n\nGet more info:\nhttps://hub.guardrailsai.com/validator/${id}""" + "✅Successfully installed ${module_name}!\n\n" + "Import validator:\n" + "from guardrails.hub import ${export}\n\n" + "Get more info:\n" + "https://hub.guardrailsai.com/validator/${id}" ).safe_substitute( module_name=package_uri, id=module_manifest.id, From 58d5da444b0ea37b55a369abf5e08237e3acad79 Mon Sep 17 00:00:00 2001 From: Aarav Navani <38411399+oofmeister27@users.noreply.github.com> Date: Sun, 12 May 2024 21:43:38 -0700 Subject: [PATCH 10/17] lint --- guardrails/cli/hub/install.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guardrails/cli/hub/install.py b/guardrails/cli/hub/install.py index 706b3da12..edcc25fa0 100644 --- a/guardrails/cli/hub/install.py +++ b/guardrails/cli/hub/install.py @@ -289,7 +289,7 @@ def install( module_name=package_uri, id=module_manifest.id, export=module_manifest.exports[0], - ) + ) success_message_logger = Template( "✅Successfully installed ${module_name}!\n\n" "Import validator:\n" From 697325f28856cfeba55bfd461501cad4a163585c Mon Sep 17 00:00:00 2001 From: Aarav Navani <38411399+oofmeister27@users.noreply.github.com> Date: Sun, 12 May 2024 21:50:34 -0700 Subject: [PATCH 11/17] fix newline --- guardrails/cli/hub/install.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guardrails/cli/hub/install.py b/guardrails/cli/hub/install.py index edcc25fa0..5ae9b55a7 100644 --- a/guardrails/cli/hub/install.py +++ b/guardrails/cli/hub/install.py @@ -284,7 +284,7 @@ def install( "[bold]Import validator:[/bold]\n" "from guardrails.hub import ${export}\n\n" "[bold]Get more info:[/bold]\n" - "https://hub.guardrailsai.com/validator/${id}" + "https://hub.guardrailsai.com/validator/${id}\n" ).safe_substitute( module_name=package_uri, id=module_manifest.id, @@ -295,7 +295,7 @@ def install( "Import validator:\n" "from guardrails.hub import ${export}\n\n" "Get more info:\n" - "https://hub.guardrailsai.com/validator/${id}" + "https://hub.guardrailsai.com/validator/${id}\n" ).safe_substitute( module_name=package_uri, id=module_manifest.id, From 7a31ac6e812cbf3003240a6f138ba33631ecc30f Mon Sep 17 00:00:00 2001 From: Aarav Navani <38411399+oofmeister27@users.noreply.github.com> Date: Wed, 15 May 2024 17:58:06 -0700 Subject: [PATCH 12/17] address comments --- guardrails/cli/hub/install.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/guardrails/cli/hub/install.py b/guardrails/cli/hub/install.py index 5ae9b55a7..db4ab5e96 100644 --- a/guardrails/cli/hub/install.py +++ b/guardrails/cli/hub/install.py @@ -248,12 +248,7 @@ def install( logger.error("Invalid URI!") sys.exit(1) - if not quiet: - console.print(f"\nInstalling {package_uri}...\n") - logger.log( - level=LEVELS.get("SPAM"), # type: ignore - msg=f"Installing {package_uri}...", - ) + console.print(f"\nInstalling {package_uri}...\n") # Validation module_name = package_uri.replace("hub://", "") @@ -277,6 +272,8 @@ def install( status.update("Running post-install setup") run_post_install(module_manifest, site_packages) add_to_hub_inits(module_manifest, site_packages) + + console.print("Installation complete") if not quiet: success_message_cli = Template( From 80b8f7c5b9733f26fc52cf032d1b2a859ab70c7f Mon Sep 17 00:00:00 2001 From: Aarav Navani <38411399+oofmeister27@users.noreply.github.com> Date: Wed, 15 May 2024 18:10:13 -0700 Subject: [PATCH 13/17] add quiet install test and fix lint --- guardrails/cli/hub/install.py | 2 +- tests/unit_tests/cli/hub/test_install.py | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/guardrails/cli/hub/install.py b/guardrails/cli/hub/install.py index db4ab5e96..d2b7f7a44 100644 --- a/guardrails/cli/hub/install.py +++ b/guardrails/cli/hub/install.py @@ -272,7 +272,7 @@ def install( status.update("Running post-install setup") run_post_install(module_manifest, site_packages) add_to_hub_inits(module_manifest, site_packages) - + console.print("Installation complete") if not quiet: diff --git a/tests/unit_tests/cli/hub/test_install.py b/tests/unit_tests/cli/hub/test_install.py index 836e3d9b8..42b3d93ca 100644 --- a/tests/unit_tests/cli/hub/test_install.py +++ b/tests/unit_tests/cli/hub/test_install.py @@ -69,7 +69,7 @@ def test_happy_path(self, mocker): msg="✅Successfully installed hub://guardrails/test-validator!\n\nImport validator:\nfrom guardrails.hub import TestValidator\n\nGet more info:\nhttps://hub.guardrailsai.com/validator/id\n", # noqa ), # noqa ] - assert mock_logger_log.call_count == 2 + assert mock_logger_log.call_count == 1 print(mock_logger_log) mock_logger_log.assert_has_calls(log_calls) @@ -706,3 +706,16 @@ def test_install_hub_module(mocker): call("install", "pydash>=7.0.6,<8.0.0"), ] mock_pip_process.assert_has_calls(pip_calls) + + def test_quiet_install(self, mocker): + mock_console_print = mocker.patch("guardrails.cli.hub.install.console.print") + + from guardrails.cli.hub.install import install + install("hub://guardrails/test-validator", quiet=True) + + # Expect no output other than the mandatory lines + mock_console_print.assert_has_calls([ + call("Installing validator..."), + call("Installation complete"), + ]) + assert mock_console_print.call_count == 2 \ No newline at end of file From 60ae651d413d4fd435b9b1b979915386210cf3fb Mon Sep 17 00:00:00 2001 From: Aarav Navani <38411399+oofmeister27@users.noreply.github.com> Date: Wed, 15 May 2024 18:23:26 -0700 Subject: [PATCH 14/17] logger log --- guardrails/cli/hub/install.py | 4 ++-- tests/unit_tests/cli/hub/test_install.py | 15 +++++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/guardrails/cli/hub/install.py b/guardrails/cli/hub/install.py index d2b7f7a44..c19127c6e 100644 --- a/guardrails/cli/hub/install.py +++ b/guardrails/cli/hub/install.py @@ -248,7 +248,7 @@ def install( logger.error("Invalid URI!") sys.exit(1) - console.print(f"\nInstalling {package_uri}...\n") + logger.info(f"\nInstalling {package_uri}...\n") # Validation module_name = package_uri.replace("hub://", "") @@ -273,7 +273,7 @@ def install( run_post_install(module_manifest, site_packages) add_to_hub_inits(module_manifest, site_packages) - console.print("Installation complete") + logger.info("Installation complete") if not quiet: success_message_cli = Template( diff --git a/tests/unit_tests/cli/hub/test_install.py b/tests/unit_tests/cli/hub/test_install.py index 42b3d93ca..89a7f76a2 100644 --- a/tests/unit_tests/cli/hub/test_install.py +++ b/tests/unit_tests/cli/hub/test_install.py @@ -706,16 +706,19 @@ def test_install_hub_module(mocker): call("install", "pydash>=7.0.6,<8.0.0"), ] mock_pip_process.assert_has_calls(pip_calls) - + def test_quiet_install(self, mocker): mock_console_print = mocker.patch("guardrails.cli.hub.install.console.print") from guardrails.cli.hub.install import install + install("hub://guardrails/test-validator", quiet=True) # Expect no output other than the mandatory lines - mock_console_print.assert_has_calls([ - call("Installing validator..."), - call("Installation complete"), - ]) - assert mock_console_print.call_count == 2 \ No newline at end of file + mock_console_print.assert_has_calls( + [ + call("Installing validator..."), + call("Installation complete"), + ] + ) + assert mock_console_print.call_count == 2 From 57f27d5f7224baa3b476c28cbd284af443d3bc8b Mon Sep 17 00:00:00 2001 From: Aarav Navani <38411399+oofmeister27@users.noreply.github.com> Date: Wed, 15 May 2024 18:42:08 -0700 Subject: [PATCH 15/17] fix test --- guardrails/cli/hub/install.py | 1 + 1 file changed, 1 insertion(+) diff --git a/guardrails/cli/hub/install.py b/guardrails/cli/hub/install.py index c19127c6e..287d94d7f 100644 --- a/guardrails/cli/hub/install.py +++ b/guardrails/cli/hub/install.py @@ -248,6 +248,7 @@ def install( logger.error("Invalid URI!") sys.exit(1) + logger.log(level=5, msg=f"Installing {package_uri}...") logger.info(f"\nInstalling {package_uri}...\n") # Validation From 7b1f5c7da77b00287ea1407aa87df0dc99510de0 Mon Sep 17 00:00:00 2001 From: Aarav Navani <38411399+oofmeister27@users.noreply.github.com> Date: Wed, 15 May 2024 18:47:48 -0700 Subject: [PATCH 16/17] logger log --- guardrails/cli/hub/install.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guardrails/cli/hub/install.py b/guardrails/cli/hub/install.py index 287d94d7f..33f7be2e5 100644 --- a/guardrails/cli/hub/install.py +++ b/guardrails/cli/hub/install.py @@ -248,7 +248,7 @@ def install( logger.error("Invalid URI!") sys.exit(1) - logger.log(level=5, msg=f"Installing {package_uri}...") + logger.log(level=5, msg=f"Installing {package_uri}...") logger.info(f"\nInstalling {package_uri}...\n") # Validation From 459418672443647af194ae9cef699a5db908ca35 Mon Sep 17 00:00:00 2001 From: Aarav Navani <38411399+oofmeister27@users.noreply.github.com> Date: Wed, 15 May 2024 18:52:27 -0700 Subject: [PATCH 17/17] test install --- tests/unit_tests/cli/hub/test_install.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit_tests/cli/hub/test_install.py b/tests/unit_tests/cli/hub/test_install.py index 89a7f76a2..fd7c55145 100644 --- a/tests/unit_tests/cli/hub/test_install.py +++ b/tests/unit_tests/cli/hub/test_install.py @@ -69,7 +69,7 @@ def test_happy_path(self, mocker): msg="✅Successfully installed hub://guardrails/test-validator!\n\nImport validator:\nfrom guardrails.hub import TestValidator\n\nGet more info:\nhttps://hub.guardrailsai.com/validator/id\n", # noqa ), # noqa ] - assert mock_logger_log.call_count == 1 + assert mock_logger_log.call_count == 2 print(mock_logger_log) mock_logger_log.assert_has_calls(log_calls)