databao-context-engine 0.1.6__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)
@@ -1,11 +1,18 @@
1
+ import re
2
+ from collections import defaultdict
1
3
  from pathlib import Path
4
+ from typing import Any
2
5
 
3
6
  from databao_context_engine.plugins.dbt.types import (
7
+ DbtAcceptedValuesConstraint,
4
8
  DbtColumn,
5
9
  DbtConfigFile,
10
+ DbtConstraint,
6
11
  DbtContext,
7
12
  DbtMaterialization,
8
13
  DbtModel,
14
+ DbtRelationshipConstraint,
15
+ DbtSimpleConstraint,
9
16
  )
10
17
  from databao_context_engine.plugins.dbt.types_artifacts import (
11
18
  DbtArtifacts,
@@ -15,6 +22,7 @@ from databao_context_engine.plugins.dbt.types_artifacts import (
15
22
  DbtManifest,
16
23
  DbtManifestColumn,
17
24
  DbtManifestModel,
25
+ DbtManifestTest,
18
26
  )
19
27
 
20
28
 
@@ -47,25 +55,47 @@ def _read_dbt_artifacts(dbt_target_folder_path: Path) -> DbtArtifacts:
47
55
 
48
56
  def _extract_context_from_artifacts(artifacts: DbtArtifacts) -> DbtContext:
49
57
  manifest_models = [
50
- manifest_model
51
- for manifest_model in artifacts.manifest.nodes.values()
52
- if isinstance(manifest_model, DbtManifestModel)
58
+ manifest_node
59
+ for manifest_node in artifacts.manifest.nodes.values()
60
+ if isinstance(manifest_node, DbtManifestModel)
53
61
  ]
54
62
 
63
+ manifest_tests_by_model_and_column = _get_manifest_tests(artifacts.manifest)
64
+
55
65
  catalog_nodes = artifacts.catalog.nodes if artifacts.catalog else {}
56
66
 
57
67
  # TODO: Extract the stages? Or at least the "highest-level" models (= marts?)
58
- # TODO: Extract the constraints
59
68
  # TODO: Organize the models by schemas? Or by stages?
60
69
  return DbtContext(
61
70
  models=[
62
- _manifest_model_to_dbt_model(manifest_model, catalog_nodes.get(manifest_model.unique_id, None))
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
+ )
63
76
  for manifest_model in manifest_models
64
77
  ],
65
78
  )
66
79
 
67
80
 
68
- def _manifest_model_to_dbt_model(manifest_model: DbtManifestModel, catalog_node: DbtCatalogNode | None) -> DbtModel:
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:
69
99
  catalog_columns = catalog_node.columns if catalog_node else {}
70
100
 
