sqlmesh 0.208.2.dev3__py3-none-any.whl → 0.209.1.dev1__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.208.2.dev3'
21
- __version_tuple__ = version_tuple = (0, 208, 2, 'dev3')
20
+ __version__ = version = '0.209.1.dev1'
21
+ __version_tuple__ = version_tuple = (0, 209, 1, 'dev1')
sqlmesh/core/dialect.py CHANGED
@@ -1408,6 +1408,41 @@ def extract_func_call(
1408
1408
  return func.lower(), kwargs
1409
1409
 
1410
1410
 
1411
+ def extract_function_calls(func_calls: t.Any, allow_tuples: bool = False) -> t.Any:
1412
+ """Used for extracting function calls for signals or audits."""
1413
+
1414
+ if isinstance(func_calls, (exp.Tuple, exp.Array)):
1415
+ return [extract_func_call(i, allow_tuples=allow_tuples) for i in func_calls.expressions]
1416
+ if isinstance(func_calls, exp.Paren):
1417
+ return [extract_func_call(func_calls.this, allow_tuples=allow_tuples)]
1418
+ if isinstance(func_calls, exp.Expression):
1419
+ return [extract_func_call(func_calls, allow_tuples=allow_tuples)]
1420
+ if isinstance(func_calls, list):
1421
+ function_calls = []
1422
+ for entry in func_calls:
1423
+ if isinstance(entry, dict):
1424
+ args = entry
1425
+ name = "" if allow_tuples else entry.pop("name")
1426
+ elif isinstance(entry, (tuple, list)):
1427
+ name, args = entry
1428
+ else:
1429
+ raise ConfigError(f"Audit must be a dictionary or named tuple. Got {entry}.")
1430
+
1431
+ function_calls.append(
1432
+ (
1433
+ name.lower(),
1434
+ {
1435
+ key: parse_one(value) if isinstance(value, str) else value
1436
+ for key, value in args.items()
1437
+ },
1438
+ )
1439
+ )
1440
+
1441
+ return function_calls
1442
+
1443
+ return func_calls or []
1444
+
1445
+
1411
1446
  def is_meta_expression(v: t.Any) -> bool:
1412
1447
  return isinstance(v, (Audit, Metric, Model))
1413
1448
 
sqlmesh/core/loader.py CHANGED
@@ -594,7 +594,6 @@ class SqlMeshLoader(Loader):
594
594
  macros=macros,
595
595
  jinja_macros=jinja_macros,
596
596
  audit_definitions=audits,
597
- default_audits=self.config.model_defaults.audits,
598
597
  module_path=self.config_path,
599
598
  dialect=self.config.model_defaults.dialect,
600
599
  time_column_format=self.config.time_column_format,
@@ -32,7 +32,7 @@ from sqlmesh.core.model.common import (
32
32
  sorted_python_env_payloads,
33
33
  validate_extra_and_required_fields,
34
34
  )
35
- from sqlmesh.core.model.meta import ModelMeta, FunctionCall
35
+ from sqlmesh.core.model.meta import ModelMeta
36
36
  from sqlmesh.core.model.kind import (
37
37
  ModelKindName,
38
38
  SeedKind,
@@ -2038,7 +2038,6 @@ def load_sql_based_model(
2038
2038
  macros: t.Optional[MacroRegistry] = None,
2039
2039
  jinja_macros: t.Optional[JinjaMacroRegistry] = None,
2040
2040
  audits: t.Optional[t.Dict[str, ModelAudit]] = None,
2041
- default_audits: t.Optional[t.List[FunctionCall]] = None,
2042
2041
  python_env: t.Optional[t.Dict[str, Executable]] = None,
2043
2042
  dialect: t.Optional[str] = None,
2044
2043
  physical_schema_mapping: t.Optional[t.Dict[re.Pattern, str]] = None,
@@ -2211,7 +2210,6 @@ Learn more at https://sqlmesh.readthedocs.io/en/stable/concepts/models/overview
2211
2210
  physical_schema_mapping=physical_schema_mapping,
2212
2211
  default_catalog=default_catalog,
2213
2212
  variables=variables,
2214
- default_audits=default_audits,
2215
2213
  inline_audits=inline_audits,
2216
2214
  blueprint_variables=blueprint_variables,
2217
2215
  **meta_fields,
@@ -2431,7 +2429,6 @@ def _create_model(
2431
2429
  physical_schema_mapping: t.Optional[t.Dict[re.Pattern, str]] = None,
2432
2430
  python_env: t.Optional[t.Dict[str, Executable]] = None,
2433
2431
  audit_definitions: t.Optional[t.Dict[str, ModelAudit]] = None,
2434
- default_audits: t.Optional[t.List[FunctionCall]] = None,
2435
2432
  inline_audits: t.Optional[t.Dict[str, ModelAudit]] = None,
2436
2433
  module_path: Path = Path(),
2437
2434
  macros: t.Optional[MacroRegistry] = None,
@@ -2541,6 +2538,10 @@ def _create_model(
2541
2538
  for jinja_macro in jinja_macros.root_macros.values():
2542
2539
  used_variables.update(extract_macro_references_and_variables(jinja_macro.definition)[1])
2543
2540
 
2541
+ # Merge model-specific audits with default audits
2542
+ if default_audits := defaults.pop("audits", None):
2543
+ kwargs["audits"] = default_audits + d.extract_function_calls(kwargs.pop("audits", []))
2544
+
2544
2545
  model = klass(
2545
2546
  name=name,
2546
2547
  **{
@@ -2558,12 +2559,7 @@ def _create_model(
2558
2559
  **(inline_audits or {}),
2559
2560
  }
2560
2561
 
2561
- # TODO: default_audits needs to be merged with model.audits; the former's arguments
2562
- # are silently dropped today because we add them in audit_definitions. We also need
2563
- # to check for duplicates when we implement this merging logic.
2564
- used_audits: t.Set[str] = set()
2565
- used_audits.update(audit_name for audit_name, _ in default_audits or [])
2566
- used_audits.update(audit_name for audit_name, _ in model.audits)
2562
+ used_audits: t.Set[str] = {audit_name for audit_name, _ in model.audits}
2567
2563
 
2568
2564
  audit_definitions = {
2569
2565
  audit_name: audit_definitions[audit_name]
@@ -11,7 +11,7 @@ from sqlglot.optimizer.normalize_identifiers import normalize_identifiers
11
11
 
12
12
  from sqlmesh.core import dialect as d
13
13
  from sqlmesh.core.config.linter import LinterConfig
14
- from sqlmesh.core.dialect import normalize_model_name, extract_func_call
14
+ from sqlmesh.core.dialect import normalize_model_name
15
15
  from sqlmesh.core.model.common import (
16
16
  bool_validator,
17
17
  default_catalog_validator,
@@ -94,37 +94,7 @@ class ModelMeta(_Node):
94
94
  def _func_call_validator(cls, v: t.Any, field: t.Any) -> t.Any:
95
95
  is_signal = getattr(field, "name" if hasattr(field, "name") else "field_name") == "signals"
96
96
 
97
- if isinstance(v, (exp.Tuple, exp.Array)):
98
- return [extract_func_call(i, allow_tuples=is_signal) for i in v.expressions]
99
- if isinstance(v, exp.Paren):
100
- return [extract_func_call(v.this, allow_tuples=is_signal)]
101
- if isinstance(v, exp.Expression):
102
- return [extract_func_call(v, allow_tuples=is_signal)]
103
- if isinstance(v, list):
104
- audits = []
105
-
106
- for entry in v:
107
- if isinstance(entry, dict):
108
- args = entry
109
- name = "" if is_signal else entry.pop("name")
110
- elif isinstance(entry, (tuple, list)):
111
- name, args = entry
112
- else:
113
- raise ConfigError(f"Audit must be a dictionary or named tuple. Got {entry}.")
114
-
115
- audits.append(
116
- (
117
- name.lower(),
118
- {
119
- key: d.parse_one(value) if isinstance(value, str) else value
120
- for key, value in args.items()
121
- },
122
- )
123
- )
124
-
125
- return audits
126
-
127
- return v or []
97
+ return d.extract_function_calls(v, allow_tuples=is_signal)
128
98
 
129
99
  @field_validator("tags", mode="before")
130
100
  def _value_or_tuple_validator(cls, v: t.Any, info: ValidationInfo) -> t.Any:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlmesh
3
- Version: 0.208.2.dev3
3
+ Version: 0.209.1.dev1
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=2yhGdTiOM_8xzexAMMOW8mI6LuP-FyYBN0zpkedz24A,528
2
+ sqlmesh/_version.py,sha256=lP0Wyi_hOUWyJq9RDOK8nQ_2NlnvoewyZ-vmfVlgd2w,528
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
@@ -15,10 +15,10 @@ sqlmesh/core/console.py,sha256=KbIXoxt5hpDENEolY-DpBlPmcWtJ9vzEgF52mjG2jPE,16571
15
15
  sqlmesh/core/constants.py,sha256=gUABXWYgH_XOSbaZAJsR5o1dmA61JDCvBDyxqqXX3LM,2630
16
16
  sqlmesh/core/context.py,sha256=bFAvnjg3YENIgWVDYfflKA5yW6o6gMEZhiSKBPIrBk8,127613
17
17
  sqlmesh/core/context_diff.py,sha256=_Ur55fGLJ58Icsp44I4pVhdi7_JHiHq45mWIco9oFzk,21792
18
- sqlmesh/core/dialect.py,sha256=gWxJv6Nowd4bdfj-yDhe_9TaRcWg0WevXtNautYASWw,51071
18
+ sqlmesh/core/dialect.py,sha256=wJ2cDoxz72LIRJ3iBZdCqtnKMbMUdIftl-AvbVldI28,52413
19
19
  sqlmesh/core/environment.py,sha256=odus40R-YzdQdS_IiUq_tFouUXIhnpwmNwo8dE8Aw1k,13041
20
20
  sqlmesh/core/lineage.py,sha256=zjB0Zfamo2Fja2r5SSZPMbrEKTXr1WjozZPVqvxdybI,3143
21
- sqlmesh/core/loader.py,sha256=ChxuRlpMCfjwYSoe-7iBlQyn7C8Zg9WX174ot1F3IRQ,41245
21
+ sqlmesh/core/loader.py,sha256=z8KNT5igXc_g-5X1BPPL9XAbpve3ZQp7OkkX63iT0Gc,41179
22
22
  sqlmesh/core/macros.py,sha256=_tQohZfLoIjO7qpgNu91Qqu3GRJ22k4Ic1AVdowTHuY,62542
23
23
  sqlmesh/core/node.py,sha256=3ChBz1PIMJhp-jzed_GLBrtmEF2v_BVDEM5WNe0ssPk,14658
24
24
  sqlmesh/core/notification_target.py,sha256=PPGoDrgbRKxr27vJEu03XqNTQLYTw0ZF_b0yAapxGeI,16158
@@ -88,9 +88,9 @@ sqlmesh/core/model/__init__.py,sha256=C8GRZ53xuXEA9hQv3BQS9pNNyd9rZ06R_B96UYGhDu
88
88
  sqlmesh/core/model/cache.py,sha256=csun0RJguHzKX6-qITcOs4fVP4f8_Ts8qiUVV4sHY6Q,7869
89
89
  sqlmesh/core/model/common.py,sha256=Gt1nBdbILfR52Rhq2KxF0EMGkB3J5zfk6UH7ecLpMZI,17969
90
90
  sqlmesh/core/model/decorator.py,sha256=wUUg5t0K559tV9Pqt6FE2EWXt5TPGb4wF2Yg4B4hX4w,9251
91
- sqlmesh/core/model/definition.py,sha256=UsRFDlO3A5so4HM2_x6M0sdTR-VlTIxw1d-T_gxS_9Q,113897
91
+ sqlmesh/core/model/definition.py,sha256=9dKh7OOtQ2XUiHvg-cL2T4zCIadSQL6UlJ3ezuNrSU4,113578
92
92
  sqlmesh/core/model/kind.py,sha256=uN73ycANfM94CxcOdkUTclLansNvwo3wySkkl--QzY0,36322
93
- sqlmesh/core/model/meta.py,sha256=D9InI9M2-IXeb34vkXNQSLALL8xVXjZ_LXwI-Tqxm7I,21197
93
+ sqlmesh/core/model/meta.py,sha256=IE-b_OkCcKzXuQBsopiaf0l5a5Ay903N_64Z1s4cXGk,20064
94
94
  sqlmesh/core/model/schema.py,sha256=_HMYfzK9wWXh7_CQDIIGnuQUD4aiX3o5D2cRp2sERzc,3387
95
95
  sqlmesh/core/model/seed.py,sha256=a0M-1zY1gOkN5ph2GQyataEdBSCtq50YjeFk2LyvInI,5058
96
96
  sqlmesh/core/plan/__init__.py,sha256=NKSvM7ZBVjw9ho3J65M1wFvG3KURB8PJ0FHHLmtSF44,443
@@ -288,7 +288,7 @@ sqlmesh/utils/pydantic.py,sha256=o_NsXbIpDqNpUA1Uc5xF0ZzoXQYYB0DfHwdRxBwXPNk,120
288
288
  sqlmesh/utils/rich.py,sha256=cwQ5nJ6sgz64xHtoh6_ec7ReV5YpsOGhMtUJnwoRfEI,3549
289
289
  sqlmesh/utils/windows.py,sha256=r7Yin4WEwbvH7sKA3hOJtRsclmscNuBeCklCfVPvtQs,611
290
290
  sqlmesh/utils/yaml.py,sha256=hvo5lmybYLcIx4p6CQwufS8X4MbwS60lEBnCmYJCXmU,2336
291
- sqlmesh-0.208.2.dev3.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
291
+ sqlmesh-0.209.1.dev1.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
292
292
  web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
293
293
  web/client/dist/index.html,sha256=SXykdSRNgrT1k6I2dPZPEfpxPjIsi8-yVFijt-naSA4,5472
294
294
  web/client/dist/assets/Audits-Jm353fhk.js,sha256=ry6b5IKT3hLAfD5C3T2BqxulfauEV0n0YZ2vsP4eQ_U,1041
@@ -406,8 +406,8 @@ web/server/api/endpoints/models.py,sha256=kwj0s7uve3iZSMfmjkoPVMFMeY1sD0peTeyrWf
406
406
  web/server/api/endpoints/modules.py,sha256=8hqqgonGay_mJmpCw0IdbjsPhWlQH2VLdKAqha-myac,468
407
407
  web/server/api/endpoints/plan.py,sha256=bbbY50W_2MsZSTxOHWMKz0tbIm75nsRSlPy8GI2fg9Q,9306
408
408
  web/server/api/endpoints/table_diff.py,sha256=SCy3-pr5x6bEEiOaZGCDbiHQhpgxwmnz3Acqa2Ie6jI,2090
409
- sqlmesh-0.208.2.dev3.dist-info/METADATA,sha256=UVocMY8V61XGRDT55-zhV0pfTSb1i4f0M1oXjIdTfO8,26685
410
- sqlmesh-0.208.2.dev3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
411
- sqlmesh-0.208.2.dev3.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
412
- sqlmesh-0.208.2.dev3.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
413
- sqlmesh-0.208.2.dev3.dist-info/RECORD,,
409
+ sqlmesh-0.209.1.dev1.dist-info/METADATA,sha256=FNbX5PCGHf_eLzUk1lJVg4denOhNJyBy0tjB5gmKt5Y,26685
410
+ sqlmesh-0.209.1.dev1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
411
+ sqlmesh-0.209.1.dev1.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
412
+ sqlmesh-0.209.1.dev1.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
413
+ sqlmesh-0.209.1.dev1.dist-info/RECORD,,