sqlmesh 0.184.1.dev4__py3-none-any.whl → 0.184.1.dev5__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.184.1.dev4'
21
- __version_tuple__ = version_tuple = (0, 184, 1, 'dev4')
20
+ __version__ = version = '0.184.1.dev5'
21
+ __version_tuple__ = version_tuple = (0, 184, 1, 'dev5')
@@ -25,7 +25,12 @@ from sqlmesh.core.config.common import (
25
25
  from sqlmesh.core.engine_adapter.shared import CatalogSupport
26
26
  from sqlmesh.core.engine_adapter import EngineAdapter
27
27
  from sqlmesh.utils.errors import ConfigError
28
- from sqlmesh.utils.pydantic import ValidationInfo, field_validator, model_validator
28
+ from sqlmesh.utils.pydantic import (
29
+ ValidationInfo,
30
+ field_validator,
31
+ model_validator,
32
+ validation_error_message,
33
+ )
29
34
  from sqlmesh.utils.aws import validate_s3_uri
30
35
 
31
36
  if t.TYPE_CHECKING:
@@ -1846,7 +1851,13 @@ def _connection_config_validator(
1846
1851
  ) -> ConnectionConfig | None:
1847
1852
  if v is None or isinstance(v, ConnectionConfig):
1848
1853
  return v
1849
- return parse_connection_config(v)
1854
+ try:
1855
+ return parse_connection_config(v)
1856
+ except pydantic.ValidationError as e:
1857
+ raise ConfigError(
1858
+ validation_error_message(e, f"Invalid '{v['type']}' connection config:")
1859
+ + "\n\nVerify your config.yaml and environment variables."
1860
+ )
1850
1861
 
1851
1862
 
1852
1863
  connection_config_validator: t.Callable = field_validator(
@@ -5,6 +5,7 @@ import os
5
5
  import typing as t
6
6
  from pathlib import Path
7
7
 
8
+ from pydantic import ValidationError
8
9
  from sqlglot.helper import ensure_list
9
10
 
10
11
  from sqlmesh.core import constants as c
@@ -13,6 +14,7 @@ from sqlmesh.core.config.root import Config
13
14
  from sqlmesh.utils import env_vars, merge_dicts, sys_path
14
15
  from sqlmesh.utils.errors import ConfigError
15
16
  from sqlmesh.utils.metaprogramming import import_python_file
17
+ from sqlmesh.utils.pydantic import validation_error_message
16
18
  from sqlmesh.utils.yaml import load as yaml_load
17
19
 
18
20
  C = t.TypeVar("C", bound=Config)
@@ -99,9 +101,15 @@ def load_config_from_paths(
99
101
  )
100
102
  non_python_configs.append(load_config_from_yaml(path))
101
103
  elif extension == "py":
102
- python_config = load_config_from_python_module(
103
- config_type, path, config_name=config_name
104
- )
104
+ try:
105
+ python_config = load_config_from_python_module(
106
+ config_type, path, config_name=config_name
107
+ )
108
+ except ValidationError as e:
109
+ raise ConfigError(
110
+ validation_error_message(e, f"Invalid project config '{config_name}':")
111
+ + "\n\nVerify your config.py."
112
+ )
105
113
  else:
106
114
  raise ConfigError(
107
115
  f"Unsupported config file extension '{extension}' in config file '{path}'."
@@ -126,7 +134,13 @@ def load_config_from_paths(
126
134
  f"'{default}' is not a valid model default configuration key. Please remove it from the `model_defaults` specification in your config file."
127
135
  )
128
136
 
129
- non_python_config = config_type.parse_obj(non_python_config_dict)
137
+ try:
138
+ non_python_config = config_type.parse_obj(non_python_config_dict)
139
+ except ValidationError as e:
140
+ raise ConfigError(
141
+ validation_error_message(e, "Invalid project config:")
142
+ + "\n\nVerify your config.yaml and environment variables."
143
+ )
130
144
 
131
145
  no_dialect_err_msg = "Default model SQL dialect is a required configuration parameter. Set it in the `model_defaults` `dialect` key in your config file."
132
146
  if python_config:
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import abc
4
4
  import typing as t
5
5
 
6
- from pydantic import Field
6
+ from pydantic import Field, ValidationError
7
7
 
8
8
  from sqlglot.helper import subclasses
9
9
  from sqlmesh.core.config.base import BaseConfig
@@ -16,7 +16,7 @@ from sqlmesh.core.config import DuckDBConnectionConfig
16
16
  from sqlmesh.core.state_sync import EngineAdapterStateSync, StateSync
17
17
  from sqlmesh.utils.errors import ConfigError
18
18
  from sqlmesh.utils.hashing import md5
19
- from sqlmesh.utils.pydantic import field_validator
19
+ from sqlmesh.utils.pydantic import field_validator, validation_error_message
20
20
 
21
21
  if t.TYPE_CHECKING:
22
22
  from sqlmesh.core.context import GenericContext
@@ -159,7 +159,13 @@ def _scheduler_config_validator(
159
159
  if scheduler_type not in SCHEDULER_CONFIG_TO_TYPE:
160
160
  raise ConfigError(f"Unknown scheduler type '{scheduler_type}'.")
161
161
 
162
- return SCHEDULER_CONFIG_TO_TYPE[scheduler_type](**v)
162
+ try:
163
+ return SCHEDULER_CONFIG_TO_TYPE[scheduler_type](**v)
164
+ except ValidationError as e:
165
+ raise ConfigError(
166
+ validation_error_message(e, f"Invalid '{scheduler_type}' scheduler config:")
167
+ + "\n\nVerify your config.yaml and environment variables."
168
+ )
163
169
 
164
170
 
165
171
  scheduler_config_validator = field_validator(
sqlmesh/core/loader.py CHANGED
@@ -11,6 +11,7 @@ import typing as t
11
11
  from collections import Counter, defaultdict
12
12
  from dataclasses import dataclass
13
13
  from pathlib import Path
14
+ from pydantic import ValidationError
14
15
 
15
16
  from sqlglot.errors import SqlglotError
16
17
  from sqlglot import exp
@@ -39,6 +40,7 @@ from sqlmesh.utils import UniqueKeyDict, sys_path
39
40
  from sqlmesh.utils.errors import ConfigError
40
41
  from sqlmesh.utils.jinja import JinjaMacroRegistry, MacroExtractor
41
42
  from sqlmesh.utils.metaprogramming import import_python_file
43
+ from sqlmesh.utils.pydantic import validation_error_message
42
44
  from sqlmesh.utils.yaml import YAML, load as yaml_load
43
45
 
44
46
 
@@ -241,7 +243,7 @@ class Loader(abc.ABC):
241
243
  for row in YAML().load(file.read())
242
244
  ]
243
245
  except Exception as ex:
244
- self._raise_failed_to_load_model_error(path, str(ex))
246
+ self._raise_failed_to_load_model_error(path, ex)
245
247
  raise
246
248
 
247
249
  for path in paths_to_load:
@@ -372,8 +374,11 @@ class Loader(abc.ABC):
372
374
 
373
375
  return self._variables_by_gateway[gateway_name]
374
376
 
375
- def _raise_failed_to_load_model_error(self, path: Path, message: str) -> None:
376
- raise ConfigError(f"Failed to load model definition at '{path}'.\n{message}")
377
+ def _raise_failed_to_load_model_error(self, path: Path, error: t.Union[str, Exception]) -> None:
378
+ base_message = f"Failed to load model definition at '{path}':"
379
+ if isinstance(error, ValidationError):
380
+ raise ConfigError(validation_error_message(error, base_message))
381
+ raise ConfigError(f"{base_message}\n {error}")
377
382
 
378
383
 
379
384
  class SqlMeshLoader(Loader):
@@ -496,7 +501,7 @@ class SqlMeshLoader(Loader):
496
501
  default_catalog_per_gateway=self.context.default_catalog_per_gateway,
497
502
  )
498
503
  except Exception as ex:
499
- self._raise_failed_to_load_model_error(path, str(ex))
504
+ self._raise_failed_to_load_model_error(path, ex)
500
505
  raise
501
506
 
502
507
  for model in cache.get_or_load_models(path, _load):
@@ -561,7 +566,7 @@ class SqlMeshLoader(Loader):
561
566
  if model.enabled:
562
567
  models[model.fqn] = model
563
568
  except Exception as ex:
564
- self._raise_failed_to_load_model_error(path, str(ex))
569
+ self._raise_failed_to_load_model_error(path, ex)
565
570
 
566
571
  finally:
567
572
  model_registry._dialect = None
@@ -20,7 +20,7 @@ from sqlmesh.utils.metaprogramming import (
20
20
  prepare_env,
21
21
  serialize_env,
22
22
  )
23
- from sqlmesh.utils.pydantic import ValidationInfo, field_validator
23
+ from sqlmesh.utils.pydantic import PydanticModel, ValidationInfo, field_validator
24
24
 
25
25
  if t.TYPE_CHECKING:
26
26
  from sqlglot.dialects.dialect import DialectType
@@ -260,6 +260,22 @@ def parse_dependencies(
260
260
  return depends_on, used_variables
261
261
 
262
262
 
263
+ def validate_extra_and_required_fields(
264
+ klass: t.Type[PydanticModel],
265
+ provided_fields: t.Set[str],
266
+ entity_name: str,
267
+ ) -> None:
268
+ missing_required_fields = klass.missing_required_fields(provided_fields)
269
+ if missing_required_fields:
270
+ raise_config_error(
271
+ f"Missing required fields {missing_required_fields} in the {entity_name}"
272
+ )
273
+
274
+ extra_fields = klass.extra_fields(provided_fields)
275
+ if extra_fields:
276
+ raise_config_error(f"Invalid extra fields {extra_fields} in the {entity_name}")
277
+
278
+
263
279
  def single_value_or_tuple(values: t.Sequence) -> exp.Identifier | exp.Tuple:
264
280
  return (
265
281
  exp.to_identifier(values[0])
@@ -31,6 +31,7 @@ from sqlmesh.core.model.common import (
31
31
  parse_dependencies,
32
32
  single_value_or_tuple,
33
33
  sorted_python_env_payloads,
34
+ validate_extra_and_required_fields,
34
35
  )
35
36
  from sqlmesh.core.model.meta import ModelMeta, FunctionCall
36
37
  from sqlmesh.core.model.kind import (
@@ -2190,15 +2191,11 @@ def load_sql_based_model(
2190
2191
  seed_properties = {
2191
2192
  p.name.lower(): p.args.get("value") for p in common_kwargs.pop("kind").expressions
2192
2193
  }
2193
- try:
2194
- return create_seed_model(
2195
- name,
2196
- SeedKind(**seed_properties),
2197
- **common_kwargs,
2198
- )
2199
- except Exception as ex:
2200
- raise_config_error(str(ex), path)
2201
- raise
2194
+ return create_seed_model(
2195
+ name,
2196
+ SeedKind(**seed_properties),
2197
+ **common_kwargs,
2198
+ )
2202
2199
 
2203
2200
 
2204
2201
  def create_sql_model(
@@ -2398,7 +2395,9 @@ def _create_model(
2398
2395
  blueprint_variables: t.Optional[t.Dict[str, t.Any]] = None,
2399
2396
  **kwargs: t.Any,
2400
2397
  ) -> Model:
2401
- _validate_model_fields(klass, {"name", *kwargs} - {"grain", "table_properties"}, path)
2398
+ validate_extra_and_required_fields(
2399
+ klass, {"name", *kwargs} - {"grain", "table_properties"}, "model definition"
2400
+ )
2402
2401
 
2403
2402
  for prop in PROPERTIES:
2404
2403
  kwargs[prop] = _resolve_properties((defaults or {}).get(prop), kwargs.get(prop))
@@ -2457,21 +2456,17 @@ def _create_model(
2457
2456
  for jinja_macro in jinja_macros.root_macros.values():
2458
2457
  used_variables.update(extract_macro_references_and_variables(jinja_macro.definition)[1])
2459
2458
 
2460
- try:
2461
- model = klass(
2462
- name=name,
2463
- **{
2464
- **(defaults or {}),
2465
- "jinja_macros": jinja_macros or JinjaMacroRegistry(),
2466
- "dialect": dialect,
2467
- "depends_on": depends_on,
2468
- "physical_schema_override": physical_schema_override,
2469
- **kwargs,
2470
- },
2471
- )
2472
- except Exception as ex:
2473
- raise_config_error(str(ex), location=path)
2474
- raise
2459
+ model = klass(
2460
+ name=name,
2461
+ **{
2462
+ **(defaults or {}),
2463
+ "jinja_macros": jinja_macros or JinjaMacroRegistry(),
2464
+ "dialect": dialect,
2465
+ "depends_on": depends_on,
2466
+ "physical_schema_override": physical_schema_override,
2467
+ **kwargs,
2468
+ },
2469
+ )
2475
2470
 
2476
2471
  audit_definitions = {
2477
2472
  **(audit_definitions or {}),
@@ -2636,19 +2631,6 @@ def _resolve_properties(
2636
2631
  return None
2637
2632
 
2638
2633
 
2639
- def _validate_model_fields(klass: t.Type[_Model], provided_fields: t.Set[str], path: Path) -> None:
2640
- missing_required_fields = klass.missing_required_fields(provided_fields)
2641
- if missing_required_fields:
2642
- raise_config_error(
2643
- f"Missing required fields {missing_required_fields} in the model definition",
2644
- path,
2645
- )
2646
-
2647
- extra_fields = klass.extra_fields(provided_fields)
2648
- if extra_fields:
2649
- raise_config_error(f"Invalid extra fields {extra_fields} in the model definition", path)
2650
-
2651
-
2652
2634
  def _list_of_calls_to_exp(value: t.List[t.Tuple[str, t.Dict[str, t.Any]]]) -> exp.Expression:
2653
2635
  return exp.Tuple(
2654
2636
  expressions=[
@@ -12,7 +12,11 @@ from sqlglot.optimizer.simplify import gen
12
12
  from sqlglot.time import format_time
13
13
 
14
14
  from sqlmesh.core import dialect as d
15
- from sqlmesh.core.model.common import parse_properties, properties_validator
15
+ from sqlmesh.core.model.common import (
16
+ parse_properties,
17
+ properties_validator,
18
+ validate_extra_and_required_fields,
19
+ )
16
20
  from sqlmesh.core.model.seed import CsvSettings
17
21
  from sqlmesh.utils.errors import ConfigError
18
22
  from sqlmesh.utils.pydantic import (
@@ -1011,6 +1015,7 @@ def create_model_kind(v: t.Any, dialect: str, defaults: t.Dict[str, t.Any]) -> M
1011
1015
  actual_kind_type, _ = custom_materialization
1012
1016
  return actual_kind_type(**props)
1013
1017
 
1018
+ validate_extra_and_required_fields(kind_type, set(props), f"model kind '{name}'")
1014
1019
  return kind_type(**props)
1015
1020
 
1016
1021
  name = (v.name if isinstance(v, exp.Expression) else str(v)).upper()
@@ -355,7 +355,7 @@ class ModelMeta(_Node):
355
355
  and not (kind.is_view and kind.materialized)
356
356
  ):
357
357
  name = field[:-1] if field.endswith("_") else field
358
- raise ValueError(f"{name} field cannot be set for {kind} models")
358
+ raise ValueError(f"{name} field cannot be set for {kind.name} models")
359
359
  if kind.is_incremental_by_partition and not getattr(self, "partitioned_by_", None):
360
360
  raise ValueError(f"partitioned_by field is required for {kind.name} models")
361
361
 
sqlmesh/utils/pydantic.py CHANGED
@@ -211,6 +211,20 @@ def positive_int_validator(v: t.Any) -> int:
211
211
  return v
212
212
 
213
213
 
214
+ def validation_error_message(error: pydantic.ValidationError, base: str) -> str:
215
+ errors = "\n ".join(_formatted_validation_errors(error))
216
+ return f"{base}\n {errors}"
217
+
218
+
219
+ def _formatted_validation_errors(error: pydantic.ValidationError) -> t.List[str]:
220
+ result = []
221
+ for e in error.errors():
222
+ msg = e["msg"]
223
+ loc: t.Optional[t.Tuple] = e.get("loc")
224
+ result.append(f"Invalid field '{loc[0]}':\n {msg}" if loc else msg)
225
+ return result
226
+
227
+
214
228
  def _get_field(
215
229
  v: t.Any,
216
230
  values: t.Any,
@@ -281,6 +295,9 @@ def cron_validator(v: t.Any) -> str:
281
295
 
282
296
  from croniter import CroniterBadCronError, croniter
283
297
 
298
+ if not isinstance(v, str):
299
+ raise ValueError(f"Invalid cron expression '{v}'. Value must be a string.")
300
+
284
301
  try:
285
302
  croniter(v)
286
303
  except CroniterBadCronError:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlmesh
3
- Version: 0.184.1.dev4
3
+ Version: 0.184.1.dev5
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=DRovDXI-9D9xeYDP7t8Fq7mI31S2btlN-LHPOK3y7PA,7240
2
- sqlmesh/_version.py,sha256=Ys9WW07CQf_ulUpBnvVsMtwBdVZ-7rZp9Hri1r2_pgM,528
2
+ sqlmesh/_version.py,sha256=ZNuAQ7PbIqwJM-d2X51SzdTnNJ9SLbYDmFE8k2HZhH8,528
3
3
  sqlmesh/magics.py,sha256=9oY1Uz8uwsuTtPRg9HTYDxnGiJ7-OVRCpmCgAhbKHUU,39431
4
4
  sqlmesh/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  sqlmesh/cicd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -18,7 +18,7 @@ sqlmesh/core/context_diff.py,sha256=s9toP17d4tJfOpFH91LcjGK2CM64PVuB0MPkeFgF4hQ,
18
18
  sqlmesh/core/dialect.py,sha256=fPTV517IOS0nWMxYznNNQnXkQkFFrPOSKe8ghsQ0o8A,49759
19
19
  sqlmesh/core/environment.py,sha256=0TTQf4C4LXwf37fm-dfYv1qyG7vtZfQI5rizgm5g0j0,11442
20
20
  sqlmesh/core/lineage.py,sha256=zjB0Zfamo2Fja2r5SSZPMbrEKTXr1WjozZPVqvxdybI,3143
21
- sqlmesh/core/loader.py,sha256=97_nTWdNdEnz-LNK7AO-tkH9mo_lpe5vJIDGMvaL-bs,31979
21
+ sqlmesh/core/loader.py,sha256=5ty4qY4qQFQuinhtNRzB-l5yvU4TgdPPW_Y_9VrnS2U,32244
22
22
  sqlmesh/core/macros.py,sha256=itPrfJt8jXTtg5BMfMHShXca9sBpgeNGdv5hBhCUh90,58851
23
23
  sqlmesh/core/node.py,sha256=r4_1MRTPcU0MAlwZ5KzrykLT58B7dkKvHzPCsJmEKD8,14497
24
24
  sqlmesh/core/notification_target.py,sha256=PPGoDrgbRKxr27vJEu03XqNTQLYTw0ZF_b0yAapxGeI,16158
@@ -41,20 +41,20 @@ sqlmesh/core/config/__init__.py,sha256=b4gFb04tpeZpowqJD-7h3U3TLgxrpQhZahVEAo6VW
41
41
  sqlmesh/core/config/base.py,sha256=t8NQmsgQoZSc-k0dlDiCb8t1jj0AMYdGZ-6se9q_Pks,4898
42
42
  sqlmesh/core/config/categorizer.py,sha256=6vzUoNLjR6GOEb_2mYVz2TwmMv2BfldgHX2u-Le5HZs,1975
43
43
  sqlmesh/core/config/common.py,sha256=-o_HoRFtR4u84frg_TLno7z7vS9II6ASiOayb59MKHo,2806
44
- sqlmesh/core/config/connection.py,sha256=5eGxU0tU8C6gOPC5oNUElX_0-Wc9tzG5eCWbVYR-e_E,69713
44
+ sqlmesh/core/config/connection.py,sha256=hWwoMeB8MD_ou57fJG_Rb0tmzHwqVjR9rR1fEs_Xu50,70008
45
45
  sqlmesh/core/config/feature_flag.py,sha256=JRcD31OG_t2cYc24meKbHDGB0iVID0P07V2oOeB_mgA,203
46
46
  sqlmesh/core/config/format.py,sha256=6CXFbvnor56xbldKE-Vrm9k_ABRoY4v6vgIb3mCihiQ,1355
47
47
  sqlmesh/core/config/gateway.py,sha256=tYngyqwd_4Qr9lhcv2hlvLvb_2pgYYtKu6hdGsTr-4I,1931
48
48
  sqlmesh/core/config/janitor.py,sha256=NP0i51V8XwMrHw8uuwQknivuudIleNiFBtBnMuXmfIY,362
49
49
  sqlmesh/core/config/linter.py,sha256=4Fh6UgY5FrRD9tk_R41Y-M_r91Wh7EQW3Pc1IdRN9Cg,1287
50
- sqlmesh/core/config/loader.py,sha256=Xp8TA4XFCsiD5vK-wgscpNCNE_6k-rRyBCmVjWRe0U0,6954
50
+ sqlmesh/core/config/loader.py,sha256=Jcxp5Y6fCqg_BFQ03h9XVWhEQKESy5e2pomjvxh2Qa8,7538
51
51
  sqlmesh/core/config/migration.py,sha256=3lZIlmIcQH3_hIEm3Y3jFtvpw0YXzRzAnk4OdiklO6M,408
52
52
  sqlmesh/core/config/model.py,sha256=GIz9kAfKD2NEXNzCZCQ17-CK2OtqN6WgeG1fvibcChM,3650
53
53
  sqlmesh/core/config/naming.py,sha256=KVGaxUgswoQajXR_cHFJvgkmEFcU1V182GkOH1SJxuE,326
54
54
  sqlmesh/core/config/plan.py,sha256=Sql_bdO2H_vVrIYosf8rWOTRVoMURciX7mEcbMNFFdg,1389
55
55
  sqlmesh/core/config/root.py,sha256=XIN-5zPJrQdlXIalqSMpKNPkrhCPQLjdwNpcEsWQTjI,14540
56
56
  sqlmesh/core/config/run.py,sha256=rIK0QnN_vArrwps2TXGVEbvao2AnGZgzXo7EliJa42E,852
57
- sqlmesh/core/config/scheduler.py,sha256=JCGiKC1m_2sv2_7F6ar9qQOrSWkxSL-f9jlSr4Lv3ZA,6500
57
+ sqlmesh/core/config/scheduler.py,sha256=essKKkJ6jD5gRT_l-WiKwGKVO1hpDlnf_UdrCvyN5JY,6786
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=BAM_U7Vsi0k37XHu_nNnu3whXxuTVDey_uZe3aelKYY,1033
@@ -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=hzpGPXxp2LFMEp6gm-8DULJKCBDGf-1kTQcfNt0xrRM,7028
88
- sqlmesh/core/model/common.py,sha256=Lr2o0KCMt3HPqlc_4uiNz5BhYSUdm5bzvjCaIz58H7A,15724
88
+ sqlmesh/core/model/common.py,sha256=J3ukpCEvZyfiYlG38aMhqxlR-Tyq2Sm2dzg5SOnldXc,16279
89
89
  sqlmesh/core/model/decorator.py,sha256=v_sVudNROGrtj5cZ3vgcOFnwPdzwoUGY6REAkQpIMQc,8927
90
- sqlmesh/core/model/definition.py,sha256=Uc0sWFosZ7V_VcFB0iVwKQotuxxrHxMqtiYJH_A2_lg,109132
91
- sqlmesh/core/model/kind.py,sha256=em6wq0W4pDnxl9sBgNweosnZH1on3h349t0Pn76wwBM,35867
92
- sqlmesh/core/model/meta.py,sha256=v-g1lnGPoeZ2SjV2CbVjvlec9buydiOFKkZWUm2dQPs,19071
90
+ sqlmesh/core/model/definition.py,sha256=vR9Y48WTZTHbjlvuQltueXNxBtVoWpxCw4D9cikRqw4,108422
91
+ sqlmesh/core/model/kind.py,sha256=i6_AMBarXPGPoMdF9kzBkyqS9tu__a2339-BoX7TgCM,36010
92
+ sqlmesh/core/model/meta.py,sha256=Hxn5BjfnGATjopHQ4Odok3FoO0X1Ulb2gm6aAvwQhP0,19076
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
@@ -264,10 +264,10 @@ sqlmesh/utils/jinja.py,sha256=6Iob2Pv88L2rCaHyl_V90b5GKsG9hI10Ua_FRWhQIl0,23628
264
264
  sqlmesh/utils/metaprogramming.py,sha256=i1rxWi-oxdh1VwKoBh5Qvy0GgHm9GaDZMvIrv3QXGt4,23083
265
265
  sqlmesh/utils/migration.py,sha256=R7Ck6FX-LfcujGy7sgS0kDWlK-xAEBODr3gqIQ8gC08,835
266
266
  sqlmesh/utils/pandas.py,sha256=WmNlTLuv_qLelrcTnwb05QMaW53AYM6dpOW0o3dz6qM,2051
267
- sqlmesh/utils/pydantic.py,sha256=ioaAzYF42PutEJRyAS11-AHguiCG3yWI6VRcTVa2G-g,10470
267
+ sqlmesh/utils/pydantic.py,sha256=-u69PDY-4FLR7ODNKBoN7PsPNmZ0wdhsJcCAG2P6vyY,11061
268
268
  sqlmesh/utils/rich.py,sha256=xNZyPCqEc4TAlJlsEthg-5eYUWpaizz0QjBzO7a1Yv4,1509
269
269
  sqlmesh/utils/yaml.py,sha256=np-WVcwmwsKghCgAj1OBBMsK1SXSRn4wR-H37cGiFr8,2282
270
- sqlmesh-0.184.1.dev4.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
270
+ sqlmesh-0.184.1.dev5.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
271
271
  web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
272
272
  web/client/dist/index.html,sha256=nPqIDCJmonOaEAp4hhwrwgPdwt_F-5zzw-WW1kJqq3I,5472
273
273
  web/client/dist/assets/Audits-DiRd7NXk.js,sha256=Q5dIFqsHps-vVYD8037NpTPW_1juQgn_Ov45smEm7Y8,1041
@@ -385,8 +385,8 @@ web/server/api/endpoints/models.py,sha256=SzS5bshzdXyM6hb948sZ_3k-xhpGCHkxkb7pHz
385
385
  web/server/api/endpoints/modules.py,sha256=8hqqgonGay_mJmpCw0IdbjsPhWlQH2VLdKAqha-myac,468
386
386
  web/server/api/endpoints/plan.py,sha256=OYuQ_4dgbhG9ibTcX1a8mvYgH3ANxw9Fhbb4wg6QWqc,9222
387
387
  web/server/api/endpoints/table_diff.py,sha256=Wd5YxeKbZB7AkrDvqFgvV9ZQlnKYOF1n5W_w2EHE_Zw,2085
388
- sqlmesh-0.184.1.dev4.dist-info/METADATA,sha256=HKBXrtTUmWXoyLQflnlaP6ahqs8L_3ZUuM9gn18M88M,25498
389
- sqlmesh-0.184.1.dev4.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
390
- sqlmesh-0.184.1.dev4.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
391
- sqlmesh-0.184.1.dev4.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
392
- sqlmesh-0.184.1.dev4.dist-info/RECORD,,
388
+ sqlmesh-0.184.1.dev5.dist-info/METADATA,sha256=tO0x611zOT7wWMvmGEX7XTmL-wtUanQ0ZMCcF_aHbUg,25498
389
+ sqlmesh-0.184.1.dev5.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
390
+ sqlmesh-0.184.1.dev5.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
391
+ sqlmesh-0.184.1.dev5.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
392
+ sqlmesh-0.184.1.dev5.dist-info/RECORD,,