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 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.dev43'
21
- __version_tuple__ = version_tuple = (0, 199, 1, 'dev43')
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
- if self.correlation_id:
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,
@@ -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
- return self.violation() if not model.audits and not model.kind.is_symbolic else None
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlmesh
3
- Version: 0.199.1.dev43
3
+ Version: 0.199.1.dev45
4
4
  Summary: Next-generation data transformation framework
5
5
  Author-email: "TobikoData Inc." <engineering@tobikodata.com>
6
6
  License: Apache License
@@ -1,5 +1,5 @@
1
1
  sqlmesh/__init__.py,sha256=QjwaamJIdW7voXoS880yAx7tHm-Im4_mqGA-XJgafos,7631
2
- sqlmesh/_version.py,sha256=dcmDfUvo5ZdPh0vrqKr3hbzovxRtmo1vmiVx1xbMwmg,530
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=DMC94WfCH8m37cVPio43Q11J8RQE8tuf1nl0RtXZ_CM,26198
62
- sqlmesh/core/engine_adapter/base.py,sha256=9rRzY01cvPdrWGCGfT4qqsPbklt6vUWTQmK_C9DEiAo,104182
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=VF4hsdzGZ8srpbtCjdRN_Hd8S_er5KTAaLXLde27Yxo,4032
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=51pv76heU6dlTHBMvL3L1x1WXzbCAsFBJGRQ8zjk-OU,3452
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.dev43.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
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.dev43.dist-info/METADATA,sha256=Vszsvjyl8sOBnxtY-dbwKOdyZEVpKzRWdxu8JG1aE5E,26658
404
- sqlmesh-0.199.1.dev43.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
405
- sqlmesh-0.199.1.dev43.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
406
- sqlmesh-0.199.1.dev43.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
407
- sqlmesh-0.199.1.dev43.dist-info/RECORD,,
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,,