frogml-cli 0.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- frogml_cli/__init__.py +10 -0
- frogml_cli/cli.py +40 -0
- frogml_cli/commands/__init__.py +0 -0
- frogml_cli/commands/_logic/__init__.py +0 -0
- frogml_cli/commands/_logic/tools.py +6 -0
- frogml_cli/commands/alerts/__init__.py +0 -0
- frogml_cli/commands/alerts/alerts_commnad_group.py +18 -0
- frogml_cli/commands/alerts/delete/__init__.py +0 -0
- frogml_cli/commands/alerts/delete/_logic.py +5 -0
- frogml_cli/commands/alerts/delete/ui.py +10 -0
- frogml_cli/commands/alerts/list/__init__.py +0 -0
- frogml_cli/commands/alerts/list/_logic.py +23 -0
- frogml_cli/commands/alerts/list/ui.py +17 -0
- frogml_cli/commands/alerts/register/__init__.py +0 -0
- frogml_cli/commands/alerts/register/_logic.py +72 -0
- frogml_cli/commands/alerts/register/ui.py +30 -0
- frogml_cli/commands/audience/__init__.py +0 -0
- frogml_cli/commands/audience/_logic/__init__.py +0 -0
- frogml_cli/commands/audience/_logic/config/__init__.py +0 -0
- frogml_cli/commands/audience/_logic/config/config_base.py +15 -0
- frogml_cli/commands/audience/_logic/config/parser.py +30 -0
- frogml_cli/commands/audience/_logic/config/v1/__init__.py +0 -0
- frogml_cli/commands/audience/_logic/config/v1/audience_config.py +25 -0
- frogml_cli/commands/audience/_logic/config/v1/conditions_config.py +59 -0
- frogml_cli/commands/audience/_logic/config/v1/config_v1.py +23 -0
- frogml_cli/commands/audience/_logic/config/v1/route_config.py +15 -0
- frogml_cli/commands/audience/_logic/config/v1/spec.py +9 -0
- frogml_cli/commands/audience/audience_api_dump.py +86 -0
- frogml_cli/commands/audience/audience_commands_group.py +30 -0
- frogml_cli/commands/audience/create/__init__.py +0 -0
- frogml_cli/commands/audience/create/logic.py +41 -0
- frogml_cli/commands/audience/create/ui.py +21 -0
- frogml_cli/commands/audience/delete/__init__.py +0 -0
- frogml_cli/commands/audience/delete/logic.py +13 -0
- frogml_cli/commands/audience/delete/ui.py +17 -0
- frogml_cli/commands/audience/get/__init__.py +0 -0
- frogml_cli/commands/audience/get/logic.py +14 -0
- frogml_cli/commands/audience/get/ui.py +25 -0
- frogml_cli/commands/audience/list/__init__.py +0 -0
- frogml_cli/commands/audience/list/logic.py +16 -0
- frogml_cli/commands/audience/list/ui.py +26 -0
- frogml_cli/commands/audience/update/__init__.py +0 -0
- frogml_cli/commands/audience/update/logic.py +37 -0
- frogml_cli/commands/audience/update/ui.py +26 -0
- frogml_cli/commands/auto_scalling/__init__.py +0 -0
- frogml_cli/commands/auto_scalling/_logic/__init__.py +0 -0
- frogml_cli/commands/auto_scalling/_logic/config/__init__.py +3 -0
- frogml_cli/commands/auto_scalling/_logic/config/config.py +152 -0
- frogml_cli/commands/auto_scalling/_logic/config/parser.py +21 -0
- frogml_cli/commands/auto_scalling/attach/__init__.py +0 -0
- frogml_cli/commands/auto_scalling/attach/_logic.py +43 -0
- frogml_cli/commands/auto_scalling/attach/ui.py +21 -0
- frogml_cli/commands/auto_scalling/autoscaling_commands_group.py +15 -0
- frogml_cli/commands/automations/__init__.py +0 -0
- frogml_cli/commands/automations/automations_commands_group.py +30 -0
- frogml_cli/commands/automations/delete/__init__.py +0 -0
- frogml_cli/commands/automations/delete/_logic.py +6 -0
- frogml_cli/commands/automations/delete/ui.py +23 -0
- frogml_cli/commands/automations/executions/__init__.py +0 -0
- frogml_cli/commands/automations/executions/executions_commands_group.py +14 -0
- frogml_cli/commands/automations/executions/list/__init__.py +0 -0
- frogml_cli/commands/automations/executions/list/_logic.py +8 -0
- frogml_cli/commands/automations/executions/list/ui.py +27 -0
- frogml_cli/commands/automations/list/__init__.py +0 -0
- frogml_cli/commands/automations/list/_logic.py +36 -0
- frogml_cli/commands/automations/list/ui.py +21 -0
- frogml_cli/commands/automations/register/__init__.py +0 -0
- frogml_cli/commands/automations/register/_logic.py +43 -0
- frogml_cli/commands/automations/register/ui.py +44 -0
- frogml_cli/commands/config/__init__.py +0 -0
- frogml_cli/commands/config/add/__init__.py +0 -0
- frogml_cli/commands/config/add/ui.py +62 -0
- frogml_cli/commands/config/config_commands_group.py +11 -0
- frogml_cli/commands/feature_store/__init__.py +0 -0
- frogml_cli/commands/feature_store/backfill/__init__.py +0 -0
- frogml_cli/commands/feature_store/backfill/_logic.py +140 -0
- frogml_cli/commands/feature_store/backfill/ui.py +129 -0
- frogml_cli/commands/feature_store/delete/__init__.py +0 -0
- frogml_cli/commands/feature_store/delete/_logic.py +107 -0
- frogml_cli/commands/feature_store/delete/ui.py +40 -0
- frogml_cli/commands/feature_store/execution/__init__.py +0 -0
- frogml_cli/commands/feature_store/execution/ui.py +19 -0
- frogml_cli/commands/feature_store/feature_store_command_group.py +29 -0
- frogml_cli/commands/feature_store/list/__init__.py +0 -0
- frogml_cli/commands/feature_store/list/ui.py +140 -0
- frogml_cli/commands/feature_store/pause/__init__.py +0 -0
- frogml_cli/commands/feature_store/pause/ui.py +18 -0
- frogml_cli/commands/feature_store/register/__init__.py +0 -0
- frogml_cli/commands/feature_store/register/_logic.py +369 -0
- frogml_cli/commands/feature_store/register/ui.py +111 -0
- frogml_cli/commands/feature_store/resume/__init__.py +0 -0
- frogml_cli/commands/feature_store/resume/ui.py +18 -0
- frogml_cli/commands/feature_store/trigger/__init__.py +0 -0
- frogml_cli/commands/feature_store/trigger/ui.py +39 -0
- frogml_cli/commands/models/__init__.py +0 -0
- frogml_cli/commands/models/build/__init__.py +0 -0
- frogml_cli/commands/models/build/_logic/__init__.py +0 -0
- frogml_cli/commands/models/build/_logic/build_steps.py +42 -0
- frogml_cli/commands/models/build/_logic/client_logs/__init__.py +0 -0
- frogml_cli/commands/models/build/_logic/client_logs/cli_phase_run_handler.py +123 -0
- frogml_cli/commands/models/build/_logic/client_logs/cli_trigger_build_logger.py +19 -0
- frogml_cli/commands/models/build/_logic/client_logs/logger.py +88 -0
- frogml_cli/commands/models/build/_logic/client_logs/messages.py +36 -0
- frogml_cli/commands/models/build/_logic/client_logs/spinner.py +14 -0
- frogml_cli/commands/models/build/_logic/client_logs/trigger_build_logger.py +54 -0
- frogml_cli/commands/models/build/_logic/client_logs/utils.py +12 -0
- frogml_cli/commands/models/build/_logic/phase/__init__.py +0 -0
- frogml_cli/commands/models/build/_logic/phase/a_fetch_model_code/__init__.py +20 -0
- frogml_cli/commands/models/build/_logic/phase/a_fetch_model_code/get_sdk_version_step.py +15 -0
- frogml_cli/commands/models/build/_logic/phase/b_remote_register_frogml_build/__init__.py +16 -0
- frogml_cli/commands/models/build/_logic/phase/c_deploy/__init__.py +6 -0
- frogml_cli/commands/models/build/_logic/phase/c_deploy/build_polling_status.py +55 -0
- frogml_cli/commands/models/build/_logic/phase/c_deploy/deploy_build.py +61 -0
- frogml_cli/commands/models/build/_logic/util/__init__.py +0 -0
- frogml_cli/commands/models/build/_logic/util/protobuf_factory.py +45 -0
- frogml_cli/commands/models/build/_logic/util/step_decorator.py +60 -0
- frogml_cli/commands/models/build/_logic/util/text.py +9 -0
- frogml_cli/commands/models/build/_logic/wait_until_finished.py +27 -0
- frogml_cli/commands/models/build/ui.py +337 -0
- frogml_cli/commands/models/builds/__init__.py +0 -0
- frogml_cli/commands/models/builds/builds_commands_group.py +16 -0
- frogml_cli/commands/models/builds/cancel/__init__.py +0 -0
- frogml_cli/commands/models/builds/cancel/_logic.py +5 -0
- frogml_cli/commands/models/builds/cancel/ui.py +15 -0
- frogml_cli/commands/models/builds/logs/__init__.py +0 -0
- frogml_cli/commands/models/builds/logs/ui.py +35 -0
- frogml_cli/commands/models/builds/status/__init__.py +0 -0
- frogml_cli/commands/models/builds/status/_logic.py +6 -0
- frogml_cli/commands/models/builds/status/ui.py +39 -0
- frogml_cli/commands/models/create/__init__.py +0 -0
- frogml_cli/commands/models/create/_logic.py +40 -0
- frogml_cli/commands/models/create/ui.py +46 -0
- frogml_cli/commands/models/delete/__init__.py +0 -0
- frogml_cli/commands/models/delete/_logic.py +18 -0
- frogml_cli/commands/models/delete/ui.py +25 -0
- frogml_cli/commands/models/deployments/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/_logic/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/_logic/advance_deployment_options_handler.py +31 -0
- frogml_cli/commands/models/deployments/deploy/_logic/base_deploy_executor.py +70 -0
- frogml_cli/commands/models/deployments/deploy/_logic/deploy_config.py +261 -0
- frogml_cli/commands/models/deployments/deploy/_logic/deployment.py +407 -0
- frogml_cli/commands/models/deployments/deploy/_logic/deployment_message_helpers.py +116 -0
- frogml_cli/commands/models/deployments/deploy/_logic/deployment_response_handler.py +156 -0
- frogml_cli/commands/models/deployments/deploy/_logic/deployment_size_mapper.py +98 -0
- frogml_cli/commands/models/deployments/deploy/_logic/get_latest_successful_build.py +28 -0
- frogml_cli/commands/models/deployments/deploy/_logic/local_deployment.py +193 -0
- frogml_cli/commands/models/deployments/deploy/batch/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/batch/_logic/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/batch/_logic/advanced_deployment_mapper.py +15 -0
- frogml_cli/commands/models/deployments/deploy/batch/_logic/deploy_executor.py +24 -0
- frogml_cli/commands/models/deployments/deploy/batch/ui.py +119 -0
- frogml_cli/commands/models/deployments/deploy/deploy_commands_group.py +19 -0
- frogml_cli/commands/models/deployments/deploy/realtime/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/realtime/_logic/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/realtime/_logic/advanced_deployment_mapper.py +21 -0
- frogml_cli/commands/models/deployments/deploy/realtime/_logic/deploy_executor.py +24 -0
- frogml_cli/commands/models/deployments/deploy/realtime/_logic/serving_strategy_mapper.py +75 -0
- frogml_cli/commands/models/deployments/deploy/realtime/ui.py +202 -0
- frogml_cli/commands/models/deployments/deploy/streaming/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/streaming/_logic/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/streaming/_logic/deploy_executor.py +24 -0
- frogml_cli/commands/models/deployments/deploy/streaming/_logic/serving_strategy_mapper.py +38 -0
- frogml_cli/commands/models/deployments/deploy/streaming/ui.py +206 -0
- frogml_cli/commands/models/deployments/undeploy/__init__.py +0 -0
- frogml_cli/commands/models/deployments/undeploy/_logic/__init__.py +0 -0
- frogml_cli/commands/models/deployments/undeploy/_logic/request_undeploy.py +249 -0
- frogml_cli/commands/models/deployments/undeploy/ui.py +61 -0
- frogml_cli/commands/models/describe/__init__.py +0 -0
- frogml_cli/commands/models/describe/_logic.py +169 -0
- frogml_cli/commands/models/describe/ui.py +35 -0
- frogml_cli/commands/models/executions/__init__.py +0 -0
- frogml_cli/commands/models/executions/cancel/__init__.py +0 -0
- frogml_cli/commands/models/executions/cancel/_logic.py +9 -0
- frogml_cli/commands/models/executions/cancel/ui.py +27 -0
- frogml_cli/commands/models/executions/execution_commands_group.py +24 -0
- frogml_cli/commands/models/executions/report/__init__.py +0 -0
- frogml_cli/commands/models/executions/report/_logic.py +14 -0
- frogml_cli/commands/models/executions/report/ui.py +43 -0
- frogml_cli/commands/models/executions/start/__init__.py +0 -0
- frogml_cli/commands/models/executions/start/_logic.py +83 -0
- frogml_cli/commands/models/executions/start/ui.py +208 -0
- frogml_cli/commands/models/executions/status/__init__.py +0 -0
- frogml_cli/commands/models/executions/status/_logic.py +13 -0
- frogml_cli/commands/models/executions/status/ui.py +27 -0
- frogml_cli/commands/models/init/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/initialize_model_structure.py +40 -0
- frogml_cli/commands/models/init/_logic/template/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/churn/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/churn/cookiecutter.json +3 -0
- frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/main/__init__.py +5 -0
- frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/main/conda.yml +10 -0
- frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/main/data.csv +1001 -0
- frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/main/model.py +99 -0
- frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/tests/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/tests/it/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/tests/it/test_churn.py +32 -0
- frogml_cli/commands/models/init/_logic/template/credit_risk/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/credit_risk/cookiecutter.json +3 -0
- frogml_cli/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/main/__init__.py +5 -0
- frogml_cli/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/main/conda.yml +11 -0
- frogml_cli/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/main/data.csv +1001 -0
- frogml_cli/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/main/model.py +108 -0
- frogml_cli/commands/models/init/_logic/template/general/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/general/cookiecutter.json +6 -0
- frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.main_directory}}/__init__.py +5 -0
- frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.main_directory}}/conda.yml +8 -0
- frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.main_directory}}/model.py +66 -0
- frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.test_directory}}/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.test_directory}}/test_qwak_model.py +5 -0
- frogml_cli/commands/models/init/_logic/template/titanic/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/titanic/cookiecutter.json +3 -0
- frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/main/__init__.py +5 -0
- frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/main/conda.yml +11 -0
- frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/main/model.py +98 -0
- frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/tests/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/tests/it/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/tests/it/test_titanic.py +24 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/cookiecutter.json +3 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/main/__init__.py +5 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/main/model.py +98 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/main/pyproject.toml +20 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/tests/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/tests/it/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/tests/it/test_titanic.py +25 -0
- frogml_cli/commands/models/init/ui.py +61 -0
- frogml_cli/commands/models/list/__init__.py +0 -0
- frogml_cli/commands/models/list/_logic.py +5 -0
- frogml_cli/commands/models/list/ui.py +41 -0
- frogml_cli/commands/models/list_models/__init__.py +0 -0
- frogml_cli/commands/models/list_models/_logic.py +11 -0
- frogml_cli/commands/models/list_models/ui.py +60 -0
- frogml_cli/commands/models/metadata/__init__.py +0 -0
- frogml_cli/commands/models/metadata/_logic.py +12 -0
- frogml_cli/commands/models/metadata/ui.py +60 -0
- frogml_cli/commands/models/models_command_group.py +44 -0
- frogml_cli/commands/models/runtime/__init__.py +0 -0
- frogml_cli/commands/models/runtime/logs/__init__.py +0 -0
- frogml_cli/commands/models/runtime/logs/ui.py +63 -0
- frogml_cli/commands/models/runtime/runtime_commands_group.py +17 -0
- frogml_cli/commands/models/runtime/update/__init__.py +0 -0
- frogml_cli/commands/models/runtime/update/_logic.py +9 -0
- frogml_cli/commands/models/runtime/update/ui.py +17 -0
- frogml_cli/commands/secrets/__init__.py +0 -0
- frogml_cli/commands/secrets/delete/__init__.py +0 -0
- frogml_cli/commands/secrets/delete/_logic.py +5 -0
- frogml_cli/commands/secrets/delete/ui.py +21 -0
- frogml_cli/commands/secrets/get/__init__.py +0 -0
- frogml_cli/commands/secrets/get/_logic.py +5 -0
- frogml_cli/commands/secrets/get/ui.py +17 -0
- frogml_cli/commands/secrets/secrets_commands_group.py +19 -0
- frogml_cli/commands/secrets/set/__init__.py +0 -0
- frogml_cli/commands/secrets/set/_logic.py +5 -0
- frogml_cli/commands/secrets/set/ui.py +16 -0
- frogml_cli/commands/ui_tools.py +18 -0
- frogml_cli/exceptions/__init__.py +14 -0
- frogml_cli/exceptions/frogml_command_exception.py +2 -0
- frogml_cli/exceptions/frogml_deploy_new_build_failed.py +5 -0
- frogml_cli/exceptions/frogml_resource_not_found.py +2 -0
- frogml_cli/inner/__init__.py +0 -0
- frogml_cli/inner/file_registry.py +98 -0
- frogml_cli/inner/tools/__init__.py +0 -0
- frogml_cli/inner/tools/cli_tools.py +179 -0
- frogml_cli/inner/tools/config_handler.py +29 -0
- frogml_cli/inner/tools/dataclasses_utils.py +21 -0
- frogml_cli/inner/tools/logger/__init__.py +3 -0
- frogml_cli/inner/tools/logger/logger.py +278 -0
- frogml_cli/inner/tools/logger/logging.yml +79 -0
- frogml_cli/inner/tools/tracking.py +47 -0
- frogml_cli/main.py +9 -0
- frogml_cli/tools/__init__.py +0 -0
- frogml_cli/tools/colors.py +13 -0
- frogml_cli/tools/const.py +3 -0
- frogml_cli/tools/files.py +63 -0
- frogml_cli/tools/log_handling.py +159 -0
- frogml_cli/tools/utils.py +45 -0
- frogml_cli-0.0.1.dist-info/METADATA +51 -0
- frogml_cli-0.0.1.dist-info/RECORD +287 -0
- frogml_cli-0.0.1.dist-info/WHEEL +4 -0
- frogml_cli-0.0.1.dist-info/entry_points.txt +3 -0
frogml_cli/__init__.py
ADDED
frogml_cli/cli.py
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
import click
|
2
|
+
from packaging import version
|
3
|
+
|
4
|
+
from frogml_cli import __version__ as sdk_version
|
5
|
+
from frogml_cli.commands.alerts.alerts_commnad_group import alerts_commands_group
|
6
|
+
from frogml_cli.commands.audience.audience_commands_group import audience_commands_group
|
7
|
+
from frogml_cli.commands.automations.automations_commands_group import (
|
8
|
+
automations_commands_group,
|
9
|
+
)
|
10
|
+
from frogml_cli.commands.config.config_commands_group import config_commands_group
|
11
|
+
from frogml_cli.commands.feature_store.feature_store_command_group import (
|
12
|
+
feature_store_commands_group,
|
13
|
+
)
|
14
|
+
from frogml_cli.commands.models.models_command_group import models_command_group
|
15
|
+
from frogml_cli.commands.secrets.secrets_commands_group import secrets_commands_group
|
16
|
+
from frogml_cli.inner.tools.logger import setup_frogml_logger
|
17
|
+
|
18
|
+
version_option_kwargs = {}
|
19
|
+
if version.parse(click.__version__) >= version.parse("8.0.0"):
|
20
|
+
version_option_kwargs["package_name"] = "frogml_cli"
|
21
|
+
version_option_kwargs["version"] = sdk_version
|
22
|
+
|
23
|
+
|
24
|
+
def create_frogml_cli():
|
25
|
+
setup_frogml_logger()
|
26
|
+
|
27
|
+
@click.group()
|
28
|
+
@click.version_option(**version_option_kwargs)
|
29
|
+
def frogml_cli():
|
30
|
+
# This class is intentionally empty
|
31
|
+
pass
|
32
|
+
|
33
|
+
frogml_cli.add_command(config_commands_group)
|
34
|
+
frogml_cli.add_command(models_command_group)
|
35
|
+
frogml_cli.add_command(secrets_commands_group)
|
36
|
+
frogml_cli.add_command(automations_commands_group)
|
37
|
+
frogml_cli.add_command(feature_store_commands_group)
|
38
|
+
frogml_cli.add_command(audience_commands_group)
|
39
|
+
frogml_cli.add_command(alerts_commands_group)
|
40
|
+
return frogml_cli
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import click
|
2
|
+
|
3
|
+
from frogml_cli.commands.alerts.delete.ui import delete_channel
|
4
|
+
from frogml_cli.commands.alerts.list.ui import list_channels
|
5
|
+
from frogml_cli.commands.alerts.register.ui import register_channel
|
6
|
+
|
7
|
+
|
8
|
+
@click.group(
|
9
|
+
name="alerts",
|
10
|
+
help="Commands for interacting with the Qwak alerts System",
|
11
|
+
)
|
12
|
+
def alerts_commands_group():
|
13
|
+
pass
|
14
|
+
|
15
|
+
|
16
|
+
alerts_commands_group.add_command(register_channel)
|
17
|
+
alerts_commands_group.add_command(list_channels)
|
18
|
+
alerts_commands_group.add_command(delete_channel)
|
File without changes
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import click
|
2
|
+
|
3
|
+
from frogml_cli.commands.alerts.delete._logic import execute_delete_channel
|
4
|
+
from frogml_cli.inner.tools.cli_tools import FrogMLCommand
|
5
|
+
|
6
|
+
|
7
|
+
@click.command("delete", cls=FrogMLCommand, help="Delete a Channel by name")
|
8
|
+
@click.argument("name")
|
9
|
+
def delete_channel(name, **kwargs):
|
10
|
+
execute_delete_channel(name)
|
File without changes
|
@@ -0,0 +1,23 @@
|
|
1
|
+
from typing import List, Tuple
|
2
|
+
|
3
|
+
from frogml.core.clients.alerts_registry import AlertingRegistryClient
|
4
|
+
from frogml.core.clients.alerts_registry.channel import Channel
|
5
|
+
from tabulate import tabulate
|
6
|
+
|
7
|
+
from frogml_cli.commands._logic.tools import list_of_messages_to_json_str
|
8
|
+
|
9
|
+
|
10
|
+
def execute_list_channels():
|
11
|
+
alerts_client = AlertingRegistryClient()
|
12
|
+
channels: List[Tuple[str, Channel]] = alerts_client.list_alerting_channel()
|
13
|
+
columns = ["id", "Name", "Type", "repr"]
|
14
|
+
data = []
|
15
|
+
for c_id, c in channels:
|
16
|
+
data.append([c_id, c.name, type(c.channel_conf).__name__, c.__dict__])
|
17
|
+
return tabulate(data, headers=columns)
|
18
|
+
|
19
|
+
|
20
|
+
def execute_json_format_list_channels():
|
21
|
+
alerts_client = AlertingRegistryClient()
|
22
|
+
channels = alerts_client.list_alerting_channel_from_client().description
|
23
|
+
return list_of_messages_to_json_str(channels)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import click
|
2
|
+
|
3
|
+
from frogml_cli.commands.alerts.list._logic import (
|
4
|
+
execute_json_format_list_channels,
|
5
|
+
execute_list_channels,
|
6
|
+
)
|
7
|
+
from frogml_cli.inner.tools.cli_tools import FrogMLCommand
|
8
|
+
|
9
|
+
|
10
|
+
@click.command("list", cls=FrogMLCommand, help="List all alerts system channels.")
|
11
|
+
@click.option("--json-format", is_flag=True, type=bool)
|
12
|
+
def list_channels(json_format, **kwargs):
|
13
|
+
if json_format:
|
14
|
+
print(execute_json_format_list_channels())
|
15
|
+
|
16
|
+
else:
|
17
|
+
print(execute_list_channels())
|
File without changes
|
@@ -0,0 +1,72 @@
|
|
1
|
+
import os
|
2
|
+
from pathlib import Path
|
3
|
+
from typing import List
|
4
|
+
|
5
|
+
from frogml.core.clients.alerts_registry import AlertingRegistryClient
|
6
|
+
from frogml.core.clients.alerts_registry.channel import Channel
|
7
|
+
|
8
|
+
from frogml_cli.inner.file_registry import extract_class_objects, list_qwak_python_files
|
9
|
+
from frogml_cli.inner.tools.cli_tools import ask_yesno
|
10
|
+
from frogml_cli.tools.utils import frogml_spinner
|
11
|
+
|
12
|
+
FROGML_alerts_DELIMITER = "----------------------------------------"
|
13
|
+
|
14
|
+
|
15
|
+
def _register_channels(qwak_python_files, alerts_client, force):
|
16
|
+
"""
|
17
|
+
Register Channels
|
18
|
+
|
19
|
+
Args:
|
20
|
+
qwak_python_files: a list of python files containing qwak package imports
|
21
|
+
alerts_client: AlertingRegistryClient alerts service client
|
22
|
+
force: boolean determining if to force register all encountered Channel objects
|
23
|
+
"""
|
24
|
+
with frogml_spinner(
|
25
|
+
begin_text="Looking for channels to register", print_callback=print
|
26
|
+
):
|
27
|
+
qwak_channels: List[Channel] = extract_class_objects(qwak_python_files, Channel)
|
28
|
+
|
29
|
+
print(f"👀 Found {len(qwak_channels)} Channels")
|
30
|
+
for channel, source_file_path in qwak_channels:
|
31
|
+
channel_id, existing_channel = alerts_client.get_alerting_channel(channel.name)
|
32
|
+
if existing_channel:
|
33
|
+
if ask_yesno(
|
34
|
+
f"Update existing Channel '{channel.name}' from source file '{source_file_path}'?",
|
35
|
+
force,
|
36
|
+
):
|
37
|
+
alerts_client.update_alerting_channel(
|
38
|
+
channel_id=channel_id, channel=channel
|
39
|
+
)
|
40
|
+
else:
|
41
|
+
if ask_yesno(
|
42
|
+
f"Create new Channel '{channel.name}' from source file '{source_file_path}'?",
|
43
|
+
force,
|
44
|
+
):
|
45
|
+
alerts_client.create_alerting_channel(channel)
|
46
|
+
print(FROGML_alerts_DELIMITER)
|
47
|
+
|
48
|
+
|
49
|
+
def execute_register_channel(path: Path, force: bool):
|
50
|
+
if not path:
|
51
|
+
path = Path.cwd()
|
52
|
+
else:
|
53
|
+
path = Path(path)
|
54
|
+
|
55
|
+
if path.is_file():
|
56
|
+
qwak_python_files = [(str(path), os.path.abspath(path))]
|
57
|
+
elif Path.is_dir(path):
|
58
|
+
with frogml_spinner(
|
59
|
+
begin_text="Recursively looking for python files in input dir",
|
60
|
+
print_callback=print,
|
61
|
+
) as sp:
|
62
|
+
qwak_python_files = list_qwak_python_files(path, sp)
|
63
|
+
print(qwak_python_files)
|
64
|
+
print(sp)
|
65
|
+
pass
|
66
|
+
|
67
|
+
alerts_client = AlertingRegistryClient()
|
68
|
+
_register_channels(
|
69
|
+
qwak_python_files=qwak_python_files,
|
70
|
+
alerts_client=alerts_client,
|
71
|
+
force=force,
|
72
|
+
)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
|
3
|
+
import click
|
4
|
+
|
5
|
+
from frogml_cli.commands.alerts.register._logic import execute_register_channel
|
6
|
+
from frogml_cli.inner.tools.cli_tools import FrogMLCommand
|
7
|
+
|
8
|
+
|
9
|
+
@click.command(
|
10
|
+
"register",
|
11
|
+
cls=FrogMLCommand,
|
12
|
+
help="Register all alerts system objects under the given path.",
|
13
|
+
)
|
14
|
+
@click.option(
|
15
|
+
"--path",
|
16
|
+
"-p",
|
17
|
+
type=click.Path(exists=True),
|
18
|
+
metavar="PATH",
|
19
|
+
help="Directory / module where frogml alerts system objects are stored",
|
20
|
+
)
|
21
|
+
@click.option(
|
22
|
+
"--force",
|
23
|
+
"-f",
|
24
|
+
default=False,
|
25
|
+
is_flag=True,
|
26
|
+
metavar="FLAG",
|
27
|
+
help="Force register all found frogml alerts system objects",
|
28
|
+
)
|
29
|
+
def register_channel(path: Path, force: bool, **kwargs):
|
30
|
+
execute_register_channel(path, force)
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
from abc import ABC, abstractmethod
|
2
|
+
from dataclasses import dataclass, field
|
3
|
+
from typing import Any
|
4
|
+
|
5
|
+
from frogml._proto.qwak.audience.v1.audience_pb2 import Audience
|
6
|
+
|
7
|
+
|
8
|
+
@dataclass
|
9
|
+
class ConfigBase(ABC):
|
10
|
+
spec: Any
|
11
|
+
api_version: str = field(default="v1")
|
12
|
+
|
13
|
+
@abstractmethod
|
14
|
+
def to_audiences_api(self) -> Audience:
|
15
|
+
pass
|
@@ -0,0 +1,30 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
from typing import Optional, Union
|
3
|
+
|
4
|
+
import yaml
|
5
|
+
|
6
|
+
from frogml_cli.commands.audience._logic.config.config_base import ConfigBase
|
7
|
+
from frogml_cli.commands.audience._logic.config.v1.config_v1 import ConfigV1
|
8
|
+
from frogml_cli.inner.tools.dataclasses_utils import create_dataclass_instance
|
9
|
+
|
10
|
+
VERSION_CONFIG_MAPPING = {"v1": ConfigV1}
|
11
|
+
|
12
|
+
|
13
|
+
def parse_audience_from_yaml(
|
14
|
+
file_path: Optional[Union[Path, str]] = None
|
15
|
+
) -> ConfigBase:
|
16
|
+
if file_path:
|
17
|
+
file_path_obj = Path(file_path)
|
18
|
+
if file_path_obj.exists():
|
19
|
+
audience_dict = yaml.safe_load(file_path_obj.open("r"))
|
20
|
+
audience_config: ConfigBase = VERSION_CONFIG_MAPPING.get(
|
21
|
+
audience_dict.get("api_version")
|
22
|
+
)
|
23
|
+
|
24
|
+
return create_dataclass_instance(audience_config, audience_dict)
|
25
|
+
else:
|
26
|
+
raise FileNotFoundError(
|
27
|
+
f"Audience file {file_path_obj} definition isn't found"
|
28
|
+
)
|
29
|
+
else:
|
30
|
+
return ConfigV1()
|
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
from dataclasses import dataclass, field
|
2
|
+
from typing import List
|
3
|
+
|
4
|
+
from frogml._proto.qwak.audience.v1.audience_pb2 import AudienceRoutesEntry
|
5
|
+
|
6
|
+
from frogml_cli.commands.audience._logic.config.v1.conditions_config import (
|
7
|
+
ConditionsConfig,
|
8
|
+
)
|
9
|
+
from frogml_cli.commands.audience._logic.config.v1.route_config import RouteConfig
|
10
|
+
|
11
|
+
|
12
|
+
@dataclass
|
13
|
+
class AudienceConfig:
|
14
|
+
name: str = field(default="")
|
15
|
+
id: str = field(default="")
|
16
|
+
description: str = field(default="")
|
17
|
+
routes: List[RouteConfig] = field(default_factory=list)
|
18
|
+
conditions: ConditionsConfig = field(default_factory=ConditionsConfig)
|
19
|
+
|
20
|
+
def to_audience_route_entry(self, index: int = 0) -> AudienceRoutesEntry:
|
21
|
+
return AudienceRoutesEntry(
|
22
|
+
audience_id=self.id,
|
23
|
+
order=index + 1,
|
24
|
+
routes=[route.to_route_api() for route in self.routes],
|
25
|
+
)
|
@@ -0,0 +1,59 @@
|
|
1
|
+
from dataclasses import dataclass, field
|
2
|
+
from typing import List
|
3
|
+
|
4
|
+
from frogml._proto.qwak.audience.v1.audience_pb2 import (
|
5
|
+
BinaryCondition,
|
6
|
+
BinaryOperatorType,
|
7
|
+
Condition,
|
8
|
+
UnaryCondition,
|
9
|
+
UnaryOperatorType,
|
10
|
+
)
|
11
|
+
|
12
|
+
|
13
|
+
@dataclass
|
14
|
+
class UnaryConditionConfig:
|
15
|
+
key: str
|
16
|
+
operator: str
|
17
|
+
operand: str
|
18
|
+
|
19
|
+
def to_condition_api(self) -> Condition:
|
20
|
+
return Condition(
|
21
|
+
key=self.key,
|
22
|
+
unary_condition=UnaryCondition(
|
23
|
+
operator=UnaryOperatorType.DESCRIPTOR.values_by_name[
|
24
|
+
self.operator
|
25
|
+
].number,
|
26
|
+
operand=self.operand,
|
27
|
+
),
|
28
|
+
)
|
29
|
+
|
30
|
+
|
31
|
+
@dataclass
|
32
|
+
class BinaryConditionConfig:
|
33
|
+
key: str
|
34
|
+
operator: str
|
35
|
+
first_operand: str
|
36
|
+
second_operand: str
|
37
|
+
|
38
|
+
def to_condition_api(self) -> Condition:
|
39
|
+
return Condition(
|
40
|
+
key=self.key,
|
41
|
+
binary_condition=BinaryCondition(
|
42
|
+
operator=BinaryOperatorType.DESCRIPTOR.values_by_name[
|
43
|
+
self.operator
|
44
|
+
].number,
|
45
|
+
first_operand=str(self.first_operand),
|
46
|
+
second_operand=str(self.second_operand),
|
47
|
+
),
|
48
|
+
)
|
49
|
+
|
50
|
+
|
51
|
+
@dataclass
|
52
|
+
class ConditionsConfig:
|
53
|
+
unary: List[UnaryConditionConfig] = field(default_factory=list)
|
54
|
+
binary: List[BinaryConditionConfig] = field(default_factory=list)
|
55
|
+
|
56
|
+
def to_conditions_api(self) -> List[Condition]:
|
57
|
+
conditions = [condition.to_condition_api() for condition in self.unary]
|
58
|
+
conditions.extend([condition.to_condition_api() for condition in self.binary])
|
59
|
+
return conditions
|
@@ -0,0 +1,23 @@
|
|
1
|
+
from dataclasses import dataclass, field
|
2
|
+
from typing import List
|
3
|
+
|
4
|
+
from frogml._proto.qwak.audience.v1.audience_pb2 import Audience
|
5
|
+
|
6
|
+
from frogml_cli.commands.audience._logic.config.config_base import ConfigBase
|
7
|
+
from frogml_cli.commands.audience._logic.config.v1.spec import Spec
|
8
|
+
|
9
|
+
|
10
|
+
@dataclass
|
11
|
+
class ConfigV1(ConfigBase):
|
12
|
+
spec: Spec = field(default_factory=Spec)
|
13
|
+
|
14
|
+
def to_audiences_api(self) -> List[Audience]:
|
15
|
+
return [
|
16
|
+
Audience(
|
17
|
+
name=audience_config.name,
|
18
|
+
description=audience_config.description,
|
19
|
+
routes=[route.to_route_api() for route in audience_config.routes],
|
20
|
+
conditions=audience_config.conditions.to_conditions_api(),
|
21
|
+
)
|
22
|
+
for audience_config in self.spec.audiences
|
23
|
+
]
|
@@ -0,0 +1,15 @@
|
|
1
|
+
from dataclasses import dataclass
|
2
|
+
|
3
|
+
from frogml._proto.qwak.audience.v1.audience_pb2 import Route
|
4
|
+
|
5
|
+
|
6
|
+
@dataclass
|
7
|
+
class RouteConfig:
|
8
|
+
variation_name: str
|
9
|
+
weight: int
|
10
|
+
shadow: bool
|
11
|
+
|
12
|
+
def to_route_api(self):
|
13
|
+
return Route(
|
14
|
+
variation_name=self.variation_name, weight=self.weight, shadow=self.shadow
|
15
|
+
)
|
@@ -0,0 +1,86 @@
|
|
1
|
+
from typing import List
|
2
|
+
|
3
|
+
from frogml._proto.qwak.audience.v1.audience_pb2 import (
|
4
|
+
Audience,
|
5
|
+
AudienceEntry,
|
6
|
+
BinaryOperatorType,
|
7
|
+
UnaryOperatorType,
|
8
|
+
)
|
9
|
+
from google.protobuf.json_format import MessageToJson
|
10
|
+
from tabulate import tabulate
|
11
|
+
|
12
|
+
from frogml_cli.tools.colors import Color
|
13
|
+
|
14
|
+
|
15
|
+
def audience_to_json(audience: Audience):
|
16
|
+
return MessageToJson(audience)
|
17
|
+
|
18
|
+
|
19
|
+
def audience_to_pretty_string(audience_id: str, audience: Audience):
|
20
|
+
header = f"{Color.UNDERLINE + Color.BOLD}Audience {audience_id}{Color.END}"
|
21
|
+
details_header = f"{Color.UNDERLINE}Details{Color.END}"
|
22
|
+
details_table = tabulate(
|
23
|
+
tabular_data=[[audience.name, audience.description]],
|
24
|
+
headers=["name", "description"],
|
25
|
+
tablefmt="pretty",
|
26
|
+
)
|
27
|
+
conditions_header = f"{Color.UNDERLINE}Conditions{Color.END}"
|
28
|
+
conditions_binary_header = f"{Color.CYAN}Binary condition{Color.END}"
|
29
|
+
conditions_binary_table = tabulate(
|
30
|
+
tabular_data=[
|
31
|
+
[
|
32
|
+
condition.key,
|
33
|
+
BinaryOperatorType.DESCRIPTOR.values_by_number[
|
34
|
+
condition.binary_condition.operator
|
35
|
+
].name,
|
36
|
+
condition.binary_condition.first_operand,
|
37
|
+
condition.binary_condition.second_operand,
|
38
|
+
]
|
39
|
+
for condition in audience.conditions
|
40
|
+
if condition.binary_condition.operator
|
41
|
+
],
|
42
|
+
headers=["Key", "Operator", "First operand", "Second operand"],
|
43
|
+
tablefmt="pretty",
|
44
|
+
)
|
45
|
+
conditions_unary_header = f"{Color.CYAN}Unary condition{Color.END}"
|
46
|
+
conditions_unary_table = tabulate(
|
47
|
+
tabular_data=[
|
48
|
+
[
|
49
|
+
condition.key,
|
50
|
+
UnaryOperatorType.DESCRIPTOR.values_by_number[
|
51
|
+
condition.unary_condition.operator
|
52
|
+
].name,
|
53
|
+
condition.unary_condition.operand,
|
54
|
+
]
|
55
|
+
for condition in audience.conditions
|
56
|
+
if condition.unary_condition.operator
|
57
|
+
],
|
58
|
+
headers=["Key", "Operator", "Operand"],
|
59
|
+
tablefmt="pretty",
|
60
|
+
)
|
61
|
+
|
62
|
+
return f"""
|
63
|
+
{header}
|
64
|
+
{details_header}
|
65
|
+
{details_table}
|
66
|
+
|
67
|
+
{conditions_header}
|
68
|
+
{conditions_unary_header}
|
69
|
+
{conditions_unary_table}
|
70
|
+
|
71
|
+
{conditions_binary_header}
|
72
|
+
{conditions_binary_table}
|
73
|
+
"""
|
74
|
+
|
75
|
+
|
76
|
+
def audience_entries_to_pretty_string(audience_entries: List[AudienceEntry]) -> str:
|
77
|
+
header = f"{Color.BOLD + Color.UNDERLINE}Audiences{Color.END}"
|
78
|
+
table = tabulate(
|
79
|
+
tabular_data=[[entry.id, entry.audience.name] for entry in audience_entries],
|
80
|
+
headers=["Audience ID", "Audience Name"],
|
81
|
+
tablefmt="pretty",
|
82
|
+
)
|
83
|
+
return f"""
|
84
|
+
{header}
|
85
|
+
{table}
|
86
|
+
"""
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
import click
|
4
|
+
|
5
|
+
from frogml_cli.commands.audience.create.ui import create_audience_command
|
6
|
+
from frogml_cli.commands.audience.delete.ui import delete_audience_command
|
7
|
+
from frogml_cli.commands.audience.get.ui import get_audience_command
|
8
|
+
from frogml_cli.commands.audience.list.ui import list_audience_command
|
9
|
+
from frogml_cli.commands.audience.update.ui import update_audience_command
|
10
|
+
|
11
|
+
logger = logging.getLogger(__name__)
|
12
|
+
DELIMITER = "----------------------------------------"
|
13
|
+
|
14
|
+
AUTOMATION = "automation"
|
15
|
+
|
16
|
+
|
17
|
+
@click.group(
|
18
|
+
name="audiences",
|
19
|
+
help="Manage audiences",
|
20
|
+
)
|
21
|
+
def audience_commands_group():
|
22
|
+
# Click commands group injection
|
23
|
+
pass
|
24
|
+
|
25
|
+
|
26
|
+
audience_commands_group.add_command(create_audience_command)
|
27
|
+
audience_commands_group.add_command(get_audience_command)
|
28
|
+
audience_commands_group.add_command(list_audience_command)
|
29
|
+
audience_commands_group.add_command(delete_audience_command)
|
30
|
+
audience_commands_group.add_command(update_audience_command)
|
File without changes
|
@@ -0,0 +1,41 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
from typing import Optional
|
3
|
+
|
4
|
+
import grpc
|
5
|
+
from frogml.core.clients.audience import AudienceClient
|
6
|
+
|
7
|
+
from frogml_cli.commands.audience._logic.config.config_base import ConfigBase
|
8
|
+
from frogml_cli.commands.audience._logic.config.parser import parse_audience_from_yaml
|
9
|
+
from frogml_cli.commands.audience._logic.config.v1.config_v1 import ConfigV1
|
10
|
+
from frogml_cli.exceptions import FrogmlCommandException
|
11
|
+
|
12
|
+
|
13
|
+
def create_audience(
|
14
|
+
name: str = "",
|
15
|
+
description: str = "",
|
16
|
+
file: Optional[Path] = None,
|
17
|
+
) -> str:
|
18
|
+
config = parse_audience_from_yaml(file)
|
19
|
+
config = merge_kw_yaml(config=config, name=name, description=description)
|
20
|
+
audience_api = config.to_audiences_api()[0]
|
21
|
+
|
22
|
+
try:
|
23
|
+
audience_id = AudienceClient().create_audience(audience=audience_api)
|
24
|
+
except grpc.RpcError as e:
|
25
|
+
raise FrogmlCommandException(e.args[0].details)
|
26
|
+
|
27
|
+
return audience_id
|
28
|
+
|
29
|
+
|
30
|
+
def merge_kw_yaml(
|
31
|
+
config: ConfigBase,
|
32
|
+
name: str = "",
|
33
|
+
description: str = "",
|
34
|
+
) -> ConfigBase:
|
35
|
+
if isinstance(config, ConfigV1):
|
36
|
+
if name:
|
37
|
+
config.spec.audiences[0].name = name
|
38
|
+
if description:
|
39
|
+
config.spec.audiences[0].description = description
|
40
|
+
|
41
|
+
return config
|
@@ -0,0 +1,21 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
|
3
|
+
import click
|
4
|
+
|
5
|
+
from frogml_cli.commands.audience.create.logic import create_audience
|
6
|
+
from frogml_cli.exceptions import FrogmlCommandException, FrogmlResourceNotFound
|
7
|
+
from frogml_cli.inner.tools.cli_tools import FrogMLCommand
|
8
|
+
|
9
|
+
|
10
|
+
@click.command("create", cls=FrogMLCommand)
|
11
|
+
@click.option("--name", type=str)
|
12
|
+
@click.option("--description", type=str)
|
13
|
+
@click.option("-f", "--file", type=click.Path(exists=True))
|
14
|
+
def create_audience_command(name: str, description: str, file: Path, **kwargs):
|
15
|
+
click.echo("Creating audience")
|
16
|
+
try:
|
17
|
+
audience_id = create_audience(name=name, description=description, file=file)
|
18
|
+
click.echo(f"Audience ID {audience_id} created successfully")
|
19
|
+
except (FrogmlCommandException, FrogmlResourceNotFound) as e:
|
20
|
+
click.echo(f"Failed to create audience, Error: {e}")
|
21
|
+
exit(1)
|
File without changes
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import grpc
|
2
|
+
from frogml.core.clients.audience import AudienceClient
|
3
|
+
|
4
|
+
from frogml_cli.exceptions import FrogmlCommandException, FrogmlResourceNotFound
|
5
|
+
|
6
|
+
|
7
|
+
def delete_audience(audience_id: str) -> None:
|
8
|
+
try:
|
9
|
+
AudienceClient().delete_audience(audience_id=audience_id)
|
10
|
+
except grpc.RpcError as e:
|
11
|
+
if e.args[0].code == grpc.StatusCode.NOT_FOUND:
|
12
|
+
raise FrogmlResourceNotFound(e.args[0].details)
|
13
|
+
raise FrogmlCommandException(e.args[0].details)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import click
|
2
|
+
|
3
|
+
from frogml_cli.commands.audience.delete.logic import delete_audience
|
4
|
+
from frogml_cli.exceptions import FrogmlCommandException, FrogmlResourceNotFound
|
5
|
+
from frogml_cli.inner.tools.cli_tools import FrogMLCommand
|
6
|
+
|
7
|
+
|
8
|
+
@click.command("delete", cls=FrogMLCommand)
|
9
|
+
@click.option("--audience-id", type=str)
|
10
|
+
def delete_audience_command(audience_id: str, **kwargs):
|
11
|
+
click.echo(f"Deleting audience ID {audience_id}")
|
12
|
+
try:
|
13
|
+
delete_audience(audience_id)
|
14
|
+
click.echo(f"Audience ID {audience_id} deleted successfully")
|
15
|
+
except (FrogmlCommandException, FrogmlResourceNotFound) as e:
|
16
|
+
click.echo(f"Failed to delete audience, Error: {e}")
|
17
|
+
exit(1)
|