dataenginex 0.4.5__tar.gz → 0.4.6__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 (283) hide show
  1. {dataenginex-0.4.5 → dataenginex-0.4.6}/PKG-INFO +1 -1
  2. {dataenginex-0.4.5 → dataenginex-0.4.6}/pyproject.toml +1 -1
  3. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/tools/builtin.py +22 -1
  4. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/vectorstore.py +15 -3
  5. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/dbt.py +9 -1
  6. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_vectorstore_extended.py +9 -2
  7. {dataenginex-0.4.5 → dataenginex-0.4.6}/uv.lock +1 -1
  8. {dataenginex-0.4.5 → dataenginex-0.4.6}/.claude/commands/new-feature.md +0 -0
  9. {dataenginex-0.4.5 → dataenginex-0.4.6}/.claude/commands/validate.md +0 -0
  10. {dataenginex-0.4.5 → dataenginex-0.4.6}/.claude/settings.json +0 -0
  11. {dataenginex-0.4.5 → dataenginex-0.4.6}/.env.template +0 -0
  12. {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  13. {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  14. {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  15. {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  16. {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/dependabot.yml +0 -0
  17. {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/labels.yml +0 -0
  18. {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/release-pr-template.md +0 -0
  19. {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/workflows/auto-pr.yml +0 -0
  20. {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/workflows/ci.yml +0 -0
  21. {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/workflows/docs-sync.yml +0 -0
  22. {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/workflows/release.yml +0 -0
  23. {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/workflows/security.yml +0 -0
  24. {dataenginex-0.4.5 → dataenginex-0.4.6}/.gitignore +0 -0
  25. {dataenginex-0.4.5 → dataenginex-0.4.6}/.gitleaks.toml +0 -0
  26. {dataenginex-0.4.5 → dataenginex-0.4.6}/.pre-commit-config.yaml +0 -0
  27. {dataenginex-0.4.5 → dataenginex-0.4.6}/.python-version +0 -0
  28. {dataenginex-0.4.5 → dataenginex-0.4.6}/CHANGELOG.md +0 -0
  29. {dataenginex-0.4.5 → dataenginex-0.4.6}/CLAUDE.md +0 -0
  30. {dataenginex-0.4.5 → dataenginex-0.4.6}/CODEOWNERS +0 -0
  31. {dataenginex-0.4.5 → dataenginex-0.4.6}/CODE_OF_CONDUCT.md +0 -0
  32. {dataenginex-0.4.5 → dataenginex-0.4.6}/CONTRIBUTING.md +0 -0
  33. {dataenginex-0.4.5 → dataenginex-0.4.6}/LICENSE +0 -0
  34. {dataenginex-0.4.5 → dataenginex-0.4.6}/README.md +0 -0
  35. {dataenginex-0.4.5 → dataenginex-0.4.6}/SECURITY.md +0 -0
  36. {dataenginex-0.4.5 → dataenginex-0.4.6}/docker-compose.test.yml +0 -0
  37. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/adr/0000-template.md +0 -0
  38. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/adr/0001-medallion-architecture.md +0 -0
  39. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/ai.md +0 -0
  40. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/api.md +0 -0
  41. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/config.md +0 -0
  42. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/core.md +0 -0
  43. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/data.md +0 -0
  44. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/engine.md +0 -0
  45. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/index.md +0 -0
  46. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/lakehouse.md +0 -0
  47. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/middleware.md +0 -0
  48. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/ml.md +0 -0
  49. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/orchestration.md +0 -0
  50. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/plugins.md +0 -0
  51. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/secops.md +0 -0
  52. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/warehouse.md +0 -0
  53. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/architecture.md +0 -0
  54. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/ci-cd.md +0 -0
  55. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/contributing.md +0 -0
  56. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/development.md +0 -0
  57. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/index.md +0 -0
  58. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/observability.md +0 -0
  59. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/quickstart.md +0 -0
  60. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/release-notes.md +0 -0
  61. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/sdlc.md +0 -0
  62. {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/security-scanning.md +0 -0
  63. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/01_hello_pipeline.py +0 -0
  64. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/02_api_quickstart.py +0 -0
  65. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/03_quality_gate.py +0 -0
  66. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/04_ml_training.py +0 -0
  67. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/05_rag_demo.py +0 -0
  68. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/06_llm_quickstart.py +0 -0
  69. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/07_api_ingestion.py +0 -0
  70. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/08_spark_ml.py +0 -0
  71. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/09_feature_engineering.py +0 -0
  72. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/10_model_analysis.py +0 -0
  73. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/GUIDE.md +0 -0
  74. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/dashboard/dashboard_config.yaml +0 -0
  75. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/dashboard/run_dashboard.py +0 -0
  76. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/data/events.csv +0 -0
  77. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/data/users.csv +0 -0
  78. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/dex.yaml +0 -0
  79. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/ecommerce/data/customers.csv +0 -0
  80. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/ecommerce/data/orders.csv +0 -0
  81. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/ecommerce/data/products.csv +0 -0
  82. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/ecommerce/dex.yaml +0 -0
  83. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/ecommerce/run_all.py +0 -0
  84. {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/movies.csv +0 -0
  85. {dataenginex-0.4.5 → dataenginex-0.4.6}/poe_tasks.toml +0 -0
  86. {dataenginex-0.4.5 → dataenginex-0.4.6}/scripts/localstack/init.sh +0 -0
  87. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/README.md +0 -0
  88. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/RELEASE_NOTES.md +0 -0
  89. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/__init__.py +0 -0
  90. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/_json.py +0 -0
  91. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/__init__.py +0 -0
  92. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/agents/__init__.py +0 -0
  93. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/agents/builtin.py +0 -0
  94. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/llm.py +0 -0
  95. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/memory/__init__.py +0 -0
  96. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/memory/base.py +0 -0
  97. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/memory/episodic.py +0 -0
  98. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/memory/long_term.py +0 -0
  99. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/observability/__init__.py +0 -0
  100. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/observability/audit.py +0 -0
  101. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/observability/cost.py +0 -0
  102. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/observability/metrics.py +0 -0
  103. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/retrieval/__init__.py +0 -0
  104. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/retrieval/builtin.py +0 -0
  105. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/retrieval/graph.py +0 -0
  106. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/routing/__init__.py +0 -0
  107. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/routing/anthropic.py +0 -0
  108. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/routing/guarded.py +0 -0
  109. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/routing/ollama.py +0 -0
  110. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/routing/openai.py +0 -0
  111. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/routing/router.py +0 -0
  112. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/runtime/__init__.py +0 -0
  113. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/runtime/checkpoint.py +0 -0
  114. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/runtime/executor.py +0 -0
  115. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/runtime/sandbox.py +0 -0
  116. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/tools/__init__.py +0 -0
  117. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/workflows/__init__.py +0 -0
  118. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/workflows/conditions.py +0 -0
  119. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/workflows/dag.py +0 -0
  120. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/workflows/human_loop.py +0 -0
  121. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/api/__init__.py +0 -0
  122. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/api/errors.py +0 -0
  123. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/api/pagination.py +0 -0
  124. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/api/schemas.py +0 -0
  125. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/cli/__init__.py +0 -0
  126. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/cli/main.py +0 -0
  127. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/cli/run.py +0 -0
  128. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/cli/secops.py +0 -0
  129. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/cli/train.py +0 -0
  130. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/config/__init__.py +0 -0
  131. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/config/defaults.py +0 -0
  132. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/config/loader.py +0 -0
  133. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/config/schema.py +0 -0
  134. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/config/settings.py +0 -0
  135. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/core/__init__.py +0 -0
  136. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/core/exceptions.py +0 -0
  137. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/core/interfaces.py +0 -0
  138. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/core/medallion_architecture.py +0 -0
  139. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/core/quality.py +0 -0
  140. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/core/registry.py +0 -0
  141. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/core/schemas.py +0 -0
  142. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/core/validators.py +0 -0
  143. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/__init__.py +0 -0
  144. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/__init__.py +0 -0
  145. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/_utils.py +0 -0
  146. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/csv.py +0 -0
  147. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/delta.py +0 -0
  148. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/duckdb.py +0 -0
  149. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/http.py +0 -0
  150. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/parquet.py +0 -0
  151. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/rest.py +0 -0
  152. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/spark.py +0 -0
  153. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/sse.py +0 -0
  154. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/pipeline/__init__.py +0 -0
  155. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/pipeline/dag.py +0 -0
  156. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/pipeline/run_history.py +0 -0
  157. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/pipeline/runner.py +0 -0
  158. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/profiler.py +0 -0
  159. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/quality/__init__.py +0 -0
  160. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/quality/gates.py +0 -0
  161. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/quality/spark.py +0 -0
  162. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/registry.py +0 -0
  163. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/transforms/__init__.py +0 -0
  164. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/transforms/sql.py +0 -0
  165. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/engine.py +0 -0
  166. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/lakehouse/__init__.py +0 -0
  167. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/lakehouse/catalog.py +0 -0
  168. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/lakehouse/partitioning.py +0 -0
  169. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/lakehouse/storage.py +0 -0
  170. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/middleware/__init__.py +0 -0
  171. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/middleware/domain_metrics.py +0 -0
  172. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/middleware/logging_config.py +0 -0
  173. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/middleware/metrics.py +0 -0
  174. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/__init__.py +0 -0
  175. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/drift.py +0 -0
  176. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/features/__init__.py +0 -0
  177. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/features/builtin.py +0 -0
  178. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/metrics.py +0 -0
  179. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/mlflow_registry.py +0 -0
  180. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/registry.py +0 -0
  181. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/serving.py +0 -0
  182. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/serving_engine/__init__.py +0 -0
  183. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/serving_engine/builtin.py +0 -0
  184. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/tracking/__init__.py +0 -0
  185. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/tracking/builtin.py +0 -0
  186. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/training.py +0 -0
  187. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/orchestration/__init__.py +0 -0
  188. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/orchestration/builtin.py +0 -0
  189. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/orchestration/scheduler.py +0 -0
  190. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/plugins/__init__.py +0 -0
  191. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/plugins/registry.py +0 -0
  192. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/py.typed +0 -0
  193. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/secops/__init__.py +0 -0
  194. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/secops/audit.py +0 -0
  195. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/secops/gate.py +0 -0
  196. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/secops/guard.py +0 -0
  197. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/secops/masking.py +0 -0
  198. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/secops/pii.py +0 -0
  199. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/store.py +0 -0
  200. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/warehouse/__init__.py +0 -0
  201. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/warehouse/lineage.py +0 -0
  202. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/warehouse/transforms.py +0 -0
  203. {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/worker.py +0 -0
  204. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/__init__.py +0 -0
  205. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/conformance/__init__.py +0 -0
  206. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/conformance/test_connector.py +0 -0
  207. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/conformance/test_feature_store.py +0 -0
  208. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/conformance/test_tracker.py +0 -0
  209. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/conformance/test_transform.py +0 -0
  210. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/conftest.py +0 -0
  211. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/fixtures/__init__.py +0 -0
  212. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/fixtures/sample_data.py +0 -0
  213. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/fixtures/sample_jobs.csv +0 -0
  214. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/fixtures/sample_jobs.json +0 -0
  215. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/__init__.py +0 -0
  216. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/test_ai_integration.py +0 -0
  217. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/test_cli_run.py +0 -0
  218. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/test_config_cli.py +0 -0
  219. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/test_lineage_integration.py +0 -0
  220. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/test_ml_integration.py +0 -0
  221. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/test_pipeline_e2e.py +0 -0
  222. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/test_secops_integration.py +0 -0
  223. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/test_storage_real.py +0 -0
  224. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/load/__init__.py +0 -0
  225. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/__init__.py +0 -0
  226. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_agent_runtime.py +0 -0
  227. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_ai_modules.py +0 -0
  228. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_api_pagination.py +0 -0
  229. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_api_schemas.py +0 -0
  230. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_api_validators.py +0 -0
  231. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_builtin_agent.py +0 -0
  232. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_builtin_feature_store.py +0 -0
  233. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_builtin_serving.py +0 -0
  234. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_builtin_tracker.py +0 -0
  235. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_cli_train.py +0 -0
  236. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_config_loader.py +0 -0
  237. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_config_schema.py +0 -0
  238. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_config_schema_extended.py +0 -0
  239. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_core_exceptions.py +0 -0
  240. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_core_interfaces.py +0 -0
  241. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_core_quality.py +0 -0
  242. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_core_registry.py +0 -0
  243. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_core_schemas_extended.py +0 -0
  244. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_csv_connector.py +0 -0
  245. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_data.py +0 -0
  246. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_dbt_connector.py +0 -0
  247. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_dex_engine.py +0 -0
  248. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_dex_store.py +0 -0
  249. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_domain_metrics.py +0 -0
  250. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_domain_metrics_wiring.py +0 -0
  251. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_drift_scheduler.py +0 -0
  252. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_duckdb_connector.py +0 -0
  253. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_guarded_provider.py +0 -0
  254. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_lakehouse.py +0 -0
  255. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_llm.py +0 -0
  256. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_llm_extended.py +0 -0
  257. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_llm_litellm_vllm.py +0 -0
  258. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_logging.py +0 -0
  259. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_medallion.py +0 -0
  260. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_medallion_extended.py +0 -0
  261. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_middleware_metrics.py +0 -0
  262. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_ml.py +0 -0
  263. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_parquet_connector.py +0 -0
  264. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_pipeline_dag.py +0 -0
  265. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_pipeline_runner.py +0 -0
  266. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_plugins.py +0 -0
  267. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_privacy_guard_wiring.py +0 -0
  268. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_quality_gates.py +0 -0
  269. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_quality_spark.py +0 -0
  270. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_retriever.py +0 -0
  271. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_retriever_graph.py +0 -0
  272. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_run_history.py +0 -0
  273. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_scheduler.py +0 -0
  274. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_secops.py +0 -0
  275. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_secops_engine_and_cli.py +0 -0
  276. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_secops_guard.py +0 -0
  277. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_spark_connector.py +0 -0
  278. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_spark_fixtures.py +0 -0
  279. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_sql_transforms.py +0 -0
  280. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_storage_abstraction.py +0 -0
  281. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_vectorstore.py +0 -0
  282. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_warehouse.py +0 -0
  283. {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_warehouse_transforms.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataenginex
3
- Version: 0.4.5
3
+ Version: 0.4.6
4
4
  Summary: DataEngineX — open-source, self-hosted, local-first Data + ML + AI workbench library
5
5
  Author-email: Jay <jayapal.myaka99@gmail.com>
6
6
  License: MIT License
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "dataenginex"
3
- version = "0.4.5"
3
+ version = "0.4.6"
4
4
  description = "DataEngineX — open-source, self-hosted, local-first Data + ML + AI workbench library"
5
5
  authors = [{ name = "Jay", email = "jayapal.myaka99@gmail.com" }]
6
6
  readme = "src/dataenginex/README.md"
@@ -29,13 +29,30 @@ logger = structlog.get_logger()
29
29
 
30
30
  # ── SQL / lakehouse ────────────────────────────────────────────────────────────
31
31
 
32
+ # This tool is reachable from HTTP-exposed agent/native-call routes, so the SQL
33
+ # it runs must be treated as untrusted input. DuckDB's enable_external_access
34
+ # blocks filesystem/network access (read_csv/read_parquet/httpfs/ATTACH/etc.)
35
+ # for the connection it's set on; the statement-shape check below is a second,
36
+ # cheap layer against non-SELECT statements (COPY/INSTALL/PRAGMA/...).
37
+ _READ_ONLY_PREFIXES = ("SELECT", "WITH")
38
+
39
+
40
+ def _require_read_only(sql: str) -> None:
41
+ stripped = sql.strip().lstrip("(").strip()
42
+ if ";" in stripped[:-1]: # allow a single optional trailing semicolon
43
+ raise ValueError("query tool only allows a single statement")
44
+ if not stripped.upper().startswith(_READ_ONLY_PREFIXES):
45
+ raise ValueError("query tool only allows read-only SELECT/WITH statements")
46
+
32
47
 
33
48
  def _query_sql(sql: str, database: str = ":memory:") -> list[dict[str, Any]]:
34
- """Execute a SQL query via DuckDB and return results."""
49
+ """Execute a read-only SQL query via DuckDB and return results."""
35
50
  import duckdb
36
51
 
52
+ _require_read_only(sql)
37
53
  conn = duckdb.connect(database)
38
54
  try:
55
+ conn.execute("SET enable_external_access=false")
39
56
  result = conn.execute(sql)
40
57
  description = result.description or []
41
58
  if not description:
@@ -52,6 +69,7 @@ def _make_lakehouse_query(lakehouse_dir: Path) -> Callable[[str], list[dict[str,
52
69
  def _query_with_lakehouse(sql: str) -> list[dict[str, Any]]:
53
70
  import duckdb
54
71
 
72
+ _require_read_only(sql)
55
73
  conn = duckdb.connect(":memory:")
56
74
  try:
57
75
  for layer in ("bronze", "silver", "gold"):
@@ -65,6 +83,9 @@ def _make_lakehouse_query(lakehouse_dir: Path) -> Callable[[str], list[dict[str,
65
83
  f"CREATE OR REPLACE VIEW {pf.stem}"
66
84
  f" AS SELECT * FROM read_parquet('{safe}')"
67
85
  )
86
+ # Lock the connection down to the views already registered above —
87
+ # untrusted `sql` below can no longer touch the filesystem/network.
88
+ conn.execute("SET enable_external_access=false")
68
89
  result = conn.execute(sql)
69
90
  description = result.description or []
70
91
  if not description:
@@ -23,8 +23,8 @@ Example::
23
23
  from __future__ import annotations
24
24
 
25
25
  import abc
26
+ import hashlib
26
27
  import math
27
- import uuid
28
28
  from dataclasses import dataclass, field
29
29
  from typing import TYPE_CHECKING, Any
30
30
 
@@ -55,11 +55,20 @@ __all__ = [
55
55
  class Document:
56
56
  """A text document with optional metadata and embedding."""
57
57
 
58
- id: str = field(default_factory=lambda: uuid.uuid4().hex[:16])
58
+ id: str = ""
59
59
  text: str = ""
60
60
  metadata: dict[str, Any] = field(default_factory=dict)
61
61
  embedding: list[float] = field(default_factory=list)
62
62
 
63
+ def __post_init__(self) -> None:
64
+ if not self.id:
65
+ # Content-hash id, not random: re-ingesting the same text upserts
66
+ # (overwrites) the existing entry instead of piling up a new
67
+ # random-id duplicate. InMemoryBackend has no eviction/cap, so a
68
+ # random id here means unbounded growth across repeated scheduled
69
+ # pipeline runs that re-ingest the same rows.
70
+ self.id = hashlib.sha256(self.text.encode("utf-8")).hexdigest()[:16]
71
+
63
72
 
64
73
  @dataclass
65
74
  class SearchResult:
@@ -447,7 +456,10 @@ class RAGPipeline:
447
456
  Number of documents stored.
448
457
  """
449
458
  meta = metadata or [{} for _ in texts]
450
- doc_ids = ids or [uuid.uuid4().hex[:16] for _ in texts]
459
+ # Content-hash ids by default (same scheme as Document.__post_init__)
460
+ # so re-ingesting identical text upserts instead of duplicating —
461
+ # see Document's docstring for why a random id here matters.
462
+ doc_ids = ids or [hashlib.sha256(t.encode("utf-8")).hexdigest()[:16] for t in texts]
451
463
 
452
464
  docs: list[Document] = []
453
465
  for doc_id, text, m in zip(doc_ids, texts, meta, strict=True):
@@ -73,6 +73,7 @@ class DbtConnector(BaseConnector):
73
73
  target_database: str | None = None,
74
74
  profiles_dir: str | None = None,
75
75
  target: str = "dev",
76
+ timeout_s: float = 600,
76
77
  **kwargs: Any,
77
78
  ) -> None:
78
79
  if not _DBT_AVAILABLE:
@@ -84,6 +85,7 @@ class DbtConnector(BaseConnector):
84
85
  )
85
86
  self._profiles_dir = Path(profiles_dir) if profiles_dir else self._project_dir
86
87
  self._target = target
88
+ self._timeout_s = timeout_s
87
89
 
88
90
  def connect(self) -> None:
89
91
  project_file = self._project_dir / "dbt_project.yml"
@@ -131,7 +133,13 @@ class DbtConnector(BaseConnector):
131
133
  "--target",
132
134
  self._target,
133
135
  ]
134
- proc = subprocess.run(cmd, capture_output=True, text=True) # noqa: S603,S607
136
+ try:
137
+ proc = subprocess.run( # noqa: S603,S607
138
+ cmd, capture_output=True, text=True, timeout=self._timeout_s
139
+ )
140
+ except subprocess.TimeoutExpired as exc:
141
+ msg = f"dbt run timed out for model '{model}' after {self._timeout_s}s"
142
+ raise RuntimeError(msg) from exc
135
143
  if proc.returncode != 0:
136
144
  msg = f"dbt run failed for model '{model}':\n{proc.stdout}\n{proc.stderr}"
137
145
  raise RuntimeError(msg)
@@ -20,10 +20,17 @@ class TestDocument:
20
20
  d = Document(text="hello")
21
21
  assert len(d.id) > 0
22
22
 
23
- def test_ids_unique(self) -> None:
24
- ids = {Document().id for _ in range(50)}
23
+ def test_ids_deterministic_by_content(self) -> None:
24
+ """Ids are content-hash derived, not random — re-ingesting the same
25
+ text must upsert (same id), and distinct texts must not collide."""
26
+ assert Document(text="hello").id == Document(text="hello").id
27
+ ids = {Document(text=f"doc-{i}").id for i in range(50)}
25
28
  assert len(ids) == 50
26
29
 
30
+ def test_explicit_id_not_overridden(self) -> None:
31
+ d = Document(id="custom-id", text="hello")
32
+ assert d.id == "custom-id"
33
+
27
34
  def test_metadata_default_empty(self) -> None:
28
35
  d = Document(text="x")
29
36
  assert d.metadata == {}
@@ -830,7 +830,7 @@ wheels = [
830
830
 
831
831
  [[package]]
832
832
  name = "dataenginex"
833
- version = "0.4.5"
833
+ version = "0.4.6"
834
834
  source = { editable = "." }
835
835
  dependencies = [
836
836
  { name = "click" },
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