From 68c8a21e3f3366dd3c86055527651a9fdc5e227f Mon Sep 17 00:00:00 2001 From: Pankaj Koti Date: Tue, 24 Feb 2026 20:05:18 +0530 Subject: [PATCH 1/3] Refactor _handle_no_precursors_or_descendants to reduce code complexity --- cosmos/dbt/selector.py | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/cosmos/dbt/selector.py b/cosmos/dbt/selector.py index 1c3b61b8a0..9673a876e8 100644 --- a/cosmos/dbt/selector.py +++ b/cosmos/dbt/selector.py @@ -443,28 +443,24 @@ def load_from_statement(self, statement: str) -> None: else: self._handle_no_precursors_or_descendants(item, node_name) - # TODO: Refactor this method to remove the noqa: C901 in a separate PR. - def _handle_no_precursors_or_descendants(self, item: str, node_name: str) -> None: # noqa: C901 - if node_name.startswith(PATH_SELECTOR): - self._parse_path_selector(item) - elif "/" in node_name: + def _handle_no_precursors_or_descendants(self, item: str, node_name: str) -> None: + prefix_handlers = { + PATH_SELECTOR: "_parse_path_selector", + TAG_SELECTOR: "_parse_tag_selector", + CONFIG_SELECTOR: "_parse_config_selector", + SOURCE_SELECTOR: "_parse_source_selector", + EXPOSURE_SELECTOR: "_parse_exposure_selector", + PACKAGE_SELECTOR: "_parse_package_selector", + RESOURCE_TYPE_SELECTOR: "_parse_resource_type_selector", + EXCLUDE_RESOURCE_TYPE_SELECTOR: "_parse_exclude_resource_type_selector", + FQN_SELECTOR: "_parse_fqn_selector", + } + for prefix, method_name in prefix_handlers.items(): + if node_name.startswith(prefix): + getattr(self, method_name)(item) + return + if "/" in node_name: self._parse_path_selector(f"{PATH_SELECTOR}{node_name}") - elif node_name.startswith(TAG_SELECTOR): - self._parse_tag_selector(item) - elif node_name.startswith(CONFIG_SELECTOR): - self._parse_config_selector(item) - elif node_name.startswith(SOURCE_SELECTOR): - self._parse_source_selector(item) - elif node_name.startswith(EXPOSURE_SELECTOR): - self._parse_exposure_selector(item) - elif node_name.startswith(PACKAGE_SELECTOR): - self._parse_package_selector(item) - elif node_name.startswith(RESOURCE_TYPE_SELECTOR): - self._parse_resource_type_selector(item) - elif node_name.startswith(EXCLUDE_RESOURCE_TYPE_SELECTOR): - self._parse_exclude_resource_type_selector(item) - elif node_name.startswith(FQN_SELECTOR): - self._parse_fqn_selector(item) elif self._is_bare_identifier(node_name): self._parse_bare_identifier(node_name) else: From 1d542f145803caa716300f96efafaa694ba81d70 Mon Sep 17 00:00:00 2001 From: Pankaj Koti Date: Tue, 24 Feb 2026 20:35:21 +0530 Subject: [PATCH 2/3] Remove noqa from _should_include_node --- cosmos/dbt/selector.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cosmos/dbt/selector.py b/cosmos/dbt/selector.py index 9673a876e8..dc8bed9f39 100644 --- a/cosmos/dbt/selector.py +++ b/cosmos/dbt/selector.py @@ -632,8 +632,7 @@ def _should_include_based_on_non_meta_and_non_tag_config(self, node: DbtNode, co return False return True - # TODO: Refactor this method to remove the noqa: C901 in a separate PR. - def _should_include_node(self, node_id: str, node: DbtNode) -> bool: # noqa: C901 + def _should_include_node(self, node_id: str, node: DbtNode) -> bool: """ Checks if a single node should be included. Only runs once per node with caching.""" logger.debug("Inspecting if the node <%s> should be included.", node_id) From df6f6b08adf4dbcdd8ed338d3fdb10164e66151d Mon Sep 17 00:00:00 2001 From: Pankaj Koti Date: Tue, 24 Feb 2026 20:50:18 +0530 Subject: [PATCH 3/3] Update cosmos/dbt/selector.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- cosmos/dbt/selector.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cosmos/dbt/selector.py b/cosmos/dbt/selector.py index dc8bed9f39..cdde43a198 100644 --- a/cosmos/dbt/selector.py +++ b/cosmos/dbt/selector.py @@ -445,19 +445,19 @@ def load_from_statement(self, statement: str) -> None: def _handle_no_precursors_or_descendants(self, item: str, node_name: str) -> None: prefix_handlers = { - PATH_SELECTOR: "_parse_path_selector", - TAG_SELECTOR: "_parse_tag_selector", - CONFIG_SELECTOR: "_parse_config_selector", - SOURCE_SELECTOR: "_parse_source_selector", - EXPOSURE_SELECTOR: "_parse_exposure_selector", - PACKAGE_SELECTOR: "_parse_package_selector", - RESOURCE_TYPE_SELECTOR: "_parse_resource_type_selector", - EXCLUDE_RESOURCE_TYPE_SELECTOR: "_parse_exclude_resource_type_selector", - FQN_SELECTOR: "_parse_fqn_selector", + PATH_SELECTOR: self._parse_path_selector, + TAG_SELECTOR: self._parse_tag_selector, + CONFIG_SELECTOR: self._parse_config_selector, + SOURCE_SELECTOR: self._parse_source_selector, + EXPOSURE_SELECTOR: self._parse_exposure_selector, + PACKAGE_SELECTOR: self._parse_package_selector, + RESOURCE_TYPE_SELECTOR: self._parse_resource_type_selector, + EXCLUDE_RESOURCE_TYPE_SELECTOR: self._parse_exclude_resource_type_selector, + FQN_SELECTOR: self._parse_fqn_selector, } - for prefix, method_name in prefix_handlers.items(): + for prefix, handler in prefix_handlers.items(): if node_name.startswith(prefix): - getattr(self, method_name)(item) + handler(item) return if "/" in node_name: self._parse_path_selector(f"{PATH_SELECTOR}{node_name}")