Skip to content

Commit cc4f5a9

Browse files
committed
feat(core): scoring threshold not reached returns exit code 1, other returns 0
1 parent dcee297 commit cc4f5a9

File tree

2 files changed

+54
-12
lines changed

2 files changed

+54
-12
lines changed

packages/cli/src/commands/lint.ts

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,14 @@ import { formatOutput, writeOutput } from '../services/output';
1414
import { FailSeverity, ILintConfig, OutputFormat } from '../services/config';
1515

1616
import { CLIError } from '../errors';
17-
import { getScoringConfig } from '../formatters/utils/getScoring';
17+
import { ScoringConfig } from "./../formatters/types";
18+
import {
19+
getScoringConfig,
20+
getScoringLevel,
21+
groupBySource,
22+
getCountsBySeverity,
23+
uniqueErrors
24+
} from '../formatters//utils';
1825

1926
const formatOptions = Object.values(OutputFormat);
2027

@@ -204,18 +211,22 @@ const lintCommand: CommandModule = {
204211
results = filterResultsBySeverity(results, failSeverity);
205212
}
206213

214+
const scoringConfigData = getScoringConfig(scoringConfig);
215+
207216
await Promise.all(
208217
format.map(f => {
209218
const formattedOutput = formatOutput(results, f, {
210219
failSeverity: getDiagnosticSeverity(failSeverity),
211-
scoringConfig: getScoringConfig(scoringConfig),
220+
scoringConfig: scoringConfigData,
212221
});
213222
return writeOutput(formattedOutput, output?.[f] ?? '<stdout>');
214223
}),
215224
);
216-
225+
//process.stdout.write(`${scoringThresholdNotEnough(results, scoringConfigData)}\n`);
217226
if (results.length > 0) {
218-
process.exit(severeEnoughToFail(results, failSeverity) ? 1 : 0);
227+
process.exit(
228+
scoringThresholdNotEnough(results, scoringConfigData) ? 1 : severeEnoughToFail(results, failSeverity) ? 1 : 0,
229+
);
219230
} else if (config.quiet !== true) {
220231
const isErrorSeverity = getDiagnosticSeverity(failSeverity) === DiagnosticSeverity.Error;
221232
process.stdout.write(
@@ -283,6 +294,25 @@ const filterResultsBySeverity = (results: IRuleResult[], failSeverity: FailSever
283294
return results.filter(r => r.severity <= diagnosticSeverity);
284295
};
285296

297+
const scoringThresholdNotEnough = (results: IRuleResult[], scoringConfig: ScoringConfig | undefined): boolean => {
298+
if (scoringConfig !== void 0) {
299+
const groupedResults = groupBySource(results);
300+
let groupedUniqueResults = { ...groupedResults };
301+
if (scoringConfig.uniqueErrors) {
302+
groupedUniqueResults = { ...groupBySource(uniqueErrors(results)) };
303+
}
304+
return (
305+
scoringConfig.threshold >
306+
getScoringLevel(
307+
getCountsBySeverity(groupedUniqueResults),
308+
scoringConfig.scoringSubtract,
309+
scoringConfig.warningsSubtract,
310+
)
311+
);
312+
}
313+
return false;
314+
};
315+
286316
export const severeEnoughToFail = (results: IRuleResult[], failSeverity: FailSeverity): boolean => {
287317
const diagnosticSeverity = getDiagnosticSeverity(failSeverity);
288318
return results.some(r => r.severity <= diagnosticSeverity);

packages/cli/src/formatters/utils/getScoring.ts

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { SEVERITY_MAP } from '@stoplight/spectral-core';
22
import { DiagnosticSeverity } from '@stoplight/types';
3-
import { ScoringConfig } from '../types';
3+
import { ScoringConfig, ScoringTable } from '../types';
44
import * as path from '@stoplight/path';
55
import fs from 'fs';
66

@@ -16,16 +16,16 @@ export const getScoringConfig = (scoringFile?: string): ScoringConfig | undefine
1616
return scoringConfig;
1717
};
1818

19-
export const getScoringText = (
19+
export const getScoringLevel = (
2020
issuesCount: {
2121
[DiagnosticSeverity.Error]: number;
2222
[DiagnosticSeverity.Warning]: number;
2323
[DiagnosticSeverity.Information]: number;
2424
[DiagnosticSeverity.Hint]: number;
2525
},
26-
scoringConfig: ScoringConfig,
27-
): string => {
28-
const { scoringSubtract, scoringLetter, warningsSubtract } = scoringConfig;
26+
scoringSubtract: ScoringTable[],
27+
warningsSubtract: boolean,
28+
): number => {
2929
let scoring = 100;
3030
Object.keys(issuesCount).forEach(key => {
3131
const scoringKey = Object.keys(SEVERITY_MAP).filter(mappedKey => SEVERITY_MAP[mappedKey] == key)[0];
@@ -34,13 +34,25 @@ export const getScoringText = (
3434
let subtractValue = 0;
3535
Object.keys(scoringSubtract[scoringKey]).forEach(
3636
subtractKey =>
37-
subtractValue = issuesCount[key] >= subtractKey ?
38-
scoringSubtract[scoringKey][subtractKey] :
39-
subtractValue
37+
(subtractValue = issuesCount[key] >= subtractKey ? scoringSubtract[scoringKey][subtractKey] : subtractValue),
4038
);
4139
scoring -= subtractValue;
4240
}
4341
});
42+
return scoring;
43+
};
44+
45+
export const getScoringText = (
46+
issuesCount: {
47+
[DiagnosticSeverity.Error]: number;
48+
[DiagnosticSeverity.Warning]: number;
49+
[DiagnosticSeverity.Information]: number;
50+
[DiagnosticSeverity.Hint]: number;
51+
},
52+
scoringConfig: ScoringConfig,
53+
): string => {
54+
const { scoringSubtract, scoringLetter, warningsSubtract } = scoringConfig;
55+
const scoring = getScoringLevel(issuesCount, scoringSubtract, warningsSubtract);
4456
let scoringLevel: string = Object.keys(scoringLetter)[Object.keys(scoringLetter).length - 1];
4557
Object.keys(scoringLetter)
4658
.reverse()

0 commit comments

Comments
 (0)