diff --git a/.changes/unreleased/Fixes-20240125-182243.yaml b/.changes/unreleased/Fixes-20240125-182243.yaml new file mode 100644 index 00000000000..e6300cad13c --- /dev/null +++ b/.changes/unreleased/Fixes-20240125-182243.yaml @@ -0,0 +1,7 @@ +kind: Fixes +body: Add TestGenerateCatalogWithExternalNodes, include empty nodes in node selection + during docs generate +time: 2024-01-25T18:22:43.253228-05:00 +custom: + Author: michelleark + Issue: "9456" diff --git a/core/dbt/context/providers.py b/core/dbt/context/providers.py index febc21a546f..5abf6a5b2b4 100644 --- a/core/dbt/context/providers.py +++ b/core/dbt/context/providers.py @@ -60,7 +60,6 @@ MetricArgsError, MissingConfigError, OperationsCannotRefEphemeralNodesError, - PackageNotInDepsError, ParsingError, RefBadContextError, RefArgsError, @@ -638,10 +637,8 @@ def packages_for_node(self) -> Iterable[Project]: package_name = self._node.package_name if package_name != self._config.project_name: - if package_name not in dependencies: - # I don't think this is actually reachable - raise PackageNotInDepsError(package_name, node=self._node) - yield dependencies[package_name] + if package_name in dependencies: + yield dependencies[package_name] yield self._config def _generate_merged(self) -> Mapping[str, Any]: diff --git a/core/dbt/task/generate.py b/core/dbt/task/generate.py index 11084d4dcbd..8cfa5133dfd 100644 --- a/core/dbt/task/generate.py +++ b/core/dbt/task/generate.py @@ -332,6 +332,7 @@ def get_node_selector(self) -> ResourceTypeSelector: manifest=self.manifest, previous_state=self.previous_state, resource_types=NodeType.executable(), + include_empty_nodes=True, ) def get_catalog_results( diff --git a/tests/functional/docs/test_generate.py b/tests/functional/docs/test_generate.py index 7af59722808..129746a0a8a 100644 --- a/tests/functional/docs/test_generate.py +++ b/tests/functional/docs/test_generate.py @@ -1,5 +1,7 @@ import pytest +from unittest import mock +from dbt.plugins.manifest import PluginNodes, ModelNodeArgs from dbt.tests.util import run_dbt, get_manifest sample_seed = """sample_num,sample_bool @@ -95,6 +97,28 @@ def test_catalog_with_sources(self, project): assert len(catalog.sources) == 2 +class TestGenerateCatalogWithExternalNodes(TestBaseGenerate): + @mock.patch("dbt.plugins.get_plugin_manager") + def test_catalog_with_sources(self, get_plugin_manager, project): + project.run_sql("create table {}.external_model (id int)".format(project.test_schema)) + + run_dbt(["build"]) + + external_nodes = PluginNodes() + external_model_node = ModelNodeArgs( + name="external_model", + package_name="external_package", + identifier="external_model", + schema=project.test_schema, + database="dbt", + ) + external_nodes.add_model(external_model_node) + get_plugin_manager.return_value.get_nodes.return_value = external_nodes + catalog = run_dbt(["docs", "generate"]) + + assert "model.external_package.external_model" in catalog.nodes + + class TestGenerateSelectSource(TestBaseGenerate): @pytest.fixture(scope="class") def seeds(self):