altimate-code 0.5.2 → 0.5.3
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.
- package/CHANGELOG.md +12 -0
- package/bin/altimate +6 -0
- package/bin/altimate-code +6 -0
- package/dbt-tools/bin/altimate-dbt +2 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/altimate/__init__.py +0 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/altimate/fetch_schema.py +35 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/altimate/utils.py +353 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/altimate/validate_sql.py +114 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/__init__.py +178 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/__main__.py +96 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/_typing.py +17 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dataframe/__init__.py +3 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dataframe/sql/__init__.py +18 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dataframe/sql/_typing.py +18 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dataframe/sql/column.py +332 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dataframe/sql/dataframe.py +866 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dataframe/sql/functions.py +1267 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dataframe/sql/group.py +59 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dataframe/sql/normalize.py +78 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dataframe/sql/operations.py +53 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dataframe/sql/readwriter.py +108 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dataframe/sql/session.py +190 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dataframe/sql/transforms.py +9 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dataframe/sql/types.py +212 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dataframe/sql/util.py +32 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dataframe/sql/window.py +134 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/__init__.py +118 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/athena.py +166 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/bigquery.py +1331 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/clickhouse.py +1393 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/databricks.py +131 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/dialect.py +1915 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/doris.py +561 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/drill.py +157 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/druid.py +20 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/duckdb.py +1159 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/dune.py +16 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/hive.py +787 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/materialize.py +94 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/mysql.py +1324 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/oracle.py +378 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/postgres.py +778 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/presto.py +788 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/prql.py +203 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/redshift.py +448 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/risingwave.py +78 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/snowflake.py +1464 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/spark.py +202 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/spark2.py +349 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/sqlite.py +320 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/starrocks.py +343 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/tableau.py +61 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/teradata.py +356 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/trino.py +115 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/dialects/tsql.py +1403 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/diff.py +456 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/errors.py +93 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/executor/__init__.py +95 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/executor/context.py +101 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/executor/env.py +246 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/executor/python.py +460 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/executor/table.py +155 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/expressions.py +8870 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/generator.py +4993 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/helper.py +582 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/jsonpath.py +227 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/lineage.py +423 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/__init__.py +11 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/annotate_types.py +589 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/canonicalize.py +222 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/eliminate_ctes.py +43 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/eliminate_joins.py +181 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/eliminate_subqueries.py +189 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/isolate_table_selects.py +50 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/merge_subqueries.py +415 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/normalize.py +200 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/normalize_identifiers.py +64 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/optimize_joins.py +91 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/optimizer.py +94 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/pushdown_predicates.py +222 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/pushdown_projections.py +172 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/qualify.py +104 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/qualify_columns.py +1024 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/qualify_tables.py +155 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/scope.py +904 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/simplify.py +1587 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/optimizer/unnest_subqueries.py +302 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/parser.py +8501 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/planner.py +463 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/schema.py +588 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/serde.py +68 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/time.py +687 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/tokens.py +1520 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/transforms.py +1020 -0
- package/dbt-tools/dist/altimate_python_packages/altimate_packages/sqlglot/trie.py +81 -0
- package/dbt-tools/dist/altimate_python_packages/dbt_core_integration.py +825 -0
- package/dbt-tools/dist/altimate_python_packages/dbt_utils.py +157 -0
- package/dbt-tools/dist/index.js +23859 -0
- package/package.json +13 -13
- package/postinstall.mjs +42 -0
- package/skills/altimate-setup/SKILL.md +31 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
import contextlib
|
|
4
|
+
from typing import (
|
|
5
|
+
Dict,
|
|
6
|
+
List,
|
|
7
|
+
Optional,
|
|
8
|
+
)
|
|
9
|
+
from decimal import Decimal
|
|
10
|
+
from collections.abc import Iterable
|
|
11
|
+
from datetime import date, datetime, time
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
import agate
|
|
15
|
+
HAS_AGATE = True
|
|
16
|
+
except ImportError:
|
|
17
|
+
HAS_AGATE = False
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def to_dict(obj, visited=None):
|
|
21
|
+
if visited is None:
|
|
22
|
+
visited = set()
|
|
23
|
+
|
|
24
|
+
# Check for circular references using object id
|
|
25
|
+
obj_id = id(obj)
|
|
26
|
+
if obj_id in visited:
|
|
27
|
+
return "<circular reference>"
|
|
28
|
+
|
|
29
|
+
if HAS_AGATE and isinstance(obj, agate.Table):
|
|
30
|
+
visited.add(obj_id)
|
|
31
|
+
result = {
|
|
32
|
+
"rows": [to_dict(row, visited) for row in obj.rows],
|
|
33
|
+
"column_names": obj.column_names,
|
|
34
|
+
"column_types": list(map(lambda x: x.__class__.__name__, obj.column_types)),
|
|
35
|
+
}
|
|
36
|
+
visited.remove(obj_id)
|
|
37
|
+
return result
|
|
38
|
+
if isinstance(obj, str):
|
|
39
|
+
return obj
|
|
40
|
+
if isinstance(obj, Decimal):
|
|
41
|
+
return float(obj)
|
|
42
|
+
if isinstance(obj, (datetime, date, time)):
|
|
43
|
+
return obj.isoformat()
|
|
44
|
+
elif isinstance(obj, dict):
|
|
45
|
+
visited.add(obj_id)
|
|
46
|
+
result = dict((key, to_dict(val, visited)) for key, val in obj.items())
|
|
47
|
+
visited.remove(obj_id)
|
|
48
|
+
return result
|
|
49
|
+
elif isinstance(obj, Iterable):
|
|
50
|
+
visited.add(obj_id)
|
|
51
|
+
result = [to_dict(val, visited) for val in obj]
|
|
52
|
+
visited.remove(obj_id)
|
|
53
|
+
return result
|
|
54
|
+
elif hasattr(obj, "__dict__"):
|
|
55
|
+
visited.add(obj_id)
|
|
56
|
+
result = to_dict(vars(obj), visited)
|
|
57
|
+
visited.remove(obj_id)
|
|
58
|
+
return result
|
|
59
|
+
elif hasattr(obj, "__slots__"):
|
|
60
|
+
visited.add(obj_id)
|
|
61
|
+
result = to_dict(
|
|
62
|
+
dict((name, getattr(obj, name)) for name in getattr(obj, "__slots__")), visited
|
|
63
|
+
)
|
|
64
|
+
visited.remove(obj_id)
|
|
65
|
+
return result
|
|
66
|
+
return obj
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@contextlib.contextmanager
|
|
70
|
+
def add_path(path):
|
|
71
|
+
sys.path.append(path)
|
|
72
|
+
try:
|
|
73
|
+
yield
|
|
74
|
+
finally:
|
|
75
|
+
sys.path.remove(path)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def validate_whether_sql_has_columns(sql: str, dialect: str):
|
|
79
|
+
try:
|
|
80
|
+
ALTIMATE_PACKAGE_PATH = os.path.join(
|
|
81
|
+
os.path.dirname(os.path.abspath(__file__)), "altimate_packages"
|
|
82
|
+
)
|
|
83
|
+
with add_path(ALTIMATE_PACKAGE_PATH):
|
|
84
|
+
from altimate.fetch_schema import validate_whether_sql_has_columns
|
|
85
|
+
|
|
86
|
+
return validate_whether_sql_has_columns(sql, dialect)
|
|
87
|
+
except Exception as e:
|
|
88
|
+
raise Exception(str(e))
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def validate_sql(
|
|
92
|
+
sql: str,
|
|
93
|
+
dialect: str,
|
|
94
|
+
models: List[Dict],
|
|
95
|
+
):
|
|
96
|
+
try:
|
|
97
|
+
ALTIMATE_PACKAGE_PATH = os.path.join(
|
|
98
|
+
os.path.dirname(os.path.abspath(__file__)), "altimate_packages"
|
|
99
|
+
)
|
|
100
|
+
with add_path(ALTIMATE_PACKAGE_PATH):
|
|
101
|
+
from altimate.validate_sql import validate_sql_from_models
|
|
102
|
+
|
|
103
|
+
return validate_sql_from_models(sql, dialect, models)
|
|
104
|
+
except Exception as e:
|
|
105
|
+
raise Exception(str(e))
|
|
106
|
+
|
|
107
|
+
def fetch_schema_from_sql(sql: str, dialect: str):
|
|
108
|
+
try:
|
|
109
|
+
ALTIMATE_PACKAGE_PATH = os.path.join(
|
|
110
|
+
os.path.dirname(os.path.abspath(__file__)), "altimate_packages"
|
|
111
|
+
)
|
|
112
|
+
with add_path(ALTIMATE_PACKAGE_PATH):
|
|
113
|
+
from altimate.fetch_schema import fetch_schema
|
|
114
|
+
|
|
115
|
+
return fetch_schema(sql, dialect)
|
|
116
|
+
except Exception as e:
|
|
117
|
+
raise Exception(str(e))
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def project_healthcheck(
|
|
121
|
+
manifest_path, catalog_path=None, config_path=None, config=None, token=None, tenant=None, backend_url: Optional[str] = None,
|
|
122
|
+
):
|
|
123
|
+
try:
|
|
124
|
+
import logging
|
|
125
|
+
import json
|
|
126
|
+
|
|
127
|
+
from datapilot.config.config import load_config
|
|
128
|
+
from datapilot.core.platforms.dbt.utils import load_catalog
|
|
129
|
+
from datapilot.core.platforms.dbt.utils import load_manifest
|
|
130
|
+
from datapilot.core.platforms.dbt.constants import MODEL
|
|
131
|
+
from datapilot.core.platforms.dbt.executor import DBTInsightGenerator
|
|
132
|
+
|
|
133
|
+
logging.basicConfig(level=logging.INFO)
|
|
134
|
+
manifest = load_manifest(manifest_path)
|
|
135
|
+
catalog = load_catalog(catalog_path) if catalog_path else None
|
|
136
|
+
if not config and config_path:
|
|
137
|
+
config = load_config(config_path)
|
|
138
|
+
insight_generator = DBTInsightGenerator(
|
|
139
|
+
manifest=manifest,
|
|
140
|
+
catalog=catalog,
|
|
141
|
+
config=config,
|
|
142
|
+
token=token,
|
|
143
|
+
instance_name=tenant,
|
|
144
|
+
backend_url=backend_url,
|
|
145
|
+
)
|
|
146
|
+
reports = insight_generator.run()
|
|
147
|
+
|
|
148
|
+
# package_insights = reports[PROJECT]
|
|
149
|
+
model_insights = {
|
|
150
|
+
k: [json.loads(item.json()) for item in v]
|
|
151
|
+
for k, v in reports[MODEL].items()
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return {"model_insights": model_insights}
|
|
155
|
+
|
|
156
|
+
except Exception as e:
|
|
157
|
+
raise Exception(str(e))
|