diff --git a/dbtmetabase/_exposures.py b/dbtmetabase/_exposures.py index 842a2d5..2feca9c 100644 --- a/dbtmetabase/_exposures.py +++ b/dbtmetabase/_exposures.py @@ -140,7 +140,7 @@ def extract_exposures( f"Visualization: {entity.get('display', 'Unknown').title()}" ) - result = self.__extract_card_exposures(ctx, card=entity) + result = self.__extract_card_exposures(ctx, entity) depends.update(result["depends"]) native_query = result["native_query"] @@ -168,12 +168,9 @@ def extract_exposures( if "id" not in card: continue - depends.update( - self.__extract_card_exposures( - ctx, - card=self.metabase.find_card(uid=card["id"]), - )["depends"] - ) + if card := self.metabase.find_card(uid=card["id"]): + result = self.__extract_card_exposures(ctx, card) + depends.update(result["depends"]) else: _logger.warning("Unexpected collection item '%s'", item["model"]) continue @@ -231,11 +228,7 @@ def extract_exposures( return exposures - def __extract_card_exposures( - self, - ctx: __Context, - card: Optional[Mapping], - ) -> Mapping: + def __extract_card_exposures(self, ctx: __Context, card: Mapping) -> Mapping: """Extracts exposures from Metabase questions.""" depends = set() @@ -251,14 +244,11 @@ def __extract_card_exposures( if str(query_source).startswith("card__"): # Handle questions based on other questions - depends.update( - self.__extract_card_exposures( - ctx, - card=self.metabase.find_card( - uid=query_source.split("__")[-1] - ), - )["depends"] - ) + if source_card := self.metabase.find_card( + uid=query_source.split("__")[-1] + ): + result = self.__extract_card_exposures(ctx, source_card) + depends.update(result["depends"]) elif query_source in ctx.table_names: # Normal question source_table = ctx.table_names.get(query_source) @@ -273,14 +263,12 @@ def __extract_card_exposures( if str(join_source).startswith("card__"): # Handle questions based on other questions - depends.update( - self.__extract_card_exposures( - ctx, - card=self.metabase.find_card( - uid=join_source.split("__")[-1] - ), - )["depends"] - ) + if source_card := self.metabase.find_card( + uid=join_source.split("__")[-1] + ): + result = self.__extract_card_exposures(ctx, source_card) + depends.update(result["depends"]) + continue # Joined model parsed