Skip to content

Commit

Permalink
async flag and some refactoring
Browse files Browse the repository at this point in the history
- restored htmlBeautifier func-ty
- reworked langs it render
- added async flag to force calling .apply with cb on engine
- added safer call of i18n
- fixed lang bugs
  • Loading branch information
Alexej Yaroshevich committed Feb 13, 2015
1 parent d23bdb4 commit afa758a
Show file tree
Hide file tree
Showing 7 changed files with 107 additions and 60 deletions.
13 changes: 0 additions & 13 deletions lib/assets/it-i18n.jst

This file was deleted.

55 changes: 46 additions & 9 deletions lib/assets/it.jst
Original file line number Diff line number Diff line change
@@ -1,13 +1,50 @@
it('should be equal `${ it }` by ${ engine.name }', function (<% if (saveHtml) { %>done<% } %>) {
var bemjson = references['${ it }'].bemjson,
expected = references['${ it }'].html,
actual = engines['${ engine.name }'].apply(bemjson);
<%
// prepares
var titleSuffix = lang ? ' in `' + lang + '` lang' : '';
var subreference = lang ? '[\'' + lang + '\']' : '';
var prettifyEngineName = function (ngn) {
return lang ? String(ngn).toLowerCase().replace(' ', '-') + '.' + lang : ngn;
};
if (saveHtml) {
var filename = [it, prettifyEngineName(engine.name), 'html'].join('.');
}
%>
it('should be equal `${ it }` by ${ engine.name }${ titleSuffix }', function (<% if (saveHtml || engine.async) { %>done<% } %>) {
var bemjson = references['${ it }']${ subreference }.bemjson,
expected = references['${ it }']${ subreference }.html;<%
if (lang) { %>
lazies['${ engine.name }${ lang }']();
<% }
if (!engine.async) { %>
// sync mode
var actual = engines['${ engine.name }']${ subreference }.apply(bemjson);
assertHtml(actual, expected);<%
if (saveHtml) {
var filename = [it, engine.name, 'html'].join('.'),
sep = '\n ';
print(sep + 'fs.writeFile(path.join(__dirname, \'' + filename + '\'), beautifyHtml(actual), done);');
} %>
if (saveHtml) { %>
saveHtmlFile('${ filename }', actual, done);
<% }
} else { // engine.async %>
// async mode
engines['${ engine.name }']${ subreference }.apply(bemjson, function(errs, actual) {
if (errs !== null) {
done(errs);
return;
}
assertHtml(actual, expected, function(err) {
<% if (saveHtml) {%>
saveHtmlFile('${ filename }', actual, function() {
done(err || null);
});
<% } else { %>
done(err || null);
<% } %>
});
});<%
} %>

});
41 changes: 26 additions & 15 deletions lib/assets/tmpl-spec.jst
Original file line number Diff line number Diff line change
@@ -1,9 +1,21 @@
<%
function reRequire(where, what, lazy) {
var name = what.name,
target = what.target,
exportName = what.exportName;
lazy && print('lazies[\'' + lazy + '\'] = function () {\n');
print('dropRequireCache(require, require.resolve(\'' + target + '\'));\n');
print((lazy ? 'return ' : '') + where + '[\'' + name + '\'] = require(\'' + target + '\')' + exportName + ';\n');
lazy && print('};\n');
}
%>
var assert = require('assert'),
path = require('path'),
<% if (saveHtml) { %>
fs = require('fs'),
beautifyHtml = require('${ paths['js-beautify'] }').html,
<% } %>
beautifyHtml = function(html) {
return require('${ paths['js-beautify'] }').html(html, beautifyHtmlConfig);
},
beautifyHtmlConfig = { unformatted: [
'a', 'span', 'img', 'address', 'script',
'h1', 'h2', 'h3', 'h4', 'h5','h6',
Expand All @@ -13,11 +25,16 @@ var assert = require('assert'),
'font', 'ins', 'del', 'pre', 'address', 'dt',
'q', 'i', 'b', 'u', 's', 'bdo', 'em'
]},
saveHtmlFile = function(filename, actual, done) {
fs.writeFile(path.join(__dirname, filename), beautifyHtml(actual), done);
},
<% } %>
dropRequireCache = require('enb/lib/fs/drop-require-cache'),
HtmlDiffer = require('${ paths['html-differ'] }').HtmlDiffer,
htmlDiffer = new HtmlDiffer('bem'),
referencesFilename = require.resolve('${ paths.references }'),
engines,
lazies = {},
references;

describe('${ describe }', function() {
Expand All @@ -27,19 +44,11 @@ describe('${ describe }', function() {

engines = {};
<% _.forEach(engines, function(engine) {
function reRequire(where, what) {
var name = what.name,
target = what.target,
exportName = what.exportName;
print('dropRequireCache(require, require.resolve(\'' + target + '\'));\n');
print(where + '[\'' + name + '\'] = require(\'' + target + '\')' + exportName + ';\n');
}
if (langs.length) {
if (langs && langs.length) {
var engineObject = 'engines[\'' + engine.name + '\']';
print(engineObject + ' = {};\n');
_.forEach(engine.langs, function(lang) {
reRequire(engineObject, lang);
reRequire(engineObject, lang, engine.name + lang.name);
});
} else {
reRequire('engines', engine);
Expand All @@ -51,9 +60,9 @@ describe('${ describe }', function() {
describe('${ it }', function() {
<% _.forEach(engines, function(engine) {
if (langs.length) {
if (langs && langs.length) {
_.forEach(langs, function(lang) {
print(template('it-i18n', {
print(template('it', {
it: it,
engine: engine,
lang: lang,
Expand All @@ -64,6 +73,7 @@ describe('${ it }', function() {
print(template('it', {
it: it,
engine: engine,
lang: null,
saveHtml: saveHtml
}));
}
Expand All @@ -72,9 +82,10 @@ describe('${ it }', function() {
});<% }); %>
});

function assertHtml(actual, expected) {
function assertHtml(actual, expected, done) {
if (htmlDiffer.isEqual(actual, expected)) {
assert.ok(actual);
done && done(null);
} else {
assert.fail(actual, expected, null, '\n');
}
Expand Down
4 changes: 3 additions & 1 deletion lib/plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,11 @@ module.exports = function (helper) {

return level;
}),
langs: options.langs || [],
langs: options.langs,
engines: _.map(engines, function (engine, name) {
var techPath = engine.tech,
tech = require(techPath),
async = !!engine.async,
options = _.cloneDeep(engine.options || {}),
target = '?.' + name.toLowerCase().replace(' ', '-') + '.js',
exportName = options && options.exportName;
Expand All @@ -62,6 +63,7 @@ module.exports = function (helper) {
target: target,
exportName: exportName,
tech: tech,
async: async,
options: options
};
}),
Expand Down
4 changes: 2 additions & 2 deletions lib/techs/mock-lang-js.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ module.exports = require('enb/lib/build-flow').create()
return vfs.read(source, 'utf8')
.then(function (content) {
var mock = [
'(function(global, bem_) {',
';(function(global, bem_) {',
' global.BEM = bem_;',
' var i18n = bem_.I18N = function(keyset, key, param) {',
' var result = key;',
Expand All @@ -20,7 +20,7 @@ module.exports = require('enb/lib/build-flow').create()
' i18n.keyset = function() { return i18n }',
' i18n.key = function(key) { return key }',
' i18n.lang = function() { return }',
'})(this, typeof BEM === \'undefined\' ? {} : BEM);'
'}(this, typeof BEM === \'undefined\' ? {} : BEM));'
].join('\n'),
mapIndex = content.lastIndexOf('//# sourceMappingURL='),
map;
Expand Down
32 changes: 20 additions & 12 deletions lib/techs/references.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,34 @@ module.exports = require('enb/lib/build-flow').create()
.useDirList('tmpl-specs')
.builder(function (dirs) {
var references = {},
bemjsons = {},
htmls = {};
bemjsons = [],
htmls = [];

dirs.forEach(function (dir) {
dir.files.forEach(function (file) {
var filename = file.name,
name = filename.split('.')[0];
fullname = file.fullname,
name = filename.split('.')[0],
lang = getLang(fullname),
item = {
name: name,
fullname: fullname,
lang: lang
};

if (hasExt(filename, '.bemjson.js')) {
bemjsons[name] = file.fullname;
bemjsons.push(item);
} else if (hasExt(filename, '.html')) {
htmls[name] = file.fullname;
htmls.push(item);
}
});
});

return vow.all([
vow.all(Object.keys(bemjsons).map(function (name) {
var filename = bemjsons[name],
lang = getLang(filename);
vow.all(bemjsons.map(function (file) {
var name = file.name,
lang = file.lang,
filename = file.fullname;

dropRequireCache(require, filename);

Expand All @@ -45,11 +53,11 @@ module.exports = require('enb/lib/build-flow').create()
}
});
})),
vow.all(Object.keys(htmls).map(function (name) {
var filename = htmls[name],
lang = getLang(filename);
vow.all(htmls.map(function (file) {
var name = file.name,
lang = file.lang;

return vfs.read(filename, 'utf-8')
return vfs.read(file.fullname, 'utf-8')
.then(function (source) {
var reference = references[name] || (references[name] = {});

Expand Down
18 changes: 10 additions & 8 deletions lib/techs/tmpl-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ var path = require('path'),
assetsDirname = path.join(__dirname, '..', 'assets'),
readAssets = vow.all([
vfs.read(path.join(assetsDirname, 'tmpl-spec.jst'), 'utf-8'),
vfs.read(path.join(assetsDirname, 'it.jst'), 'utf-8'),
vfs.read(path.join(assetsDirname, 'it-i18n.jst'), 'utf-8')
vfs.read(path.join(assetsDirname, 'it.jst'), 'utf-8')
]),
lodash = require('lodash'),
template = lodash.template,
Expand Down Expand Up @@ -40,13 +39,15 @@ module.exports = require('enb/lib/build-flow').create()
references = require(referencesFilename),
engines = this._engines,
langs = this._langs,
oneLang = langs === true,
manyLangs = Array.isArray(langs) && langs.length > 0,
saveHtml = this._saveHtml,
coverageEngines = this._coverageEngines,
coverageBundle = this._coverageBundle,
its = {};

if (!this._coverageBundle) {
if (langs.length > 0) {
if (manyLangs) {
Object.keys(references).forEach(function (name) {
langs.forEach(function (lang) {
var reference = references[name],
Expand All @@ -69,10 +70,9 @@ module.exports = require('enb/lib/build-flow').create()
}
its = Object.keys(its);

return readAssets.spread(function (asset, it, iti18n) {
return readAssets.spread(function (asset, it) {
var templates = {
it: it,
'it-i18n': iti18n
it: it
},
data = {
describe: path.basename(nodePath) + ' (' + path.dirname(nodePath) + ')',
Expand All @@ -83,21 +83,22 @@ module.exports = require('enb/lib/build-flow').create()

exportName = engine.exportName ? '.' + engine.exportName : '';

if (langs && !langs.length) {
if (oneLang) {
target = coverageBundle ?
target.replace('.js.instr.js', '.lang.js.instr.js') :
target.replace('.js', '.lang.js');
}

target = './' + node.unmaskTargetName(target);

if (langs.length) {
if (manyLangs) {
return {
name: engine.name,
langs: langs.map(function (lang) {
var langTarget = target.replace('.js', '.' + lang + '.js');
return {
name: lang,
async: engine.async,
target: langTarget,
exportName: exportName
};
Expand All @@ -107,6 +108,7 @@ module.exports = require('enb/lib/build-flow').create()

return {
name: engine.name,
async: engine.async,
target: target,
exportName: exportName
};
Expand Down

0 comments on commit afa758a

Please sign in to comment.