Skip to content

Commit e7dee5c

Browse files
committed
Add code validator and Travis CI
1 parent ef46369 commit e7dee5c

File tree

10 files changed

+381
-48
lines changed

10 files changed

+381
-48
lines changed

.bin/batchFix.js

Lines changed: 0 additions & 45 deletions
This file was deleted.

.gitignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
/.idea
22
/node_modules
33
/npm-debug.log
4-
/package.json
5-
/package-lock.json
64
.DS_Store

.travis.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
language: node_js
2+
node_js: 'stable'
3+
cache: npm

.validate/constants.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
const path = require('path');
2+
3+
const rootDir = path.resolve(__dirname, '..');
4+
const MAX_STEPS = 100;
5+
6+
module.exports = {
7+
rootDir,
8+
MAX_STEPS,
9+
};

.validate/index.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
const path = require('path');
2+
const fs = require('fs-extra');
3+
4+
const { listDirectories, listFiles } = require('./utils');
5+
const { rootDir } = require('./constants');
6+
const validate = {
7+
js: require('./js'),
8+
};
9+
10+
const categories = listDirectories(rootDir).filter(dir => dir !== 'node_modules');
11+
let hasError = false;
12+
for (const category of categories) {
13+
const categoryDir = path.resolve(rootDir, category);
14+
const algorithms = listDirectories(categoryDir);
15+
for (const algorithm of algorithms) {
16+
const algorithmDir = path.resolve(categoryDir, algorithm);
17+
const files = listFiles(algorithmDir);
18+
for (const file of files) {
19+
const ext = file.split('.').pop();
20+
const validator = validate[ext];
21+
if (validator) {
22+
const filePath = path.resolve(algorithmDir, file);
23+
const content = fs.readFileSync(filePath, 'utf-8');
24+
if (!validator(category, algorithm, file, content)) {
25+
hasError = true;
26+
}
27+
}
28+
}
29+
}
30+
}
31+
32+
process.exit(hasError ? 1 : 0);

.validate/js/index.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
const path = require('path');
2+
const { Commander } = require('algorithm-visualizer');
3+
const { rootDir } = require('../constants');
4+
const { signale } = require('../utils');
5+
const { MAX_STEPS } = require('../constants');
6+
7+
module.exports = (category, algorithm, file, content) => {
8+
const errors = [];
9+
const error = message => errors.push(message);
10+
const warns = [];
11+
const warn = message => warns.push(message);
12+
13+
try {
14+
Commander.init();
15+
require(path.resolve(rootDir, category, algorithm, file));
16+
} catch (e) {
17+
error(e);
18+
}
19+
const steps = Commander.commands.filter(command => command.method === 'delay').length;
20+
if (steps > MAX_STEPS) {
21+
warn('Too many steps.');
22+
}
23+
if (!/\/\/ import visualization libraries {/.test(content)) {
24+
error('Missing the code folding for importing visualization libraries.');
25+
}
26+
if (!/\/\/ define tracer variables {/.test(content)) {
27+
error('Missing the code folding for defining tracer variables.');
28+
}
29+
if (!/\/\/ visualize {/.test(content)) {
30+
error('Missing the code folding for visualizing.');
31+
}
32+
33+
if (errors.length || warns.length) {
34+
signale.log(`${category}/${algorithm}/${file}`);
35+
warns.forEach(error => signale.warn(error));
36+
errors.forEach(error => signale.error(error));
37+
signale.log();
38+
}
39+
return errors.length === 0;
40+
};

.validate/utils.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const path = require('path');
2+
const fs = require('fs-extra');
3+
const { Signale } = require('signale');
4+
5+
function isDirectory(dirPath) {
6+
return fs.lstatSync(dirPath).isDirectory();
7+
}
8+
9+
function listFiles(dirPath) {
10+
return fs.pathExistsSync(dirPath) ? fs.readdirSync(dirPath).filter(fileName => !fileName.startsWith('.')) : [];
11+
}
12+
13+
function listDirectories(dirPath) {
14+
return listFiles(dirPath).filter(fileName => isDirectory(path.resolve(dirPath, fileName)));
15+
}
16+
17+
const signale = new Signale();
18+
19+
module.exports = {
20+
isDirectory,
21+
listFiles,
22+
listDirectories,
23+
signale,
24+
};

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Algorithms
1+
# Algorithms [![Travis (.com)](https://img.shields.io/travis/com/algorithm-visualizer/algorithms.svg?style=flat-square)](https://travis-ci.com/algorithm-visualizer/algorithms)
22

33
> This repository is part of the project [Algorithm Visualizer](https://github.com/algorithm-visualizer).
44

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy