Skip to content

Commit

Permalink
🚸 Simpler CLI
Browse files Browse the repository at this point in the history
- poltergust ./rules will run both test and merge
- check if rules folders is set and exist when running the command
  • Loading branch information
ouvreboite committed Jun 14, 2024
1 parent 8b91ce8 commit 48dbfca
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 37 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/poltergust.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
run: npm ci

- name: Test the valid example ruleset
run: npx poltergust test ./examples/valid
run: npx poltergust ./examples/valid

build-and-test-invalid-example:
needs: build-and-test-valid-example
Expand All @@ -38,5 +38,5 @@ jobs:
run: npm ci

- name: Test the invalid example ruleset (should exit 1)
run: npx poltergust test ./examples/invalid || (exitcode=$?; [ $exitcode -eq 1 ] || exit $exitcode)
run: npx poltergust ./examples/invalid || (exitcode=$?; [ $exitcode -eq 1 ] || exit $exitcode)
shell: bash
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ An npm CLI to extract, test and merge Spectral rules from .md files.

```sh
npm install
npx poltergust test ./examples/valid
npx poltergust merge ./examples/valid
npx poltergust ./examples/valid
```

## Examples
Expand Down
2 changes: 1 addition & 1 deletion examples/invalid/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
## Test ouput

```
npx poltergust test .\examples\invalid
npx poltergust .\examples\invalid
🔎 Testing the spectral rules from the .md files in the directory: .\examples\invalid
👻 base-path-must-start-with-slash (examples\invalid\invalid.md:22)
❌ Expected 0 failure(s) for rule base-path-must-start-with-slash in test (examples\invalid\invalid.md:9)
Expand Down
1 change: 1 addition & 0 deletions examples/valid/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,5 @@ npx poltergust test .\examples\valid
✅ Test OK (examples\valid\rules2.md:11)
👻 required-property-must-exist (examples\valid\rules2.md:96)
✅ Test OK (examples\valid\rules2.md:66)
✅ Spectral rules merged in the file: examples\valid\spectral.yaml
```
92 changes: 60 additions & 32 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,41 +3,69 @@ import * as fs from 'fs';
import * as path from 'path';
import { extractAllRulesAndTestCases, generateRuleFileContent, runTestCase } from './functions.js';


// Skip the first two elements in process.argv (node path and file path)
const args = process.argv.slice(2);

if (args[0] === 'merge') {
const rulesDir = args[1];
console.log("🔎 Extracting and merging spectral rules from the .md files in the directory: " + rulesDir);
let rulesAndTestCases = extractAllRulesAndTestCases(rulesDir);
//--help
if(args.includes("--help")){
console.log("📖 Usage: spectral-test <rules-directory>");
console.log("ℹ️ The rules-directory should contain the spectral.base.yaml file and the spectral rules in .md files.");
process.exit(0);
}

//extract, test, merge
const rulesDir = getAndCheckRulesDdir(args);
console.log("🔎 Testing the spectral rules from the .md files in the directory: " + rulesDir);
let rulesAndTestCases = extractAllRulesAndTestCases(rulesDir);

//run the test cases for each rule
let allTestSucessful = true;
for(let ruleName in rulesAndTestCases){
const rule = rulesAndTestCases[ruleName].rule;
console.log(`👻 ${ruleName} (${rule.filePath}:${rule.line})`);

const testCases = rulesAndTestCases[ruleName].testCases;
if(!testCases || testCases.length == 0){
continue;
}

for(let testCase of testCases){
if(!await runTestCase(rule, testCase, rulesDir))
allTestSucessful = false;
}
}

for(let ruleName in rulesAndTestCases){
const rule = rulesAndTestCases[ruleName].rule;
console.log(`👻 ${ruleName} (${rule.filePath}:${rule.line})`);
if(!allTestSucessful){
process.exit(1);
}

//merge
let rules = Object.values(rulesAndTestCases).map((ruleAndTestCases) => ruleAndTestCases.rule.content);
const ruleFileContent = generateRuleFileContent(rules, rulesDir);
const ruleFile = path.join(rulesDir, 'spectral.yaml');
fs.writeFileSync(ruleFile, ruleFileContent, 'utf8');
console.log("✅ Spectral rules merged in the file: " + ruleFile);


/**
* @param {string[]} args
* @returns
*/
function getAndCheckRulesDdir(args) {
if (args.length == 0) {
console.error("⚠️ Please provide the directory containing the spectral rules in .md files as an argument.");
process.exit(1);
}
const rulesDir = args[0];
if (!fs.existsSync(rulesDir)) {
console.error("⚠️ The rules directory does not exist: " + rulesDir);
process.exit(1);
}
let rules = Object.values(rulesAndTestCases).filter((ruleAndTestCases) => ruleAndTestCases.rule).map((ruleAndTestCases) => ruleAndTestCases.rule.content);
const ruleFileContent = generateRuleFileContent(rules, rulesDir);
const ruleFile = path.join(rulesDir, 'spectral.yaml');
fs.writeFileSync(ruleFile, ruleFileContent, 'utf8');
console.log("✅ Spectral rules merged in the file: " + ruleFile);
}else if (args[0] === 'test') {
const rulesDir = args[1];
console.log("🔎 Testing the spectral rules from the .md files in the directory: " + rulesDir);
let rulesAndTestCases = extractAllRulesAndTestCases(rulesDir);

//run the test cases for each rule
for(let ruleName in rulesAndTestCases){
const rule = rulesAndTestCases[ruleName].rule;
const testCases = rulesAndTestCases[ruleName].testCases;
console.log(`👻 ${ruleName} (${rule.filePath}:${rule.line})`);
if(!testCases || testCases.length == 0){
continue;
}

for(let testCase of testCases){
const testCaseSuccess = await runTestCase(rule, testCase, rulesDir);
if(! testCaseSuccess)
process.exitCode = 1;
}
//check if spectral.base.yaml exists in the rules dir
if (!fs.existsSync(path.join(rulesDir, 'spectral.base.yaml'))) {
console.error("⚠️ The spectral.base.yaml file does not exist in the rules directory: " + rulesDir);
process.exit(1);
}
}
return rulesDir;
}

0 comments on commit 48dbfca

Please sign in to comment.