2222
2323from sqlmesh .core import constants as c
2424from sqlmesh .core import dialect as d
25- from sqlmesh .core .macros import MacroRegistry , macro
25+ from sqlmesh .core .macros import MacroRegistry , MacroStrTemplate , macro
2626from sqlmesh .core .model .common import expression_validator
2727from sqlmesh .core .model .kind import ModelKindName , SeedKind
2828from sqlmesh .core .model .meta import ModelMeta
@@ -1435,6 +1435,38 @@ def load_sql_based_model(
14351435 path ,
14361436 )
14371437
1438+ unrendered_signals = None
1439+ for prop in meta .expressions :
1440+ if prop .name .lower () == "signals" :
1441+ unrendered_signals = prop .args .get ("value" )
1442+
1443+ meta_python_env = _python_env (
1444+ expressions = meta ,
1445+ jinja_macro_references = None ,
1446+ module_path = module_path ,
1447+ macros = macros or macro .get_registry (),
1448+ variables = variables ,
1449+ path = path ,
1450+ )
1451+ meta_renderer = ExpressionRenderer (
1452+ meta ,
1453+ dialect ,
1454+ [],
1455+ path = path ,
1456+ jinja_macro_registry = jinja_macros ,
1457+ python_env = meta_python_env ,
1458+ default_catalog = default_catalog ,
1459+ quote_identifiers = False ,
1460+ )
1461+ rendered_meta_exprs = meta_renderer .render ()
1462+ if rendered_meta_exprs is None or len (rendered_meta_exprs ) != 1 :
1463+ raise_config_error (
1464+ f"Invalid MODEL statement:\n { meta .sql (dialect = dialect , pretty = True )} " ,
1465+ path ,
1466+ )
1467+ raise
1468+ rendered_meta = rendered_meta_exprs [0 ]
1469+
14381470 # Extract the query and any pre/post statements
14391471 query_or_seed_insert , pre_statements , post_statements = _split_sql_model_statements (
14401472 expressions [1 :], path
@@ -1443,11 +1475,16 @@ def load_sql_based_model(
14431475 meta_fields : t .Dict [str , t .Any ] = {
14441476 "dialect" : dialect ,
14451477 "description" : (
1446- "\n " .join (comment .strip () for comment in meta .comments ) if meta .comments else None
1478+ "\n " .join (comment .strip () for comment in rendered_meta .comments )
1479+ if rendered_meta .comments
1480+ else None
14471481 ),
1448- ** {prop .name .lower (): prop .args .get ("value" ) for prop in meta .expressions },
1482+ ** {prop .name .lower (): prop .args .get ("value" ) for prop in rendered_meta .expressions },
14491483 ** kwargs ,
14501484 }
1485+ if unrendered_signals :
1486+ # Signals must remain unrendered, so that they can be rendered later at evaluation runtime.
1487+ meta_fields ["signals" ] = unrendered_signals
14511488
14521489 name = meta_fields .pop ("name" , "" )
14531490 if not name :
@@ -1465,8 +1502,8 @@ def load_sql_based_model(
14651502 )
14661503
14671504 jinja_macros = (jinja_macros or JinjaMacroRegistry ()).trim (jinja_macro_references )
1468- for macro in jinja_macros .root_macros .values ():
1469- used_variables .update (extract_macro_references_and_variables (macro .definition )[1 ])
1505+ for jinja_macro in jinja_macros .root_macros .values ():
1506+ used_variables .update (extract_macro_references_and_variables (jinja_macro .definition )[1 ])
14701507
14711508 common_kwargs = dict (
14721509 pre_statements = pre_statements ,
@@ -1867,7 +1904,7 @@ def _python_env(
18671904 expressions = ensure_list (expressions )
18681905 for expression in expressions :
18691906 if not isinstance (expression , d .Jinja ):
1870- for macro_func_or_var in expression .find_all (d .MacroFunc , d .MacroVar ):
1907+ for macro_func_or_var in expression .find_all (d .MacroFunc , d .MacroVar , exp . Identifier ):
18711908 if macro_func_or_var .__class__ is d .MacroFunc :
18721909 name = macro_func_or_var .this .name .lower ()
18731910 if name in macros :
@@ -1888,6 +1925,15 @@ def _python_env(
18881925 used_macros [name ] = macros [name ]
18891926 elif name in variables :
18901927 used_variables .add (name )
1928+ elif (
1929+ isinstance (macro_func_or_var , exp .Identifier ) and "@" in macro_func_or_var .this
1930+ ):
1931+ for _ , identifier , braced_identifier , _ in MacroStrTemplate .pattern .findall (
1932+ macro_func_or_var .this
1933+ ):
1934+ var_name = braced_identifier or identifier
1935+ if var_name in variables :
1936+ used_variables .add (var_name )
18911937
18921938 for macro_ref in jinja_macro_references or set ():
18931939 if macro_ref .package is None and macro_ref .name in macros :
0 commit comments