-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparseXml.js
85 lines (68 loc) · 2.19 KB
/
parseXml.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
'use strict';
const fs_prom = require('fs-promise'),
fs = require('fs'),
path = require('path'),
xml2js = require('xml2js');
const exemptDirsDef = ['test-classes', 'config', 'node_modules', 'feedback'];
const parser = new xml2js.Parser();
let basePathGlobal;
let exemptDirsGlobal;
let parseXml = (xml) => {
return new Promise((resolve, reject) => {
parser.parseString(xml, (err, res) => {
let cases = res.testsuite.testcase;
let casesMap = cases.map(curr => {
let out = {};
out['exercise'] = curr.$.name;
out['success'] = !('failure' in curr);
return out;
});
resolve(casesMap);
})
})
};
let readDir = (stat, file) => {
return new Promise((resolve, reject) => {
let completePath = path.join(basePathGlobal, file, 'result.xml');
if (stat.isDirectory() && fs.existsSync(completePath)) {
fs_prom.readFile(completePath, {encoding: 'utf8'})
.then(parseXml)
.then(result => {
result['name'] = file;
return resolve(result)
})
.catch(console.error);
} else {
resolve(null);
}
})
};
let checkForDirectory = (file) => {
return new Promise((resolve, reject) => {
fs_prom.stat(path.join(basePathGlobal, file))
.then(stat => readDir(stat, file))
.then(resolve)
.catch(console.error)
})
};
let iterateOverFiles = (files) => {
return new Promise((resolve, reject) => {
let filtered = files.filter(file => exemptDirsGlobal.indexOf(file) < 0);
Promise.all(filtered.map(checkForDirectory))
.then(result => resolve(result.filter(c => c)))
.catch(console.error)
})
};
let parseXmlOut = (basePath, exemptDirs) => {
exemptDirsGlobal = exemptDirs || exemptDirsDef;
basePathGlobal = basePath;
return new Promise((resolve, reject) => {
fs_prom.readdir(basePath)
.then(iterateOverFiles)
.then(resolve)
.catch(console.error);
})
};
module.exports = {
parseXml: parseXmlOut
};