71
101
  return DbtModel(
@@ -75,7 +105,11 @@ def _manifest_model_to_dbt_model(manifest_model: DbtManifestModel, catalog_node:
75
105
  schema=manifest_model.schema_,
76
106
  description=manifest_model.description,
77
107
  columns=[
78
- _manifest_column_to_dbt_column(manifest_column, catalog_columns.get(manifest_column.name))
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
+ )
79
113
  for manifest_column in manifest_model.columns.values()
80
114
  ],
81
115
  materialization=_manifest_materialization_to_dbt_materializaton(
@@ -87,15 +121,87 @@ def _manifest_model_to_dbt_model(manifest_model: DbtManifestModel, catalog_node:
87
121
 
88
122
 
89
123
  def _manifest_column_to_dbt_column(
90
- manifest_column: DbtManifestColumn, catalog_column: DbtCatalogColumn | None
124
+ manifest_column: DbtManifestColumn, catalog_column: DbtCatalogColumn | None, test_nodes: list[DbtManifestTest]
91
125
  ) -> DbtColumn:
126
+ constraints = _manifest_test_to_dbt_constraint(test_nodes)
127
+
92
128
  return DbtColumn(
93
129
  name=manifest_column.name,
94
130
  description=manifest_column.description,
95
131
  type=catalog_column.type if catalog_column else manifest_column.data_type,
132
+ constraints=constraints,
96
133
  )
97
134
 
98
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
+
99
205
  def _manifest_materialization_to_dbt_materializaton(materialized: str | None) -> DbtMaterialization | None:
100
206
  if materialized is None:
101
207
  return None
@@ -1,6 +1,7 @@
1
1
  from dataclasses import dataclass
2
2
  from enum import Enum
3
3
  from pathlib import Path
4
+ from typing import Literal
4
5
 
5
6
  from pydantic import BaseModel, Field
6
7
 
@@ -19,11 +20,39 @@ class DbtMaterialization(str, Enum):
19
20
  return self.value
20
21
 
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
+
22
50
  @dataclass(kw_only=True)
23
51
  class DbtColumn:
24
52
  name: str
25
53
  type: str | None = None
26
54
  description: str | None = None
55
+ constraints: list[DbtConstraint] | None = None
27
56
 
28
57
 
29
58
  @dataclass(kw_only=True)
@@ -1,10 +1,10 @@
1
1
  from dataclasses import dataclass
2
- from typing import Annotated, Literal
2
+ from typing import Annotated, Any, Literal
3
3
 
4
4
  from pydantic import BaseModel, Discriminator, Field
5
5
 
6
6
 
7
- class DbtManifestNodeConfig(BaseModel):
7
+ class DbtManifestModelConfig(BaseModel):
8
8
  materialized: str
9
9
 
10
10
 
@@ -21,17 +21,36 @@ class DbtManifestModel(BaseModel):
21
21
  database: str
22
22
  schema_: str = Field(alias="schema")
23
23
  description: str | None = None
24
- config: DbtManifestNodeConfig | None = None
24
+ config: DbtManifestModelConfig | None = None
25
25
  columns: dict[str, DbtManifestColumn]
26
26
  depends_on: dict[str, list[str]] | None = None
27
27
  primary_key: list[str] | None = None
28
28
 
29
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
+
30
49
  class DbtManifestOtherNode(BaseModel):
31
- resource_type: Literal["seed", "analysis", "test", "operation", "sql_operation", "snapshot"]
50
+ resource_type: Literal["seed", "analysis", "operation", "sql_operation", "snapshot"]
32
51
 
33
52
 
34
- DbtManifestNode = Annotated[DbtManifestModel | DbtManifestOtherNode, Discriminator("resource_type")]
53
+ DbtManifestNode = Annotated[DbtManifestModel | DbtManifestTest | DbtManifestOtherNode, Discriminator("resource_type")]
35
54
 
36
55
 
37
56
  class DbtManifest(BaseModel):
@@ -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.6
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
@@ -84,10 +84,10 @@ databao_context_engine/plugins/databases/sqlite/sqlite_db_plugin.py,sha256=MI896
84
84
  databao_context_engine/plugins/databases/sqlite/sqlite_introspector.py,sha256=kKFNzclp1NmQ6BF3ylGn86R5PuQh6aqevj6E7_zAKmQ,8361
85
85
  databao_context_engine/plugins/dbt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
86
  databao_context_engine/plugins/dbt/dbt_chunker.py,sha256=5OQo0Y9ouelZV8KQBA0Kqksx72wRhTdRztUOSCKwLZc,1516
87
- databao_context_engine/plugins/dbt/dbt_context_extractor.py,sha256=8ac2Fx5vv0t_AGqNbx9BXj73l9ZqjDK8r-VAAQukcP0,3748
87
+ databao_context_engine/plugins/dbt/dbt_context_extractor.py,sha256=fbX2EUiMV_5yvtfWrQaEvfepgqgssXCuLrvOCmizyNc,7653
88
88
  databao_context_engine/plugins/dbt/dbt_plugin.py,sha256=-oAVh4u9YZ7j1b6w2K2lwcZT_bOdkN-lL1RRBWgB20k,1026
89
- databao_context_engine/plugins/dbt/types.py,sha256=yJUVSZa5Ohhx6Znl_20gKwjvgxkBBcxlKrAFFV6tfgY,881
90
- databao_context_engine/plugins/dbt/types_artifacts.py,sha256=OC2_DL7srcniVqrj9uj5XxNV-7VcA974xqgU1Rzfd5A,1349
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
91
91
  databao_context_engine/plugins/duckdb_tools.py,sha256=46rctnTxDPAhHtaiTp1DxMuuDuRKrtKWJFSSM2w7uUU,645
92
92
  databao_context_engine/plugins/files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
93
  databao_context_engine/plugins/files/unstructured_files_plugin.py,sha256=eqs1anQhYBZh7xu4CwhfkqXQjGE5gJnKEwyJbtUR78E,2384
@@ -97,7 +97,7 @@ databao_context_engine/plugins/resources/parquet_chunker.py,sha256=R9WCOBqpKRTVN
97
97
  databao_context_engine/plugins/resources/parquet_introspector.py,sha256=Cn_yh6E-dOTOZstlavEGAsV6ZRKZXJraVAl_pzJJuGs,5629
98
98
  databao_context_engine/plugins/resources/parquet_plugin.py,sha256=FVRdAqhZkEBvUsW1CkYH4yPPs3P1pRsofR8PdHN26AE,1128
99
99
  databao_context_engine/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
- databao_context_engine/project/info.py,sha256=3chVSZ4pV2EsYJSeVfOYTK746POlJImciIBOvrQuYbc,2479
100
+ databao_context_engine/project/info.py,sha256=q7NwMs2E11ZUEIWFLOqm0f6-7ViuU920SPM7a7DgEVU,2610
101
101
  databao_context_engine/project/init_project.py,sha256=QiLalH--BMQGB-c2WBbPAUKBinDbO0cJkmilUfqPAuI,3970
102
102
  databao_context_engine/project/layout.py,sha256=3ttCJDLMh4AS1tBRcSROgT7hG6uOqkI1QGsQEcfGsqg,4087
103
103
  databao_context_engine/project/project_config.py,sha256=rI-Wkll7lca7RlYIaFScs5CIKIZ8uujtKRxSjibGIt8,1132
@@ -135,7 +135,7 @@ databao_context_engine/system/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
135
135
  databao_context_engine/system/properties.py,sha256=mQ7-_PZeYSESYn1cMUQ0IK7rJEnbhc7t4WesFjAgo-Q,429
136
136
  databao_context_engine/templating/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
137
  databao_context_engine/templating/renderer.py,sha256=W2-0IGStAp6oxANmsKs_Z-UoIR6Gt_c4ILYFa3Hruo4,662
138
- databao_context_engine-0.1.6.dist-info/WHEEL,sha256=5w2T7AS2mz1-rW9CNagNYWRCaB0iQqBMYLwKdlgiR4Q,78
139
- databao_context_engine-0.1.6.dist-info/entry_points.txt,sha256=5EeQJ1W8zEFh4HuF1bs2zBeoP408oiwuM9UrkJiurgI,138
140
- databao_context_engine-0.1.6.dist-info/METADATA,sha256=weN9iS4ZtRnnt3tTJY-epHUgNdpMo-dWD4E3F-8dXyk,7773
141
- databao_context_engine-0.1.6.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,,