Skip to content

Commit 68f67d6

Browse files
committed
feat: add diagnostics change handling and update problems panel
1 parent b4bb03b commit 68f67d6

File tree

7 files changed

+112
-22
lines changed

7 files changed

+112
-22
lines changed

src/dbt_client/dbtCloudIntegration.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ export class DBTCloudProjectIntegration implements DBTProjectIntegration {
156156
protected projectRoot: string,
157157
private projectConfigDiagnostics: DBTDiagnosticData[],
158158
private deferConfig: DeferConfig | undefined,
159+
private onDiagnosticsChanged: () => void,
159160
) {
160161
this.terminal.debug(
161162
"DBTCloudProjectIntegration",
@@ -319,6 +320,7 @@ export class DBTCloudProjectIntegration implements DBTProjectIntegration {
319320
return {
320321
pythonBridgeDiagnostics: this.pythonBridgeDiagnosticsData,
321322
rebuildManifestDiagnostics: this.rebuildManifestDiagnosticsData,
323+
projectConfigDiagnostics: this.projectConfigDiagnostics,
322324
};
323325
}
324326

@@ -384,6 +386,7 @@ export class DBTCloudProjectIntegration implements DBTProjectIntegration {
384386
)
385387
.map((line) => line.info.msg);
386388
this.rebuildManifestDiagnosticsData = [];
389+
this.onDiagnosticsChanged();
387390
const filePath = path.join(this.projectRoot, DBT_PROJECT_FILE);
388391
const diagnosticDataArray: DBTDiagnosticData[] = [
389392
...errors.map((error) => ({
@@ -404,6 +407,7 @@ export class DBTCloudProjectIntegration implements DBTProjectIntegration {
404407
})),
405408
];
406409
this.rebuildManifestDiagnosticsData = diagnosticDataArray;
410+
this.onDiagnosticsChanged();
407411
} catch (error) {
408412
this.terminal.error(
409413
"dbtCloudCannotParseProjectCommandExecuteError",
@@ -427,6 +431,7 @@ export class DBTCloudProjectIntegration implements DBTProjectIntegration {
427431
category: "command-execution",
428432
};
429433
this.rebuildManifestDiagnosticsData = [diagnosticData];
434+
this.onDiagnosticsChanged();
430435
}
431436
}
432437

@@ -986,6 +991,7 @@ export class DBTCloudProjectIntegration implements DBTProjectIntegration {
986991
} catch (error) {} // We don't care about errors here.
987992
this.rebuildManifestDiagnosticsData = [];
988993
this.pythonBridgeDiagnosticsData = [];
994+
this.onDiagnosticsChanged();
989995
while (this.disposables.length) {
990996
const x = this.disposables.pop();
991997
if (x) {

src/dbt_client/dbtCoreIntegration.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ export class DBTCoreProjectIntegration implements DBTProjectIntegration {
223223
protected projectRoot: string,
224224
private projectConfigDiagnostics: DBTDiagnosticData[],
225225
private deferConfig: DeferConfig | undefined,
226+
private onDiagnosticsChanged: () => void,
226227
) {
227228
this.dbtTerminal.debug(
228229
"DBTCoreProjectIntegration",
@@ -430,6 +431,7 @@ export class DBTCoreProjectIntegration implements DBTProjectIntegration {
430431
}
431432
await this.createPythonDbtProject(this.python);
432433
this.pythonBridgeDiagnosticsData = [];
434+
this.onDiagnosticsChanged();
433435
} catch (exc: any) {
434436
if (exc instanceof PythonException) {
435437
// python errors can be about anything, so we just associate the error with the project file
@@ -457,6 +459,7 @@ export class DBTCoreProjectIntegration implements DBTProjectIntegration {
457459
category: "python-bridge",
458460
};
459461
this.pythonBridgeDiagnosticsData = [diagnosticData];
462+
this.onDiagnosticsChanged();
460463
}
461464
this.dbtTerminal.error(
462465
"pythonBridgeInitPythonError",
@@ -540,6 +543,7 @@ export class DBTCoreProjectIntegration implements DBTProjectIntegration {
540543
return {
541544
pythonBridgeDiagnostics: this.pythonBridgeDiagnosticsData,
542545
rebuildManifestDiagnostics: this.rebuildManifestDiagnosticsData,
546+
projectConfigDiagnostics: this.projectConfigDiagnostics,
543547
};
544548
}
545549

@@ -557,6 +561,7 @@ export class DBTCoreProjectIntegration implements DBTProjectIntegration {
557561
(python) => python`to_dict(project.safe_parse_project())`,
558562
);
559563
this.rebuildManifestDiagnosticsData = [];
564+
this.onDiagnosticsChanged();
560565
} catch (exc) {
561566
if (exc instanceof PythonException) {
562567
// dbt errors can be about anything, so we just associate the error with the project file
@@ -573,6 +578,7 @@ export class DBTCoreProjectIntegration implements DBTProjectIntegration {
573578
category: "manifest-rebuild",
574579
};
575580
this.rebuildManifestDiagnosticsData = [diagnosticData];
581+
this.onDiagnosticsChanged();
576582
return;
577583
}
578584
this.dbtTerminal.error(
@@ -1030,6 +1036,7 @@ export class DBTCoreProjectIntegration implements DBTProjectIntegration {
10301036
} catch (error) {} // We don't care about errors here.
10311037
this.rebuildManifestDiagnosticsData = [];
10321038
this.pythonBridgeDiagnosticsData = [];
1039+
this.onDiagnosticsChanged();
10331040
while (this.disposables.length) {
10341041
const x = this.disposables.pop();
10351042
if (x) {

src/dbt_client/dbtFusionCommandIntegration.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -512,13 +512,6 @@ export class DBTFusionCommandProjectIntegration extends DBTCloudProjectIntegrati
512512
return stdout;
513513
}
514514

515-
getDiagnostics(): DBTDiagnosticResult {
516-
return {
517-
pythonBridgeDiagnostics: this.pythonBridgeDiagnosticsData,
518-
rebuildManifestDiagnostics: this.rebuildManifestDiagnosticsData,
519-
};
520-
}
521-
522515
getDeferConfigDefaults(): DeferConfig {
523516
return {
524517
deferToProduction: true,

src/dbt_client/diagnostics.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,5 @@ export interface DBTDiagnosticData {
1515
export interface DBTDiagnosticResult {
1616
pythonBridgeDiagnostics: DBTDiagnosticData[];
1717
rebuildManifestDiagnostics: DBTDiagnosticData[];
18-
// This is only available on dbtIntegrationAdapter
19-
projectConfigDiagnostics?: DBTDiagnosticData[];
18+
projectConfigDiagnostics: DBTDiagnosticData[];
2019
}

src/inversify.config.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -392,12 +392,13 @@ container
392392
>("Factory<DBTCoreProjectIntegration>")
393393
.toFactory<
394394
DBTCoreProjectIntegration,
395-
[string, DBTDiagnosticData[], DeferConfig | undefined]
395+
[string, DBTDiagnosticData[], DeferConfig | undefined, () => void]
396396
>((context: interfaces.Context) => {
397397
return (
398398
projectRoot: string,
399399
projectConfigDiagnostics: DBTDiagnosticData[],
400400
deferConfig: DeferConfig | undefined,
401+
onDiagnosticsChanged: () => void,
401402
) => {
402403
const { container } = context;
403404
return new DBTCoreProjectIntegration(
@@ -413,6 +414,7 @@ container
413414
projectRoot,
414415
projectConfigDiagnostics,
415416
deferConfig,
417+
onDiagnosticsChanged,
416418
);
417419
};
418420
});
@@ -423,12 +425,13 @@ container
423425
>("Factory<DBTCoreCommandProjectIntegration>")
424426
.toFactory<
425427
DBTCoreCommandProjectIntegration,
426-
[string, DBTDiagnosticData[], DeferConfig]
428+
[string, DBTDiagnosticData[], DeferConfig | undefined, () => void]
427429
>((context: interfaces.Context) => {
428430
return (
429431
projectRoot: string,
430432
projectConfigDiagnostics: DBTDiagnosticData[],
431-
deferConfig: DeferConfig,
433+
deferConfig: DeferConfig | undefined,
434+
onDiagnosticsChanged: () => void,
432435
) => {
433436
const { container } = context;
434437
return new DBTCoreCommandProjectIntegration(
@@ -444,6 +447,7 @@ container
444447
projectRoot,
445448
projectConfigDiagnostics,
446449
deferConfig,
450+
onDiagnosticsChanged,
447451
);
448452
};
449453
});
@@ -454,12 +458,13 @@ container
454458
>("Factory<DBTFusionCommandProjectIntegration>")
455459
.toFactory<
456460
DBTFusionCommandProjectIntegration,
457-
[string, DBTDiagnosticData[], DeferConfig]
461+
[string, DBTDiagnosticData[], DeferConfig | undefined, () => void]
458462
>((context: interfaces.Context) => {
459463
return (
460464
projectRoot: string,
461465
projectConfigDiagnostics: DBTDiagnosticData[],
462-
deferConfig: DeferConfig,
466+
deferConfig: DeferConfig | undefined,
467+
onDiagnosticsChanged: () => void,
463468
) => {
464469
const { container } = context;
465470
return new DBTFusionCommandProjectIntegration(
@@ -471,6 +476,7 @@ container
471476
projectRoot,
472477
projectConfigDiagnostics,
473478
deferConfig,
479+
onDiagnosticsChanged,
474480
);
475481
};
476482
});
@@ -481,12 +487,13 @@ container
481487
>("Factory<DBTCloudProjectIntegration>")
482488
.toFactory<
483489
DBTCloudProjectIntegration,
484-
[string, DBTDiagnosticData[], DeferConfig]
490+
[string, DBTDiagnosticData[], DeferConfig | undefined, () => void]
485491
>((context: interfaces.Context) => {
486492
return (
487493
projectRoot: string,
488494
projectConfigDiagnostics: DBTDiagnosticData[],
489-
deferConfig: DeferConfig,
495+
deferConfig: DeferConfig | undefined,
496+
onDiagnosticsChanged: () => void,
490497
) => {
491498
const { container } = context;
492499
return new DBTCloudProjectIntegration(
@@ -498,6 +505,7 @@ container
498505
projectRoot,
499506
projectConfigDiagnostics,
500507
deferConfig,
508+
onDiagnosticsChanged,
501509
);
502510
};
503511
});

src/manifest/dbtIntegrationAdapter.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,21 +100,25 @@ export class DBTIntegrationAdapter extends EventEmitter implements DBTFacade {
100100
projectRoot: string,
101101
diagnostics: DBTDiagnosticData[],
102102
deferConfig: DeferConfig | undefined,
103+
onDiagnosticsChanged: () => void,
103104
) => DBTProjectIntegration,
104105
private dbtCloudIntegrationFactory: (
105106
projectRoot: string,
106107
diagnostics: DBTDiagnosticData[],
107108
deferConfig: DeferConfig | undefined,
109+
onDiagnosticsChanged: () => void,
108110
) => DBTProjectIntegration,
109111
private dbtFusionIntegrationFactory: (
110112
projectRoot: string,
111113
diagnostics: DBTDiagnosticData[],
112114
deferConfig: DeferConfig | undefined,
115+
onDiagnosticsChanged: () => void,
113116
) => DBTProjectIntegration,
114117
private dbtCoreCommandIntegrationFactory: (
115118
projectRoot: string,
116119
diagnostics: DBTDiagnosticData[],
117120
deferConfig: DeferConfig | undefined,
121+
onDiagnosticsChanged: () => void,
118122
) => DBTProjectIntegration,
119123
private projectRoot: string,
120124
private deferConfig: DeferConfig | undefined,
@@ -137,30 +141,36 @@ export class DBTIntegrationAdapter extends EventEmitter implements DBTFacade {
137141
private createIntegration(): DBTProjectIntegration {
138142
const integrationMode = this.dbtConfiguration.getDbtIntegration();
139143

144+
const onDiagnosticsChanged = () => this.emit("diagnosticsChanged");
145+
140146
switch (integrationMode) {
141147
case "cloud":
142148
return this.dbtCloudIntegrationFactory(
143149
this.projectRoot,
144150
this.projectConfigDiagnostics,
145151
this.deferConfig,
152+
onDiagnosticsChanged,
146153
);
147154
case "fusion":
148155
return this.dbtFusionIntegrationFactory(
149156
this.projectRoot,
150157
this.projectConfigDiagnostics,
151158
this.deferConfig,
159+
onDiagnosticsChanged,
152160
);
153161
case "corecommand":
154162
return this.dbtCoreCommandIntegrationFactory(
155163
this.projectRoot,
156164
this.projectConfigDiagnostics,
157165
this.deferConfig,
166+
onDiagnosticsChanged,
158167
);
159168
default: // "core"
160169
return this.dbtCoreIntegrationFactory(
161170
this.projectRoot,
162171
this.projectConfigDiagnostics,
163172
this.deferConfig,
173+
onDiagnosticsChanged,
164174
);
165175
}
166176
}
@@ -228,20 +238,19 @@ export class DBTIntegrationAdapter extends EventEmitter implements DBTFacade {
228238
}
229239

230240
getDiagnostics() {
231-
return {
232-
projectConfigDiagnostics: this.projectConfigDiagnostics,
233-
...this.currentIntegration.getDiagnostics(),
234-
};
241+
this.currentIntegration.getDiagnostics();
235242
}
236243

237244
private addProjectConfigDiagnostic(diagnostic: DBTDiagnosticData): void {
238245
// Add to project config diagnostics array
239246
this.projectConfigDiagnostics.push(diagnostic);
247+
this.emit("diagnosticsChanged");
240248
}
241249

242250
private clearProjectConfigDiagnostics(): void {
243251
// Clear project config diagnostics
244252
this.projectConfigDiagnostics.length = 0;
253+
this.emit("diagnosticsChanged");
245254
}
246255

247256
getAdapterType(): string {

0 commit comments

Comments
 (0)