Skip to content

Commit 4446595

Browse files
akbogfa-assistant
authored andcommitted
Add 'static_analysis' property to all analyzeable nodes, ensure sources adapt static_analysis to failures (#4083)
GitOrigin-RevId: b207097cd5781d7c063f58a4174fc689a20d143a
1 parent ec39ee6 commit 4446595

File tree

11 files changed

+88
-3
lines changed

11 files changed

+88
-3
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
kind: Features
2+
body: Add 'static_analysis' property to all analyzeable nodes, ensure sources adapt static_analysis to failures
3+
time: 2025-06-23T23:35:05.987702-07:00

crates/dbt-parser/src/resolve/resolve_snapshots.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use dbt_common::constants::DBT_SNAPSHOTS_DIR_NAME;
22
use dbt_common::error::AbstractLocation;
3+
use dbt_common::io_args::StaticAnalysisKind;
34
use dbt_common::{fs_err, show_error, show_warning, stdfs, unexpected_fs_err, ErrorCode, FsResult};
45
use dbt_jinja_utils::jinja_environment::JinjaEnvironment;
56
use dbt_jinja_utils::refs_and_sources::RefsAndSources;
@@ -268,6 +269,9 @@ pub async fn resolve_snapshots(
268269
.expect("quoting is required")
269270
.try_into()
270271
.expect("quoting is required"),
272+
static_analysis: final_config
273+
.static_analysis
274+
.unwrap_or(StaticAnalysisKind::On),
271275
tags: final_config
272276
.tags
273277
.clone()

crates/dbt-parser/src/resolve/resolve_sources.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
use crate::dbt_project_config::{init_project_config, RootProjectConfigs};
33
use crate::utils::get_node_fqn;
44

5-
use dbt_common::io_args::IoArgs;
5+
use dbt_common::io_args::{IoArgs, StaticAnalysisKind};
66
use dbt_common::{err, show_error, ErrorCode, FsResult};
77
use dbt_jinja_utils::jinja_environment::JinjaEnvironment;
88
use dbt_jinja_utils::refs_and_sources::RefsAndSources;
@@ -223,6 +223,9 @@ pub fn resolve_sources(
223223
freshness: merged_freshness.clone(),
224224
loaded_at_field: merged_loaded_at_field.clone(),
225225
loaded_at_query: merged_loaded_at_query.clone(),
226+
static_analysis: source_properties_config
227+
.static_analysis
228+
.unwrap_or(StaticAnalysisKind::On),
226229
meta: merged_meta.unwrap_or_default(),
227230
tags: merged_tags.unwrap_or_default(),
228231
};

crates/dbt-parser/src/resolve/resolve_tests/resolve_data_tests.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use crate::utils::update_node_relation_components;
1111
use crate::utils::RelationComponents;
1212
use dbt_common::constants::DBT_GENERIC_TESTS_DIR_NAME;
1313
use dbt_common::error::AbstractLocation;
14+
use dbt_common::io_args::StaticAnalysisKind;
1415
use dbt_common::io_utils::try_read_yml_to_str;
1516
use dbt_common::stdfs;
1617
use dbt_common::FsResult;
@@ -236,6 +237,9 @@ pub async fn resolve_data_tests(
236237
.expect("quoting is required")
237238
.try_into()
238239
.expect("quoting is required"),
240+
static_analysis: test_config
241+
.static_analysis
242+
.unwrap_or(StaticAnalysisKind::On),
239243
tags: test_config
240244
.tags
241245
.clone()

crates/dbt-parser/src/resolve/resolve_tests/resolve_unit_tests.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use dbt_common::err;
77
use dbt_common::error::AbstractLocation;
88
use dbt_common::fs_err;
99
use dbt_common::io_args::IoArgs;
10+
use dbt_common::io_args::StaticAnalysisKind;
1011
use dbt_common::CodeLocation;
1112
use dbt_common::ErrorCode;
1213
use dbt_common::FsResult;
@@ -217,6 +218,9 @@ pub fn resolve_unit_tests(
217218
.unwrap_or_default(),
218219
meta: properties_config.meta.clone().unwrap_or_default(),
219220
quoting: package_quoting.try_into()?,
221+
static_analysis: properties_config
222+
.static_analysis
223+
.unwrap_or(StaticAnalysisKind::On),
220224
deprecated_config: properties_config,
221225
};
222226

crates/dbt-schemas/src/schemas/manifest/manifest.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ pub fn nodes_from_dbt_manifest(manifest: DbtManifest, dbt_quoting: DbtQuoting) -
365365
.unwrap_or_default(),
366366
meta: model.config.meta.clone().unwrap_or_default(),
367367
enabled: model.config.enabled.unwrap_or(true),
368+
// TODO: The resolved static analysis should be serialized to / from the manifest
368369
static_analysis: StaticAnalysisKind::On,
369370
contract: model.config.contract.clone(),
370371
incremental_strategy: model.config.incremental_strategy.clone(),
@@ -398,6 +399,7 @@ pub fn nodes_from_dbt_manifest(manifest: DbtManifest, dbt_quoting: DbtQuoting) -
398399
.unwrap_or(dbt_quoting)
399400
.try_into()
400401
.expect("DbtQuoting should be set"),
402+
static_analysis: StaticAnalysisKind::On,
401403
tags: test
402404
.config
403405
.tags
@@ -430,6 +432,10 @@ pub fn nodes_from_dbt_manifest(manifest: DbtManifest, dbt_quoting: DbtQuoting) -
430432
.unwrap_or(dbt_quoting)
431433
.try_into()
432434
.expect("DbtQuoting should be set"),
435+
static_analysis: snapshot
436+
.config
437+
.static_analysis
438+
.unwrap_or(StaticAnalysisKind::On),
433439
tags: snapshot
434440
.config
435441
.tags
@@ -512,6 +518,7 @@ pub fn nodes_from_dbt_manifest(manifest: DbtManifest, dbt_quoting: DbtQuoting) -
512518
loaded_at_field: source.loaded_at_field,
513519
loaded_at_query: source.loaded_at_query,
514520
freshness: source.freshness,
521+
static_analysis: StaticAnalysisKind::On,
515522
tags: source
516523
.config
517524
.tags
@@ -531,6 +538,7 @@ pub fn nodes_from_dbt_manifest(manifest: DbtManifest, dbt_quoting: DbtQuoting) -
531538
common_attr: unit_test.common_attr,
532539
base_attr: unit_test.base_attr,
533540
quoting: dbt_quoting.try_into().expect("DbtQuoting should be set"),
541+
static_analysis: StaticAnalysisKind::On,
534542
tags: unit_test
535543
.config
536544
.tags

crates/dbt-schemas/src/schemas/nodes.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ pub trait InternalDbtNodeAttributes: InternalDbtNode {
126126
}
127127
// Setters
128128
fn set_quoting(&mut self, quoting: ResolvedQuoting);
129+
fn set_static_analysis(&mut self, static_analysis: StaticAnalysisKind);
129130

130131
// Optional Fields
131132
fn get_access(&self) -> Option<Access> {
@@ -231,6 +232,9 @@ impl InternalDbtNodeAttributes for DbtModel {
231232
fn set_quoting(&mut self, quoting: ResolvedQuoting) {
232233
self.quoting = quoting;
233234
}
235+
fn set_static_analysis(&mut self, static_analysis: StaticAnalysisKind) {
236+
self.static_analysis = static_analysis;
237+
}
234238
fn tags(&self) -> Vec<String> {
235239
self.tags.clone()
236240
}
@@ -307,6 +311,9 @@ impl InternalDbtNodeAttributes for DbtSeed {
307311
fn set_quoting(&mut self, quoting: ResolvedQuoting) {
308312
self.quoting = quoting;
309313
}
314+
fn set_static_analysis(&mut self, _static_analysis: StaticAnalysisKind) {
315+
unimplemented!()
316+
}
310317
fn tags(&self) -> Vec<String> {
311318
self.tags.clone()
312319
}
@@ -386,6 +393,9 @@ impl InternalDbtNodeAttributes for DbtTest {
386393
fn set_quoting(&mut self, quoting: ResolvedQuoting) {
387394
self.quoting = quoting;
388395
}
396+
fn set_static_analysis(&mut self, static_analysis: StaticAnalysisKind) {
397+
self.static_analysis = static_analysis;
398+
}
389399
fn tags(&self) -> Vec<String> {
390400
self.tags.clone()
391401
}
@@ -457,6 +467,9 @@ impl InternalDbtNodeAttributes for DbtUnitTest {
457467
fn set_quoting(&mut self, quoting: ResolvedQuoting) {
458468
self.quoting = quoting;
459469
}
470+
fn set_static_analysis(&mut self, static_analysis: StaticAnalysisKind) {
471+
self.static_analysis = static_analysis;
472+
}
460473
fn tags(&self) -> Vec<String> {
461474
self.tags.clone()
462475
}
@@ -530,12 +543,18 @@ impl InternalDbtNodeAttributes for DbtSource {
530543
fn materialized(&self) -> DbtMaterialization {
531544
DbtMaterialization::External
532545
}
546+
fn static_analysis(&self) -> StaticAnalysisKind {
547+
self.static_analysis
548+
}
533549
fn quoting(&self) -> ResolvedQuoting {
534550
self.quoting
535551
}
536552
fn set_quoting(&mut self, quoting: ResolvedQuoting) {
537553
self.quoting = quoting;
538554
}
555+
fn set_static_analysis(&mut self, static_analysis: StaticAnalysisKind) {
556+
self.static_analysis = static_analysis;
557+
}
539558
fn tags(&self) -> Vec<String> {
540559
self.tags.clone()
541560
}
@@ -592,12 +611,18 @@ impl InternalDbtNodeAttributes for DbtSnapshot {
592611
fn materialized(&self) -> DbtMaterialization {
593612
self.materialized.clone()
594613
}
614+
fn static_analysis(&self) -> StaticAnalysisKind {
615+
self.static_analysis
616+
}
595617
fn quoting(&self) -> ResolvedQuoting {
596618
self.quoting
597619
}
598620
fn set_quoting(&mut self, quoting: ResolvedQuoting) {
599621
self.quoting = quoting;
600622
}
623+
fn set_static_analysis(&mut self, static_analysis: StaticAnalysisKind) {
624+
self.static_analysis = static_analysis;
625+
}
601626
fn tags(&self) -> Vec<String> {
602627
self.tags.clone()
603628
}
@@ -1262,6 +1287,7 @@ pub struct DbtUnitTest {
12621287

12631288
// [Start] Previously config fields
12641289
pub quoting: ResolvedQuoting,
1290+
pub static_analysis: StaticAnalysisKind,
12651291
pub tags: Vec<String>,
12661292
pub meta: BTreeMap<String, Value>,
12671293
// [End]
@@ -1290,6 +1316,7 @@ pub struct DbtTest {
12901316

12911317
// [Start] Previously config fields
12921318
pub quoting: ResolvedQuoting,
1319+
pub static_analysis: StaticAnalysisKind,
12931320
pub tags: Vec<String>,
12941321
pub meta: BTreeMap<String, Value>,
12951322
// [End]
@@ -1329,6 +1356,7 @@ pub struct DbtSnapshot {
13291356
// [Start] Previously config fields
13301357
pub materialized: DbtMaterialization,
13311358
pub quoting: ResolvedQuoting,
1359+
pub static_analysis: StaticAnalysisKind,
13321360
pub tags: Vec<String>,
13331361
pub meta: BTreeMap<String, Value>,
13341362
pub snapshot_meta_column_names: SnapshotMetaColumnNames,
@@ -1350,6 +1378,7 @@ pub struct DbtSource {
13501378

13511379
// [Start] Previously config fields
13521380
pub quoting: ResolvedQuoting,
1381+
pub static_analysis: StaticAnalysisKind,
13531382
pub tags: Vec<String>,
13541383
pub meta: BTreeMap<String, Value>,
13551384
// [End]

crates/dbt-schemas/src/schemas/project/configs/data_test_config.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use dbt_common::io_args::StaticAnalysisKind;
12
use dbt_serde_yaml::{JsonSchema, ShouldBe};
23
use serde::{Deserialize, Serialize};
34
use serde_with::skip_serializing_none;
@@ -49,6 +50,8 @@ pub struct ProjectDataTestConfig {
4950
pub where_: Option<String>,
5051
#[serde(rename = "+quoting")]
5152
pub quoting: Option<DbtQuoting>,
53+
#[serde(rename = "+static_analysis")]
54+
pub static_analysis: Option<StaticAnalysisKind>,
5255
pub __additional_properties__: BTreeMap<String, ShouldBe<ProjectDataTestConfig>>,
5356
}
5457

@@ -78,6 +81,7 @@ pub struct DataTestConfig {
7881
pub tags: Option<StringOrArrayOfStrings>,
7982
pub warn_if: Option<String>,
8083
pub quoting: Option<DbtQuoting>,
84+
pub static_analysis: Option<StaticAnalysisKind>,
8185
#[serde(rename = "where")]
8286
pub where_: Option<String>,
8387
}
@@ -101,6 +105,7 @@ impl From<ProjectDataTestConfig> for DataTestConfig {
101105
warn_if: config.warn_if,
102106
quoting: config.quoting,
103107
where_: config.where_,
108+
static_analysis: config.static_analysis,
104109
}
105110
}
106111
}
@@ -124,6 +129,7 @@ impl From<DataTestConfig> for ProjectDataTestConfig {
124129
warn_if: config.warn_if,
125130
quoting: config.quoting,
126131
where_: config.where_,
132+
static_analysis: config.static_analysis,
127133
__additional_properties__: BTreeMap::new(),
128134
}
129135
}
@@ -152,6 +158,7 @@ impl DefaultTo<DataTestConfig> for DataTestConfig {
152158
ref mut warn_if,
153159
ref mut quoting,
154160
ref mut where_,
161+
ref mut static_analysis,
155162
} = self;
156163

157164
// Protect the mutable refs from being used in the default_to macro
@@ -178,6 +185,7 @@ impl DefaultTo<DataTestConfig> for DataTestConfig {
178185
schema,
179186
group,
180187
where_,
188+
static_analysis,
181189
]
182190
);
183191
}

crates/dbt-schemas/src/schemas/project/configs/snapshot_config.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use dbt_common::io_args::StaticAnalysisKind;
12
use dbt_serde_yaml::JsonSchema;
23
use dbt_serde_yaml::ShouldBe;
34
use dbt_serde_yaml::Verbatim;
@@ -64,6 +65,8 @@ pub struct ProjectSnapshotConfig {
6465
pub event_time: Option<String>,
6566
#[serde(rename = "+quoting")]
6667
pub quoting: Option<DbtQuoting>,
68+
#[serde(rename = "+static_analysis")]
69+
pub static_analysis: Option<StaticAnalysisKind>,
6770
#[serde(rename = "+meta")]
6871
pub meta: Option<BTreeMap<String, serde_json::Value>>,
6972
#[serde(rename = "+group")]
@@ -113,6 +116,7 @@ pub struct SnapshotConfig {
113116
pub grants: Option<serde_json::Value>,
114117
pub event_time: Option<String>,
115118
pub quoting: Option<DbtQuoting>,
119+
pub static_analysis: Option<StaticAnalysisKind>,
116120
pub meta: Option<BTreeMap<String, serde_json::Value>>,
117121
pub group: Option<String>,
118122
#[serde(default, deserialize_with = "bool_or_string_bool")]
@@ -190,6 +194,7 @@ impl From<ProjectSnapshotConfig> for SnapshotConfig {
190194
grants: config.grants,
191195
event_time: config.event_time,
192196
quoting: config.quoting,
197+
static_analysis: config.static_analysis,
193198
meta: config.meta,
194199
group: config.group,
195200
quote_columns: config.quote_columns,
@@ -221,6 +226,7 @@ impl From<SnapshotConfig> for ProjectSnapshotConfig {
221226
grants: config.grants,
222227
event_time: config.event_time,
223228
quoting: config.quoting,
229+
static_analysis: config.static_analysis,
224230
meta: config.meta,
225231
group: config.group,
226232
quote_columns: config.quote_columns,
@@ -270,6 +276,7 @@ impl DefaultTo<SnapshotConfig> for SnapshotConfig {
270276
ref mut quote_columns,
271277
ref mut invalidate_hard_deletes,
272278
ref mut docs,
279+
ref mut static_analysis,
273280
} = self;
274281

275282
#[allow(unused, clippy::let_unit_value)]
@@ -306,6 +313,7 @@ impl DefaultTo<SnapshotConfig> for SnapshotConfig {
306313
snapshot_meta_column_names,
307314
hard_deletes,
308315
check_cols,
316+
static_analysis,
309317
]
310318
);
311319
}

crates/dbt-schemas/src/schemas/project/configs/source_config.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use dbt_common::io_args::StaticAnalysisKind;
12
use dbt_serde_yaml::{JsonSchema, ShouldBe};
23
use serde::{Deserialize, Serialize};
34
use serde_with::skip_serializing_none;
@@ -25,6 +26,8 @@ pub struct ProjectSourceConfig {
2526
pub tags: Option<StringOrArrayOfStrings>,
2627
#[serde(rename = "+quoting")]
2728
pub quoting: Option<DbtQuoting>,
29+
#[serde(rename = "+static_analysis")]
30+
pub static_analysis: Option<StaticAnalysisKind>,
2831
// Flattened fields
2932
pub __additional_properties__: BTreeMap<String, ShouldBe<ProjectSourceConfig>>,
3033
}
@@ -45,6 +48,7 @@ pub struct SourceConfig {
4548
pub freshness: Option<FreshnessDefinition>,
4649
pub tags: Option<StringOrArrayOfStrings>,
4750
pub quoting: Option<DbtQuoting>,
51+
pub static_analysis: Option<StaticAnalysisKind>,
4852
}
4953

5054
impl From<ProjectSourceConfig> for SourceConfig {
@@ -56,6 +60,7 @@ impl From<ProjectSourceConfig> for SourceConfig {
5660
freshness: config.freshness,
5761
tags: config.tags,
5862
quoting: config.quoting,
63+
static_analysis: config.static_analysis,
5964
}
6065
}
6166
}
@@ -69,6 +74,7 @@ impl From<SourceConfig> for ProjectSourceConfig {
6974
freshness: config.freshness,
7075
tags: config.tags,
7176
quoting: config.quoting,
77+
static_analysis: config.static_analysis,
7278
__additional_properties__: BTreeMap::new(),
7379
}
7480
}
@@ -87,6 +93,7 @@ impl DefaultTo<SourceConfig> for SourceConfig {
8793
ref mut freshness,
8894
ref mut tags,
8995
ref mut quoting,
96+
ref mut static_analysis,
9097
} = self;
9198

9299
#[allow(unused, clippy::let_unit_value)]
@@ -96,6 +103,6 @@ impl DefaultTo<SourceConfig> for SourceConfig {
96103
#[allow(unused, clippy::let_unit_value)]
97104
let tags = ();
98105

99-
default_to!(parent, [enabled, event_time, freshness]);
106+
default_to!(parent, [enabled, event_time, freshness, static_analysis]);
100107
}
101108
}

0 commit comments

Comments
 (0)