-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Backport to 1.7.latest] Fix assorted source freshness edgecases so c…
…heck is run or actionable information (#9825) (#9826) * Fix assorted source freshness edgecases so check is run or actionable information (#9825) * Ensure BaseRunner handles nodes without `build_path` Some nodes, like SourceDefinition nodes, don't have a `build_path` property. This is problematic because we take in nodes with no type checking, and assume they have properties sometimes, like `build_path`. This was just the case in BaseRunner's `_handle_generic_exception` and `_handle_interal_exception` methods. Thus to stop dbt from crashing when trying to handle an exception related to a node without a `build_path`, we added an private method to the BaseRunner class for safely trying to get `build_path`. * Use keyword arguments when instantiating `Note` events in freshness.py Previously we were passing arguments during the `Note` event instantiations in freshness.py as positional arguments. This would cause not the desired `Note` event to be emitted, but instead get the message ``` [Note] Don't use positional arguments when constructing logging events ``` which was our fault, not the users'. Additionally, we were passing the level for the event in the `Note` instantiation when we needed to be passing it to the `fire_event` method. * Raise error when `loaded_at_field` is `None` and metadata check isn't possible Previously if a source freshness check didn't have a `loaded_at_field` and metadata source freshness wasn't supported by the adapter, then we'd log a warning message and let the source freshness check continue. This was problematic because the source freshness check couldn't actually continue and the process would raise an error in the form ``` type object argument after ** must be a mapping, not NoneType ``` because the `freshness` variable was never getting set. This error wasn't particularly helpful for any person running into it. So instead of letting that error happen we now deliberately raise an error with helpful information. * Add test which ensures bad source freshness checks raise appropriate error This test directly tests that when a source freshness check doesn't have a `loaded_at_field` and the adapter in use doesn't support metadata checks, then the appropriate error message gets raised. That is, it directly tests the change made in a162d53. This test indirectly tests the changes in both 7ec2f82 and 7b0ff31 as the appropriate error can only be raised because we've fixed other upstream issues via those commits. * Add changelog entry for source freshness edgecase fixes * Update imports of dbt.artifacts to pre-dbt.artifacts locations Moving things to dbt.artifacts started to happen AFTER the release of dbt-core 1.7, thus 1.7 has no concept of dbt.articacts. The changes brought in via the previous commit, were cherry-picked from main (1.8.0 beta) and thus reference dbt.artifacts. This caused everything to blow up, because dbt.artifacts doesn't exist. Here we've updated the dbt.artifacts imports to their pre-dbt.artifacts paths.
- Loading branch information
Showing
7 changed files
with
83 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
kind: Fixes | ||
body: Fix assorted source freshness edgecases so check is run or actionable information | ||
is given | ||
time: 2024-03-26T16:21:00.008936-07:00 | ||
custom: | ||
Author: QMalcolm | ||
Issue: "9078" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
import pytest | ||
|
||
from dbt.contracts.graph.model_config import SourceConfig | ||
from dbt.contracts.graph.nodes import SourceDefinition | ||
from dbt.contracts.graph.unparsed import Quoting | ||
from dbt.node_types import NodeType | ||
|
||
|
||
@pytest.fixture | ||
def basic_parsed_source_definition_object(): | ||
return SourceDefinition( | ||
columns={}, | ||
database="some_db", | ||
description="", | ||
fqn=["test", "source", "my_source", "my_source_table"], | ||
identifier="my_source_table", | ||
loader="stitch", | ||
name="my_source_table", | ||
original_file_path="/root/models/sources.yml", | ||
package_name="test", | ||
path="/root/models/sources.yml", | ||
quoting=Quoting(), | ||
resource_type=NodeType.Source, | ||
schema="some_schema", | ||
source_description="my source description", | ||
source_name="my_source", | ||
unique_id="test.source.my_source.my_source_table", | ||
tags=[], | ||
config=SourceConfig(), | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
from dbt.task.base import BaseRunner | ||
from dbt.contracts.graph.nodes import SourceDefinition | ||
|
||
|
||
class MockRunner(BaseRunner): | ||
def compile(self): | ||
pass | ||
|
||
|
||
class TestBaseRunner: | ||
def test_handle_generic_exception_handles_nodes_without_build_path( | ||
self, basic_parsed_source_definition_object: SourceDefinition | ||
): | ||
# Source definition nodes don't have `build_path` attributes. Thus, this | ||
# test will fail if _handle_generic_exception doesn't account for this | ||
runner = MockRunner( | ||
config=None, | ||
adapter=None, | ||
node=basic_parsed_source_definition_object, | ||
node_index=None, | ||
num_nodes=None, | ||
) | ||
assert not hasattr(basic_parsed_source_definition_object, "build_path") | ||
runner._handle_generic_exception(Exception("bad thing happened"), ctx=None) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters