sqlmesh 0.185.2.dev4__py3-none-any.whl → 0.186.1__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.185.2.dev4'
21
- __version_tuple__ = version_tuple = (0, 185, 2, 'dev4')
20
+ __version__ = version = '0.186.1'
21
+ __version_tuple__ = version_tuple = (0, 186, 1)
@@ -13,6 +13,7 @@ from functools import partial
13
13
 
14
14
  import pydantic
15
15
  from pydantic import Field
16
+ from pydantic_core import from_json
16
17
  from packaging import version
17
18
  from sqlglot import exp
18
19
  from sqlglot.helper import subclasses
@@ -33,6 +34,7 @@ from sqlmesh.utils.pydantic import (
33
34
  field_validator,
34
35
  model_validator,
35
36
  validation_error_message,
37
+ get_concrete_types_from_typehint,
36
38
  )
37
39
  from sqlmesh.utils.aws import validate_s3_uri
38
40
 
@@ -177,6 +179,42 @@ class ConnectionConfig(abc.ABC, BaseConfig):
177
179
  return self.db
178
180
  return None
179
181
 
182
+ @model_validator(mode="before")
183
+ @classmethod
184
+ def _expand_json_strings_to_concrete_types(cls, data: t.Any) -> t.Any:
185
+ """
186
+ There are situations where a connection config class has a field that is some kind of complex type
187
+ (eg a list of strings or a dict) but the value is being supplied from a source such as an environment variable
188
+
189
+ When this happens, the value is supplied as a string rather than a Python object. We need some way
190
+ of turning this string into the corresponding Python list or dict.
191
+
192
+ Rather than doing this piecemeal on every config subclass, this provides a generic implementatation
193
+ to identify fields that may be be supplied as JSON strings and handle them transparently
194
+ """
195
+ if data and isinstance(data, dict):
196
+ for maybe_json_field_name in cls._get_list_and_dict_field_names():
197
+ if (value := data.get(maybe_json_field_name)) and isinstance(value, str):
198
+ # crude JSON check as we dont want to try and parse every string we get
199
+ value = value.strip()
200
+ if value.startswith("{") or value.startswith("["):
201
+ data[maybe_json_field_name] = from_json(value)
202
+
203
+ return data
204
+
205
+ @classmethod
206
+ def _get_list_and_dict_field_names(cls) -> t.Set[str]:
207
+ field_names = set()
208
+ for name, field in cls.model_fields.items():
209
+ if field.annotation:
210
+ field_types = get_concrete_types_from_typehint(field.annotation)
211
+
212
+ # check if the field type is something that could concievably be supplied as a json string
213
+ if any(ft is t for t in (list, tuple, set, dict) for ft in field_types):
214
+ field_names.add(name)
215
+
216
+ return field_names
217
+
180
218
 
181
219
  class DuckDBAttachOptions(BaseConfig):
182
220
  type: str
sqlmesh/core/macros.py CHANGED
@@ -173,6 +173,7 @@ class MacroEvaluator:
173
173
  default_catalog: t.Optional[str] = None,
174
174
  path: Path = Path(),
175
175
  environment_naming_info: t.Optional[EnvironmentNamingInfo] = None,
176
+ model_fqn: t.Optional[str] = None,
176
177
  ):
177
178
  self.dialect = dialect
178
179
  self.generator = MacroDialect().generator()
@@ -198,6 +199,7 @@ class MacroEvaluator:
198
199
  self._snapshots = snapshots if snapshots is not None else {}
199
200
  self._path = path
200
201
  self._environment_naming_info = environment_naming_info
202
+ self._model_fqn = model_fqn
201
203
 
202
204
  prepare_env(self.python_env, self.env)
203
205
  for k, v in self.python_env.items():
@@ -476,6 +478,12 @@ class MacroEvaluator:
476
478
  raise SQLMeshError("Model name is not available in the macro evaluator.")
477
479
  return this_model.sql(dialect=self.dialect, identify=True, comments=False)
478
480
 
481
+ @property
482
+ def this_model_fqn(self) -> str:
483
+ if self._model_fqn is None:
484
+ raise SQLMeshError("Model name is not available in the macro evaluator.")
485
+ return self._model_fqn
486
+
479
487
  @property
