|
13 | 13 | from sqlmesh.core import dialect as d |
14 | 14 | from sqlmesh.core.macros import MacroRegistry, MacroStrTemplate |
15 | 15 | from sqlmesh.utils import str_to_bool |
16 | | -from sqlmesh.utils.errors import ConfigError, SQLMeshError, raise_config_error |
| 16 | +from sqlmesh.utils.errors import ConfigError, SQLMeshError, raise_config_error, \ |
| 17 | + ModelBlockFieldValidationMissingFieldsError, ModeBlockExtraFields |
17 | 18 | from sqlmesh.utils.metaprogramming import ( |
18 | 19 | Executable, |
19 | 20 | SqlValue, |
@@ -269,34 +270,29 @@ def validate_extra_and_required_fields( |
269 | 270 | ) -> None: |
270 | 271 | missing_required_fields = klass.missing_required_fields(provided_fields) |
271 | 272 | if missing_required_fields: |
272 | | - field_names = "'" + "', '".join(missing_required_fields) + "'" |
273 | | - raise_config_error( |
274 | | - f"Please add required field{'s' if len(missing_required_fields) > 1 else ''} {field_names} to the {entity_name}." |
| 273 | + raise ModelBlockFieldValidationMissingFieldsError( |
| 274 | + path, missing_required_fields |
275 | 275 | ) |
276 | 276 |
|
277 | 277 | extra_fields = klass.extra_fields(provided_fields) |
278 | 278 | if extra_fields: |
279 | 279 | extra_field_names = "'" + "', '".join(extra_fields) + "'" |
280 | 280 |
|
281 | 281 | all_fields = klass.all_fields() |
282 | | - close_matches = {} |
| 282 | + extra_with_close_match: t.Dict[str, t.Optional[str]] = {} |
283 | 283 | for field in extra_fields: |
284 | 284 | matches = get_close_matches(field, all_fields, n=1) |
285 | 285 | if matches: |
286 | | - close_matches[field] = matches[0] |
| 286 | + extra_with_close_match[field] = matches[0] |
| 287 | + else: |
| 288 | + extra_with_close_match[field] = None |
| 289 | + |
| 290 | + if extra_with_close_match: |
| 291 | + raise ModeBlockExtraFields( |
| 292 | + path, |
| 293 | + extra_fields=extra_with_close_match, |
| 294 | + ) |
287 | 295 |
|
288 | | - if len(close_matches) == 1: |
289 | | - similar_msg = ". Did you mean " + "'" + "', '".join(close_matches.values()) + "'?" |
290 | | - else: |
291 | | - similar = [ |
292 | | - f"- {field}: Did you mean '{match}'?" for field, match in close_matches.items() |
293 | | - ] |
294 | | - similar_msg = "\n\n " + "\n ".join(similar) if similar else "" |
295 | | - |
296 | | - raise_config_error( |
297 | | - f"Invalid field name{'s' if len(extra_fields) > 1 else ''} present in the {entity_name}: {extra_field_names}{similar_msg}", |
298 | | - path, |
299 | | - ) |
300 | 296 |
|
301 | 297 |
|
302 | 298 | def single_value_or_tuple(values: t.Sequence) -> exp.Identifier | exp.Tuple: |
|
0 commit comments