sqlmesh 0.199.1.dev43__py3-none-any.whl → 0.199.1.dev45__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.
- sqlmesh/_version.py +2 -2
- sqlmesh/core/engine_adapter/athena.py +4 -0
- sqlmesh/core/engine_adapter/base.py +7 -2
- sqlmesh/core/linter/helpers.py +39 -0
- sqlmesh/core/linter/rules/builtin.py +16 -2
- {sqlmesh-0.199.1.dev43.dist-info → sqlmesh-0.199.1.dev45.dist-info}/METADATA +1 -1
- {sqlmesh-0.199.1.dev43.dist-info → sqlmesh-0.199.1.dev45.dist-info}/RECORD +11 -11
- {sqlmesh-0.199.1.dev43.dist-info → sqlmesh-0.199.1.dev45.dist-info}/WHEEL +0 -0
- {sqlmesh-0.199.1.dev43.dist-info → sqlmesh-0.199.1.dev45.dist-info}/entry_points.txt +0 -0
- {sqlmesh-0.199.1.dev43.dist-info → sqlmesh-0.199.1.dev45.dist-info}/licenses/LICENSE +0 -0
- {sqlmesh-0.199.1.dev43.dist-info → sqlmesh-0.199.1.dev45.dist-info}/top_level.txt +0 -0
sqlmesh/_version.py
CHANGED
|
@@ -17,5 +17,5 @@ __version__: str
|
|
|
17
17
|
__version_tuple__: VERSION_TUPLE
|
|
18
18
|
version_tuple: VERSION_TUPLE
|
|
19
19
|
|
|
20
|
-
__version__ = version = '0.199.1.
|
|
21
|
-
__version_tuple__ = version_tuple = (0, 199, 1, '
|
|
20
|
+
__version__ = version = '0.199.1.dev45'
|
|
21
|
+
__version_tuple__ = version_tuple = (0, 199, 1, 'dev45')
|
|
@@ -41,6 +41,10 @@ class AthenaEngineAdapter(PandasNativeFetchDFSupportMixin, RowDiffMixin):
|
|
|
41
41
|
COMMENT_CREATION_VIEW = CommentCreationView.UNSUPPORTED
|
|
42
42
|
SCHEMA_DIFFER = TrinoEngineAdapter.SCHEMA_DIFFER
|
|
43
43
|
MAX_TIMESTAMP_PRECISION = 3 # copied from Trino
|
|
44
|
+
# Athena does not deal with comments well, e.g:
|
|
45
|
+
# >>> self._execute('/* test */ DESCRIBE foo')
|
|
46
|
+
# pyathena.error.OperationalError: FAILED: ParseException line 1:0 cannot recognize input near '/' '*' 'test'
|
|
47
|
+
ATTACH_CORRELATION_ID = False
|
|
44
48
|
|
|
45
49
|
def __init__(
|
|
46
50
|
self, *args: t.Any, s3_warehouse_location: t.Optional[str] = None, **kwargs: t.Any
|
|
@@ -109,6 +109,7 @@ class EngineAdapter:
|
|
|
109
109
|
DEFAULT_CATALOG_TYPE = DIALECT
|
|
110
110
|
QUOTE_IDENTIFIERS_IN_VIEWS = True
|
|
111
111
|
MAX_IDENTIFIER_LENGTH: t.Optional[int] = None
|
|
112
|
+
ATTACH_CORRELATION_ID = True
|
|
112
113
|
|
|
113
114
|
def __init__(
|
|
114
115
|
self,
|
|
@@ -2219,8 +2220,7 @@ class EngineAdapter:
|
|
|
2219
2220
|
else:
|
|
2220
2221
|
sql = t.cast(str, e)
|
|
2221
2222
|
|
|
2222
|
-
|
|
2223
|
-
sql = f"/* {self.correlation_id} */ {sql}"
|
|
2223
|
+
sql = self._attach_correlation_id(sql)
|
|
2224
2224
|
|
|
2225
2225
|
self._log_sql(
|
|
2226
2226
|
sql,
|
|
@@ -2229,6 +2229,11 @@ class EngineAdapter:
|
|
|
2229
2229
|
)
|
|
2230
2230
|
self._execute(sql, **kwargs)
|
|
2231
2231
|
|
|
2232
|
+
def _attach_correlation_id(self, sql: str) -> str:
|
|
2233
|
+
if self.ATTACH_CORRELATION_ID and self.correlation_id:
|
|
2234
|
+
return f"/* {self.correlation_id} */ {sql}"
|
|
2235
|
+
return sql
|
|
2236
|
+
|
|
2232
2237
|
def _log_sql(
|
|
2233
2238
|
self,
|
|
2234
2239
|
sql: str,
|
sqlmesh/core/linter/helpers.py
CHANGED
|
@@ -2,6 +2,7 @@ from pathlib import Path
|
|
|
2
2
|
|
|
3
3
|
from sqlmesh.core.linter.rule import Position, Range
|
|
4
4
|
from sqlmesh.utils.pydantic import PydanticModel
|
|
5
|
+
from sqlglot import tokenize, TokenType
|
|
5
6
|
import typing as t
|
|
6
7
|
|
|
7
8
|
|
|
@@ -113,3 +114,41 @@ def read_range_from_file(file: Path, text_range: Range) -> str:
|
|
|
113
114
|
result.append(line[start_char:end_char])
|
|
114
115
|
|
|
115
116
|
return "".join(result)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def get_range_of_model_block(
|
|
120
|
+
sql: str,
|
|
121
|
+
dialect: str,
|
|
122
|
+
) -> t.Optional[Range]:
|
|
123
|
+
"""
|
|
124
|
+
Get the range of the model block in an SQL file.
|
|
125
|
+
"""
|
|
126
|
+
tokens = tokenize(sql, dialect=dialect)
|
|
127
|
+
|
|
128
|
+
# Find start of the model block
|
|
129
|
+
start = next(
|
|
130
|
+
(t for t in tokens if t.token_type is TokenType.VAR and t.text.upper() == "MODEL"),
|
|
131
|
+
None,
|
|
132
|
+
)
|
|
133
|
+
end = next((t for t in tokens if t.token_type is TokenType.SEMICOLON), None)
|
|
134
|
+
|
|
135
|
+
if start is None or end is None:
|
|
136
|
+
return None
|
|
137
|
+
|
|
138
|
+
start_position = TokenPositionDetails(
|
|
139
|
+
line=start.line,
|
|
140
|
+
col=start.col,
|
|
141
|
+
start=start.start,
|
|
142
|
+
end=start.end,
|
|
143
|
+
)
|
|
144
|
+
end_position = TokenPositionDetails(
|
|
145
|
+
line=end.line,
|
|
146
|
+
col=end.col,
|
|
147
|
+
start=end.start,
|
|
148
|
+
end=end.end,
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
splitlines = sql.splitlines()
|
|
152
|
+
return Range(
|
|
153
|
+
start=start_position.to_range(splitlines).start, end=end_position.to_range(splitlines).end
|
|
154
|
+
)
|
|
@@ -7,7 +7,7 @@ import typing as t
|
|
|
7
7
|
from sqlglot.expressions import Star
|
|
8
8
|
from sqlglot.helper import subclasses
|
|
9
9
|
|
|
10
|
-
from sqlmesh.core.linter.helpers import TokenPositionDetails
|
|
10
|
+
from sqlmesh.core.linter.helpers import TokenPositionDetails, get_range_of_model_block
|
|
11
11
|
from sqlmesh.core.linter.rule import Rule, RuleViolation, Range, Fix, TextEdit
|
|
12
12
|
from sqlmesh.core.linter.definition import RuleSet
|
|
13
13
|
from sqlmesh.core.model import Model, SqlModel
|
|
@@ -93,7 +93,21 @@ class NoMissingAudits(Rule):
|
|
|
93
93
|
"""Model `audits` must be configured to test data quality."""
|
|
94
94
|
|
|
95
95
|
def check_model(self, model: Model) -> t.Optional[RuleViolation]:
|
|
96
|
-
|
|
96
|
+
if model.audits or model.kind.is_symbolic:
|
|
97
|
+
return None
|
|
98
|
+
if model._path is None or not str(model._path).endswith(".sql"):
|
|
99
|
+
return self.violation()
|
|
100
|
+
|
|
101
|
+
try:
|
|
102
|
+
with open(model._path, "r", encoding="utf-8") as file:
|
|
103
|
+
content = file.read()
|
|
104
|
+
|
|
105
|
+
range = get_range_of_model_block(content, model.dialect)
|
|
106
|
+
if range:
|
|
107
|
+
return self.violation(violation_range=range)
|
|
108
|
+
return self.violation()
|
|
109
|
+
except Exception:
|
|
110
|
+
return self.violation()
|
|
97
111
|
|
|
98
112
|
|
|
99
113
|
BUILTIN_RULES = RuleSet(subclasses(__name__, Rule, (Rule,)))
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
sqlmesh/__init__.py,sha256=QjwaamJIdW7voXoS880yAx7tHm-Im4_mqGA-XJgafos,7631
|
|
2
|
-
sqlmesh/_version.py,sha256=
|
|
2
|
+
sqlmesh/_version.py,sha256=HL_ihNgGoramFkQE1PrHObtLhsJZGjVBQK7cM0fe3O4,530
|
|
3
3
|
sqlmesh/magics.py,sha256=bEzYqXHcM0P3CjyUZ1O9arlmXAdLAhoglKbQ29fD9AE,41842
|
|
4
4
|
sqlmesh/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
sqlmesh/cicd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -58,8 +58,8 @@ sqlmesh/core/config/scheduler.py,sha256=LVEHIln7dqv8ygo4uniji4j9-gfuJlk-WpQU9FAq
|
|
|
58
58
|
sqlmesh/core/config/ui.py,sha256=jsO-S6_d9NkLZGG5pT4mgKgxMF34KzkDociZAMvCX3U,278
|
|
59
59
|
sqlmesh/core/engine_adapter/__init__.py,sha256=two_WTs4UnSNp-fscJh8vOunJq0Xi37EuDuMjKsKuNE,2281
|
|
60
60
|
sqlmesh/core/engine_adapter/_typing.py,sha256=_63pYCThfC39UtPVHY3N0H6qJ1YBT32OqwwR3swolGM,1037
|
|
61
|
-
sqlmesh/core/engine_adapter/athena.py,sha256=
|
|
62
|
-
sqlmesh/core/engine_adapter/base.py,sha256=
|
|
61
|
+
sqlmesh/core/engine_adapter/athena.py,sha256=AS1w_l_VrFZsc2CIicElg1dtS9y6q5hHHmTg4ECH-xs,26453
|
|
62
|
+
sqlmesh/core/engine_adapter/base.py,sha256=vCnqWyZCUsLVZArCdyEQywvAliwFCDDbGMig7EyOaTU,104361
|
|
63
63
|
sqlmesh/core/engine_adapter/base_postgres.py,sha256=DOsOdCJyQAVfA9S0GznuH0J1bonMqYVP_yJLDYcxFYM,6772
|
|
64
64
|
sqlmesh/core/engine_adapter/bigquery.py,sha256=qJE8vHLKKAeWMvltmYaUvWS95jM_UEZ6UzYLlr58sGo,50424
|
|
65
65
|
sqlmesh/core/engine_adapter/clickhouse.py,sha256=LoPdm_s_s-ZxS1XJPA3Et0iOHeJ1LgqTAFbwBdiqE7A,34912
|
|
@@ -77,10 +77,10 @@ sqlmesh/core/engine_adapter/spark.py,sha256=sYkVOPS0X43UPbI0z7Hh_EpKlI36qkOcr4NN
|
|
|
77
77
|
sqlmesh/core/engine_adapter/trino.py,sha256=Ik5yOW_gYahVq6ksZPzE2Um-5J4A2AJv-QZiZYUPeP8,15842
|
|
78
78
|
sqlmesh/core/linter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
79
79
|
sqlmesh/core/linter/definition.py,sha256=pXDxl8TxTGNuVc1B5ywYmaH7dDjsoMRvCtLCK_co-ek,5567
|
|
80
|
-
sqlmesh/core/linter/helpers.py,sha256=
|
|
80
|
+
sqlmesh/core/linter/helpers.py,sha256=ygumMRAShxHITK_5vI64tHJoEa2mAdKen5hlMxaXKoQ,5022
|
|
81
81
|
sqlmesh/core/linter/rule.py,sha256=FlsP0PN4dmke7sJ2oD8ZZo3tWw8i87Q7CvbdNOOy3N8,3648
|
|
82
82
|
sqlmesh/core/linter/rules/__init__.py,sha256=gevzfb67vFqckTCoVAe_TBGf6hQ-YtE1_YuGuXyh1L0,77
|
|
83
|
-
sqlmesh/core/linter/rules/builtin.py,sha256=
|
|
83
|
+
sqlmesh/core/linter/rules/builtin.py,sha256=ea2jOkg78UWBbMjHSI0mTWee-MsCzQWqI7hpTgrjwYs,3939
|
|
84
84
|
sqlmesh/core/metric/__init__.py,sha256=H1HmoD5IwN4YWe9iJXyueLYNmTQFZwok5nSWNJcZIBQ,237
|
|
85
85
|
sqlmesh/core/metric/definition.py,sha256=Yd5aVgsZCDPJ43aGP7WqtzZOuuSUtB8uJGVA6Jw9x9M,7201
|
|
86
86
|
sqlmesh/core/metric/rewriter.py,sha256=GiSTHfn2kinqCfNPYgZPRk93JFLzVaaejHtHDQ0yXZI,7326
|
|
@@ -282,7 +282,7 @@ sqlmesh/utils/pydantic.py,sha256=o_NsXbIpDqNpUA1Uc5xF0ZzoXQYYB0DfHwdRxBwXPNk,120
|
|
|
282
282
|
sqlmesh/utils/rich.py,sha256=BpB47G0-JcU41LkGkeGKroexj4NOV5fox4-GOIXPgIc,3545
|
|
283
283
|
sqlmesh/utils/windows.py,sha256=r7Yin4WEwbvH7sKA3hOJtRsclmscNuBeCklCfVPvtQs,611
|
|
284
284
|
sqlmesh/utils/yaml.py,sha256=hvo5lmybYLcIx4p6CQwufS8X4MbwS60lEBnCmYJCXmU,2336
|
|
285
|
-
sqlmesh-0.199.1.
|
|
285
|
+
sqlmesh-0.199.1.dev45.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
|
|
286
286
|
web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
287
287
|
web/client/dist/index.html,sha256=DAv6ABGogw4xRLb0T_92WP_S7XWyqVhwBgGKWtuQwU4,5472
|
|
288
288
|
web/client/dist/assets/Audits-BuHAmFO8.js,sha256=zbYUF6WdUGMbnMm01GMNPb7xAJwj-o5wMdL56vPo2qE,1041
|
|
@@ -400,8 +400,8 @@ web/server/api/endpoints/models.py,sha256=kwj0s7uve3iZSMfmjkoPVMFMeY1sD0peTeyrWf
|
|
|
400
400
|
web/server/api/endpoints/modules.py,sha256=8hqqgonGay_mJmpCw0IdbjsPhWlQH2VLdKAqha-myac,468
|
|
401
401
|
web/server/api/endpoints/plan.py,sha256=bbbY50W_2MsZSTxOHWMKz0tbIm75nsRSlPy8GI2fg9Q,9306
|
|
402
402
|
web/server/api/endpoints/table_diff.py,sha256=SCy3-pr5x6bEEiOaZGCDbiHQhpgxwmnz3Acqa2Ie6jI,2090
|
|
403
|
-
sqlmesh-0.199.1.
|
|
404
|
-
sqlmesh-0.199.1.
|
|
405
|
-
sqlmesh-0.199.1.
|
|
406
|
-
sqlmesh-0.199.1.
|
|
407
|
-
sqlmesh-0.199.1.
|
|
403
|
+
sqlmesh-0.199.1.dev45.dist-info/METADATA,sha256=NL8VQrIbMzzmLYAeFcIgiKFZUofxtSDUsBBZKgTJTHU,26658
|
|
404
|
+
sqlmesh-0.199.1.dev45.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
405
|
+
sqlmesh-0.199.1.dev45.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
|
|
406
|
+
sqlmesh-0.199.1.dev45.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
|
|
407
|
+
sqlmesh-0.199.1.dev45.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|