sqlmesh 0.199.1.dev42__py3-none-any.whl → 0.199.1.dev44__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.dev42'
21
- __version_tuple__ = version_tuple = (0, 199, 1, 'dev42')
20
+ __version__ = version = '0.199.1.dev44'
21
+ __version_tuple__ = version_tuple = (0, 199, 1, 'dev44')
@@ -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.dev42
3
+ Version: 0.199.1.dev44
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=BtVU0UaZRBiL-WFM8zR4k_uxX2joo3hg267FrwiBxG4,530
2
+ sqlmesh/_version.py,sha256=aanCQzolghLH-GxbReu52h4BEUDoVhg9YNUwoDQJoeU,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
@@ -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.dev42.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
285
+ sqlmesh-0.199.1.dev44.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.dev42.dist-info/METADATA,sha256=5zp-xIRG755w4ITvfsI8rxcH-qBTs2zo7ufvhzzAGeU,26658
404
- sqlmesh-0.199.1.dev42.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
405
- sqlmesh-0.199.1.dev42.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
406
- sqlmesh-0.199.1.dev42.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
407
- sqlmesh-0.199.1.dev42.dist-info/RECORD,,
403
+ sqlmesh-0.199.1.dev44.dist-info/METADATA,sha256=sVlPmMOIz5iZCsU2rHYnYASMl7Pt2tvvmsl89gGeOts,26658
404
+ sqlmesh-0.199.1.dev44.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
405
+ sqlmesh-0.199.1.dev44.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
406
+ sqlmesh-0.199.1.dev44.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
407
+ sqlmesh-0.199.1.dev44.dist-info/RECORD,,