@@ -645,7 +645,60 @@ def __hash__(self) -> int:
645645 return hash (self .unique_id )
646646
647647
648- Evaluable : TypeAlias = Model | Source | Snapshot | Seed | Exposure
648+ @dataclass
649+ class Macro :
650+ """Represents a dbt macro.
651+
652+ Attributes:
653+ unique_id: The unique id of the macro (e.g. `macro.package.macro_name`).
654+ name: The name of the macro.
655+ description: The description of the macro.
656+ original_file_path: The path to the macro file
657+ (e.g. `macros/my_macro.sql`).
658+ package_name: The name of the package this macro belongs to.
659+ macro_sql: The SQL code of the macro.
660+ meta: The metadata attached to the macro.
661+ tags: The list of tags attached to the macro.
662+ depends_on: The depends_on of the macro (macros it depends on).
663+ arguments: The list of arguments the macro accepts.
664+ _raw_values: The raw values of the macro in the manifest.
665+ """
666+
667+ unique_id : str
668+ name : str
669+ description : str
670+ original_file_path : str
671+ package_name : str
672+ macro_sql : str
673+ meta : dict [str , Any ]
674+ tags : list [str ]
675+ depends_on : dict [str , list [str ]] = field (default_factory = dict )
676+ arguments : list [dict [str , Any ]] = field (default_factory = list )
677+ _raw_values : dict [str , Any ] = field (default_factory = dict )
678+
679+ @classmethod
680+ def from_node (cls , node_values : dict [str , Any ]) -> "Macro" :
681+ """Create a macro object from a node in the manifest."""
682+ return cls (
683+ unique_id = node_values ["unique_id" ],
684+ name = node_values ["name" ],
685+ description = node_values .get ("description" , "" ),
686+ original_file_path = node_values ["original_file_path" ],
687+ package_name = node_values ["package_name" ],
688+ macro_sql = node_values ["macro_sql" ],
689+ meta = node_values .get ("meta" , {}),
690+ tags = node_values .get ("tags" , []),
691+ depends_on = node_values .get ("depends_on" , {}),
692+ arguments = node_values .get ("arguments" , []),
693+ _raw_values = node_values ,
694+ )
695+
696+ def __hash__ (self ) -> int :
697+ """Compute a unique hash for a macro."""
698+ return hash (self .unique_id )
699+
700+
701+ Evaluable : TypeAlias = Model | Source | Snapshot | Seed | Exposure | Macro
649702
650703
651704class ManifestLoader :
@@ -677,20 +730,27 @@ def __init__(self, file_path: Path, select: Iterable[str] | None = None):
677730 ).items ()
678731 if exposure_values ["package_name" ] == self .project_name
679732 }
733+ self .raw_macros = {
734+ macro_id : macro_values
735+ for macro_id , macro_values in self .raw_manifest .get ("macros" , {}).items ()
736+ if macro_values ["package_name" ] == self .project_name
737+ }
680738
681739 self .models : dict [str , Model ] = {}
682740 self .tests : dict [str , list [dict [str , Any ]]] = defaultdict (list )
683741 self .sources : dict [str , Source ] = {}
684742 self .snapshots : dict [str , Snapshot ] = {}
685743 self .exposures : dict [str , Exposure ] = {}
686744 self .seeds : dict [str , Seed ] = {}
745+ self .macros : dict [str , Macro ] = {}
687746
688747 self ._reindex_tests ()
689748 self ._load_models ()
690749 self ._load_sources ()
691750 self ._load_snapshots ()
692751 self ._load_exposures ()
693752 self ._load_seeds ()
753+ self ._load_macros ()
694754 self ._populate_relatives ()
695755
696756 if select :
@@ -702,6 +762,7 @@ def __init__(self, file_path: Path, select: Iterable[str] | None = None):
702762 + len (self .snapshots )
703763 + len (self .seeds )
704764 + len (self .exposures )
765+ + len (self .macros )
705766 ) == 0 :
706767 logger .warning ("Nothing to evaluate!" )
707768
@@ -740,6 +801,13 @@ def _load_seeds(self) -> None:
740801 seed = Seed .from_node (node_values , self .tests .get (node_id , []))
741802 self .seeds [node_id ] = seed
742803
804+ def _load_macros (self ) -> None :
805+ """Load the macros from the manifest."""
806+ for macro_id , macro_values in self .raw_macros .items ():
807+ if macro_values .get ("resource_type" ) == "macro" :
808+ macro = Macro .from_node (macro_values )
809+ self .macros [macro_id ] = macro
810+
743811 def _reindex_tests (self ) -> None :
744812 """Index tests based on their associated evaluable."""
745813 for node_values in self .raw_nodes .values ():
@@ -796,3 +864,4 @@ def _filter_evaluables(self, select: Iterable[str]) -> None:
796864 self .snapshots = {k : s for k , s in self .snapshots .items () if s .name in selected }
797865 self .exposures = {k : e for k , e in self .exposures .items () if e .name in selected }
798866 self .seeds = {k : s for k , s in self .seeds .items () if s .name in selected }
867+ self .macros = {k : m for k , m in self .macros .items () if m .name in selected }
0 commit comments