altimate-datapilot-cli 0.3.4__tar.gz → 0.3.5__tar.gz
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.
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/.bumpversion.cfg +1 -1
- {altimate_datapilot_cli-0.3.4/src/altimate_datapilot_cli.egg-info → altimate_datapilot_cli-0.3.5}/PKG-INFO +1 -1
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/README.md +29 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/conf.py +1 -1
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/setup.py +1 -1
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5/src/altimate_datapilot_cli.egg-info}/PKG-INFO +1 -1
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/altimate_datapilot_cli.egg-info/SOURCES.txt +5 -0
- altimate_datapilot_cli-0.3.5/src/datapilot/__init__.py +1 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/cli/decorators.py +21 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/clients/altimate/client.py +6 -1
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/clients/altimate/utils.py +2 -1
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/mcp_utils/mcp.py +3 -2
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/cli/cli.py +6 -3
- altimate_datapilot_cli-0.3.5/src/datapilot/utils/logging_utils.py +79 -0
- altimate_datapilot_cli-0.3.5/tests/cli/test_debug_option.py +65 -0
- altimate_datapilot_cli-0.3.5/tests/clients/altimate/test_client_redaction.py +66 -0
- altimate_datapilot_cli-0.3.5/tests/utils/__init__.py +0 -0
- altimate_datapilot_cli-0.3.5/tests/utils/test_logging_utils.py +99 -0
- altimate_datapilot_cli-0.3.4/src/datapilot/__init__.py +0 -1
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/.cookiecutterrc +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/.coveragerc +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/.editorconfig +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/.github/workflows/github-actions.yml +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/.pre-commit-config.yaml +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/.pre-commit-hooks.yaml +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/.readthedocs.yml +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/AUTHORS.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/CHANGELOG.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/CONTRIBUTING.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/LICENSE +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/MANIFEST.in +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/Makefile +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/README.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/ci/bootstrap.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/ci/requirements.txt +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/ci/templates/.github/workflows/github-actions.yml +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/authors.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/changelog.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/configuration.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/contributing.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/features.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/hooks.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/index.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/insights.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/installation.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/introduction.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/performance.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/readme.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/reference/datapilot.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/reference/index.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/requirements.txt +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/spelling_wordlist.txt +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/docs/usage.rst +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/pyproject.toml +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/pytest.ini +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/setup.cfg +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/altimate_datapilot_cli.egg-info/dependency_links.txt +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/altimate_datapilot_cli.egg-info/entry_points.txt +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/altimate_datapilot_cli.egg-info/not-zip-safe +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/altimate_datapilot_cli.egg-info/requires.txt +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/altimate_datapilot_cli.egg-info/top_level.txt +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/__main__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/cli/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/cli/main.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/clients/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/clients/altimate/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/clients/altimate/constants.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/config/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/config/config.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/config/utils.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/insights/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/insights/base/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/insights/base/insight.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/insights/report.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/insights/schema.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/insights/sql/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/insights/sql/base/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/insights/sql/base/insight.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/insights/sql/runtime/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/insights/sql/static/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/insights/utils.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/knowledge/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/knowledge/cli.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/knowledge/server.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/mcp_utils/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/cli/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/constants.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/exceptions.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/executor.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/factory.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/formatting.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/hooks/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/hooks/executor_hook.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/base.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/base.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_column_desc_are_same.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_column_name_contract.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_macro_args_have_desc.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_macro_has_desc.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_model_has_all_columns.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_model_has_labels_keys.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_model_has_meta_keys.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_model_has_properties_file.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_model_has_tests_by_group.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_model_has_tests_by_name.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_model_has_tests_by_type.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_model_materialization_by_childs.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_model_name_contract.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_model_parents_and_childs.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_model_parents_database.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_model_parents_schema.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_model_tags.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_source_childs.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_source_columns_have_desc.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_all_columns.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_freshness.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_labels_keys.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_loader.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_meta_keys.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_tests.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_tests_by_group.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_tests_by_name.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_tests_by_type.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_source_table_has_description.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/checks/check_source_tags.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/dbt_test/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/dbt_test/base.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/dbt_test/missing_primary_key_tests.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/dbt_test/test_coverage.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/governance/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/governance/base.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/governance/documentation_on_stale_columns.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/governance/exposures_dependent_on_private_models.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/governance/public_models_without_contracts.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/governance/undocumented_columns.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/governance/undocumented_public_models.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/modelling/README.md +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/modelling/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/modelling/base.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/modelling/direct_join_to_source.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/modelling/downstream_models_dependent_on_source.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/modelling/duplicate_sources.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/modelling/hard_coded_references.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/modelling/joining_of_upstream_concepts.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/modelling/model_fanout.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/modelling/multiple_sources_joined.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/modelling/root_model.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/modelling/source_fanout.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/modelling/staging_model_dependent_on_downstream_models.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/modelling/staging_model_dependent_on_staging_models.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/modelling/unused_sources.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/performance/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/performance/base.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/performance/chain_view_linking.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/performance/exposure_parent_materializations.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/schema.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/sql/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/sql/base.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/sql/sql_check.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/structure/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/structure/base.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/structure/model_directories_structure.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/structure/model_naming_conventions.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/structure/source_directories_structure.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/structure/test_directory_structure.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/insights/utils.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/schemas/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/schemas/catalog.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/schemas/manifest.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/schemas/run_results.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/schemas/sources.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/utils.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/catalog/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/catalog/v1/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/catalog/v1/wrapper.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/catalog/wrapper.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/manifest/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/manifest/v10/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/manifest/v10/schemas.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/manifest/v10/wrapper.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/manifest/v11/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/manifest/v11/schemas.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/manifest/v11/wrapper.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/manifest/v12/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/manifest/v12/schemas.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/manifest/v12/wrapper.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/manifest/wrapper.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/run_results/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/platforms/dbt/wrappers/run_results/run_results.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/exceptions/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/exceptions/exceptions.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/schemas/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/schemas/constants.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/schemas/nodes.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/schemas/sql.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/utils/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/utils/formatting/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/utils/formatting/utils.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/utils/utils.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parser.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/base.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/catalog/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/catalog/catalog_v1.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/manifest/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/manifest/manifest_v1.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/manifest/manifest_v10.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/manifest/manifest_v11.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/manifest/manifest_v12.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/manifest/manifest_v2.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/manifest/manifest_v3.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/manifest/manifest_v4.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/manifest/manifest_v5.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/manifest/manifest_v6.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/manifest/manifest_v7.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/manifest/manifest_v8.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/manifest/manifest_v9.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/run_results/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/run_results/run_results_v1.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/run_results/run_results_v2.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/run_results/run_results_v3.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/run_results/run_results_v4.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/run_results/run_results_v5.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/run_results/run_results_v6.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/sources/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/sources/sources_v1.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/sources/sources_v2.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/sources/sources_v3.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/utils.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/parsers/version_map.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/catalog/catalog_v1.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/manifest/manifest_v1.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/manifest/manifest_v10.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/manifest/manifest_v11.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/manifest/manifest_v12.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/manifest/manifest_v2.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/manifest/manifest_v3.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/manifest/manifest_v4.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/manifest/manifest_v5.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/manifest/manifest_v6.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/manifest/manifest_v7.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/manifest/manifest_v8.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/manifest/manifest_v9.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/run-results/run-results_v1.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/run-results/run-results_v2.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/run-results/run-results_v3.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/run-results/run-results_v4.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/run-results/run-results_v5.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/run-results/run-results_v6.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/sources/sources_v1.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/sources/sources_v2.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/resources/sources/sources_v3.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/vendor/dbt_artifacts_parser/utils.py +0 -0
- {altimate_datapilot_cli-0.3.4/tests/clients → altimate_datapilot_cli-0.3.5/tests/cli}/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4/tests/clients/altimate → altimate_datapilot_cli-0.3.5/tests/clients}/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4/tests/core → altimate_datapilot_cli-0.3.5/tests/clients/altimate}/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/clients/altimate/test_utils.py +0 -0
- {altimate_datapilot_cli-0.3.4/tests/core/platform → altimate_datapilot_cli-0.3.5/tests/core}/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4/tests/core/platform/dbt → altimate_datapilot_cli-0.3.5/tests/core/platform}/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4/tests/test_vendor → altimate_datapilot_cli-0.3.5/tests/core/platform/dbt}/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/core/platform/dbt/test_artifact_loaders.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/core/platform/dbt/test_cli.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/core/platform/dbt/test_utils.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/data/catalog_v1.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/data/catalog_v12.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/data/config.yml +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/data/manifest_v10.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/data/manifest_v10macroargs.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/data/manifest_v11.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/data/manifest_v11macroargs.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/data/manifest_v12.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/data/manifests/manifest_js.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/data/manifests/manifest_js2.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/data/manifests/manifest_js3.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/data/manifests/manifest_tuva.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/data/manifests/manifest_tuva2.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/data/manifests/manifest_tuva3.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/data/run_results_v6.json +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/data/sources_v3.json +0 -0
- {altimate_datapilot_cli-0.3.4/tests/utils → altimate_datapilot_cli-0.3.5/tests/test_vendor}/__init__.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/test_vendor/test_catalog_v1.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/test_vendor/test_run_results_pre_v6.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/test_vendor/test_run_results_v6.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tests/utils/test_utils.py +0 -0
- {altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/tox.ini +0 -0
|
@@ -42,6 +42,35 @@ The [--catalog-path] is an optional argument. If you don't specify a catalog pat
|
|
|
42
42
|
|
|
43
43
|
The [--config-path] is an optional argument. You can provide a yaml file with overrides for the default behavior of the insights.
|
|
44
44
|
|
|
45
|
+
#### Verbose / Debug Logging
|
|
46
|
+
|
|
47
|
+
By default, API failures are reported as a short summary such as `Error in uploading the manifest.`
|
|
48
|
+
To see the underlying HTTP status codes and the error bodies returned by the API, enable debug
|
|
49
|
+
logging with either the `--debug` flag or the `DATAPILOT_DEBUG` environment variable:
|
|
50
|
+
|
|
51
|
+
```shell
|
|
52
|
+
datapilot dbt onboard --debug ...
|
|
53
|
+
|
|
54
|
+
# Or, for CI/CD pipelines where the command line is generated:
|
|
55
|
+
export DATAPILOT_DEBUG=1
|
|
56
|
+
datapilot dbt onboard ...
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
This turns the generic message into an actionable one:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
DEBUG:APIClient:Sending GET request for tenant acme at url: https://api.myaltimate.com/dbt/v1/signed_url
|
|
63
|
+
DEBUG:APIClient:Request params: {'dbt_core_integration_id': '2', 'dbt_core_integration_environment_type': 'DEV', 'file_type': 'manifest'}
|
|
64
|
+
DEBUG:APIClient:HTTP Error: {'detail': 'dbt_core_integration with id:2 and env:DEV not found'} - Status code: 400
|
|
65
|
+
Error in uploading the manifest.
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Note that `--dbt_core_integration_environment` is matched exactly, including case, against the
|
|
69
|
+
environments configured for your integration.
|
|
70
|
+
|
|
71
|
+
Debug output is safe to share: the API token is never logged, and the credentials in presigned
|
|
72
|
+
upload URLs are redacted to `?<redacted>`.
|
|
73
|
+
|
|
45
74
|
#### Generating Manifest and Catalog Files for dbt Projects
|
|
46
75
|
|
|
47
76
|
1. Generate Manifest File (manifest.json). Open your dbt project's root directory in a terminal or command prompt. Run `dbt compile`. This command generates manifest.json in the target folder under your dbt project directory structure.
|
|
@@ -193,6 +193,7 @@ src/datapilot/schemas/constants.py
|
|
|
193
193
|
src/datapilot/schemas/nodes.py
|
|
194
194
|
src/datapilot/schemas/sql.py
|
|
195
195
|
src/datapilot/utils/__init__.py
|
|
196
|
+
src/datapilot/utils/logging_utils.py
|
|
196
197
|
src/datapilot/utils/utils.py
|
|
197
198
|
src/datapilot/utils/formatting/__init__.py
|
|
198
199
|
src/datapilot/utils/formatting/utils.py
|
|
@@ -252,8 +253,11 @@ src/vendor/dbt_artifacts_parser/resources/run-results/run-results_v6.json
|
|
|
252
253
|
src/vendor/dbt_artifacts_parser/resources/sources/sources_v1.json
|
|
253
254
|
src/vendor/dbt_artifacts_parser/resources/sources/sources_v2.json
|
|
254
255
|
src/vendor/dbt_artifacts_parser/resources/sources/sources_v3.json
|
|
256
|
+
tests/cli/__init__.py
|
|
257
|
+
tests/cli/test_debug_option.py
|
|
255
258
|
tests/clients/__init__.py
|
|
256
259
|
tests/clients/altimate/__init__.py
|
|
260
|
+
tests/clients/altimate/test_client_redaction.py
|
|
257
261
|
tests/clients/altimate/test_utils.py
|
|
258
262
|
tests/core/__init__.py
|
|
259
263
|
tests/core/platform/__init__.py
|
|
@@ -282,4 +286,5 @@ tests/test_vendor/test_catalog_v1.py
|
|
|
282
286
|
tests/test_vendor/test_run_results_pre_v6.py
|
|
283
287
|
tests/test_vendor/test_run_results_v6.py
|
|
284
288
|
tests/utils/__init__.py
|
|
289
|
+
tests/utils/test_logging_utils.py
|
|
285
290
|
tests/utils/test_utils.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.3.5"
|
{altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/cli/decorators.py
RENAMED
|
@@ -9,6 +9,27 @@ from typing import Optional
|
|
|
9
9
|
import click
|
|
10
10
|
from dotenv import load_dotenv
|
|
11
11
|
|
|
12
|
+
from datapilot.utils.logging_utils import DEBUG_ENV_VAR
|
|
13
|
+
from datapilot.utils.logging_utils import configure_logging
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def debug_option(f):
|
|
17
|
+
"""Decorator adding a --debug flag, also settable via DATAPILOT_DEBUG."""
|
|
18
|
+
|
|
19
|
+
@click.option(
|
|
20
|
+
"--debug",
|
|
21
|
+
is_flag=True,
|
|
22
|
+
default=False,
|
|
23
|
+
envvar=DEBUG_ENV_VAR,
|
|
24
|
+
help=f"Enable verbose debug logging, including API status codes and error responses. Can also be set with {DEBUG_ENV_VAR}=1.",
|
|
25
|
+
)
|
|
26
|
+
@wraps(f)
|
|
27
|
+
def wrapper(*args, **kwargs):
|
|
28
|
+
configure_logging(debug=kwargs.pop("debug", False))
|
|
29
|
+
return f(*args, **kwargs)
|
|
30
|
+
|
|
31
|
+
return wrapper
|
|
32
|
+
|
|
12
33
|
|
|
13
34
|
def load_config_from_file() -> Optional[Dict]:
|
|
14
35
|
"""Load configuration from ~/.altimate/altimate.json if it exists."""
|
|
@@ -6,6 +6,8 @@ from requests.exceptions import HTTPError
|
|
|
6
6
|
from requests.exceptions import RequestException
|
|
7
7
|
from requests.exceptions import Timeout
|
|
8
8
|
|
|
9
|
+
from datapilot.utils.logging_utils import redact_url
|
|
10
|
+
|
|
9
11
|
|
|
10
12
|
class APIClient:
|
|
11
13
|
def __init__(self, api_token="", base_url="", tenant=""):
|
|
@@ -36,6 +38,8 @@ class APIClient:
|
|
|
36
38
|
|
|
37
39
|
try:
|
|
38
40
|
self.logger.debug(f"Sending GET request for tenant {self.tenant} at url: {url}")
|
|
41
|
+
if params:
|
|
42
|
+
self.logger.debug(f"Request params: {params}")
|
|
39
43
|
response = requests.get(url, headers=headers, params=params, timeout=timeout)
|
|
40
44
|
|
|
41
45
|
# Check if the response was successful
|
|
@@ -67,7 +71,8 @@ class APIClient:
|
|
|
67
71
|
def put(self, endpoint, data, timeout=None):
|
|
68
72
|
url = f"{self.base_url}{endpoint}"
|
|
69
73
|
|
|
70
|
-
|
|
74
|
+
# Presigned upload URLs carry AWS credentials in the query string.
|
|
75
|
+
self.logger.debug(f"Sending PUT request for tenant {self.tenant} at url: {redact_url(url)}")
|
|
71
76
|
response = requests.put(url, data=data, timeout=timeout)
|
|
72
77
|
self.logger.debug(f"Received PUT response with status: {response.status_code}")
|
|
73
78
|
return response
|
|
@@ -8,6 +8,7 @@ from requests import Response
|
|
|
8
8
|
|
|
9
9
|
from datapilot.clients.altimate.client import APIClient
|
|
10
10
|
from datapilot.clients.altimate.constants import SUPPORTED_ARTIFACT_TYPES
|
|
11
|
+
from datapilot.utils.logging_utils import redact_url
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
def check_token_and_instance(
|
|
@@ -89,7 +90,7 @@ def onboard_file(api_token, tenant, dbt_core_integration_id, dbt_core_integratio
|
|
|
89
90
|
if signed_url_data:
|
|
90
91
|
signed_url = signed_url_data.get("url")
|
|
91
92
|
file_id = signed_url_data.get("dbt_core_integration_file_id")
|
|
92
|
-
api_client.log(f"Received signed URL: {signed_url}")
|
|
93
|
+
api_client.log(f"Received signed URL: {redact_url(signed_url)}")
|
|
93
94
|
api_client.log(f"Received File ID: {file_id}")
|
|
94
95
|
|
|
95
96
|
upload_response = upload_content_to_signed_url(file_path, signed_url)
|
{altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/src/datapilot/core/mcp_utils/mcp.py
RENAMED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import json
|
|
3
|
-
import logging
|
|
4
3
|
import shutil
|
|
5
4
|
from dataclasses import dataclass
|
|
6
5
|
|
|
@@ -10,7 +9,9 @@ from mcp import ClientSession
|
|
|
10
9
|
from mcp import StdioServerParameters
|
|
11
10
|
from mcp.client.stdio import stdio_client
|
|
12
11
|
|
|
13
|
-
|
|
12
|
+
from datapilot.utils.logging_utils import configure_logging
|
|
13
|
+
|
|
14
|
+
configure_logging()
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
@dataclass
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
|
|
3
1
|
import click
|
|
4
2
|
|
|
5
3
|
from datapilot.cli.decorators import auth_options
|
|
4
|
+
from datapilot.cli.decorators import debug_option
|
|
6
5
|
from datapilot.clients.altimate.utils import check_token_and_instance
|
|
7
6
|
from datapilot.clients.altimate.utils import get_all_dbt_configs
|
|
8
7
|
from datapilot.clients.altimate.utils import onboard_file
|
|
@@ -21,9 +20,11 @@ from datapilot.core.platforms.dbt.utils import load_manifest
|
|
|
21
20
|
from datapilot.core.platforms.dbt.utils import load_run_results
|
|
22
21
|
from datapilot.core.platforms.dbt.utils import load_sources
|
|
23
22
|
from datapilot.utils.formatting.utils import tabulate_data
|
|
23
|
+
from datapilot.utils.logging_utils import configure_logging
|
|
24
24
|
from datapilot.utils.utils import map_url_to_instance
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
# Honour DATAPILOT_DEBUG even for code paths that never reach a command callback.
|
|
27
|
+
configure_logging()
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
# New dbt group
|
|
@@ -33,6 +34,7 @@ def dbt():
|
|
|
33
34
|
|
|
34
35
|
|
|
35
36
|
@dbt.command("project-health")
|
|
37
|
+
@debug_option
|
|
36
38
|
@auth_options
|
|
37
39
|
@click.option(
|
|
38
40
|
"--manifest-path",
|
|
@@ -134,6 +136,7 @@ def project_health(
|
|
|
134
136
|
|
|
135
137
|
|
|
136
138
|
@dbt.command("onboard")
|
|
139
|
+
@debug_option
|
|
137
140
|
@auth_options
|
|
138
141
|
@click.option(
|
|
139
142
|
"--dbt_core_integration_id",
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"""Logging configuration for the datapilot CLI.
|
|
2
|
+
|
|
3
|
+
Verbose output is opt-in and can be turned on two ways:
|
|
4
|
+
|
|
5
|
+
- the ``DATAPILOT_DEBUG`` environment variable, which is the option to reach for
|
|
6
|
+
in CI/CD pipelines where the command line is generated and hard to edit
|
|
7
|
+
- the ``--debug`` flag on individual commands
|
|
8
|
+
|
|
9
|
+
Both raise the root logger to ``DEBUG``, which surfaces the HTTP status codes and
|
|
10
|
+
API error bodies that ``APIClient`` already records but normally discards.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import logging
|
|
14
|
+
import os
|
|
15
|
+
from typing import Optional
|
|
16
|
+
from urllib.parse import urlsplit
|
|
17
|
+
from urllib.parse import urlunsplit
|
|
18
|
+
|
|
19
|
+
DEBUG_ENV_VAR = "DATAPILOT_DEBUG"
|
|
20
|
+
|
|
21
|
+
# Values that count as "on" for DATAPILOT_DEBUG. Anything else (including "0",
|
|
22
|
+
# "false" and the empty string) leaves debug logging off.
|
|
23
|
+
_TRUTHY_VALUES = frozenset({"1", "true", "yes", "on"})
|
|
24
|
+
|
|
25
|
+
# Debug mode is sticky: a command-level `--debug` must not be undone by a later
|
|
26
|
+
# call that happens to default to False.
|
|
27
|
+
_debug_enabled = False
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def debug_enabled_via_env() -> bool:
|
|
31
|
+
"""Return True when DATAPILOT_DEBUG is set to a truthy value."""
|
|
32
|
+
return os.environ.get(DEBUG_ENV_VAR, "").strip().lower() in _TRUTHY_VALUES
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def configure_logging(debug: bool = False) -> bool:
|
|
36
|
+
"""Configure root logging for the CLI and return whether debug mode is on.
|
|
37
|
+
|
|
38
|
+
Safe to call more than once; the group callback and the command callback both
|
|
39
|
+
call it, and the more verbose of the two wins.
|
|
40
|
+
"""
|
|
41
|
+
global _debug_enabled
|
|
42
|
+
_debug_enabled = _debug_enabled or debug or debug_enabled_via_env()
|
|
43
|
+
level = logging.DEBUG if _debug_enabled else logging.INFO
|
|
44
|
+
|
|
45
|
+
root = logging.getLogger()
|
|
46
|
+
# Only install a handler when nothing else has, so embedding applications
|
|
47
|
+
# (and pytest's caplog) keep theirs. Setting the level is what actually
|
|
48
|
+
# decides whether the DEBUG records get through.
|
|
49
|
+
if not root.handlers:
|
|
50
|
+
logging.basicConfig(level=level)
|
|
51
|
+
root.setLevel(level)
|
|
52
|
+
|
|
53
|
+
# urllib3 logs each request line in full, which for a presigned S3 upload means
|
|
54
|
+
# the AWS key and signature. Our own client logs the status codes and request
|
|
55
|
+
# params, so nothing diagnostic is lost by holding urllib3 at INFO.
|
|
56
|
+
logging.getLogger("urllib3").setLevel(logging.INFO)
|
|
57
|
+
|
|
58
|
+
return _debug_enabled
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def is_debug_enabled() -> bool:
|
|
62
|
+
"""Return whether debug logging is currently enabled."""
|
|
63
|
+
return _debug_enabled
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def redact_url(url: Optional[str]) -> str:
|
|
67
|
+
"""Strip a URL's query string so it is safe to log.
|
|
68
|
+
|
|
69
|
+
Presigned upload URLs carry AWS credentials and a signature in the query
|
|
70
|
+
string, and debug output routinely gets pasted into support tickets.
|
|
71
|
+
"""
|
|
72
|
+
if not url:
|
|
73
|
+
return ""
|
|
74
|
+
|
|
75
|
+
parts = urlsplit(url)
|
|
76
|
+
if not parts.query:
|
|
77
|
+
return url
|
|
78
|
+
|
|
79
|
+
return urlunsplit((parts.scheme, parts.netloc, parts.path, "<redacted>", ""))
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
from click.testing import CliRunner
|
|
5
|
+
|
|
6
|
+
from datapilot.cli.main import datapilot
|
|
7
|
+
from datapilot.utils import logging_utils
|
|
8
|
+
from datapilot.utils.logging_utils import DEBUG_ENV_VAR
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@pytest.fixture(autouse=True)
|
|
12
|
+
def _reset_logging_state(monkeypatch):
|
|
13
|
+
monkeypatch.setattr(logging_utils, "_debug_enabled", False)
|
|
14
|
+
monkeypatch.delenv(DEBUG_ENV_VAR, raising=False)
|
|
15
|
+
original_level = logging.getLogger().level
|
|
16
|
+
yield
|
|
17
|
+
logging.getLogger().setLevel(original_level)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def invoke_project_health(env=None, extra_args=()):
|
|
21
|
+
"""project-health runs fully offline, so it exercises the flag without network access."""
|
|
22
|
+
return CliRunner().invoke(
|
|
23
|
+
datapilot,
|
|
24
|
+
["dbt", "project-health", "--manifest-path", "tests/data/manifest_v11.json", *extra_args],
|
|
25
|
+
env=env or {},
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class TestDebugFlag:
|
|
30
|
+
def test_flag_is_advertised_in_help(self):
|
|
31
|
+
result = CliRunner().invoke(datapilot, ["dbt", "onboard", "--help"])
|
|
32
|
+
|
|
33
|
+
assert result.exit_code == 0
|
|
34
|
+
assert "--debug" in result.output
|
|
35
|
+
assert DEBUG_ENV_VAR in result.output
|
|
36
|
+
|
|
37
|
+
def test_flag_enables_debug_logging(self):
|
|
38
|
+
result = invoke_project_health(extra_args=["--debug"])
|
|
39
|
+
|
|
40
|
+
assert result.exit_code == 0
|
|
41
|
+
assert logging_utils.is_debug_enabled() is True
|
|
42
|
+
assert logging.getLogger().level == logging.DEBUG
|
|
43
|
+
|
|
44
|
+
def test_without_flag_stays_at_info(self):
|
|
45
|
+
result = invoke_project_health()
|
|
46
|
+
|
|
47
|
+
assert result.exit_code == 0
|
|
48
|
+
assert logging_utils.is_debug_enabled() is False
|
|
49
|
+
assert logging.getLogger().level == logging.INFO
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class TestDebugEnvVar:
|
|
53
|
+
def test_env_var_enables_debug_logging(self):
|
|
54
|
+
result = invoke_project_health(env={DEBUG_ENV_VAR: "1"})
|
|
55
|
+
|
|
56
|
+
assert result.exit_code == 0
|
|
57
|
+
assert logging_utils.is_debug_enabled() is True
|
|
58
|
+
assert logging.getLogger().level == logging.DEBUG
|
|
59
|
+
|
|
60
|
+
def test_env_var_off_stays_at_info(self):
|
|
61
|
+
result = invoke_project_health(env={DEBUG_ENV_VAR: "0"})
|
|
62
|
+
|
|
63
|
+
assert result.exit_code == 0
|
|
64
|
+
assert logging_utils.is_debug_enabled() is False
|
|
65
|
+
assert logging.getLogger().level == logging.INFO
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from unittest.mock import patch
|
|
3
|
+
|
|
4
|
+
import pytest
|
|
5
|
+
from requests import Response
|
|
6
|
+
|
|
7
|
+
from datapilot.clients.altimate.client import APIClient
|
|
8
|
+
from datapilot.utils import logging_utils
|
|
9
|
+
from datapilot.utils.logging_utils import DEBUG_ENV_VAR
|
|
10
|
+
from datapilot.utils.logging_utils import configure_logging
|
|
11
|
+
|
|
12
|
+
PRESIGNED_URL = (
|
|
13
|
+
"https://altimate-datapilot-freemium-prod.s3.amazonaws.com/prd/tenant%3Delastic/manifest.json"
|
|
14
|
+
"?AWSAccessKeyId=AKIAVXVSOK5H3JQFSSU4&Signature=2LV9nU5JHPVOFz&Expires=1785271367"
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@pytest.fixture(autouse=True)
|
|
19
|
+
def _reset_logging_state(monkeypatch):
|
|
20
|
+
monkeypatch.setattr(logging_utils, "_debug_enabled", False)
|
|
21
|
+
monkeypatch.delenv(DEBUG_ENV_VAR, raising=False)
|
|
22
|
+
original_level = logging.getLogger().level
|
|
23
|
+
yield
|
|
24
|
+
logging.getLogger().setLevel(original_level)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def make_response(status_code=200):
|
|
28
|
+
response = Response()
|
|
29
|
+
response.status_code = status_code
|
|
30
|
+
response._content = b""
|
|
31
|
+
return response
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class TestPresignedUrlRedaction:
|
|
35
|
+
def test_put_does_not_log_aws_credentials(self, caplog):
|
|
36
|
+
client = APIClient()
|
|
37
|
+
|
|
38
|
+
with caplog.at_level(logging.DEBUG), patch("requests.put", return_value=make_response()):
|
|
39
|
+
client.put(PRESIGNED_URL, data=b"{}")
|
|
40
|
+
|
|
41
|
+
assert "AKIAVXVSOK5H3JQFSSU4" not in caplog.text
|
|
42
|
+
assert "2LV9nU5JHPVOFz" not in caplog.text
|
|
43
|
+
# The object path is still logged, which is the part that aids debugging.
|
|
44
|
+
assert "manifest.json" in caplog.text
|
|
45
|
+
assert "<redacted>" in caplog.text
|
|
46
|
+
|
|
47
|
+
def test_get_logs_request_params(self, caplog):
|
|
48
|
+
"""Params identify the integration id/env, and contain no secrets."""
|
|
49
|
+
client = APIClient(api_token="secret-token", base_url="https://api.myaltimate.com", tenant="elastic") # noqa: S106
|
|
50
|
+
params = {"dbt_core_integration_id": "2", "dbt_core_integration_environment_type": "PROD"}
|
|
51
|
+
|
|
52
|
+
with caplog.at_level(logging.DEBUG), patch("requests.get", return_value=make_response()):
|
|
53
|
+
client.get("/dbt/v1/signed_url", params=params)
|
|
54
|
+
|
|
55
|
+
assert "dbt_core_integration_environment_type" in caplog.text
|
|
56
|
+
assert "PROD" in caplog.text
|
|
57
|
+
assert "secret-token" not in caplog.text
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class TestUrllib3Silencing:
|
|
61
|
+
def test_urllib3_is_held_at_info_in_debug_mode(self):
|
|
62
|
+
"""urllib3 logs whole request lines, presigned query string included."""
|
|
63
|
+
configure_logging(debug=True)
|
|
64
|
+
|
|
65
|
+
assert logging.getLogger().level == logging.DEBUG
|
|
66
|
+
assert logging.getLogger("urllib3").level == logging.INFO
|
|
File without changes
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from datapilot.utils import logging_utils
|
|
6
|
+
from datapilot.utils.logging_utils import DEBUG_ENV_VAR
|
|
7
|
+
from datapilot.utils.logging_utils import configure_logging
|
|
8
|
+
from datapilot.utils.logging_utils import debug_enabled_via_env
|
|
9
|
+
from datapilot.utils.logging_utils import is_debug_enabled
|
|
10
|
+
from datapilot.utils.logging_utils import redact_url
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@pytest.fixture(autouse=True)
|
|
14
|
+
def _reset_logging_state(monkeypatch):
|
|
15
|
+
"""Debug mode is sticky by design, so reset it between tests."""
|
|
16
|
+
monkeypatch.setattr(logging_utils, "_debug_enabled", False)
|
|
17
|
+
monkeypatch.delenv(DEBUG_ENV_VAR, raising=False)
|
|
18
|
+
original_level = logging.getLogger().level
|
|
19
|
+
yield
|
|
20
|
+
logging.getLogger().setLevel(original_level)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TestDebugEnabledViaEnv:
|
|
24
|
+
@pytest.mark.parametrize("value", ["1", "true", "TRUE", "yes", "on", " True "])
|
|
25
|
+
def test_truthy_values(self, monkeypatch, value):
|
|
26
|
+
monkeypatch.setenv(DEBUG_ENV_VAR, value)
|
|
27
|
+
|
|
28
|
+
assert debug_enabled_via_env() is True
|
|
29
|
+
|
|
30
|
+
@pytest.mark.parametrize("value", ["0", "false", "no", "off", "", " "])
|
|
31
|
+
def test_falsy_values(self, monkeypatch, value):
|
|
32
|
+
monkeypatch.setenv(DEBUG_ENV_VAR, value)
|
|
33
|
+
|
|
34
|
+
assert debug_enabled_via_env() is False
|
|
35
|
+
|
|
36
|
+
def test_unset(self):
|
|
37
|
+
assert debug_enabled_via_env() is False
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class TestConfigureLogging:
|
|
41
|
+
def test_default_is_info(self):
|
|
42
|
+
assert configure_logging() is False
|
|
43
|
+
assert is_debug_enabled() is False
|
|
44
|
+
assert logging.getLogger().level == logging.INFO
|
|
45
|
+
|
|
46
|
+
def test_debug_argument_sets_debug_level(self):
|
|
47
|
+
assert configure_logging(debug=True) is True
|
|
48
|
+
assert logging.getLogger().level == logging.DEBUG
|
|
49
|
+
|
|
50
|
+
def test_env_var_sets_debug_level(self, monkeypatch):
|
|
51
|
+
monkeypatch.setenv(DEBUG_ENV_VAR, "1")
|
|
52
|
+
|
|
53
|
+
assert configure_logging() is True
|
|
54
|
+
assert logging.getLogger().level == logging.DEBUG
|
|
55
|
+
|
|
56
|
+
def test_env_var_off_stays_at_info(self, monkeypatch):
|
|
57
|
+
monkeypatch.setenv(DEBUG_ENV_VAR, "0")
|
|
58
|
+
|
|
59
|
+
assert configure_logging() is False
|
|
60
|
+
assert logging.getLogger().level == logging.INFO
|
|
61
|
+
|
|
62
|
+
def test_debug_is_sticky_across_calls(self):
|
|
63
|
+
"""An import-time configure_logging() must not undo a --debug flag, or vice versa."""
|
|
64
|
+
configure_logging(debug=True)
|
|
65
|
+
configure_logging(debug=False)
|
|
66
|
+
|
|
67
|
+
assert is_debug_enabled() is True
|
|
68
|
+
assert logging.getLogger().level == logging.DEBUG
|
|
69
|
+
|
|
70
|
+
def test_debug_records_reach_a_handler(self, caplog):
|
|
71
|
+
configure_logging(debug=True)
|
|
72
|
+
|
|
73
|
+
with caplog.at_level(logging.DEBUG):
|
|
74
|
+
logging.getLogger("APIClient").debug("HTTP Error: boom")
|
|
75
|
+
|
|
76
|
+
assert "HTTP Error: boom" in caplog.text
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class TestRedactUrl:
|
|
80
|
+
def test_url_without_query_is_unchanged(self):
|
|
81
|
+
url = "https://api.myaltimate.com/dbt/v1/signed_url"
|
|
82
|
+
|
|
83
|
+
assert redact_url(url) == url
|
|
84
|
+
|
|
85
|
+
def test_presigned_url_credentials_are_removed(self):
|
|
86
|
+
url = (
|
|
87
|
+
"https://altimate-datapilot-freemium-prod.s3.amazonaws.com/prd/tenant%3Delastic/manifest.json"
|
|
88
|
+
"?AWSAccessKeyId=AKIAVXVSOK5H3JQFSSU4&Signature=2LV9nU5JHPVOFz&Expires=1785271367"
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
redacted = redact_url(url)
|
|
92
|
+
|
|
93
|
+
assert "AKIAVXVSOK5H3JQFSSU4" not in redacted
|
|
94
|
+
assert "2LV9nU5JHPVOFz" not in redacted
|
|
95
|
+
assert redacted == ("https://altimate-datapilot-freemium-prod.s3.amazonaws.com/prd/tenant%3Delastic/manifest.json?<redacted>")
|
|
96
|
+
|
|
97
|
+
def test_empty_values(self):
|
|
98
|
+
assert redact_url("") == ""
|
|
99
|
+
assert redact_url(None) == ""
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.3.4"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{altimate_datapilot_cli-0.3.4 → altimate_datapilot_cli-0.3.5}/.github/workflows/github-actions.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|