Transactor(db, function(err, transactor){ if(err) return t.end(err); λ.series([ λ.curry(transactor.transact, [["0", "_db/attribute" , "emails"], ["0", "_db/type" , "String"], ["0", "_db/is-multi-valued", true]]), λ.curry(transactor.transact, [["me", "emails", "1@email"]]), λ.curry(transactor.transact, [["me", "emails", "2@email"], ["me", "emails", "3@email"]]) ], function(err, fb_versions){ if(err) return t.end(err); var fb = transactor.connection.snap(); λ.concurrent({ my_emails: λ.curry(q, fb, [["me", "emails", "?emails"]]), the_first_me: λ.curry(getEntity, fb_versions[1], "me"), the_last_me: λ.curry(getEntity, fb, "me") }, function(err, r){ if(err) return t.end(err); t.deepEqual(_.pluck(r.my_emails, "?emails"), ["1@email", "2@email", "3@email"]); t.deepEqual(r.the_first_me, {emails: ["1@email"]}); t.deepEqual(r.the_last_me, {emails: ["1@email", "2@email", "3@email"]}); t.end(); }); }); });
module.exports.commit = function (files, message, newVer, tagName, callback) { message = message.replace('%s', newVer).replace('"', '').replace("'", ''); files = files.map(function (file) { return '"' + escapeQuotes(file) + '"'; }).join(' '); var functionSeries = [ function (done) { cp.exec(gitApp + ' add ' + files, gitExtra, done); }, function (done) { cp.exec([gitApp, 'commit', '-m', '"' + message + '"'].join(' '), gitExtra, done); }, function (done) { cp.exec( [ gitApp, 'tag', '-a', tagName, '-m', '"' + message + '"' ].join(' '), gitExtra, done ); } ]; contra.series(functionSeries, callback); };
function footprint (done) { var dominusNeedle = /(with a footprint of \*\*)(\S*)(\*\* minified and gzipped)/mig; var jqueryNeedle = /(vs the \*\*)(\S*)(\*\* in jQuery)/mig; contra.series([ contra.curry(replaceFootprint, dominusNeedle, './dist/dominus.min.js'), contra.curry(replaceFootprint, jqueryNeedle, './node_modules/jquery/dist/jquery.min.js') ], done); }
Transactor(db, {}, function(err, transactor){ if(err) return callback(err); λ.series([ λ.curry(transactor.transact, [["01", "_db/attribute", "is"], ["01", "_db/type" , "String"]], {}) ].concat(prophets.map(function(name){ return λ.curry(transactor.transact, [["prophet", "is", name]], {}); })), callback); });
function updateSyncRoot (article, done) { if (!enabled) { winston.debug('Skipping filesystem synchronization from database.'); done(null); return; } const sources = getGitDirectory({ created: article.created, slug: article.slug }); const d = file => path.join(sources, file); const files = { [d('metadata.json')]: JSON.stringify({ id: article._id, author: article.author._id || article.author, title: article.titleMarkdown, slug: article.slug, tags: article.tags, heroImage: article.heroImage || null }, null, 2), [d('summary.markdown')]: article.summary, [d('teaser.markdown')]: article.teaser, [d('editor-notes.markdown')]: article.editorNote, [d('introduction.markdown')]: article.introduction, [d('body.markdown')]: article.body, [d('readme.markdown')]: htmlService.downgradeEmojiImages(htmlService.absolutize([ section(article.heroImage ? `<img src='${article.heroImage}' alt='${article.title}' />` : ''), section(article.titleHtml, 'h1'), section(article.tags.map(tag => section(tag, 'kbd')).join(' '), 'p'), section(article.summaryHtml, 'blockquote'), section(article.teaserHtml), section(article.editorNoteHtml), section(article.introductionHtml), section(article.bodyHtml) ].join('\n\n'))) }; const filenames = Object.keys(files); contra.series([ next => mkdirp(sources, next), next => contra.concurrent(filenames.map(filename => next => write(filename, files[filename], next) ), next) ], err => done(err, filenames)); function section (html, tag) { tag = tag || 'div'; return `<${tag}>${html || ''}</${tag}>`; } function write (filename, data, done) { fs.writeFile(filename, (data || '').trim() + '\n', 'utf8', done); } }
function screenshot (done) { contra.series({ take: function take (next) { webshot(req.url, actual, next); }, compare: function compare (next) { imageDiff({ actualImage: actual, expectedImage: expected, diffImage: diff, threshold: 0.1 }, next); } }, done); }
function migrate (article, done) { const date = moment(article.created).format('YYYY-MM-DD--'); const dir = path.join(base, date + article.slug); contra.series([ next => mkdirp(path.join(dir, 'source'), next), next => contra.concurrent([ next => console.log(date + article.slug), next(), next => write('source/metadata.json', JSON.stringify({ id: article._id, title: article.titleMarkdown, slug: article.slug, tags: article.tags, publication: moment(article.publication).format('DD-MM-YYYY HH:mm'), status: article.status, social: { email: article.email, tweet: article.tweet, fb: article.fb, echojs: article.echojs, lobsters: article.lobsters, hn: article.hn } }, null, 2), next), next => dec('source/summary.markdown', article.summaryHtml, next), next => dec('source/teaser.markdown', article.teaserHtml, next), next => dec('source/introduction.markdown', article.introductionHtml, next), next => dec('source/body.markdown', article.bodyHtml, next), next => abs('summary.html', article.summaryHtml, next), next => abs('teaser.html', article.teaserHtml, next), next => abs('introduction.html', article.introductionHtml, next), next => abs('body.html', article.bodyHtml, next) ], next) ], done); function dec (filename, data, done) { const decompiled = markdownService.decompile(data, { href: authority + '/articles/' + article.slug }); write(filename, decompiled, done); } function abs (filename, data, done) { write(filename, htmlService.absolutize(data), done); } function write (filename, data, done) { fs.writeFile(path.join(dir, filename), data.trim() + '\n', 'utf8', done); } }
Transactor(db, {}, function(err, transactor){ if(err) return t.end(err); λ.series([ λ.curry(transactor.transact, [["0", "_db/attribute", "name"], ["0", "_db/type" , "String"]]), λ.curry(transactor.transact, [["1", "name", "?notavar"], ["2", "name", "notavar"], ["3", "name", "\\?notavar"], ["4", "name", "\\\\"], ["5", "name", "?_"]]) ], function(err){ if(err) return t.end(err); var fb = transactor.connection.snap(); λ.concurrent({ should_be_a_var: λ.curry(q, fb, [["?id", "name", "?notavar"]]), bind_it: λ.curry(q, fb, [["?id", "name", "?name"]], [{"?name": "?notavar"}]), escape_it: λ.curry(q, fb, [["?id", "name", "\\?notavar"]]), bind_it2: λ.curry(q, fb, [["?id", "name", "?name"]], [{"?name": "\\?notavar"}]), not_actually_escaped: λ.curry(q, fb, [["?id", "name", "\\\\?notavar"]]), double_slash: λ.curry(q, fb, [["?id", "name", "\\\\\\"]]), double_slash_bind: λ.curry(q, fb, [["?id", "name", "?name"]], [{"?name": "\\\\"}]), not_a_throw_away: λ.curry(q, fb, [["?id", "name", "\\?_"]]), not_a_throw_away2: λ.curry(q, fb, [["?id", "name", "?name"]], [{"?name": "?_"}]), }, function(err, r){ t.deepEqual(_.sortBy(r.should_be_a_var, "?id"), [{"?id": "1", "?notavar": "?notavar"}, {"?id": "2", "?notavar": "notavar"}, {"?id": "3", "?notavar": "\\?notavar"}, {"?id": "4", "?notavar": "\\\\"}, {"?id": "5", "?notavar": "?_"}]); t.deepEqual(r.bind_it, [{"?id": "1", "?name": "?notavar"}]); t.deepEqual(r.escape_it, [{"?id": "1"}]); t.deepEqual(r.bind_it2, [{"?id": "3", "?name": "\\?notavar"}]); t.deepEqual(r.not_actually_escaped, [{"?id": "3"}]); t.deepEqual(r.double_slash, [{"?id": "4"}]); t.deepEqual(r.double_slash_bind, [{"?id": "4", "?name": "\\\\"}]); t.deepEqual(r.not_a_throw_away, [{"?id": "5"}]); t.deepEqual(r.not_a_throw_away2, [{"?id": "5", "?name": "?_"}]); t.end(err); }); }); });
Transactor(db, function(err, transactor){ if(err) return t.end(err); λ.series([ λ.curry(transactor.transact, [["s0", "_db/attribute" , "time"], ["s0", "_db/type" , "Date"], ["s0", "_db/is-multi-valued", true], ["s1", "_db/attribute" , "int"], ["s1", "_db/type" , "Integer"], ["s2", "_db/attribute" , "float"], ["s2", "_db/type" , "Number"]]), λ.curry(transactor.transact, [["1", "time", new Date(2010, 11, 25)]]), λ.curry(transactor.transact, [["2", "int", 123]]), λ.curry(transactor.transact, [["3", "float", 123.45]]) ], function(err, fb_versions){ if(err) return t.end(err); var fb = transactor.connection.snap(); t.ok(fb.schema.time["_db/is-multi-valued"] === true, "must also decode db default schema values"); λ.concurrent({ time1: λ.curry(q, fb, [["1", "time", "?val"]]), integer1: λ.curry(q, fb, [["2", "int", "?val"]]), number1: λ.curry(q, fb, [["3", "float", "?val"]]), //query with variable attribute name time2: λ.curry(q, fb, [["1", "?a", "?val"]]), integer2: λ.curry(q, fb, [["2", "?a", "?val"]]), number2: λ.curry(q, fb, [["3", "?a", "?val"]]), //query with unknown attribute name time3: λ.curry(q, fb, [["1", "?_", "?val"]]), integer3: λ.curry(q, fb, [["2", "?_", "?val"]]), number3: λ.curry(q, fb, [["3", "?_", "?val"]]), //encode values at query with known attribute name time4: λ.curry(q, fb, [["?e", "time", new Date(2010, 11, 25)]]), integer4: λ.curry(q, fb, [["?e", "int", 123]]), number4: λ.curry(q, fb, [["?e", "float", 123.45]]), //encode values at query with variable attribute name time5: λ.curry(q, fb, [["?e", "?a", new Date(2010, 11, 25)]]), integer5: λ.curry(q, fb, [["?e", "?a", 123]]), number5: λ.curry(q, fb, [["?e", "?a", 123.45]]), //encode values at query with unknown attribute name time6: λ.curry(q, fb, [["?e", "?_", new Date(2010, 11, 25)]]), integer6: λ.curry(q, fb, [["?e", "?_", 123]]), number6: λ.curry(q, fb, [["?e", "?_", 123.45]]) }, function(err, r){ if(err) return t.end(err); _.each(r, function(results, key){ t.equal(results.length, 1, "all these type encode/decode queries should return 1 result"); }); t.ok(_.isDate(r.time1[0]['?val'])); t.ok(_.isDate(r.time2[0]['?val'])); t.ok(_.isDate(r.time3[0]['?val'])); t.ok(_.isNumber(r.integer1[0]['?val'])); t.ok(_.isNumber(r.integer2[0]['?val'])); t.ok(_.isNumber(r.integer3[0]['?val'])); t.equal(r.integer1[0]['?val'], 123); t.equal(r.integer2[0]['?val'], 123); t.equal(r.integer3[0]['?val'], 123); t.ok(_.isNumber(r.number1[0]['?val'])); t.ok(_.isNumber(r.number2[0]['?val'])); t.ok(_.isNumber(r.number3[0]['?val'])); t.equal(r.number1[0]['?val'], 123.45); t.equal(r.number2[0]['?val'], 123.45); t.equal(r.number3[0]['?val'], 123.45); t.equal(r.time4[0]['?e'], "1"); t.equal(r.time5[0]['?e'], "1"); t.equal(r.time6[0]['?e'], "1"); t.equal(r.integer4[0]['?e'], "2"); t.equal(r.integer5[0]['?e'], "2"); t.equal(r.integer6[0]['?e'], "2"); t.equal(r.number4[0]['?e'], "3"); t.equal(r.number5[0]['?e'], "3"); t.equal(r.number6[0]['?e'], "3"); t.end(); }); }); });