databao-context-engine 0.1.5__py3-none-any.whl → 0.1.7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -23,7 +23,12 @@ from databao_context_engine.pluginlib.build_plugin import (
23
23
  DatasourceType,
24
24
  )
25
25
  from databao_context_engine.pluginlib.config import ConfigPropertyDefinition
26
- from databao_context_engine.project.info import DceInfo, DceProjectInfo, get_databao_context_engine_info
26
+ from databao_context_engine.project.info import (
27
+ DceInfo,
28
+ DceProjectInfo,
29
+ get_databao_context_engine_info,
30
+ get_databao_context_engine_project_info,
31
+ )
27
32
  from databao_context_engine.project.init_project import InitErrorReason, InitProjectError
28
33
  from databao_context_engine.services.chunk_embedding_service import ChunkEmbeddingMode
29
34
 
@@ -41,6 +46,7 @@ __all__ = [
41
46
  "DatasourceConfigFile",
42
47
  "DatasourceType",
43
48
  "get_databao_context_engine_info",
49
+ "get_databao_context_engine_project_info",
44
50
  "DceInfo",
45
51
  "DceProjectInfo",
46
52
  "init_dce_project",
@@ -4,18 +4,21 @@ from pathlib import Path
4
4
 
5
5
  import click
6
6
 
7
- from databao_context_engine import DceInfo, get_databao_context_engine_info
7
+ from databao_context_engine import DceInfo, DceProjectInfo, get_databao_context_engine_info
8
+ from databao_context_engine.project.info import get_databao_context_engine_project_info
8
9
 
9
10
 
10
11
  def echo_info(project_dir: Path) -> None:
11
- click.echo(_generate_info_string(get_databao_context_engine_info(project_dir=project_dir)))
12
+ dce_info = get_databao_context_engine_info()
13
+ dce_project_info = get_databao_context_engine_project_info(project_dir=project_dir)
14
+ click.echo(_generate_info_string(dce_info, dce_project_info))
12
15
 
13
16
 
14
- def _generate_info_string(command_info: DceInfo) -> str:
17
+ def _generate_info_string(dce_info: DceInfo, project_info: DceProjectInfo) -> str:
15
18
  info_lines = []
16
- info_lines.append(f"Databao context engine version: {command_info.version}")
17
- info_lines.append(f"Databao context engine storage dir: {command_info.dce_path}")
18
- info_lines.append(f"Databao context engine plugins: {command_info.plugin_ids}")
19
+ info_lines.append(f"Databao context engine version: {dce_info.version}")
20
+ info_lines.append(f"Databao context engine storage dir: {dce_info.dce_path}")
21
+ info_lines.append(f"Databao context engine plugins: {dce_info.plugin_ids}")
19
22
 
20
23
  info_lines.append("")
21
24
 
@@ -24,10 +27,10 @@ def _generate_info_string(command_info: DceInfo) -> str:
24
27
 
25
28
  info_lines.append("")
26
29
 
27
- if command_info.project_info.is_initialized:
28
- info_lines.append(f"Project dir: {command_info.project_info.project_path.resolve()}")
29
- info_lines.append(f"Project ID: {str(command_info.project_info.project_id)}")
30
+ if project_info.is_initialized:
31
+ info_lines.append(f"Project dir: {project_info.project_path.resolve()}")
32
+ info_lines.append(f"Project ID: {str(project_info.project_id)}")
30
33
  else:
31
- info_lines.append(f"Project not initialized at {command_info.project_info.project_path.resolve()}")
34
+ info_lines.append(f"Project not initialized at {project_info.project_path.resolve()}")
32
35
 
33
36
  return os.linesep.join(info_lines)
File without changes
@@ -0,0 +1,47 @@
1
+ from dataclasses import dataclass
2
+
3
+ from databao_context_engine.pluginlib.build_plugin import EmbeddableChunk
4
+ from databao_context_engine.plugins.dbt.types import DbtColumn, DbtContext, DbtModel
5
+
6
+
7
+ @dataclass
8
+ class DbtColumnChunkContent:
9
+ database_name: str
10
+ schema_name: str
11
+ model_name: str
12
+ column: DbtColumn
13
+
14
+
15
+ def build_dbt_chunks(context: DbtContext) -> list[EmbeddableChunk]:
16
+ chunks = []
17
+
18
+ for model in context.models:
19
+ chunks.append(_create_model_chunk(model))
20
+
21
+ for column in model.columns:
22
+ chunks.append(_create_column_chunk(model, column))
23
+
24
+ return chunks
25
+
26
+
27
+ def _create_model_chunk(model: DbtModel) -> EmbeddableChunk:
28
+ return EmbeddableChunk(embeddable_text=_build_model_chunk_text(model), content=model)
29
+
30
+
31
+ def _build_model_chunk_text(model: DbtModel) -> str:
32
+ # TODO: Use description and potentially other infos?
33
+ return f"Model {model.name} in database {model.database} and schema {model.schema}, with unique id {model.id}"
34
+
35
+
36
+ def _create_column_chunk(model: DbtModel, column: DbtColumn) -> EmbeddableChunk:
37
+ return EmbeddableChunk(
38
+ embeddable_text=_build_column_chunk_text(model, column),
39
+ content=DbtColumnChunkContent(
40
+ database_name=model.database, schema_name=model.schema, model_name=model.name, column=column
41
+ ),
42
+ )
43
+
44
+
45
+ def _build_column_chunk_text(model: DbtModel, column: DbtColumn) -> str:
46
+ # TODO: Use description and potentially other infos?
47
+ return f"Column {column.name} in model {model.id}"
@@ -0,0 +1,212 @@
1
+ import re
2
+ from collections import defaultdict
3
+ from pathlib import Path
4
+ from typing import Any
5
+
6
+ from databao_context_engine.plugins.dbt.types import (
7
+ DbtAcceptedValuesConstraint,
8
+ DbtColumn,
9
+ DbtConfigFile,
10
+ DbtConstraint,
11
+ DbtContext,
12
+ DbtMaterialization,
13
+ DbtModel,
14
+ DbtRelationshipConstraint,
15
+ DbtSimpleConstraint,
16
+ )
17
+ from databao_context_engine.plugins.dbt.types_artifacts import (
18
+ DbtArtifacts,
19
+ DbtCatalog,
20
+ DbtCatalogColumn,
21
+ DbtCatalogNode,
22
+ DbtManifest,
23
+ DbtManifestColumn,
24
+ DbtManifestModel,
25
+ DbtManifestTest,
26
+ )
27
+
28
+
29
+ def check_connection(config_file: DbtConfigFile) -> None:
30
+ _read_dbt_artifacts(config_file.dbt_target_folder_path.expanduser())
31
+
32
+
33
+ def extract_context(config_file: DbtConfigFile) -> DbtContext:
34
+ artifacts = _read_dbt_artifacts(config_file.dbt_target_folder_path.expanduser())
35
+
36
+ return _extract_context_from_artifacts(artifacts)
37
+
38
+
39
+ def _read_dbt_artifacts(dbt_target_folder_path: Path) -> DbtArtifacts:
40
+ if not dbt_target_folder_path.is_dir():
41
+ raise ValueError(f'Invalid "dbt_target_folder_path": not a directory ({dbt_target_folder_path})')
42
+
43
+ # TODO: Check the manifest schema version?
44
+ manifest_file = dbt_target_folder_path.joinpath("manifest.json")
45
+ if not manifest_file.is_file():
46
+ raise ValueError(f'Invalid "dbt_target_folder_path": missing manifest.json file ({manifest_file})')
47
+
48
+ manifest = DbtManifest.model_validate_json(manifest_file.read_text())
49
+
50
+ catalog_file = dbt_target_folder_path.joinpath("catalog.json")
51
+ catalog = DbtCatalog.model_validate_json(catalog_file.read_text()) if catalog_file.is_file() else None
52
+
53
+ return DbtArtifacts(manifest=manifest, catalog=catalog)
54
+
55
+
56
+ def _extract_context_from_artifacts(artifacts: DbtArtifacts) -> DbtContext:
57
+ manifest_models = [
58
+ manifest_node
59
+ for manifest_node in artifacts.manifest.nodes.values()
60
+ if isinstance(manifest_node, DbtManifestModel)
61
+ ]
62
+
63
+ manifest_tests_by_model_and_column = _get_manifest_tests(artifacts.manifest)
64
+
65
+ catalog_nodes = artifacts.catalog.nodes if artifacts.catalog else {}
66
+
67
+ # TODO: Extract the stages? Or at least the "highest-level" models (= marts?)
68
+ # TODO: Organize the models by schemas? Or by stages?
69
+ return DbtContext(
70
+ models=[
71
+ _manifest_model_to_dbt_model(
72
+ manifest_model,
73
+ catalog_nodes.get(manifest_model.unique_id, None),
74
+ manifest_tests_by_model_and_column.get(manifest_model.unique_id, {}),
75
+ )
76
+ for manifest_model in manifest_models
77
+ ],
78
+ )
79
+
80
+
81
+ def _get_manifest_tests(manifest: DbtManifest) -> dict[Any, dict[Any, list]]:
82
+ """Extract all tests nodes in the manifest and groups them by model and column."""
83
+ manifest_tests_by_model_and_column: dict[str, dict[str, list[DbtManifestTest]]] = defaultdict(
84
+ lambda: defaultdict(list)
85
+ )
86
+ for manifest_node in manifest.nodes.values():
87
+ if isinstance(manifest_node, DbtManifestTest) and manifest_node.attached_node and manifest_node.column_name:
88
+ manifest_tests_by_model_and_column[manifest_node.attached_node][manifest_node.column_name].append(
89
+ manifest_node
90
+ )
91
+ return manifest_tests_by_model_and_column
92
+
93
+
94
+ def _manifest_model_to_dbt_model(
95
+ manifest_model: DbtManifestModel,
96
+ catalog_node: DbtCatalogNode | None,
97
+ test_nodes_by_column_name: dict[str, list[DbtManifestTest]],
98
+ ) -> DbtModel:
99
+ catalog_columns = catalog_node.columns if catalog_node else {}
100
+
101
+ return DbtModel(
102
+ id=manifest_model.unique_id,
103
+ name=manifest_model.name,
104
+ database=manifest_model.database,
105
+ schema=manifest_model.schema_,
106
+ description=manifest_model.description,
107
+ columns=[
108
+ _manifest_column_to_dbt_column(
109
+ manifest_column,
110
+ catalog_columns.get(manifest_column.name),
111
+ test_nodes_by_column_name.get(manifest_column.name, []),
112
+ )
113
+ for manifest_column in manifest_model.columns.values()
114
+ ],
115
+ materialization=_manifest_materialization_to_dbt_materializaton(
116
+ manifest_model.config.materialized if manifest_model.config else None
117
+ ),
118
+ primary_key=manifest_model.primary_key,
119
+ depends_on_nodes=manifest_model.depends_on.get("nodes", []) if manifest_model.depends_on else [],
120
+ )
121
+
122
+
123
+ def _manifest_column_to_dbt_column(
124
+ manifest_column: DbtManifestColumn, catalog_column: DbtCatalogColumn | None, test_nodes: list[DbtManifestTest]
125
+ ) -> DbtColumn:
126
+ constraints = _manifest_test_to_dbt_constraint(test_nodes)
127
+
128
+ return DbtColumn(
129
+ name=manifest_column.name,
130
+ description=manifest_column.description,
131
+ type=catalog_column.type if catalog_column else manifest_column.data_type,
132
+ constraints=constraints,
133
+ )
134
+
135
+
136
+ def _manifest_test_to_dbt_constraint(test_nodes: list[DbtManifestTest]) -> list[DbtConstraint]:
137
+ result: list[DbtConstraint] = []
138
+
139
+ for test_node in test_nodes:
140
+ is_enforced = test_node.config.severity == "ERROR" if test_node.config else False
141
+
142
+ if test_node.test_metadata is None:
143
+ continue
144
+
145
+ match test_node.test_metadata.name:
146
+ case "not_null":
147
+ result.append(
148
+ DbtSimpleConstraint(type="not_null", is_enforced=is_enforced, description=test_node.description)
149
+ )
150
+ case "unique":
151
+ result.append(
152
+ DbtSimpleConstraint(type="unique", is_enforced=is_enforced, description=test_node.description)
153
+ )
154
+ case "accepted_values":
155
+ if test_node.test_metadata.kwargs is None:
156
+ continue
157
+
158
+ accepted_values = test_node.test_metadata.kwargs.get("values", None)
159
+ if accepted_values is None:
160
+ continue
161
+ result.append(
162
+ DbtAcceptedValuesConstraint(
163
+ type="accepted_values",
164
+ is_enforced=is_enforced,
165
+ description=test_node.description,
166
+ accepted_values=accepted_values,
167
+ )
168
+ )
169
+ case "relationships":
170
+ if test_node.test_metadata.kwargs is None:
171
+ continue
172
+
173
+ target_model = _extract_ref_model(test_node.test_metadata.kwargs.get("to", None))
174
+ if target_model is None:
175
+ continue
176
+ target_column = test_node.test_metadata.kwargs.get("field", None)
177
+ if target_column is None:
178
+ continue
179
+ result.append(
180
+ DbtRelationshipConstraint(
181
+ type="relationships",
182
+ is_enforced=is_enforced,
183
+ description=test_node.description,
184
+ target_model=target_model,
185
+ target_column=target_column,
186
+ )
187
+ )
188
+ case _:
189
+ continue
190
+
191
+ return result
192
+
193
+
194
+ def _extract_ref_model(target_model_with_ref: str | None) -> str | None:
195
+ if target_model_with_ref is None:
196
+ return None
197
+
198
+ match = re.fullmatch(r"ref\(['\"]([\w.]+)['\"]\)", target_model_with_ref)
199
+ if match:
200
+ return match.group(1)
201
+
202
+ return None
203
+
204
+
205
+ def _manifest_materialization_to_dbt_materializaton(materialized: str | None) -> DbtMaterialization | None:
206
+ if materialized is None:
207
+ return None
208
+
209
+ try:
210
+ return DbtMaterialization(materialized)
211
+ except ValueError:
212
+ return None
@@ -0,0 +1,25 @@
1
+ from typing import Any
2
+
3
+ from databao_context_engine import BuildDatasourcePlugin
4
+ from databao_context_engine.pluginlib.build_plugin import EmbeddableChunk
5
+ from databao_context_engine.plugins.dbt.dbt_chunker import build_dbt_chunks
6
+ from databao_context_engine.plugins.dbt.dbt_context_extractor import check_connection, extract_context
7
+ from databao_context_engine.plugins.dbt.types import DbtConfigFile
8
+
9
+
10
+ class DbtPlugin(BuildDatasourcePlugin[DbtConfigFile]):
11
+ id = "jetbrains/dbt"
12
+ name = "Dbt Plugin"
13
+ config_file_type = DbtConfigFile
14
+
15
+ def supported_types(self) -> set[str]:
16
+ return {"dbt"}
17
+
18
+ def build_context(self, full_type: str, datasource_name: str, file_config: DbtConfigFile) -> Any:
19
+ return extract_context(file_config)
20
+
21
+ def check_connection(self, full_type: str, datasource_name: str, file_config: DbtConfigFile) -> None:
22
+ check_connection(file_config)
23
+
24
+ def divide_context_into_chunks(self, context: Any) -> list[EmbeddableChunk]:
25
+ return build_dbt_chunks(context)
@@ -0,0 +1,73 @@
1
+ from dataclasses import dataclass
2
+ from enum import Enum
3
+ from pathlib import Path
4
+ from typing import Literal
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class DbtConfigFile(BaseModel):
10
+ name: str | None = Field(default=None)
11
+ type: str = Field(default="dbt")
12
+ dbt_target_folder_path: Path
13
+
14
+
15
+ class DbtMaterialization(str, Enum):
16
+ TABLE = "table"
17
+ VIEW = "view"
18
+
19
+ def __str__(self):
20
+ return self.value
21
+
22
+
23
+ @dataclass(kw_only=True)
24
+ class DbtSimpleConstraint:
25
+ type: Literal["unique", "not_null"]
26
+ is_enforced: bool
27
+ description: str | None = None
28
+
29
+
30
+ @dataclass(kw_only=True)
31
+ class DbtAcceptedValuesConstraint:
32
+ type: Literal["accepted_values"]
33
+ is_enforced: bool
34
+ description: str | None = None
35
+ accepted_values: list[str]
36
+
37
+
38
+ @dataclass(kw_only=True)
39
+ class DbtRelationshipConstraint:
40
+ type: Literal["relationships"]
41
+ is_enforced: bool
42
+ description: str | None = None
43
+ target_model: str
44
+ target_column: str
45
+
46
+
47
+ DbtConstraint = DbtSimpleConstraint | DbtAcceptedValuesConstraint | DbtRelationshipConstraint
48
+
49
+
50
+ @dataclass(kw_only=True)
51
+ class DbtColumn:
52
+ name: str
53
+ type: str | None = None
54
+ description: str | None = None
55
+ constraints: list[DbtConstraint] | None = None
56
+
57
+
58
+ @dataclass(kw_only=True)
59
+ class DbtModel:
60
+ id: str
61
+ name: str
62
+ database: str
63
+ schema: str
64
+ columns: list[DbtColumn]
65
+ description: str | None = None
66
+ materialization: DbtMaterialization | None = None
67
+ primary_key: list[str] | None = None
68
+ depends_on_nodes: list[str]
69
+
70
+
71
+ @dataclass(kw_only=True)
72
+ class DbtContext:
73
+ models: list[DbtModel]
@@ -0,0 +1,77 @@
1
+ from dataclasses import dataclass
2
+ from typing import Annotated, Any, Literal
3
+
4
+ from pydantic import BaseModel, Discriminator, Field
5
+
6
+
7
+ class DbtManifestModelConfig(BaseModel):
8
+ materialized: str
9
+
10
+
11
+ class DbtManifestColumn(BaseModel):
12
+ name: str
13
+ description: str | None = None
14
+ data_type: str | None = None
15
+
16
+
17
+ class DbtManifestModel(BaseModel):
18
+ resource_type: Literal["model"]
19
+ unique_id: str
20
+ name: str
21
+ database: str
22
+ schema_: str = Field(alias="schema")
23
+ description: str | None = None
24
+ config: DbtManifestModelConfig | None = None
25
+ columns: dict[str, DbtManifestColumn]
26
+ depends_on: dict[str, list[str]] | None = None
27
+ primary_key: list[str] | None = None
28
+
29
+
30
+ class DbtManifestTestConfig(BaseModel):
31
+ severity: str
32
+
33
+
34
+ class DbtManifestTestMetadata(BaseModel):
35
+ name: str | None = None
36
+ kwargs: dict[str, Any] | None = None
37
+
38
+
39
+ class DbtManifestTest(BaseModel):
40
+ resource_type: Literal["test"]
41
+ unique_id: str
42
+ attached_node: str | None = None
43
+ column_name: str | None = None
44
+ description: str | None = None
45
+ test_metadata: DbtManifestTestMetadata | None = None
46
+ config: DbtManifestTestConfig | None = None
47
+
48
+
49
+ class DbtManifestOtherNode(BaseModel):
50
+ resource_type: Literal["seed", "analysis", "operation", "sql_operation", "snapshot"]
51
+
52
+
53
+ DbtManifestNode = Annotated[DbtManifestModel | DbtManifestTest | DbtManifestOtherNode, Discriminator("resource_type")]
54
+
55
+
56
+ class DbtManifest(BaseModel):
57
+ nodes: dict[str, DbtManifestNode]
58
+
59
+
60
+ class DbtCatalogColumn(BaseModel):
61
+ name: str
62
+ type: str
63
+
64
+
65
+ class DbtCatalogNode(BaseModel):
66
+ unique_id: str | None = None
67
+ columns: dict[str, DbtCatalogColumn]
68
+
69
+
70
+ class DbtCatalog(BaseModel):
71
+ nodes: dict[str, DbtCatalogNode]
72
+
73
+
74
+ @dataclass(kw_only=True)
75
+ class DbtArtifacts:
76
+ manifest: DbtManifest
77
+ catalog: DbtCatalog | None
@@ -45,6 +45,7 @@ def _load_builtin_datasource_plugins() -> list[BuildDatasourcePlugin]:
45
45
  """Statically register built-in plugins."""
46
46
  from databao_context_engine.plugins.databases.duckdb.duckdb_db_plugin import DuckDbPlugin
47
47
  from databao_context_engine.plugins.databases.sqlite.sqlite_db_plugin import SQLiteDbPlugin
48
+ from databao_context_engine.plugins.dbt.dbt_plugin import DbtPlugin
48
49
  from databao_context_engine.plugins.resources.parquet_plugin import ParquetPlugin
49
50
 
50
51
  # optional plugins are added to the python environment via extras
@@ -91,7 +92,7 @@ def _load_builtin_datasource_plugins() -> list[BuildDatasourcePlugin]:
91
92
  except ImportError:
92
93
  pass
93
94
 
94
- required_plugins: list[BuildDatasourcePlugin] = [DuckDbPlugin(), ParquetPlugin(), SQLiteDbPlugin()]
95
+ required_plugins: list[BuildDatasourcePlugin] = [DuckDbPlugin(), ParquetPlugin(), SQLiteDbPlugin(), DbtPlugin()]
95
96
  return required_plugins + optional_plugins
96
97
 
97
98
 
@@ -30,33 +30,38 @@ class DceInfo:
30
30
  Attributes:
31
31
  version: The version of the databao_context_engine package installed on the system.
32
32
  dce_path: The path where databao_context_engine stores its global data.
33
- project_info: Information about the Databao Context Engine project.
34
33
  """
35
34
 
36
35
  version: str
37
36
  dce_path: Path
38
37
  plugin_ids: list[str]
39
38
 
40
- project_info: DceProjectInfo
41
39
 
42
-
43
- def get_databao_context_engine_info(project_dir: Path) -> DceInfo:
40
+ def get_databao_context_engine_info() -> DceInfo:
44
41
  """Return information about the current Databao Context Engine installation and project.
45
42
 
46
- Args:
47
- project_dir: The root directory of the Databao Context Project.
48
-
49
43
  Returns:
50
- A DceInfo instance containing information about the Databao Context Engine installation and project.
44
+ A DceInfo instance containing information about the Databao Context Engine installation.
51
45
  """
52
46
  return DceInfo(
53
47
  version=get_dce_version(),
54
48
  dce_path=get_dce_path(),
55
49
  plugin_ids=[plugin.id for plugin in load_plugins().values()],
56
- project_info=_get_project_info(project_dir),
57
50
  )
58
51
 
59
52
 
53
+ def get_databao_context_engine_project_info(project_dir: Path) -> DceProjectInfo:
54
+ """Return information about the current Databao Context Engine project.
55
+
56
+ Args:
57
+ project_dir: The root directory of the Databao Context Project.
58
+
59
+ Returns:
60
+ A DceProjectInfo instance containing information about the Databao Context Engine project.
61
+ """
62
+ return _get_project_info(project_dir)
63
+
64
+
60
65
  def _get_project_info(project_dir: Path) -> DceProjectInfo:
61
66
  project_layout = validate_project_dir(project_dir)
62
67
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: databao-context-engine
3
- Version: 0.1.5
3
+ Version: 0.1.7
4
4
  Summary: Semantic context for your LLMs — generated automatically
5
5
  Requires-Dist: click>=8.3.0
6
6
  Requires-Dist: duckdb>=1.4.3
@@ -1,4 +1,4 @@
1
- databao_context_engine/__init__.py,sha256=sPhGoLZhsFvf1n-WLt9gFUL1IZegCQJPkOZrcrJYn2c,2239
1
+ databao_context_engine/__init__.py,sha256=j7vQ0tiaGGwTiy9i4PGAhYaV9NC6uHHb3URbJx3GJ8w,2348
2
2
  databao_context_engine/build_sources/__init__.py,sha256=FteGp3MvSuX_fh-Fx1pq-jOjFcjYKQSXFSll4tQffvk,224
3
3
  databao_context_engine/build_sources/build_runner.py,sha256=aSxp99R4tbnbHlEDFrg8iw4Bi1dGvO_5uTO-mIrB080,3986
4
4
  databao_context_engine/build_sources/build_service.py,sha256=eywJzpvZUVrj-JYxXii_kxhTBzVUT0xfbNtdAFcpGWQ,1624
@@ -9,7 +9,7 @@ databao_context_engine/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
9
9
  databao_context_engine/cli/add_datasource_config.py,sha256=fK1MIaTCoz1jurldJZD_BpPIgc6kr-NaAyVjVgjsOTU,5523
10
10
  databao_context_engine/cli/commands.py,sha256=VJOHB3H28wNjOUuFC8hhF8-rnlIFjsZMlNT3C2ZbIUY,7807
11
11
  databao_context_engine/cli/datasources.py,sha256=kHbXhEnDVaYXTRAE3WeaDGohH1Y9cwyYjjcycQ8eh1U,2376
12
- databao_context_engine/cli/info.py,sha256=2iegfvRAxMae3KkWMDu-BOnljeJMVQ5u8P5k_8nOKpc,1203
12
+ databao_context_engine/cli/info.py,sha256=ziduzb1IzH5rMklDsxk4ZREMIluPJ7qoo_iwrfnz0hY,1376
13
13
  databao_context_engine/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  databao_context_engine/config/log_config.yaml,sha256=hH2NPumufcyig8L-7Z_DbLQ88_G2N6CAEl5fvHafeAw,360
15
15
  databao_context_engine/config/logging.py,sha256=66k7x3ftEdHx-CKqbOss4pqZfGn4nMFv7AzVPs9aVnY,1525
@@ -82,16 +82,22 @@ databao_context_engine/plugins/databases/snowflake/snowflake_introspector.py,sha
82
82
  databao_context_engine/plugins/databases/sqlite/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
83
  databao_context_engine/plugins/databases/sqlite/sqlite_db_plugin.py,sha256=MI896G7Yq8NcQ8sTWErAFD7YK8qfDpZZprxoszJ46l8,460
84
84
  databao_context_engine/plugins/databases/sqlite/sqlite_introspector.py,sha256=kKFNzclp1NmQ6BF3ylGn86R5PuQh6aqevj6E7_zAKmQ,8361
85
+ databao_context_engine/plugins/dbt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
+ databao_context_engine/plugins/dbt/dbt_chunker.py,sha256=5OQo0Y9ouelZV8KQBA0Kqksx72wRhTdRztUOSCKwLZc,1516
87
+ databao_context_engine/plugins/dbt/dbt_context_extractor.py,sha256=fbX2EUiMV_5yvtfWrQaEvfepgqgssXCuLrvOCmizyNc,7653
88
+ databao_context_engine/plugins/dbt/dbt_plugin.py,sha256=-oAVh4u9YZ7j1b6w2K2lwcZT_bOdkN-lL1RRBWgB20k,1026
89
+ databao_context_engine/plugins/dbt/types.py,sha256=S7bgZT3tDGLX7so_hlrU5Qs3R9mnpy-n_BUEQt8YfFc,1590
90
+ databao_context_engine/plugins/dbt/types_artifacts.py,sha256=umESx3Pm1QxbVPPJX1jbj12bfmZOsEqfNb7O0MAvR1w,1841
85
91
  databao_context_engine/plugins/duckdb_tools.py,sha256=46rctnTxDPAhHtaiTp1DxMuuDuRKrtKWJFSSM2w7uUU,645
86
92
  databao_context_engine/plugins/files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
93
  databao_context_engine/plugins/files/unstructured_files_plugin.py,sha256=eqs1anQhYBZh7xu4CwhfkqXQjGE5gJnKEwyJbtUR78E,2384
88
- databao_context_engine/plugins/plugin_loader.py,sha256=8j7JAKqtG6_VjX3GbfAD6kjrWuuJ7NnC2nnHPEujux8,4074
94
+ databao_context_engine/plugins/plugin_loader.py,sha256=x5cZ8pUwrEYbadqlPddZvBzU2BpdyBWYI4KlEtffFUY,4159
89
95
  databao_context_engine/plugins/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
96
  databao_context_engine/plugins/resources/parquet_chunker.py,sha256=R9WCOBqpKRTVN6t5eeOm_mmnKBOxvjIiQ9zTc8vnUb4,848
91
97
  databao_context_engine/plugins/resources/parquet_introspector.py,sha256=Cn_yh6E-dOTOZstlavEGAsV6ZRKZXJraVAl_pzJJuGs,5629
92
98
  databao_context_engine/plugins/resources/parquet_plugin.py,sha256=FVRdAqhZkEBvUsW1CkYH4yPPs3P1pRsofR8PdHN26AE,1128
93
99
  databao_context_engine/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
- databao_context_engine/project/info.py,sha256=3chVSZ4pV2EsYJSeVfOYTK746POlJImciIBOvrQuYbc,2479
100
+ databao_context_engine/project/info.py,sha256=q7NwMs2E11ZUEIWFLOqm0f6-7ViuU920SPM7a7DgEVU,2610
95
101
  databao_context_engine/project/init_project.py,sha256=QiLalH--BMQGB-c2WBbPAUKBinDbO0cJkmilUfqPAuI,3970
96
102
  databao_context_engine/project/layout.py,sha256=3ttCJDLMh4AS1tBRcSROgT7hG6uOqkI1QGsQEcfGsqg,4087
97
103
  databao_context_engine/project/project_config.py,sha256=rI-Wkll7lca7RlYIaFScs5CIKIZ8uujtKRxSjibGIt8,1132
@@ -129,7 +135,7 @@ databao_context_engine/system/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
129
135
  databao_context_engine/system/properties.py,sha256=mQ7-_PZeYSESYn1cMUQ0IK7rJEnbhc7t4WesFjAgo-Q,429
130
136
  databao_context_engine/templating/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
137
  databao_context_engine/templating/renderer.py,sha256=W2-0IGStAp6oxANmsKs_Z-UoIR6Gt_c4ILYFa3Hruo4,662
132
- databao_context_engine-0.1.5.dist-info/WHEEL,sha256=5w2T7AS2mz1-rW9CNagNYWRCaB0iQqBMYLwKdlgiR4Q,78
133
- databao_context_engine-0.1.5.dist-info/entry_points.txt,sha256=5EeQJ1W8zEFh4HuF1bs2zBeoP408oiwuM9UrkJiurgI,138
134
- databao_context_engine-0.1.5.dist-info/METADATA,sha256=HfJBADmvbXEEK710S6zzybfWl-mqnDXfm_18LIgh7kk,7773
135
- databao_context_engine-0.1.5.dist-info/RECORD,,
138
+ databao_context_engine-0.1.7.dist-info/WHEEL,sha256=5w2T7AS2mz1-rW9CNagNYWRCaB0iQqBMYLwKdlgiR4Q,78
139
+ databao_context_engine-0.1.7.dist-info/entry_points.txt,sha256=5EeQJ1W8zEFh4HuF1bs2zBeoP408oiwuM9UrkJiurgI,138
140
+ databao_context_engine-0.1.7.dist-info/METADATA,sha256=REehDNFCn_yEYfgeo0UH_k2W9eVZPcbiIe2xY6IxzUY,7773
141
+ databao_context_engine-0.1.7.dist-info/RECORD,,