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 +2 -2
- sqlmesh/core/dialect.py +35 -0
- sqlmesh/core/loader.py +0 -1
- sqlmesh/core/model/definition.py +6 -10
- sqlmesh/core/model/meta.py +2 -32
- {sqlmesh-0.208.2.dev3.dist-info → sqlmesh-0.209.1.dev1.dist-info}/METADATA +1 -1
- {sqlmesh-0.208.2.dev3.dist-info → sqlmesh-0.209.1.dev1.dist-info}/RECORD +11 -11
- {sqlmesh-0.208.2.dev3.dist-info → sqlmesh-0.209.1.dev1.dist-info}/WHEEL +0 -0
- {sqlmesh-0.208.2.dev3.dist-info → sqlmesh-0.209.1.dev1.dist-info}/entry_points.txt +0 -0
- {sqlmesh-0.208.2.dev3.dist-info → sqlmesh-0.209.1.dev1.dist-info}/licenses/LICENSE +0 -0
- {sqlmesh-0.208.2.dev3.dist-info → sqlmesh-0.209.1.dev1.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.
|
|
21
|
-
__version_tuple__ = version_tuple = (0,
|
|
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,
|
sqlmesh/core/model/definition.py
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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]
|
sqlmesh/core/model/meta.py
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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,5 +1,5 @@
|
|
|
1
1
|
sqlmesh/__init__.py,sha256=QjwaamJIdW7voXoS880yAx7tHm-Im4_mqGA-XJgafos,7631
|
|
2
|
-
sqlmesh/_version.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
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.
|
|
410
|
-
sqlmesh-0.
|
|
411
|
-
sqlmesh-0.
|
|
412
|
-
sqlmesh-0.
|
|
413
|
-
sqlmesh-0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|