From e941698e4cca1dd42fc5bd81d8085a313d25587a Mon Sep 17 00:00:00 2001 From: wtrocki Date: Thu, 13 Mar 2025 21:29:10 +0100 Subject: [PATCH 1/3] task: filter violations to add to the report --- package.json | 3 +- .../ipa/scripts/filter-ipa-violations.js | 88 +++++++++++++++++++ 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 tools/spectral/ipa/scripts/filter-ipa-violations.js diff --git a/package.json b/package.json index 485a0ec983..3dad4b34c7 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "format-check": "npx prettier . --check", "lint-js": "npx eslint **/*.js", "gen-ipa-docs": "node tools/spectral/ipa/scripts/generateRulesetReadme.js", - "ipa-validation": "spectral lint ./openapi/.raw/v2.yaml --ruleset=./tools/spectral/ipa/ipa-spectral.yaml", + "ipa-validation": "spectral lint ./openapi/.raw/v2.yaml --ruleset=./tools/spectral/ipa/ipa-spectral.yaml", + "ipa-filter": "node tools/spectral/ipa/scripts/filter-ipa-violations.js", "spectral-validation": "spectral lint ./openapi/.raw/v2.yaml --ruleset=./tools/spectral/.spectral.yaml", "test": "jest", "precommit": "husky install" diff --git a/tools/spectral/ipa/scripts/filter-ipa-violations.js b/tools/spectral/ipa/scripts/filter-ipa-violations.js new file mode 100644 index 0000000000..b8adaac5a2 --- /dev/null +++ b/tools/spectral/ipa/scripts/filter-ipa-violations.js @@ -0,0 +1,88 @@ +import fs from 'node:fs/promises'; +import { execSync } from 'child_process'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const dirname = path.dirname(fileURLToPath(import.meta.url)); + +async function filterIpaViolations() { + try { + // Check if rule ID is provided + const ruleId = process.argv[2]; + if (!ruleId) { + console.error('Usage: node filter-ipa-violations.js '); + console.error('Example: node filter-ipa-violations.js xgen-IPA-102-collection-identifier-camelCase'); + process.exit(1); + } + + const outputFile = path.join(process.cwd(), `${ruleId}-violations.md`); + + console.log(`Filtering violations for rule ID: ${ruleId}`); + console.log('Running IPA validation...'); + + let validationOutput; + try { + // Run IPA validation and get output as JSON + execSync( + 'spectral lint --format=json -o results.json ./openapi/.raw/v2.yaml --ruleset=./tools/spectral/ipa/ipa-spectral.yaml', + { + encoding: 'utf-8', + timeout: 4000, + maxBuffer: 10 * 1024 * 1024, + } + ); + } catch (error) { + console.error('Error (expected):', error.message); + } + + // Read the JSON output + validationOutput = await fs.readFile('results.json', 'utf-8'); + console.log('Filtering results...'); + + // Parse the JSON output + const validationResults = JSON.parse(validationOutput); + + // Filter results for the exact specified rule ID + const filteredResults = validationResults.filter((violation) => violation.code === ruleId); + + // Group by source file + const groupedBySource = filteredResults.reduce((acc, violation) => { + const source = violation.source; + if (!acc[source]) { + acc[source] = []; + } + acc[source].push({ + path: violation.path, + message: violation.message, + source: violation.source, + }); + return acc; + }, {}); + + // Generate markdown content + let markdownContent = `# ${ruleId} Violations Checklist\n\n`; + markdownContent += `Generated on: ${new Date().toLocaleString()}\n\n`; + + Object.keys(groupedBySource).forEach((source) => { + const violations = groupedBySource[source]; + + violations.forEach((violation) => { + markdownContent += `## ${violation.source}\n\n`; + markdownContent += `Path: \`${violation.path.join('/')}\`\n\n`; + markdownContent += `- [ ] Fixed\n\n`; + }); + }); + + // Write the markdown file + await fs.writeFile(outputFile, markdownContent, 'utf-8'); + + const violationCount = filteredResults.length; + console.log(`Results saved to ${outputFile}`); + console.log(`Found ${violationCount} violations to fix`); + } catch (error) { + console.error('Error:', error.message); + process.exit(1); + } +} + +filterIpaViolations(); From 3b35ac3c3f2925b210d1598e7a2d9917cb782515 Mon Sep 17 00:00:00 2001 From: wtrocki Date: Thu, 13 Mar 2025 21:36:07 +0100 Subject: [PATCH 2/3] fix: lint --- tools/spectral/ipa/scripts/filter-ipa-violations.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/tools/spectral/ipa/scripts/filter-ipa-violations.js b/tools/spectral/ipa/scripts/filter-ipa-violations.js index b8adaac5a2..28ab003cb2 100644 --- a/tools/spectral/ipa/scripts/filter-ipa-violations.js +++ b/tools/spectral/ipa/scripts/filter-ipa-violations.js @@ -1,9 +1,6 @@ import fs from 'node:fs/promises'; import { execSync } from 'child_process'; import path from 'path'; -import { fileURLToPath } from 'url'; - -const dirname = path.dirname(fileURLToPath(import.meta.url)); async function filterIpaViolations() { try { From fa61590b53c33599450b70505f627a9ee001768c Mon Sep 17 00:00:00 2001 From: Wojciech Trocki Date: Fri, 14 Mar 2025 12:31:14 +0100 Subject: [PATCH 3/3] Update package.json Co-authored-by: Lovisa Berggren <59226031+lovisaberggren@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3dad4b34c7..5b85ba13d1 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "lint-js": "npx eslint **/*.js", "gen-ipa-docs": "node tools/spectral/ipa/scripts/generateRulesetReadme.js", "ipa-validation": "spectral lint ./openapi/.raw/v2.yaml --ruleset=./tools/spectral/ipa/ipa-spectral.yaml", - "ipa-filter": "node tools/spectral/ipa/scripts/filter-ipa-violations.js", + "ipa-filter-violations": "node tools/spectral/ipa/scripts/filter-ipa-violations.js", "spectral-validation": "spectral lint ./openapi/.raw/v2.yaml --ruleset=./tools/spectral/.spectral.yaml", "test": "jest", "precommit": "husky install"