altimate-datapilot-cli 0.0.19__tar.gz → 0.0.20__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.
Files changed (218) hide show
  1. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/.bumpversion.cfg +1 -1
  2. {altimate-datapilot-cli-0.0.19/src/altimate_datapilot_cli.egg-info → altimate-datapilot-cli-0.0.20}/PKG-INFO +1 -1
  3. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/conf.py +1 -1
  4. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/setup.py +3 -1
  5. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20/src/altimate_datapilot_cli.egg-info}/PKG-INFO +1 -1
  6. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/altimate_datapilot_cli.egg-info/SOURCES.txt +3 -0
  7. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/altimate_datapilot_cli.egg-info/requires.txt +1 -0
  8. altimate-datapilot-cli-0.0.20/src/datapilot/__init__.py +1 -0
  9. altimate-datapilot-cli-0.0.20/src/datapilot/cli/main.py +96 -0
  10. altimate-datapilot-cli-0.0.20/src/datapilot/core/knowledge/cli.py +46 -0
  11. altimate-datapilot-cli-0.0.20/src/datapilot/core/knowledge/server.py +84 -0
  12. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/cli/cli.py +24 -13
  13. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tests/core/platform/dbt/test_cli.py +19 -7
  14. altimate-datapilot-cli-0.0.20/tests/utils/__init__.py +0 -0
  15. altimate-datapilot-cli-0.0.19/src/datapilot/__init__.py +0 -1
  16. altimate-datapilot-cli-0.0.19/src/datapilot/cli/main.py +0 -13
  17. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/.cookiecutterrc +0 -0
  18. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/.coveragerc +0 -0
  19. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/.editorconfig +0 -0
  20. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/.github/workflows/github-actions.yml +0 -0
  21. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/.pre-commit-config.yaml +0 -0
  22. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/.pre-commit-hooks.yaml +0 -0
  23. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/.readthedocs.yml +0 -0
  24. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/AUTHORS.rst +0 -0
  25. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/CHANGELOG.rst +0 -0
  26. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/CONTRIBUTING.rst +0 -0
  27. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/LICENSE +0 -0
  28. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/MANIFEST.in +0 -0
  29. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/README.md +0 -0
  30. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/README.rst +0 -0
  31. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/ci/bootstrap.py +0 -0
  32. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/ci/requirements.txt +0 -0
  33. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/ci/templates/.github/workflows/github-actions.yml +0 -0
  34. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/authors.rst +0 -0
  35. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/changelog.rst +0 -0
  36. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/configuration.rst +0 -0
  37. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/contributing.rst +0 -0
  38. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/features.rst +0 -0
  39. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/hooks.rst +0 -0
  40. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/index.rst +0 -0
  41. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/insights.rst +0 -0
  42. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/installation.rst +0 -0
  43. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/introduction.rst +0 -0
  44. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/performance.rst +0 -0
  45. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/readme.rst +0 -0
  46. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/reference/datapilot.rst +0 -0
  47. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/reference/index.rst +0 -0
  48. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/requirements.txt +0 -0
  49. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/spelling_wordlist.txt +0 -0
  50. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/docs/usage.rst +0 -0
  51. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/pyproject.toml +0 -0
  52. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/pytest.ini +0 -0
  53. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/setup.cfg +0 -0
  54. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/altimate_datapilot_cli.egg-info/dependency_links.txt +0 -0
  55. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/altimate_datapilot_cli.egg-info/entry_points.txt +0 -0
  56. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/altimate_datapilot_cli.egg-info/not-zip-safe +0 -0
  57. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/altimate_datapilot_cli.egg-info/top_level.txt +0 -0
  58. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/__main__.py +0 -0
  59. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/cli/__init__.py +0 -0
  60. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/clients/__init__.py +0 -0
  61. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/clients/altimate/__init__.py +0 -0
  62. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/clients/altimate/client.py +0 -0
  63. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/clients/altimate/utils.py +0 -0
  64. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/config/__init__.py +0 -0
  65. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/config/config.py +0 -0
  66. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/config/utils.py +0 -0
  67. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/__init__.py +0 -0
  68. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/insights/__init__.py +0 -0
  69. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/insights/base/__init__.py +0 -0
  70. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/insights/base/insight.py +0 -0
  71. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/insights/report.py +0 -0
  72. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/insights/schema.py +0 -0
  73. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/insights/sql/__init__.py +0 -0
  74. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/insights/sql/base/__init__.py +0 -0
  75. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/insights/sql/base/insight.py +0 -0
  76. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/insights/sql/runtime/__init__.py +0 -0
  77. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/insights/sql/static/__init__.py +0 -0
  78. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/insights/utils.py +0 -0
  79. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms → altimate-datapilot-cli-0.0.20/src/datapilot/core/knowledge}/__init__.py +0 -0
  80. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/mcp_utils/__init__.py +0 -0
  81. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/mcp_utils/mcp.py +0 -0
  82. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms}/__init__.py +0 -0
  83. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/cli → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt}/__init__.py +0 -0
  84. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/hooks → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/cli}/__init__.py +0 -0
  85. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/constants.py +0 -0
  86. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/exceptions.py +0 -0
  87. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/executor.py +0 -0
  88. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/factory.py +0 -0
  89. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/formatting.py +0 -0
  90. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/insights/checks → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/hooks}/__init__.py +0 -0
  91. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/hooks/executor_hook.py +0 -0
  92. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/__init__.py +0 -0
  93. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/base.py +0 -0
  94. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/insights/dbt_test → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/insights/checks}/__init__.py +0 -0
  95. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/base.py +0 -0
  96. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_column_desc_are_same.py +0 -0
  97. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_column_name_contract.py +0 -0
  98. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_macro_args_have_desc.py +0 -0
  99. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_macro_has_desc.py +0 -0
  100. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_model_has_all_columns.py +0 -0
  101. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_model_has_labels_keys.py +0 -0
  102. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_model_has_meta_keys.py +0 -0
  103. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_model_has_properties_file.py +0 -0
  104. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_model_has_tests_by_group.py +0 -0
  105. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_model_has_tests_by_name.py +0 -0
  106. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_model_has_tests_by_type.py +0 -0
  107. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_model_materialization_by_childs.py +0 -0
  108. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_model_name_contract.py +0 -0
  109. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_model_parents_and_childs.py +0 -0
  110. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_model_parents_database.py +0 -0
  111. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_model_parents_schema.py +0 -0
  112. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_model_tags.py +0 -0
  113. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_source_childs.py +0 -0
  114. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_source_columns_have_desc.py +0 -0
  115. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_all_columns.py +0 -0
  116. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_freshness.py +0 -0
  117. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_labels_keys.py +0 -0
  118. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_loader.py +0 -0
  119. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_meta_keys.py +0 -0
  120. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_tests.py +0 -0
  121. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_tests_by_group.py +0 -0
  122. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_tests_by_name.py +0 -0
  123. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_source_has_tests_by_type.py +0 -0
  124. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_source_table_has_description.py +0 -0
  125. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/checks/check_source_tags.py +0 -0
  126. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/insights/governance → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/insights/dbt_test}/__init__.py +0 -0
  127. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/dbt_test/base.py +0 -0
  128. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/dbt_test/missing_primary_key_tests.py +0 -0
  129. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/dbt_test/test_coverage.py +0 -0
  130. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/insights/modelling → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/insights/governance}/__init__.py +0 -0
  131. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/governance/base.py +0 -0
  132. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/governance/documentation_on_stale_columns.py +0 -0
  133. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/governance/exposures_dependent_on_private_models.py +0 -0
  134. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/governance/public_models_without_contracts.py +0 -0
  135. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/governance/undocumented_columns.py +0 -0
  136. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/governance/undocumented_public_models.py +0 -0
  137. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/modelling/README.md +0 -0
  138. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/insights/performance → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/insights/modelling}/__init__.py +0 -0
  139. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/modelling/base.py +0 -0
  140. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/modelling/direct_join_to_source.py +0 -0
  141. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/modelling/downstream_models_dependent_on_source.py +0 -0
  142. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/modelling/duplicate_sources.py +0 -0
  143. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/modelling/hard_coded_references.py +0 -0
  144. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/modelling/joining_of_upstream_concepts.py +0 -0
  145. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/modelling/model_fanout.py +0 -0
  146. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/modelling/multiple_sources_joined.py +0 -0
  147. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/modelling/root_model.py +0 -0
  148. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/modelling/source_fanout.py +0 -0
  149. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/modelling/staging_model_dependent_on_downstream_models.py +0 -0
  150. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/modelling/staging_model_dependent_on_staging_models.py +0 -0
  151. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/modelling/unused_sources.py +0 -0
  152. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/insights/sql → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/insights/performance}/__init__.py +0 -0
  153. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/performance/base.py +0 -0
  154. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/performance/chain_view_linking.py +0 -0
  155. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/performance/exposure_parent_materializations.py +0 -0
  156. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/schema.py +0 -0
  157. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/insights/structure → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/insights/sql}/__init__.py +0 -0
  158. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/sql/base.py +0 -0
  159. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/sql/sql_check.py +0 -0
  160. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/schemas → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/insights/structure}/__init__.py +0 -0
  161. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/structure/base.py +0 -0
  162. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/structure/model_directories_structure.py +0 -0
  163. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/structure/model_naming_conventions.py +0 -0
  164. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/structure/source_directories_structure.py +0 -0
  165. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/structure/test_directory_structure.py +0 -0
  166. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/insights/utils.py +0 -0
  167. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/wrappers → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/schemas}/__init__.py +0 -0
  168. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/schemas/catalog.py +0 -0
  169. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/schemas/manifest.py +0 -0
  170. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/utils.py +0 -0
  171. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/wrappers/catalog → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/wrappers}/__init__.py +0 -0
  172. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/wrappers/catalog/v1 → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/wrappers/catalog}/__init__.py +0 -0
  173. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/wrappers/manifest → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/wrappers/catalog/v1}/__init__.py +0 -0
  174. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/wrappers/catalog/v1/wrapper.py +0 -0
  175. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/wrappers/catalog/wrapper.py +0 -0
  176. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/wrappers/manifest/v10 → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/wrappers/manifest}/__init__.py +0 -0
  177. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/wrappers/manifest/v11 → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/wrappers/manifest/v10}/__init__.py +0 -0
  178. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/wrappers/manifest/v10/schemas.py +0 -0
  179. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/wrappers/manifest/v10/wrapper.py +0 -0
  180. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/wrappers/manifest/v12 → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/wrappers/manifest/v11}/__init__.py +0 -0
  181. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/wrappers/manifest/v11/schemas.py +0 -0
  182. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/wrappers/manifest/v11/wrapper.py +0 -0
  183. {altimate-datapilot-cli-0.0.19/src/datapilot/core/platforms/dbt/wrappers/run_results → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/wrappers/manifest/v12}/__init__.py +0 -0
  184. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/wrappers/manifest/v12/schemas.py +0 -0
  185. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/wrappers/manifest/v12/wrapper.py +0 -0
  186. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/wrappers/manifest/wrapper.py +0 -0
  187. {altimate-datapilot-cli-0.0.19/src/datapilot/exceptions → altimate-datapilot-cli-0.0.20/src/datapilot/core/platforms/dbt/wrappers/run_results}/__init__.py +0 -0
  188. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/core/platforms/dbt/wrappers/run_results/run_results.py +0 -0
  189. {altimate-datapilot-cli-0.0.19/src/datapilot/schemas → altimate-datapilot-cli-0.0.20/src/datapilot/exceptions}/__init__.py +0 -0
  190. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/exceptions/exceptions.py +0 -0
  191. {altimate-datapilot-cli-0.0.19/src/datapilot/utils → altimate-datapilot-cli-0.0.20/src/datapilot/schemas}/__init__.py +0 -0
  192. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/schemas/constants.py +0 -0
  193. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/schemas/nodes.py +0 -0
  194. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/schemas/sql.py +0 -0
  195. {altimate-datapilot-cli-0.0.19/src/datapilot/utils/formatting → altimate-datapilot-cli-0.0.20/src/datapilot/utils}/__init__.py +0 -0
  196. {altimate-datapilot-cli-0.0.19/tests/core → altimate-datapilot-cli-0.0.20/src/datapilot/utils/formatting}/__init__.py +0 -0
  197. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/utils/formatting/utils.py +0 -0
  198. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/src/datapilot/utils/utils.py +0 -0
  199. {altimate-datapilot-cli-0.0.19/tests/core/platform → altimate-datapilot-cli-0.0.20/tests/core}/__init__.py +0 -0
  200. {altimate-datapilot-cli-0.0.19/tests/core/platform/dbt → altimate-datapilot-cli-0.0.20/tests/core/platform}/__init__.py +0 -0
  201. {altimate-datapilot-cli-0.0.19/tests/utils → altimate-datapilot-cli-0.0.20/tests/core/platform/dbt}/__init__.py +0 -0
  202. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tests/core/platform/dbt/test_utils.py +0 -0
  203. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tests/data/catalog_v1.json +0 -0
  204. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tests/data/catalog_v12.json +0 -0
  205. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tests/data/config.yml +0 -0
  206. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tests/data/manifest_v10.json +0 -0
  207. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tests/data/manifest_v10macroargs.json +0 -0
  208. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tests/data/manifest_v11.json +0 -0
  209. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tests/data/manifest_v11macroargs.json +0 -0
  210. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tests/data/manifest_v12.json +0 -0
  211. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tests/data/manifests/manifest_js.json +0 -0
  212. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tests/data/manifests/manifest_js2.json +0 -0
  213. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tests/data/manifests/manifest_js3.json +0 -0
  214. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tests/data/manifests/manifest_tuva.json +0 -0
  215. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tests/data/manifests/manifest_tuva2.json +0 -0
  216. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tests/data/manifests/manifest_tuva3.json +0 -0
  217. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tests/utils/test_utils.py +0 -0
  218. {altimate-datapilot-cli-0.0.19 → altimate-datapilot-cli-0.0.20}/tox.ini +0 -0
