sqlmesh 0.186.2.dev7__py3-none-any.whl → 0.186.2.dev9__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.186.2.dev7'
21
- __version_tuple__ = version_tuple = (0, 186, 2, 'dev7')
20
+ __version__ = version = '0.186.2.dev9'
21
+ __version_tuple__ = version_tuple = (0, 186, 2, 'dev9')
sqlmesh/core/context.py CHANGED
@@ -869,7 +869,12 @@ class GenericContext(BaseContext, t.Generic[C]):
869
869
  Returns:
870
870
  The expected model.
871
871
  """
872
- if isinstance(model_or_snapshot, str):
872
+ if isinstance(model_or_snapshot, Snapshot):
873
+ return model_or_snapshot.model
874
+ if not isinstance(model_or_snapshot, str):
875
+ return model_or_snapshot
876
+
877
+ try:
873
878
  # We should try all dialects referenced in the project for cases when models use mixed dialects.
874
879
  for dialect in self._all_dialects:
875
880
  normalized_name = normalize_model_name(
@@ -879,13 +884,16 @@ class GenericContext(BaseContext, t.Generic[C]):
879
884
  )
880
885
  if normalized_name in self._models:
881
886
  return self._models[normalized_name]
882
- elif isinstance(model_or_snapshot, Snapshot):
883
- return model_or_snapshot.model
884
- else:
885
- return model_or_snapshot
887
+ except:
888
+ pass
886
889
 
887
890
  if raise_if_missing:
888
- raise SQLMeshError(f"Cannot find model for '{model_or_snapshot}'")
891
+ if model_or_snapshot.endswith((".sql", ".py")):
892
+ msg = "Resolving models by path is not supported, please pass in the model name instead."
893
+ else:
894
+ msg = f"Cannot find model with name '{model_or_snapshot}'"
895
+
896
+ raise SQLMeshError(msg)
889
897
 
890
898
  return None
891
899
 
@@ -183,7 +183,31 @@ class BigQueryEngineAdapter(InsertOverwriteWithMergeMixin, ClusteredByMixin, Row
183
183
  def _begin_session(self, properties: SessionProperties) -> None:
184
184
  from google.cloud.bigquery import QueryJobConfig
185
185
 
186
- job = self.client.query("SELECT 1;", job_config=QueryJobConfig(create_session=True))
186
+ query_label_property = properties.get("query_label")
187
+ parsed_query_label: list[tuple[str, str]] = []
188
+ if isinstance(query_label_property, (exp.Array, exp.Paren, exp.Tuple)):
189
+ label_tuples = (
190
+ [query_label_property.unnest()]
191
+ if isinstance(query_label_property, exp.Paren)
192
+ else query_label_property.expressions
193
+ )
194
+
195
+ # query_label is a Paren, Array or Tuple of 2-tuples and validated at load time
196
+ parsed_query_label.extend(
197
+ (label_tuple.expressions[0].name, label_tuple.expressions[1].name)
198
+ for label_tuple in label_tuples
199
+ )
200
+
201
+ if parsed_query_label:
202
+ query_label_str = ",".join([":".join(label) for label in parsed_query_label])
203
+ query = f'SET @@query_label = "{query_label_str}";SELECT 1;'
204
+ else:
205
+ query = "SELECT 1;"
206
+
207
+ job = self.client.query(
208
+ query,
209
+ job_config=QueryJobConfig(create_session=True),
210
+ )
187
211
  session_info = job.session_info
188
212
  session_id = session_info.session_id if session_info else None
189
213
  self._session_id = session_id
@@ -441,7 +441,6 @@ bool_validator: t.Callable = field_validator(
441
441
  properties_validator: t.Callable = field_validator(
442
442
  "physical_properties_",
443
443
  "virtual_properties_",
444
- "session_properties_",
445
444
  "materialization_properties_",
446
445
  mode="before",
447
446
  check_fields=False,
@@ -17,6 +17,7 @@ from sqlmesh.core.model.common import (
17
17
  default_catalog_validator,
18
18
  depends_on_validator,
19
19
  properties_validator,
20
+ parse_properties,
20
21
  )
21
22
  from sqlmesh.core.model.kind import (
22
23
  CustomKind,
@@ -310,6 +311,43 @@ class ModelMeta(_Node):
310
311
  def ignored_rules_validator(cls, vs: t.Any) -> t.Any:
311
312
  return LinterConfig._validate_rules(vs)
312
313
 
314
+ @field_validator("session_properties_", mode="before")
315
+ def session_properties_validator(cls, v: t.Any, info: ValidationInfo) -> t.Any:
316
+ # use the generic properties validator to parse the session properties
317
+ parsed_session_properties = parse_properties(type(cls), v, info)
318
+ if not parsed_session_properties:
319
+ return parsed_session_properties
320
+
321
+ for eq in parsed_session_properties:
322
+ if eq.name == "query_label":
323
+ query_label = eq.right
324
+ if not (
325
+ isinstance(query_label, exp.Array)
326
+ or isinstance(query_label, exp.Tuple)
327
+ or isinstance(query_label, exp.Paren)
328
+ ):
329
+ raise ConfigError(
330
+ "Invalid value for `session_properties.query_label`. Must be an array or tuple."
331
+ )
332
+
333
+ label_tuples: t.List[exp.Expression] = (
334
+ [query_label.unnest()]
335
+ if isinstance(query_label, exp.Paren)
336
+ else query_label.expressions
337
+ )
338
+
339
+ for label_tuple in label_tuples:
340
+ if not (
341
+ isinstance(label_tuple, exp.Tuple)
342
+ and len(label_tuple.expressions) == 2
343
+ and all(isinstance(label, exp.Literal) for label in label_tuple.expressions)
344
+ ):
345
+ raise ConfigError(
346
+ "Invalid entry in `session_properties.query_label`. Must be tuples of string literals with length 2."
347
+ )
348
+
349
+ return parsed_session_properties
350
+
313
351
  @model_validator(mode="before")
314
352
  def _pre_root_validator(cls, data: t.Any) -> t.Any:
315
353
  if not isinstance(data, dict):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlmesh
3
- Version: 0.186.2.dev7
3
+ Version: 0.186.2.dev9
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=69xw6bTmi4cW90M-sl3g6wLDgxVcLHcKg1q8GS3lqyA,7466
2
- sqlmesh/_version.py,sha256=5Qq3pqXoSjLPVN13IN75WxegsGj69CHuuWXEqsIlVh0,528
2
+ sqlmesh/_version.py,sha256=jeZrRJAjsFoG4AdF0QDMWkYzRJePsaNf_KOlplTcdlg,528
3
3
  sqlmesh/magics.py,sha256=JHorAZNtezf123jmTyNSoUC9yHmv-08hMP205PJmmIo,39750
4
4
  sqlmesh/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  sqlmesh/cicd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -13,7 +13,7 @@ sqlmesh/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  sqlmesh/core/_typing.py,sha256=e1f7xO2aZCy38M_3VoDy-XI3shyd99-IFctgIFSgXWM,497
14
14
  sqlmesh/core/console.py,sha256=ZAaGLOWBJGBxPzLV7KZZ9akPExgD5m5AboCM8O0Q0nY,150944
15
15
  sqlmesh/core/constants.py,sha256=oqt6zjepUhQoWlgapKn_HpG7Pu9mrFwepdX5caNfJUI,2499
16
- sqlmesh/core/context.py,sha256=uv-RQTajXhrltbzOEbalDY6NKIJWCUhmiww8YTgFxW0,115024
16
+ sqlmesh/core/context.py,sha256=paXJMdaydEQ9Tp80fVUnxveBlbCN7kGGEvesqAiezmw,115276
17
17
  sqlmesh/core/context_diff.py,sha256=s9toP17d4tJfOpFH91LcjGK2CM64PVuB0MPkeFgF4hQ,20415
18
18
  sqlmesh/core/dialect.py,sha256=fPTV517IOS0nWMxYznNNQnXkQkFFrPOSKe8ghsQ0o8A,49759
19
19
  sqlmesh/core/environment.py,sha256=0TTQf4C4LXwf37fm-dfYv1qyG7vtZfQI5rizgm5g0j0,11442
@@ -61,7 +61,7 @@ sqlmesh/core/engine_adapter/_typing.py,sha256=BAM_U7Vsi0k37XHu_nNnu3whXxuTVDey_u
61
61
  sqlmesh/core/engine_adapter/athena.py,sha256=WBVAB_YzBJXdiqq51LTd2jmYoMtGrLmtsA8IrIFVnQ0,26199
62
62
  sqlmesh/core/engine_adapter/base.py,sha256=WDyZhieFq9iBQSDsLdf-ae6aPu25d-FpwZ4Lt3FPf6o,101153
63
63
  sqlmesh/core/engine_adapter/base_postgres.py,sha256=DOsOdCJyQAVfA9S0GznuH0J1bonMqYVP_yJLDYcxFYM,6772
64
- sqlmesh/core/engine_adapter/bigquery.py,sha256=gnd2cFc7v95tT_E9XMHHgccS-QwSF2sJHsL8xfcSguk,49249
64
+ sqlmesh/core/engine_adapter/bigquery.py,sha256=dc4ve_O5Tu6CKuojt5_edr4kAHUzR_HWIPFpsunat_w,50201
65
65
  sqlmesh/core/engine_adapter/clickhouse.py,sha256=4ACsYsZ8-gvyCozwoEMEayTTUdMjmNea4xUkxtXw6R4,34907
66
66
  sqlmesh/core/engine_adapter/databricks.py,sha256=AbNbnt9nQdOd7lTov2zsKROZlzgV2fLvOYXam3cowvk,14507
67
67
  sqlmesh/core/engine_adapter/duckdb.py,sha256=FfNmBzLySDDi--nTlsSavTwdperCzhpYzDoroCilPcA,4900
@@ -85,11 +85,11 @@ sqlmesh/core/metric/definition.py,sha256=Yd5aVgsZCDPJ43aGP7WqtzZOuuSUtB8uJGVA6Jw
85
85
  sqlmesh/core/metric/rewriter.py,sha256=GiSTHfn2kinqCfNPYgZPRk93JFLzVaaejHtHDQ0yXZI,7326
86
86
  sqlmesh/core/model/__init__.py,sha256=C8GRZ53xuXEA9hQv3BQS9pNNyd9rZ06R_B96UYGhDu4,1644
87
87
  sqlmesh/core/model/cache.py,sha256=s-aEFuUmUKITaWHvYbOyRarsjsgoA6vfASK-f-MwJ9k,7257
88
- sqlmesh/core/model/common.py,sha256=J3ukpCEvZyfiYlG38aMhqxlR-Tyq2Sm2dzg5SOnldXc,16279
88
+ sqlmesh/core/model/common.py,sha256=vbcXFhWE22-FeKYAVIlKWvTb-wkeC8XISjU_TIlak0c,16252
89
89
  sqlmesh/core/model/decorator.py,sha256=v_sVudNROGrtj5cZ3vgcOFnwPdzwoUGY6REAkQpIMQc,8927
90
90
  sqlmesh/core/model/definition.py,sha256=QBwGNL7Jqg8BGgpZfTtKciRJA7axkI5FShJJjnUDQ4w,108645
91
91
  sqlmesh/core/model/kind.py,sha256=i6_AMBarXPGPoMdF9kzBkyqS9tu__a2339-BoX7TgCM,36010
92
- sqlmesh/core/model/meta.py,sha256=Hxn5BjfnGATjopHQ4Odok3FoO0X1Ulb2gm6aAvwQhP0,19076
92
+ sqlmesh/core/model/meta.py,sha256=osJgfSj6maIIdWAHzDVCkXXL--__gnKvqkzxM6Nuq6g,20779
93
93
  sqlmesh/core/model/schema.py,sha256=QzM1cOfukuK3L-cEE9MtxKeYec3x5JvutdZAnczJSiQ,3858
94
94
  sqlmesh/core/model/seed.py,sha256=ctUHH6CmeEnBVJyIAZznx0xJBm09W7VIZ-76Cfwfq28,5004
95
95
  sqlmesh/core/plan/__init__.py,sha256=ctpnu9mK3uTujs0It8qRMqcj9GdObXDnvSgn4rD2zqc,450
@@ -269,7 +269,7 @@ sqlmesh/utils/pydantic.py,sha256=I898jAFqa3qU6lG2uPpRebVFncOUo8ZrLWM_R3K3DHU,116
269
269
  sqlmesh/utils/rich.py,sha256=xNZyPCqEc4TAlJlsEthg-5eYUWpaizz0QjBzO7a1Yv4,1509
270
270
  sqlmesh/utils/windows.py,sha256=r7Yin4WEwbvH7sKA3hOJtRsclmscNuBeCklCfVPvtQs,611
271
271
  sqlmesh/utils/yaml.py,sha256=np-WVcwmwsKghCgAj1OBBMsK1SXSRn4wR-H37cGiFr8,2282
272
- sqlmesh-0.186.2.dev7.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
272
+ sqlmesh-0.186.2.dev9.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
273
273
  web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
274
274
  web/client/dist/index.html,sha256=M50OuwjW63dRCS0Dz40Yecgvw9ecLFqizbTa6gv5Nd4,5472
275
275
  web/client/dist/assets/Audits-BPlxzqeG.js,sha256=TCx1qCjCGgmUSvH6HoPr5t8ztbRXMlOxrcW4o7hRjlA,1041
@@ -387,8 +387,8 @@ web/server/api/endpoints/models.py,sha256=ud-lRwriyI_OYg9tZchrBgeiXELiRTLNEodraf
387
387
  web/server/api/endpoints/modules.py,sha256=8hqqgonGay_mJmpCw0IdbjsPhWlQH2VLdKAqha-myac,468
388
388
  web/server/api/endpoints/plan.py,sha256=OYuQ_4dgbhG9ibTcX1a8mvYgH3ANxw9Fhbb4wg6QWqc,9222
389
389
  web/server/api/endpoints/table_diff.py,sha256=Wd5YxeKbZB7AkrDvqFgvV9ZQlnKYOF1n5W_w2EHE_Zw,2085
390
- sqlmesh-0.186.2.dev7.dist-info/METADATA,sha256=mMGGuNn8T4WE0hc6NZIXtl6RrgcRW0v4DA5v05OvHUw,25523
391
- sqlmesh-0.186.2.dev7.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
392
- sqlmesh-0.186.2.dev7.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
393
- sqlmesh-0.186.2.dev7.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
394
- sqlmesh-0.186.2.dev7.dist-info/RECORD,,
390
+ sqlmesh-0.186.2.dev9.dist-info/METADATA,sha256=ET7j4M3y_JZuXPTtTlqkQBtcu_hxq7lONYrg4_PupLQ,25523
391
+ sqlmesh-0.186.2.dev9.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
392
+ sqlmesh-0.186.2.dev9.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
393
+ sqlmesh-0.186.2.dev9.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
394
+ sqlmesh-0.186.2.dev9.dist-info/RECORD,,