示例#1
0
  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();
      });
    });
  });
示例#2
0
文件: git.js 项目: paulwib/mversion
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);
};
示例#3
0
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);
}
示例#4
0
 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);
 });
示例#5
0
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);
  }
}
示例#6
0
 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);
 }
示例#7
0
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);
  }
}
示例#8
0
  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);
      });
    });
  });
示例#9
0
  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();
      });
    });
  });