@@ -1,5 +1,5 @@
1
1
  [bumpversion]
2
- current_version = 0.0.19
2
+ current_version = 0.0.20
3
3
  commit = True
4
4
  tag = True
5
5
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: altimate-datapilot-cli
3
- Version: 0.0.19
3
+ Version: 0.0.20
4
4
  Summary: Assistant for Data Teams
5
5
  Home-page: https://github.com/AltimateAI/datapilot-cli
6
6
  Author: Altimate Inc
@@ -15,7 +15,7 @@ project = "datapilot-cli"
15
15
  year = "2024"
16
16
  author = "Altimate Inc."
17
17
  copyright = f"{year}, {author}"
18
- version = release = "0.0.19"
18
+ version = release = "0.0.20"
19
19
 
20
20
  pygments_style = "trac"
21
21
  templates_path = ["."]
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env python
1
2
  import re
2
3
  from pathlib import Path
3
4
 
@@ -12,7 +13,7 @@ def read(*names, **kwargs):
12
13
 
13
14
  setup(
14
15
  name="altimate-datapilot-cli",
15
- version="0.0.19",
16
+ version="0.0.20",
16
17
  license="MIT",
17
18
  description="Assistant for Data Teams",
18
19
  long_description="{}\n{}".format(
@@ -69,6 +70,7 @@ setup(
69
70
  "sqlglot~=25.30.0",
70
71
  "mcp~=1.9.0",
71
72
  "pyperclip~=1.8.2",
73
+ "python-dotenv~=1.0.0",
72
74
  ],
73
75
  extras_require={
74
76
  # eg:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: altimate-datapilot-cli
3
- Version: 0.0.19
3
+ Version: 0.0.20
4
4
  Summary: Assistant for Data Teams
5
5
  Home-page: https://github.com/AltimateAI/datapilot-cli
6
6
  Author: Altimate Inc
@@ -68,6 +68,9 @@ src/datapilot/core/insights/sql/base/__init__.py
68
68
  src/datapilot/core/insights/sql/base/insight.py
69
69
  src/datapilot/core/insights/sql/runtime/__init__.py
70
70
  src/datapilot/core/insights/sql/static/__init__.py
71
+ src/datapilot/core/knowledge/__init__.py
72
+ src/datapilot/core/knowledge/cli.py
73
+ src/datapilot/core/knowledge/server.py
71
74
  src/datapilot/core/mcp_utils/__init__.py
72
75
  src/datapilot/core/mcp_utils/mcp.py
73
76
  src/datapilot/core/platforms/__init__.py
@@ -6,3 +6,4 @@ requests>=2.31
6
6
  sqlglot~=25.30.0
7
7
  mcp~=1.9.0
8
8
  pyperclip~=1.8.2
9
+ python-dotenv~=1.0.0
@@ -0,0 +1 @@
1
+ __version__ = "0.0.20"
@@ -0,0 +1,96 @@
1
+ import json
2
+ import os
3
+ import re
4
+ from pathlib import Path
5
+
6
+ import click
7
+ from dotenv import load_dotenv
8
+
9
+ from datapilot import __version__
10
+ from datapilot.core.knowledge.cli import cli as knowledge
11
+ from datapilot.core.mcp_utils.mcp import mcp
12
+ from datapilot.core.platforms.dbt.cli.cli import dbt
13
+
14
+
15
+ def load_config_from_file():
16
+ """Load configuration from ~/.altimate/altimate.json if it exists."""
17
+ config_path = Path.home() / ".altimate" / "altimate.json"
18
+
19
+ if not config_path.exists():
20
+ return {}
21
+
22
+ try:
23
+ with config_path.open() as f:
24
+ config = json.load(f)
25
+ return config
26
+ except (OSError, json.JSONDecodeError) as e:
27
+ click.echo(f"Warning: Failed to load config from {config_path}: {e}", err=True)
28
+ return {}
29
+
30
+
31
+ def substitute_env_vars(value):
32
+ """Replace ${env:ENV_VARIABLE} patterns with actual environment variable values."""
33
+ if not isinstance(value, str):
34
+ return value
35
+
36
+ # Pattern to match ${env:VARIABLE_NAME}
37
+ pattern = r"\$\{env:([^}]+)\}"
38
+
39
+ def replacer(match):
40
+ env_var = match.group(1)
41
+ return os.environ.get(env_var, match.group(0))
42
+
43
+ return re.sub(pattern, replacer, value)
44
+
45
+
46
+ def process_config(config):
47
+ """Process configuration dictionary to substitute environment variables."""
48
+ processed = {}
49
+ for key, value in config.items():
50
+ processed[key] = substitute_env_vars(value)
51
+ return processed
52
+
53
+
54
+ @click.group()
55
+ @click.version_option(version=__version__, prog_name="datapilot")
56
+ @click.option("--token", required=False, help="Your API token for authentication.", hide_input=True)
57
+ @click.option("--instance-name", required=False, help="Your tenant ID.")
58
+ @click.option("--backend-url", required=False, help="Altimate's Backend URL", default="https://api.myaltimate.com")
59
+ @click.pass_context
60
+ def datapilot(ctx, token, instance_name, backend_url):
61
+ """Altimate CLI for DBT project management."""
62
+ # Load .env file from current directory if it exists
63
+ load_dotenv()
64
+
65
+ # Load configuration from file
66
+ file_config = load_config_from_file()
67
+ file_config = process_config(file_config)
68
+
69
+ # Map config file keys to CLI option names
70
+ config_mapping = {"altimateApiKey": "token", "altimateInstanceName": "instance_name", "altimateUrl": "backend_url"}
71
+
72
+ # Store common options in context, with CLI args taking precedence
73
+ ctx.ensure_object(dict)
74
+
75
+ # Apply file config first
76
+ for file_key, cli_key in config_mapping.items():
77
+ if file_key in file_config:
78
+ ctx.obj[cli_key] = file_config[file_key]
79
+
80
+ # Override with CLI arguments if provided
81
+ if token is not None:
82
+ ctx.obj["token"] = token
83
+ if instance_name is not None:
84
+ ctx.obj["instance_name"] = instance_name
85
+ if backend_url != "https://api.myaltimate.com": # Only override if not default
86
+ ctx.obj["backend_url"] = backend_url
87
+
88
+ # Set defaults if nothing was provided
89
+ ctx.obj.setdefault("token", None)
90
+ ctx.obj.setdefault("instance_name", None)
91
+ ctx.obj.setdefault("backend_url", "https://api.myaltimate.com")
92
+
93
+
94
+ datapilot.add_command(dbt)
95
+ datapilot.add_command(mcp)
96
+ datapilot.add_command(knowledge)
@@ -0,0 +1,46 @@
1
+ from http.server import HTTPServer
2
+
3
+ import click
4
+
5
+ from .server import KnowledgeBaseHandler
6
+
7
+
8
+ @click.group(name="knowledge")
9
+ def cli():
10
+ """knowledge specific commands."""
11
+
12
+
13
+ @cli.command()
14
+ @click.option("--port", default=4000, help="Port to run the server on")
15
+ @click.pass_context
16
+ def serve(ctx, port):
17
+ """Serve knowledge bases via HTTP server."""
18
+ # Get configuration from parent context
19
+ token = ctx.parent.obj.get("token")
20
+ instance_name = ctx.parent.obj.get("instance_name")
21
+ backend_url = ctx.parent.obj.get("backend_url")
22
+
23
+ if not token or not instance_name:
24
+ click.echo(
25
+ "Error: API token and instance name are required. Use --token and --instance-name options or set them in config.", err=True
26
+ )
27
+ ctx.exit(1)
28
+
29
+ # Set context data for the handler
30
+ KnowledgeBaseHandler.token = token
31
+ KnowledgeBaseHandler.instance_name = instance_name
32
+ KnowledgeBaseHandler.backend_url = backend_url
33
+
34
+ server_address = ("", port)
35
+ httpd = HTTPServer(server_address, KnowledgeBaseHandler)
36
+
37
+ click.echo(f"Starting knowledge base server on port {port}...")
38
+ click.echo(f"Backend URL: {backend_url}")
39
+ click.echo(f"Instance: {instance_name}")
40
+ click.echo(f"Server running at http://localhost:{port}")
41
+
42
+ try:
43
+ httpd.serve_forever()
44
+ except KeyboardInterrupt:
45
+ click.echo("\nShutting down server...")
46
+ httpd.shutdown()
@@ -0,0 +1,84 @@
1
+ import json
2
+ import re
3
+ from http.server import BaseHTTPRequestHandler
4
+ from urllib.error import HTTPError
5
+ from urllib.error import URLError
6
+ from urllib.parse import urlparse
7
+ from urllib.request import Request
8
+ from urllib.request import urlopen
9
+
10
+ import click
11
+
12
+
13
+ class KnowledgeBaseHandler(BaseHTTPRequestHandler):
14
+ """HTTP request handler for serving knowledge bases and health checks."""
15
+
16
+ token: str = ""
17
+ instance_name: str = ""
18
+ backend_url: str = ""
19
+
20
+ def do_GET(self):
21
+ """Handle GET requests."""
22
+ path = urlparse(self.path).path
23
+
24
+ # Match /knowledge_bases/{uuid} pattern
25
+ match = re.match(r"^/kb/([a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})$", path)
26
+
27
+ if match:
28
+ public_id = match.group(1)
29
+ self.handle_knowledge_base(public_id)
30
+ elif path == "/health":
31
+ self.handle_health()
32
+ else:
33
+ self.send_error(404, "Not Found")
34
+
35
+ def handle_knowledge_base(self, public_id):
36
+ """Fetch and return knowledge base data."""
37
+ url = f"{self.backend_url}/knowledge_bases/private/{public_id}"
38
+
39
+ # Validate URL scheme for security
40
+ parsed_url = urlparse(url)
41
+ if parsed_url.scheme not in ("http", "https"):
42
+ self.send_response(400)
43
+ self.send_header("Content-Type", "application/json")
44
+ self.end_headers()
45
+ error_msg = json.dumps({"error": "Invalid URL scheme. Only HTTP and HTTPS are allowed."})
46
+ self.wfile.write(error_msg.encode("utf-8"))
47
+ return
48
+
49
+ headers = {"Authorization": f"Bearer {self.token}", "X-Tenant": self.instance_name, "Content-Type": "application/json"}
50
+
51
+ req = Request(url, headers=headers) # noqa: S310
52
+
53
+ try:
54
+ # URL scheme validated above - only HTTP/HTTPS allowed
55
+ with urlopen(req, timeout=30) as response: # noqa: S310
56
+ data = response.read()
57
+ self.send_response(200)
58
+ self.send_header("Content-Type", "application/json")
59
+ self.end_headers()
60
+ self.wfile.write(data)
61
+ except HTTPError as e:
62
+ error_body = e.read()
63
+ error_data = error_body.decode("utf-8") if error_body else '{"error": "HTTP Error"}'
64
+ self.send_response(e.code)
65
+ self.send_header("Content-Type", "application/json")
66
+ self.end_headers()
67
+ self.wfile.write(error_data.encode("utf-8"))
68
+ except URLError as e:
69
+ self.send_response(500)
70
+ self.send_header("Content-Type", "application/json")
71
+ self.end_headers()
72
+ error_msg = json.dumps({"error": str(e)})
73
+ self.wfile.write(error_msg.encode("utf-8"))
74
+
75
+ def handle_health(self):
76
+ """Handle health check endpoint."""
77
+ self.send_response(200)
78
+ self.send_header("Content-Type", "application/json")
79
+ self.end_headers()
80
+ self.wfile.write(json.dumps({"status": "ok"}).encode("utf-8"))
81
+
82
+ def log_message(self, format, *args):
83
+ """Override to use click.echo for logging."""
84
+ click.echo(f"{self.address_string()} - {format % args}")
@@ -24,13 +24,14 @@ logging.basicConfig(level=logging.INFO)
24
24
 
25
25
  # New dbt group
26
26
  @click.group()
27
- def dbt():
27
+ @click.pass_context
28
+ def dbt(ctx):
28
29
  """DBT specific commands."""
30
+ # Ensure context object exists
31
+ ctx.ensure_object(dict)
29
32
 
30
33
 
31
34
  @dbt.command("project-health")
32
- @click.option("--token", required=False, help="Your API token for authentication.")
33
- @click.option("--instance-name", required=False, help="Your tenant ID.")
34
35
  @click.option(
35
36
  "--manifest-path",
36
37
  required=True,
@@ -57,21 +58,24 @@ def dbt():
57
58
  default=None,
58
59
  help="Selective model testing. Specify one or more models to run tests on.",
59
60
  )
60
- @click.option("--backend-url", required=False, help="Altimate's Backend URL", default="https://api.myaltimate.com")
61
+ @click.pass_context
61
62
  def project_health(
62
- token,
63
- instance_name,
63
+ ctx,
64
64
  manifest_path,
65
65
  catalog_path,
66
66
  config_path=None,
67
67
  config_name=None,
68
68
  select=None,
69
- backend_url="https://api.myaltimate.com",
70
69
  ):
71
70
  """
72
71
  Validate the DBT project's configuration and structure.
73
72
  :param manifest_path: Path to the DBT manifest file.
74
73
  """
74
+ # Get common options from parent context
75
+ token = ctx.parent.obj.get("token")
76
+ instance_name = ctx.parent.obj.get("instance_name")
77
+ backend_url = ctx.parent.obj.get("backend_url")
78
+
75
79
  config = None
76
80
  if config_path:
77
81
  config = load_config(config_path)
@@ -131,25 +135,32 @@ def project_health(
131
135
 
132
136
 
133
137
  @dbt.command("onboard")
134
- @click.option("--token", prompt="API Token", help="Your API token for authentication.")
135
- @click.option("--instance-name", prompt="Instance Name", help="Your tenant ID.")
136
138
  @click.option("--dbt_core_integration_id", prompt="DBT Core Integration ID", help="DBT Core Integration ID")
137
139
  @click.option(
138
140
  "--dbt_core_integration_environment", default="PROD", prompt="DBT Core Integration Environment", help="DBT Core Integration Environment"
139
141
  )
140
142
  @click.option("--manifest-path", required=True, prompt="Manifest Path", help="Path to the manifest file.")
141
143
  @click.option("--catalog-path", required=False, prompt=False, help="Path to the catalog file.")
142
- @click.option("--backend-url", required=False, help="Altimate's Backend URL", default="https://api.myaltimate.com")
144
+ @click.pass_context
143
145
  def onboard(
144
- token,
145
- instance_name,
146
+ ctx,
146
147
  dbt_core_integration_id,
147
148
  dbt_core_integration_environment,
148
149
  manifest_path,
149
150
  catalog_path,
150
- backend_url="https://api.myaltimate.com",
151
151
  ):
152
152
  """Onboard a manifest file to DBT."""
153
+ # Get common options from parent context
154
+ token = ctx.parent.obj.get("token")
155
+ instance_name = ctx.parent.obj.get("instance_name")
156
+ backend_url = ctx.parent.obj.get("backend_url")
157
+
158
+ # For onboard command, token and instance_name are required
159
+ if not token:
160
+ token = click.prompt("API Token")
161
+ if not instance_name:
162
+ instance_name = click.prompt("Instance Name")
163
+
153
164
  check_token_and_instance(token, instance_name)
154
165
 
155
166
  if not validate_credentials(token, backend_url, instance_name):
@@ -1,7 +1,7 @@
1
1
  # test_app.py
2
2
  from click.testing import CliRunner
3
3
 
4
- from datapilot.core.platforms.dbt.cli.cli import project_health
4
+ from datapilot.cli.main import datapilot
5
5
 
6
6
 
7
7
  def test_project_health_with_required_and_optional_args():
@@ -11,7 +11,9 @@ def test_project_health_with_required_and_optional_args():
11
11
  config_path = "tests/data/config.yml"
12
12
 
13
13
  # Simulate command invocation
14
- result = runner.invoke(project_health, ["--manifest-path", manifest_path, "--catalog-path", catalog_path, "--config-path", config_path])
14
+ result = runner.invoke(
15
+ datapilot, ["dbt", "project-health", "--manifest-path", manifest_path, "--catalog-path", catalog_path, "--config-path", config_path]
16
+ )
15
17
 
16
18
  assert result.exit_code == 0 # Ensure the command executed successfully
17
19
  # Add more assertions here to validate the behavior of your command,
@@ -25,8 +27,10 @@ def test_project_health_with_only_required_arg():
25
27
 
26
28
  # Simulate command invocation without optional arguments
27
29
  result = runner.invoke(
28
- project_health,
30
+ datapilot,
29
31
  [
32
+ "dbt",
33
+ "project-health",
30
34
  "--manifest-path",
31
35
  manifest_path,
32
36
  ],
@@ -43,8 +47,10 @@ def test_project_health_with_only_required_arg_version1_6():
43
47
 
44
48
  # Simulate command invocation without optional arguments
45
49
  result = runner.invoke(
46
- project_health,
50
+ datapilot,
47
51
  [
52
+ "dbt",
53
+ "project-health",
48
54
  "--manifest-path",
49
55
  manifest_path,
50
56
  ],
@@ -61,8 +67,10 @@ def test_project_health_with_macro_args():
61
67
 
62
68
  # Simulate command invocation without optional arguments
63
69
  result = runner.invoke(
64
- project_health,
70
+ datapilot,
65
71
  [
72
+ "dbt",
73
+ "project-health",
66
74
  "--manifest-path",
67
75
  manifest_path,
68
76
  ],
@@ -76,8 +84,10 @@ def test_project_health_with_macro_args():
76
84
 
77
85
  # Simulate command invocation without optional arguments
78
86
  result = runner.invoke(
79
- project_health,
87
+ datapilot,
80
88
  [
89
+ "dbt",
90
+ "project-health",
81
91
  "--manifest-path",
82
92
  manifest_path,
83
93
  ],
@@ -95,7 +105,9 @@ def test_project_health_with_required_and_optional_args_v12():
95
105
  config_path = "tests/data/config.yml"
96
106
 
97
107
  # Simulate command invocation
98
- result = runner.invoke(project_health, ["--manifest-path", manifest_path, "--catalog-path", catalog_path, "--config-path", config_path])
108
+ result = runner.invoke(
109
+ datapilot, ["dbt", "project-health", "--manifest-path", manifest_path, "--catalog-path", catalog_path, "--config-path", config_path]
110
+ )
99
111
 
100
112
  assert result.exit_code == 0 # Ensure the command executed successfully
101
113
  # Add more assertions here to validate the behavior of your command,
File without changes
@@ -1 +0,0 @@
1
- __version__ = "0.0.19"
@@ -1,13 +0,0 @@
1
- import click
2
-
3
- from datapilot.core.mcp_utils.mcp import mcp
4
- from datapilot.core.platforms.dbt.cli.cli import dbt
5
-
6
-
7
- @click.group()
8
- def datapilot():
9
- """Altimate CLI for DBT project management."""
10
-
11
-
12
- datapilot.add_command(dbt)
13
- datapilot.add_command(mcp)