480
488
  def engine_adapter(self) -> EngineAdapter:
481
489
  engine_adapter = self.locals.get("engine_adapter")
@@ -2488,22 +2488,27 @@ def _create_model(
2488
2488
 
2489
2489
  model.audit_definitions.update(audit_definitions)
2490
2490
 
2491
- from sqlmesh.core.audit.builtin import BUILT_IN_AUDITS
2491
+ # Any macro referenced in audits or signals needs to be treated as metadata-only
2492
+ statements.extend((audit.query, True) for audit in audit_definitions.values())
2492
2493
 
2493
2494
  # Ensure that all audits referenced in the model are defined
2495
+ from sqlmesh.core.audit.builtin import BUILT_IN_AUDITS
2496
+
2494
2497
  available_audits = BUILT_IN_AUDITS.keys() | model.audit_definitions.keys()
2495
- for referenced_audit, *_ in model.audits:
2498
+ for referenced_audit, audit_args in model.audits:
2496
2499
  if referenced_audit not in available_audits:
2497
2500
  raise_config_error(f"Audit '{referenced_audit}' is undefined", location=path)
2498
2501
 
2499
- # Any macro referenced in audits or signals needs to be treated as metadata-only
2500
- statements.extend((audit.query, True) for audit in audit_definitions.values())
2501
- for _, audit_args in model.audits:
2502
2502
  statements.extend(
2503
2503
  (audit_arg_expression, True) for audit_arg_expression in audit_args.values()
2504
2504
  )
2505
2505
 
2506
- for _, kwargs in model.signals:
2506
+ signal_definitions = signal_definitions or UniqueKeyDict("signals")
2507
+
2508
+ for referenced_signal, kwargs in model.signals:
2509
+ if referenced_signal and referenced_signal not in signal_definitions:
2510
+ raise_config_error(f"Signal '{referenced_signal}' is undefined", location=path)
2511
+
2507
2512
  statements.extend((signal_kwarg, True) for signal_kwarg in kwargs.values())
2508
2513
 
2509
2514
  python_env = make_python_env(
@@ -2523,7 +2528,7 @@ def _create_model(
2523
2528
  env: t.Dict[str, t.Tuple[t.Any, t.Optional[bool]]] = {}
2524
2529
 
2525
2530
  for signal_name, _ in model.signals:
2526
- if signal_definitions and signal_name in signal_definitions:
2531
+ if signal_name and signal_name in signal_definitions:
2527
2532
  func = signal_definitions[signal_name].func
2528
2533
  setattr(func, c.SQLMESH_METADATA, True)
2529
2534
  build_env(func, env=env, name=signal_name, path=module_path)
@@ -344,6 +344,15 @@ class PlanBuilder:
344
344
  for s_id in dag:
345
345
  snapshot = self._context_diff.snapshots[s_id]
346
346
 
347
+ # Since we are traversing the graph in topological order and the largest interval range is pushed down
348
+ # the graph we just have to check our immediate parents in the graph and not the whole upstream graph.
349
+ restating_parents = [
350
+ self._context_diff.snapshots[s] for s in snapshot.parents if s in restatements
351
+ ]
352
+
353
+ if not restating_parents and snapshot.name not in restate_models:
354
+ continue
355
+
347
356
  if not forward_only_preview_needed:
348
357
  if self._is_dev and not snapshot.is_paused:
349
358
  self._console.log_warning(
@@ -362,15 +371,6 @@ class PlanBuilder:
362
371
  logger.info("Skipping restatement for model '%s'", snapshot.name)
363
372
  continue
364
373
 
365
- # Since we are traversing the graph in topological order and the largest interval range is pushed down
366
- # the graph we just have to check our immediate parents in the graph and not the whole upstream graph.
367
- restating_parents = [
368
- self._context_diff.snapshots[s] for s in snapshot.parents if s in restatements
369
- ]
370
-
371
- if not restating_parents and snapshot.name not in restate_models:
372
- continue
373
-
374
374
  possible_intervals = {
375
375
  restatements[p.snapshot_id] for p in restating_parents if p.is_incremental
376
376
  }
@@ -116,6 +116,7 @@ class BuiltInPlanEvaluator(PlanEvaluator):
116
116
  after_promote_snapshots = all_names - before_promote_snapshots
117
117
  deployability_index_for_evaluation = DeployabilityIndex.all_deployable()
118
118
 
119
+ # Step 1: Run before_all environment statements before doing anything else
119
120
  execute_environment_statements(
120
121
  adapter=self.snapshot_evaluator.adapter,
121
122
  environment_statements=plan.environment_statements or [],
@@ -128,15 +129,24 @@ class BuiltInPlanEvaluator(PlanEvaluator):
128
129
  execution_time=plan.execution_time,
129
130
  )
130
131
 
131
- self._run_audits_for_metadata_snapshots(plan, new_snapshots)
132
-
132
+ # Step 2:Store new snapshot records in the state and create physical tables for them
133
133
  push_completion_status = self._push(plan, snapshots, deployability_index_for_creation)
134
134
  if push_completion_status.is_nothing_to_do:
135
135
  self.console.log_success(
136
136
  "" if plan.restatements else "\nSKIP: No physical layer updates to perform"
137
137
  )
138
+
139
+ # Step 3: Update the intervals for the new forward-only snapshots
138
140
  update_intervals_for_new_snapshots(plan.new_snapshots, self.state_sync)
141
+
142
+ # Step 4: Run audits without evaluations for snapshots that capture audit metadata changes
143
+ self._run_audits_for_metadata_snapshots(plan, new_snapshots)
144
+
145
+ # Step 5: Remove intervals for snapshots that need to be restated
139
146
  self._restate(plan, snapshots_by_name)
147
+
148
+ # Step 6: Backfill missing intervals for snapshots that can be backfilled before updating
149
+ # the schema of production tables
140
150
  first_bf_completion_status = self._backfill(
141
151
  plan,
142
152
  snapshots_by_name,
@@ -144,9 +154,15 @@ class BuiltInPlanEvaluator(PlanEvaluator):
144
154
  deployability_index_for_evaluation,
145
155
  circuit_breaker=circuit_breaker,
146
156
  )
157
+
158
+ # Step 7: Update the target environment record in the state and migrate table schemas for forward-only
159
+ # snapshots if deploying to production
147
160
  promotion_result = self._promote(
148
161
  plan, snapshots, before_promote_snapshots, deployability_index_for_creation
149
162
  )
163
+
164
+ # Step 8: Backfill missing intervals for snapshots that can be backfilled only after updating
165
+ # the schema of production tables
150
166
  second_bf_completion_status = self._backfill(
151
167
  plan,
152
168
  snapshots_by_name,
@@ -154,15 +170,20 @@ class BuiltInPlanEvaluator(PlanEvaluator):
154
170
  deployability_index_for_evaluation,
155
171
  circuit_breaker=circuit_breaker,
156
172
  )
173
+
157
174
  if (
158
175
  first_bf_completion_status.is_nothing_to_do
159
176
  and second_bf_completion_status.is_nothing_to_do
160
177
  ):
161
178
  self.console.log_success("SKIP: No model batches to execute")
179
+
180
+ # Step 9: Update environment views to point at new physical tables and finalize the environment
181
+ # record in the state
162
182
  self._update_views(
163
183
  plan, snapshots, promotion_result, deployability_index_for_evaluation
164
184
  )
165
185
 
186
+ # Step 10: Run after_all environment statements
166
187
  execute_environment_statements(
167
188
  adapter=self.snapshot_evaluator.adapter,
168
189
  environment_statements=plan.environment_statements or [],
sqlmesh/core/renderer.py CHANGED
@@ -169,6 +169,7 @@ class BaseExpressionRenderer:
169
169
  default_catalog=self._default_catalog,
170
170
  path=self._path,
171
171
  environment_naming_info=environment_naming_info,
172
+ model_fqn=self._model_fqn,
172
173
  )
173
174
 
174
175
  start_time, end_time = (
sqlmesh/lsp/main.py CHANGED
@@ -69,10 +69,7 @@ class SQLMeshLanguageServer:
69
69
  # Use user-provided instantiator to build the context
70
70
  created_context = self.context_class(paths=[folder_path])
71
71
  self.lsp_context = LSPContext(created_context)
72
- ls.show_message(
73
- f"Loaded SQLMesh context from {config_path}",
74
- types.MessageType.Info,
75
- )
72
+ loaded_sqlmesh_message(ls, folder_path)
76
73
  return # Exit after successfully loading any config
77
74
  except Exception as e:
78
75
  ls.show_message(
@@ -94,6 +91,9 @@ class SQLMeshLanguageServer:
94
91
  @self.server.feature(API_FEATURE)
95
92
  def api(ls: LanguageServer, request: ApiRequest) -> t.Dict[str, t.Any]:
96
93
  ls.log_trace(f"API request: {request}")
94
+ if self.lsp_context is None:
95
+ current_path = Path.cwd()
96
+ self._ensure_context_in_folder(current_path)
97
97
  if self.lsp_context is None:
98
98
  raise RuntimeError("No context found")
99
99
 
@@ -291,6 +291,20 @@ class SQLMeshLanguageServer:
291
291
  raise RuntimeError("No context found")
292
292
  return self.lsp_context
293
293
 
294
+ def _ensure_context_in_folder(self, folder_uri: Path) -> None:
295
+ if self.lsp_context is not None:
296
+ return
297
+ for ext in ("py", "yml", "yaml"):
298
+ config_path = folder_uri / f"config.{ext}"
299
+ if config_path.exists():
300
+ try:
301
+ created_context = self.context_class(paths=[folder_uri])
302
+ self.lsp_context = LSPContext(created_context)
303
+ loaded_sqlmesh_message(self.server, folder_uri)
304
+ return
305
+ except Exception as e:
306
+ self.server.show_message(f"Error loading context: {e}", types.MessageType.Error)
307
+
294
308
  def _ensure_context_for_document(
295
309
  self,
296
310
  document_uri: URI,
@@ -382,6 +396,13 @@ class SQLMeshLanguageServer:
382
396
  self.server.start_io()
383
397
 
384
398
 
399
+ def loaded_sqlmesh_message(ls: LanguageServer, folder: Path) -> None:
400
+ ls.show_message(
401
+ f"Loaded SQLMesh context from {folder}",
402
+ types.MessageType.Info,
403
+ )
404
+
405
+
385
406
  def main() -> None:
386
407
  # Example instantiator that just uses the same signature as your original `Context` usage.
387
408
  sqlmesh_server = SQLMeshLanguageServer(context_class=Context)
sqlmesh/utils/pydantic.py CHANGED
@@ -306,6 +306,24 @@ def cron_validator(v: t.Any) -> str:
306
306
  return v
307
307
 
308
308
 
309
+ def get_concrete_types_from_typehint(typehint: type[t.Any]) -> set[type[t.Any]]:
310
+ concrete_types = set()
311
+ unpacked = t.get_origin(typehint)
312
+ if unpacked is None:
313
+ if type(typehint) == type(type):
314
+ return {typehint}
315
+ elif unpacked is t.Union:
316
+ for item in t.get_args(typehint):
317
+ if str(item).startswith("typing."):
318
+ concrete_types |= get_concrete_types_from_typehint(item)
319
+ else:
320
+ concrete_types.add(item)
321
+ else:
322
+ concrete_types.add(unpacked)
323
+
324
+ return concrete_types
325
+
326
+
309
327
  if t.TYPE_CHECKING:
310
328
  SQLGlotListOfStrings = t.List[str]
311
329
  SQLGlotString = str
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlmesh
3
- Version: 0.185.2.dev4
3
+ Version: 0.186.1
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=BF3oWNJaV7IVSnNGQaNKA52W-sbcRbnj7QU2wqrSmN8,528
2
+ sqlmesh/_version.py,sha256=ZyYEbKRiUuvbnbcMpZ8ZrN0r56rDLeaI5UqpifrpO7U,515
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
@@ -19,11 +19,11 @@ 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
21
  sqlmesh/core/loader.py,sha256=5ty4qY4qQFQuinhtNRzB-l5yvU4TgdPPW_Y_9VrnS2U,32244
22
- sqlmesh/core/macros.py,sha256=SdDmOC1pBANeTpLI45r913h_qTp7JGjsu7uwdHx181U,59336
22
+ sqlmesh/core/macros.py,sha256=wSKkFDZ2eIvhPENIsQ_7j27zVMHIgT-2juRjGvDeEKM,59620
23
23
  sqlmesh/core/node.py,sha256=r4_1MRTPcU0MAlwZ5KzrykLT58B7dkKvHzPCsJmEKD8,14497
24
24
  sqlmesh/core/notification_target.py,sha256=PPGoDrgbRKxr27vJEu03XqNTQLYTw0ZF_b0yAapxGeI,16158
25
25
  sqlmesh/core/reference.py,sha256=k7OSkLqTjPR8WJjNeFj0xAJ297nZUMgb_iTVwKRRKjc,4875
26
- sqlmesh/core/renderer.py,sha256=n2WEGENL-1Z53sBTI6RVH_yRVneDtNK0GxNElFaQKcE,26597
26
+ sqlmesh/core/renderer.py,sha256=KOr7rQ-RfWiS51cEj2fzdhxCrYbU0A5wNTGwKyeqLt4,26636
27
27
  sqlmesh/core/scheduler.py,sha256=TB03rSvPyaPMRANOJq_O_cNXvu0fc5rVaDVC9olE5kg,34196
28
28
  sqlmesh/core/schema_diff.py,sha256=mE28W51JUQz6q8inSOw2Cds84VPIqPxI6C2ed6xLmrg,29812
29
29
  sqlmesh/core/schema_loader.py,sha256=lvrI9k7hr1P4X4E6t3U-KrcuvdQuw0UdNlN90P2s52w,3563
@@ -41,7 +41,7 @@ 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=scyhg-gq0czu7-2y9n1tBKnLfM0jT51QaYR_hFCeQU8,73917
44
+ sqlmesh/core/config/connection.py,sha256=NlTFCqRVA9S18EfdXELH3Qb79Qfj84Tt-_eW0-4P0Eg,75808
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
@@ -87,15 +87,15 @@ sqlmesh/core/model/__init__.py,sha256=C8GRZ53xuXEA9hQv3BQS9pNNyd9rZ06R_B96UYGhDu
87
87
  sqlmesh/core/model/cache.py,sha256=s-aEFuUmUKITaWHvYbOyRarsjsgoA6vfASK-f-MwJ9k,7257
88
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=vR9Y48WTZTHbjlvuQltueXNxBtVoWpxCw4D9cikRqw4,108422
90
+ sqlmesh/core/model/definition.py,sha256=QBwGNL7Jqg8BGgpZfTtKciRJA7axkI5FShJJjnUDQ4w,108645
91
91
  sqlmesh/core/model/kind.py,sha256=i6_AMBarXPGPoMdF9kzBkyqS9tu__a2339-BoX7TgCM,36010
92
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
96
- sqlmesh/core/plan/builder.py,sha256=ltoUlUr13uoEftYqGzjbnOa_n7-Q1CUiE9R_LgHY9Mc,38471
96
+ sqlmesh/core/plan/builder.py,sha256=Fd5raxq6r6b_3mOZndiI2U7SmliVYevcrpxWNqRV_OE,38471
97
97
  sqlmesh/core/plan/definition.py,sha256=SI3zi2poPkKJKTZogYv60Q7eIOhksaAcFUcu-J2-XqI,13218
98
- sqlmesh/core/plan/evaluator.py,sha256=ocRqGy36RKZyfkGBzaXDnCA1-p8JPkb5IF__ZrmEhL4,25724
98
+ sqlmesh/core/plan/evaluator.py,sha256=RAHJgQoV5Y5SIG_pV2O_Bn0VFlD1yzMC0UrUU6eaB_E,26842
99
99
  sqlmesh/core/snapshot/__init__.py,sha256=Z5HTetNCZGoKF1WAKXk4LWL9dc8EC8lwS2O4TtoBmt4,1317
100
100
  sqlmesh/core/snapshot/cache.py,sha256=MRYi_koDvp2yeQ5NDGoNFzhuJTw7Vh7mI0oJyeVbqio,4022
101
101
  sqlmesh/core/snapshot/categorizer.py,sha256=qGG5870mu1jR2whKisSBH_GFbsyh96RnzJDgkN7DV9g,2482
@@ -159,7 +159,7 @@ sqlmesh/lsp/api.py,sha256=LJdECSaEZoPbu_Xl4KscVG-WLt7_g4dY-zKGO68dH14,2162
159
159
  sqlmesh/lsp/completions.py,sha256=Uo8lUzPBeoB58Eu2642YoAtNI0pgIFWFSvwmuJALTv4,3583
160
160
  sqlmesh/lsp/context.py,sha256=Ff09vrsawdYS-7YcXbGZW_RU-tj_-k8WV7maCghpYp0,1438
161
161
  sqlmesh/lsp/custom.py,sha256=GvNAiW7imPI8xmIx3qLWN5FljGPHFJKh0N5b6aZnwRo,489
162
- sqlmesh/lsp/main.py,sha256=6lxwiZOwlU3LsiCWKPHEA-goRihC_LqhuGJ9-5FJtCc,17223
162
+ sqlmesh/lsp/main.py,sha256=yX4HDvg6MmXvApndvHWUh9tsSXIWoa2hzgN3TtSzT2s,18044
163
163
  sqlmesh/lsp/reference.py,sha256=MiTnNmaGrVs1Scms3jHkZ89Cu8_ZLJGAHcs1LRywFdU,8129
164
164
  sqlmesh/lsp/uri.py,sha256=mvSLbZGmMTHPpliThOtVWiFcHnfJzp1w39q9l-xD2SI,802
165
165
  sqlmesh/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -264,11 +264,11 @@ 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=uKI-ygEtMcGDRzXdBu0RkGmMBkYxwu5O2Wabho841Ls,2196
267
- sqlmesh/utils/pydantic.py,sha256=dywc9i-diWLA3vB-X_28I8NX3BPoSWAjcaP31zkzr0k,11115
267
+ sqlmesh/utils/pydantic.py,sha256=I898jAFqa3qU6lG2uPpRebVFncOUo8ZrLWM_R3K3DHU,11685
268
268
  sqlmesh/utils/rich.py,sha256=xNZyPCqEc4TAlJlsEthg-5eYUWpaizz0QjBzO7a1Yv4,1509
269
269
  sqlmesh/utils/windows.py,sha256=r7Yin4WEwbvH7sKA3hOJtRsclmscNuBeCklCfVPvtQs,611
270
270
  sqlmesh/utils/yaml.py,sha256=np-WVcwmwsKghCgAj1OBBMsK1SXSRn4wR-H37cGiFr8,2282
271
- sqlmesh-0.185.2.dev4.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
271
+ sqlmesh-0.186.1.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
272
272
  web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
273
273
  web/client/dist/index.html,sha256=xQIU9G6dbuTnmbHZ61bSYbh0gYz9A2lb4BRwLlXL94Y,5472
274
274
  web/client/dist/assets/Audits-Dcl7Y5yf.js,sha256=D2CfXzrdXFdD_-7c51tBJCKNwUY9yGeIpDEaRae7V8I,1041
@@ -386,8 +386,8 @@ web/server/api/endpoints/models.py,sha256=ud-lRwriyI_OYg9tZchrBgeiXELiRTLNEodraf
386
386
  web/server/api/endpoints/modules.py,sha256=8hqqgonGay_mJmpCw0IdbjsPhWlQH2VLdKAqha-myac,468
387
387
  web/server/api/endpoints/plan.py,sha256=OYuQ_4dgbhG9ibTcX1a8mvYgH3ANxw9Fhbb4wg6QWqc,9222
388
388
  web/server/api/endpoints/table_diff.py,sha256=Wd5YxeKbZB7AkrDvqFgvV9ZQlnKYOF1n5W_w2EHE_Zw,2085
389
- sqlmesh-0.185.2.dev4.dist-info/METADATA,sha256=RnaoK8IGiPxmEFS-_BG6fp2ocTJsC1K_l-8cuv0Ck60,25523
390
- sqlmesh-0.185.2.dev4.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
391
- sqlmesh-0.185.2.dev4.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
392
- sqlmesh-0.185.2.dev4.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
393
- sqlmesh-0.185.2.dev4.dist-info/RECORD,,
389
+ sqlmesh-0.186.1.dist-info/METADATA,sha256=e1nmr6XMP09suPC39FNfoJ6nLi_puiRGd3E1PqWtC2k,25518
390
+ sqlmesh-0.186.1.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
391
+ sqlmesh-0.186.1.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
392
+ sqlmesh-0.186.1.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
393
+ sqlmesh-0.186.1.dist-info/RECORD,,