diff --git a/guardrails_api/cli/start.py b/guardrails_api/cli/start.py index 61cb8b8..eb8f027 100644 --- a/guardrails_api/cli/start.py +++ b/guardrails_api/cli/start.py @@ -2,7 +2,7 @@ from typing import Optional from guardrails_api.cli.cli import cli from guardrails_api.app import create_app - +from guardrails_api.utils.configuration import valid_configuration @cli.command("start") def start( @@ -23,5 +23,5 @@ def start( # look for them in a .guardrailsrc in the current directory. env = env or None config = config or None - + valid_configuration(config) create_app(env, config, port).run(port=port) diff --git a/guardrails_api/utils/configuration.py b/guardrails_api/utils/configuration.py new file mode 100644 index 0000000..742f8f4 --- /dev/null +++ b/guardrails_api/utils/configuration.py @@ -0,0 +1,22 @@ +from guardrails_api.clients.postgres_client import postgres_is_enabled +from typing import Optional +import os + +def valid_configuration(config: Optional[str]=""): + default_config_file = os.path.join(os.path.dirname(__file__), "config.py") + + config_file_path = os.path.abspath(config) + default_config_file_path = os.path.abspath(default_config_file) + # If config.py is not present and + # if a config filepath is not passed and + # if postgres is not there (i.e. we’re using in-mem db) + # then raise ConfigurationError + has_default_config_file = os.path.isfile(default_config_file_path) + has_config_file = config != "" and os.path.isfile(config_file_path) + if not has_default_config_file and not has_config_file and not postgres_is_enabled(): + raise ConfigurationError("Can not start. Configuration not provided and default" + " configuration not found and postgres is not enabled.") + return True + +class ConfigurationError(Exception): + pass \ No newline at end of file diff --git a/tests/cli/test_start.py b/tests/cli/test_start.py index 2e31da8..2fd10da 100644 --- a/tests/cli/test_start.py +++ b/tests/cli/test_start.py @@ -1,5 +1,5 @@ from unittest.mock import MagicMock - +import os def test_start(mocker): mocker.patch("guardrails_api.cli.start.cli") @@ -10,7 +10,8 @@ def test_start(mocker): ) from guardrails_api.cli.start import start - + # pg enabled + os.environ["PGHOST"] = "localhost" start("env", "config", 8000) - + os.environ.pop("PGHOST") mock_create_app.assert_called_once_with("env", "config", 8000) diff --git a/tests/utils/test_configuration.py b/tests/utils/test_configuration.py new file mode 100644 index 0000000..635893a --- /dev/null +++ b/tests/utils/test_configuration.py @@ -0,0 +1,27 @@ +import os +import pytest +from guardrails_api.utils.configuration import valid_configuration, ConfigurationError + +def test_valid_configuration(mocker): + with pytest.raises(ConfigurationError): + valid_configuration() + + # pg enabled + os.environ["PGHOST"] = "localhost" + valid_configuration("config.py") + os.environ.pop("PGHOST") + + # custom config + mock_isfile = mocker.patch("os.path.isfile") + mock_isfile.side_effect = [False, True] + valid_configuration("config.py") + + # no config + mock_isfile.side_effect = [False, False] + with pytest.raises(ConfigurationError): + valid_configuration("") + + # default config + mock_isfile = mocker.patch("os.path.isfile") + mock_isfile.side_effect = [True, False] + valid_configuration()