Skip to content
Permalink

Comparing changes

This is a direct comparison between two commits made in this repository or its related repositories. View the default comparison for this range or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: wework/speccy
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 9f7cf5ea78d8cf15d66c7fd847f1ff24e6bb18ed
Choose a base ref
..
head repository: wework/speccy
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 6ab5082f2565c772ce3e0ed12217a5a8cfb96b91
Choose a head ref
Showing with 2,115 additions and 2,222 deletions.
  1. +28 −6 lib/loader.js
  2. +7 −3 lib/rules.js
  3. +1 −1 lint.js
  4. +1,970 −2,190 package-lock.json
  5. +3 −2 package.json
  6. +11 −10 resolve.js
  7. +2 −1 rules/default.yaml
  8. +4 −4 speccy.js
  9. +73 −1 test/integration/lint.test.js
  10. +16 −4 test/lib/rules.test.js
34 changes: 28 additions & 6 deletions lib/loader.js
Original file line number Diff line number Diff line change
@@ -6,6 +6,7 @@ const path = require('path');
const rules = require('./rules.js');
const resolver = require('oas-resolver');
const yaml = require('js-yaml');
const readline = require('readline');

class ExtendableError extends Error {
constructor(message) {
@@ -27,6 +28,21 @@ function readFileAsync(filename, encoding) {
});
}

function readFileStdinAsync() {
return new Promise((resolve, reject) => {
const rl = readline.createInterface({
input: process.stdin
});
let lines = [];
rl.on('line', (line) => {
lines.push(line);
});
rl.on('close', () => {
resolve(lines.join('\n'));
});
});
}

const fetchUrl = async (url) => {
let response;
try {
@@ -45,18 +61,24 @@ const fetchUrl = async (url) => {
};


// file can be null, meaning stdin
function readSpecFile(file, options) {
if (options.verbose > 1) {
console.log('GET ' + file);
file ? console.error('GET ' + file) : console.error('GET <stdin>');
}
if (file && file.startsWith('http')) {
if (!file) {
// standard input
return readFileStdinAsync();
} else if (file && file.startsWith('http')) {
// remote file
return fetch(file).then(res => {
if (res.status !== 200) {
throw new Error(`Received status code ${res.status}`);
}
return res.text();
})
} else {
// local file
// TODO error handlers?
return readFileAsync(file, 'utf8');
}
@@ -83,16 +105,16 @@ const recursivelyLoadRulesets = async (ruleset, loadedRulesets, options) => {
let text;
// If the ruleset looks like a HTTP URL
if (ruleset && ruleset.startsWith('http')) {
if (verbose > 1) console.log('GET ' + ruleset);
if (verbose > 1) console.error('GET ' + ruleset);
text = await fetchUrl(ruleset);
}
else if (fs.existsSync(ruleset)) {
if (verbose > 1) console.log('READ ' + ruleset);
if (verbose > 1) console.error('READ ' + ruleset);
text = fs.readFileSync(ruleset, 'utf8');
}
else {
const rulesetFile = path.join(__dirname, '../rules/' + ruleset + '.yaml');
if (verbose > 1) console.log('READ ' + rulesetFile);
if (verbose > 1) console.error('READ ' + rulesetFile);
text = fs.readFileSync(rulesetFile, 'utf8');
}

@@ -111,7 +133,7 @@ const recursivelyLoadRulesets = async (ruleset, loadedRulesets, options) => {
console.log(`Found ${data.rules.length} rules in ${ruleset}: ${data.rules.map(x => x.name)}`);
}
// Create and hold the rules
rules.createNewRules(data.rules);
rules.createNewRules(data.rules, data.url);
}

return loadedRulesets;
10 changes: 7 additions & 3 deletions lib/rules.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
'use strict';

const documentationUrl = 'https://speccy.io/rules/1-rulesets';
let activeRules = {};
let skipRules = [];

@@ -8,14 +9,17 @@ const init = (params = {}) => {
skipRules = params.skip || [];
};

const createNewRules = rules => {
rules.forEach(rule => createNewRule(rule));
const createNewRules = (rules, rulesetDocumentationUrl) => {
rules.forEach(rule => createNewRule(rule, rulesetDocumentationUrl));
};

const createNewRule = rule => {
const createNewRule = (rule, rulesetDocumentationUrl) => {
if (rule.disabled === true) return;
// @DEPRECATED in v0.9.0, use `disabled: true`
if (rule.enabled === false) return;

if (!rule.url) rule.url = (rulesetDocumentationUrl) ? rulesetDocumentationUrl : documentationUrl;

activeRules[rule.name] = rule;
}

2 changes: 1 addition & 1 deletion lint.js
Original file line number Diff line number Diff line change
@@ -58,7 +58,7 @@ const formatLintResults = lintResults => {
${colors.yellow + pointer} ${colors.cyan} R: ${rule.name} ${colors.white} D: ${rule.description}
${colors.reset + truncateLongMessages(error.message)}
More information: https://speccy.io/rules/1-rulesets#${rule.name}
More information: ${rule.url}#${rule.name}
`;
});

Loading