fix: unify single and multifile testing
This commit is contained in:
committed by
Mrugesh Mohapatra
parent
d7dc1acb4a
commit
0f3f27287d
@ -19,22 +19,23 @@ function defaultFile(lang) {
|
||||
tail: ''
|
||||
};
|
||||
}
|
||||
function createCodeGetter(key, regEx, seeds) {
|
||||
function createCodeGetter(codeKey, regEx, seeds) {
|
||||
return container => {
|
||||
const {
|
||||
properties: { id }
|
||||
} = container;
|
||||
const lang = id.match(regEx)[1];
|
||||
const key = `index${lang}`;
|
||||
const code = select('code', container).children[0].value;
|
||||
if (lang in seeds) {
|
||||
seeds[lang] = {
|
||||
...seeds[lang],
|
||||
[key]: code
|
||||
if (key in seeds) {
|
||||
seeds[key] = {
|
||||
...seeds[key],
|
||||
[codeKey]: code
|
||||
};
|
||||
} else {
|
||||
seeds[lang] = {
|
||||
seeds[key] = {
|
||||
...defaultFile(lang),
|
||||
[key]: code
|
||||
[codeKey]: code
|
||||
};
|
||||
}
|
||||
};
|
||||
@ -89,30 +90,28 @@ function createPlugin() {
|
||||
|
||||
file.data = {
|
||||
...file.data,
|
||||
files: Object.keys(seeds).map(lang => seeds[lang])
|
||||
files: seeds
|
||||
};
|
||||
|
||||
// TODO: make this readable.
|
||||
|
||||
if (file.data.files) {
|
||||
file.data.files.forEach(fileData => {
|
||||
const editRegionMarkers = findRegionMarkers(fileData);
|
||||
if (editRegionMarkers) {
|
||||
fileData.contents = removeLines(
|
||||
fileData.contents,
|
||||
editRegionMarkers
|
||||
);
|
||||
Object.keys(seeds).forEach(key => {
|
||||
const fileData = seeds[key];
|
||||
const editRegionMarkers = findRegionMarkers(fileData);
|
||||
if (editRegionMarkers) {
|
||||
fileData.contents = removeLines(
|
||||
fileData.contents,
|
||||
editRegionMarkers
|
||||
);
|
||||
|
||||
if (editRegionMarkers[1] <= editRegionMarkers[0]) {
|
||||
throw Error('Editable region must be non zero');
|
||||
}
|
||||
fileData.editableRegionBoundaries = editRegionMarkers;
|
||||
} else {
|
||||
fileData.editableRegionBoundaries = [];
|
||||
if (editRegionMarkers[1] <= editRegionMarkers[0]) {
|
||||
throw Error('Editable region must be non zero');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
fileData.editableRegionBoundaries = editRegionMarkers;
|
||||
} else {
|
||||
fileData.editableRegionBoundaries = [];
|
||||
}
|
||||
});
|
||||
// TODO: TESTS!
|
||||
}
|
||||
}
|
||||
@ -122,3 +121,4 @@ function createPlugin() {
|
||||
|
||||
exports.challengeSeedToData = createPlugin;
|
||||
exports.createCodeGetter = createCodeGetter;
|
||||
exports.defaultFile = defaultFile;
|
||||
|
@ -2,23 +2,27 @@ const visit = require('unist-util-visit');
|
||||
const { selectAll } = require('hast-util-select');
|
||||
|
||||
const { sectionFilter } = require('./utils');
|
||||
const { createCodeGetter } = require('./challengeSeed-to-data');
|
||||
const { createCodeGetter, defaultFile } = require('./challengeSeed-to-data');
|
||||
const { isEmpty } = require('lodash');
|
||||
|
||||
const solutionRE = /(.+)-solution$/;
|
||||
|
||||
function indexByKey(obj) {
|
||||
return { [obj.key]: { ...obj } };
|
||||
}
|
||||
|
||||
function createPlugin() {
|
||||
return function transformer(tree, file) {
|
||||
function visitor(node) {
|
||||
if (sectionFilter(node, 'solution')) {
|
||||
// fallback for single-file challenges
|
||||
const solutions = selectAll('code', node).map(
|
||||
element => element.children[0].value
|
||||
);
|
||||
file.data = {
|
||||
...file.data,
|
||||
solutions
|
||||
};
|
||||
const rawSolutions = selectAll('code', node).map(element => ({
|
||||
lang: element.properties.className[0].split('-')[1],
|
||||
contents: element.children[0].value
|
||||
}));
|
||||
|
||||
const solutionFiles = {};
|
||||
|
||||
const codeDivs = selectAll('div', node);
|
||||
const solutionContainers = codeDivs.filter(({ properties: { id } }) =>
|
||||
solutionRE.test(id)
|
||||
@ -27,11 +31,20 @@ function createPlugin() {
|
||||
createCodeGetter('contents', solutionRE, solutionFiles)
|
||||
);
|
||||
|
||||
const solutionsAsFiles = rawSolutions
|
||||
.map(({ lang, contents }) => ({
|
||||
...defaultFile(lang),
|
||||
contents
|
||||
}))
|
||||
.map(indexByKey);
|
||||
|
||||
const solutions = isEmpty(solutionFiles)
|
||||
? solutionsAsFiles
|
||||
: [solutionFiles];
|
||||
|
||||
file.data = {
|
||||
...file.data,
|
||||
solutionFiles: Object.keys(solutionFiles).map(
|
||||
lang => solutionFiles[lang]
|
||||
)
|
||||
solutions
|
||||
};
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user