<commit_before>'use strict';

const {series, src, dest} = require('gulp');
const eslint = require('gulp-eslint');
const babel = require('gulp-babel');
const del = require('del');
const {exec} = require('child_process');

function staticFiles() {
  return src(['**/*.js'])
    // .pipe(excludeGitignore())
    .pipe(eslint())
    .pipe(eslint.format())
    .pipe(eslint.failAfterError());
}

function testCoverage() {
  return exec('npm i nyc');
}

function jsTranspile() {
  return src('lib/**/*.js')
    .pipe(babel())
    .pipe(dest('dist'));
}

function prepublish() {
  return jsTranspile();
}

function clean() {
  return del('dist');
}

function defaultTask(cb) {
  staticFiles();
  test();
  cb();
}

exports.build = series(
  clean,
  staticFiles,
  prepublish,
  testCoverage
);

exports.default = defaultTask;

<commit_msg>update gulpfile to make default run<commit_after>'use strict';

const {series, src, dest} = require('gulp');
const eslint = require('gulp-eslint');
const babel = require('gulp-babel');
const del = require('del');
const {exec} = require('child_process');

function staticFiles() {
  return src(['**/*.js'])
    // .pipe(excludeGitignore())
    .pipe(eslint())
    .pipe(eslint.format())
    .pipe(eslint.failAfterError());
}

function testCoverage() {
  return exec('npm i nyc');
}

function jsTranspile() {
  return src('lib/**/*.js')
    .pipe(babel())
    .pipe(dest('dist'));
}

function prepublish() {
  return jsTranspile();
}

function clean() {
  return del('dist');
}

const build = series(
  clean,
  staticFiles,
  prepublish,
  testCoverage
);

function defaultTask(cb) {
  build();
  cb();
}

exports.build = build;
exports.default = defaultTask;

<|endoftext|>


<commit_before>/* ========================================================================
 * Bootstrap-Airview: airview.js v1.0.0
 * https://github.com/deviprsd21/Bootstrap-Airview
 * ========================================================================
 * This Plugin is inspired by Tooltip.js by Jacob Thornton
 * Copyright 2014 Devi Prasad
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */

+function ($) {
  'use strict';

  // AIRVIEW PUBLIC CLASS DEFINITION
  // ===============================

  var Airview = function (element, options) {
    this.init('airview', element, options)
  }

  if (!$.fn.tooltip) throw new Error('Airview requires tooltip.js')

  Airview.VERSION  = '1.0.0'

  Airview.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
    placement: 'auto',
    trigger: 'hover focus',
	url: false,
    content: '',
	width: 'auto',
	error: 'Image Not Found',
    template: '

' +
	'

'
  })

  // NOTE: AIRVIEW EXTENDS tooltip.js
  // ================================

  Airview.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)

  Airview.prototype.constructor = Airview

  Airview.prototype.getDefaults = function () {
    return Airview.DEFAULTS
  }

  Airview.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
	var imgalt  = title.substr(title.lastIndexOf('/') + 1)
    var content = this.getContent()
	var dimension   = {width : this.options.width == 'auto' ? 500 : this.options.width, height: this.options.width == 'auto' ?
	                   this.getHeight(500) : this.getHeight(this.options.width)}

	if(!title && !content) {
	  title = this.options.content ? this.options.url ? this.options.url + this.options.content : this.options.content : ''
	} else {
	  if(title) title = this.options.url ? this.options.url + title : title
	  else title = content ? this.options.url ? this.options.url + content : content : title
	}

	$tip.find('.airview-inner > img').on('load', function(){ $tip.find('.airview-loader').fadeOut() })
	this.options.html ? $tip.find('.airview-inner')['html'](title) : $tip.find('.airview-inner > img')['attr']({src: title, alt: imgalt})
	$tip.find('.airview-inner > img')['attr'](dimension)

    $tip.removeClass('fade top bottom left right in')

    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
    // this manually by checking the contents.
    if (!title) $tip.find('.airview-inner').empty().html('
' + this.options.error + '
')
  }

  Airview.prototype.getHeight = function (width) {
    var $e = this.$element
    return width / $e.attr('data-aratio')
  }

  Airview.prototype.fixTitle = function () {
    var $e = this.$element
	var loaded  = false
	var wait    = false
	var img     = new Image()
	var that    = this

    if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
    }

	var title   = this.getTitle()
	var content = this.getContent()

	if(!title && !content) {
	  title = this.options.content ? this.options.url ? this.options.url + this.options.content : this.options.content : ''
	} else {
	  if(title) title = this.options.url ? this.options.url + title : title
	  else title = content ? this.options.url ? this.options.url + content : content : title
	}

	img.addEventListener('load', function () {  }, true)
	img.src = title

	wait = setInterval(function () {
	  if(img.width != 0 && img.height != 0) {
		$e.attr('data-aratio', img.width / img.height)
		img.removeAttribute("src")
		img = null
		clearInterval(wait)
	  }
	}, 0)
  }

  Airview.prototype.hasContent = function () {
    return this.getTitle() || this.getContent() || " "
  }

  Airview.prototype.getContent = function () {
    var $e = this.$element
    var o  = this.options

    return $e.attr('data-content')
      || (typeof o.content == 'function' ?
            o.content.call($e[0]) :
            o.content)
  }

  Airview.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.airview-arrow'))
  }

  Airview.prototype.tip = function () {
    if (!this.$tip) this.$tip = $(this.options.template)
    return this.$tip
  }

  // AIRVIEW PLUGIN DEFINITION
  // =========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.airview')
      var options = typeof option == 'object' && option

      if (!data && option == 'destroy') return
      if (!data) $this.data('bs.airview', (data = new Airview(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.popover

  $.fn.airview             = Plugin
  $.fn.airview.Constructor = Airview

  // AIRVIEW NO CONFLICT
  // ===================

  $.fn.airview.noConflict = function () {
    $.fn.airview = old
    return this
  }

}(jQuery);
<commit_msg>Image bug fix<commit_after>/* ========================================================================
 * Bootstrap-Airview: airview.js v1.0.0
 * https://github.com/deviprsd21/Bootstrap-Airview
 * ========================================================================
 * This Plugin is inspired by Tooltip.js by Jacob Thornton
 * Copyright 2014 Devi Prasad
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */

+function ($) {
  'use strict';

  // AIRVIEW PUBLIC CLASS DEFINITION
  // ===============================

  var Airview = function (element, options) {
    this.init('airview', element, options)
  }

  if (!$.fn.tooltip) throw new Error('Airview requires tooltip.js')

  Airview.VERSION  = '1.0.0'

  Airview.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
    placement: 'auto',
    trigger: 'hover focus',
	url: false,
    content: '',
	width: 'auto',
	error: 'Image Not Found',
    template: '

' +
	'

'
  })

  // NOTE: AIRVIEW EXTENDS tooltip.js
  // ================================

  Airview.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)

  Airview.prototype.constructor = Airview

  Airview.prototype.getDefaults = function () {
    return Airview.DEFAULTS
  }

  Airview.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
	var imgalt  = title.substr(title.lastIndexOf('/') + 1)
    var content = this.getContent()
	var dimension   = {width : this.options.width == 'auto' ? 500 : this.options.width, height: this.options.width == 'auto' ?
	                   this.getHeight(500) : this.getHeight(this.options.width)}

	if(!title && !content) {
	  title = this.options.content ? this.options.url ? this.options.url + this.options.content : this.options.content : ''
	} else {
	  if(title) title = this.options.url ? this.options.url + title : title
	  else title = content ? this.options.url ? this.options.url + content : content : title
	}

	$tip.find('.airview-inner > img').on('load', function(){ $tip.find('.airview-loader').fadeOut() })
	this.options.html ? $tip.find('.airview-inner')['html'](title) : $tip.find('.airview-inner > img')['attr']({src: title, alt: imgalt})
	$tip.find('.airview-inner > img')['attr'](dimension)

    $tip.removeClass('fade top bottom left right in')

    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
    // this manually by checking the contents.
    if (!title) $tip.find('.airview-inner').empty().html('
' + this.options.error + '
')
  }

  Airview.prototype.getHeight = function (width) {
    var $e = this.$element
    return width / $e.attr('data-aratio')
  }

  Airview.prototype.fixTitle = function () {
    var $e = this.$element
	var loaded  = false
	var wait    = false
	var img     = new Image()
	var that    = this

    if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
    }

	var title   = this.getTitle()
	var content = this.getContent()

	if(!title && !content) {
	  title = this.options.content ? this.options.url ? this.options.url + this.options.content : this.options.content : ''
	} else {
	  if(title) title = this.options.url ? this.options.url + title : title
	  else title = content ? this.options.url ? this.options.url + content : content : title
	}

	img.addEventListener('load', function () {  }, true)
	img.src = title

	wait = setInterval(function () {
	  if(img.width != 0 && img.height != 0) {
		$e.attr('data-aratio', img.width / img.height)
		img.removeAttribute("src")
		img = null
		clearInterval(wait)
	  }
	}, 0)
  }

  Airview.prototype.hasContent = function () {
    return this.getTitle() || this.getContent() || " "
  }

  Airview.prototype.getContent = function () {
    var $e = this.$element
    var o  = this.options

    return $e.attr('data-content')
      || (typeof o.content == 'function' ?
            o.content.call($e[0]) :
            o.content)
  }

  Airview.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.airview-arrow'))
  }

  Airview.prototype.tip = function () {
    if (!this.$tip) this.$tip = $(this.options.template)
    return this.$tip
  }

  // AIRVIEW PLUGIN DEFINITION
  // =========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.airview')
      var options = typeof option == 'object' && option

      if (!data && option == 'destroy') return
      if (!data) $this.data('bs.airview', (data = new Airview(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.popover

  $.fn.airview             = Plugin
  $.fn.airview.Constructor = Airview

  // AIRVIEW NO CONFLICT
  // ===================

  $.fn.airview.noConflict = function () {
    $.fn.airview = old
    return this
  }

}(jQuery);
<|endoftext|>


<commit_before>
Meteor.methods({
  fetchTwitterApi: function(){
  /*  var tweetDebounce = _.debounce(Meteor.bindEnvironment(function(){
      var Twit = Meteor.npmRequire('twit');
      T = new Twit({
        consumer_key: Meteor.settings.twitter.consumer_key,
        consumer_secret: Meteor.settings.twitter.consumer_secret,
        access_token: Meteor.settings.twitter.access_token,
        access_token_secret: Meteor.settings.twitter.access_token_secret
      })
      T.get('search/tweets', { q: 'from:RasmusHjulskov #webonaut', count: 100 }, Meteor.bindEnvironment(function(err, data, response) {
        // if(!err){
          data.statuses.forEach(function(entry) {
            console.log(entry)
            entry.unixTime = moment(entry.created_at).unix();
            Meteor.call('addTweet', entry);
          });
        // }
      }));
    }, 60 * 1000));

    tweetDebounce();*/
  }
});
<commit_msg>Scaling crash testing twitFeed<commit_after>
Meteor.methods({
  fetchTwitterApi: function(){
    var tweetDebounce = _.debounce(Meteor.bindEnvironment(function(){
      var Twit = Meteor.npmRequire('twit');
      T = new Twit({
        consumer_key: Meteor.settings.twitter.consumer_key,
        consumer_secret: Meteor.settings.twitter.consumer_secret,
        access_token: Meteor.settings.twitter.access_token,
        access_token_secret: Meteor.settings.twitter.access_token_secret
      })
      T.get('search/tweets', { q: 'from:RasmusHjulskov #webonaut', count: 100 }, Meteor.bindEnvironment(function(err, data, response) {
        // if(!err){
          data.statuses.forEach(function(entry) {
            console.log(entry)
            entry.unixTime = moment(entry.created_at).unix();
            Meteor.call('addTweet', entry);
          });
        // }
      }));
    }, 60 * 1000));

    tweetDebounce();
  }
});
<|endoftext|>


<commit_before>var fs = require('fs'),
    DDP = require('ddp'),
    moment = require('moment'),
    ddpLogin = require('ddp-login'),
    config = require('./config.js');

var ddp = new DDP({
  host: config.ddpHost,
  port: config.ddpPort,
  use_ejson: true
})

ddp.connect(function(err){
  if(err) throw err;
  ddpLogin(ddp, {
    env: "METEOR_TOKEN",
    method: "account",
    account: config.ddpEmail,
    pass: config.ddpPassword,
    retry: 5,
    plaintext: false
  }, function(err, userInfo){
    if(err) throw err;

    var allSensors = fs.readdirSync('/sys/bus/w1/devices');
    var sensorValues = [];

    for(var i = 0; i < allSensors.length; i++){
      if(allSensors[i] != 'w1_bus_master1'){
        var logPath = '/sys/bus/w1/devices/' + allSensors[i] + '/w1_slave';
        var tempFile = fs.readFileSync(logPath,'utf8');
        var splitTemp = tempFile.split('t=');
        if(splitTemp.length > 1){
          var currentTemp = splitTemp[1];
          sensorValues.push({sensorID: allSensors[i], value: currentTemp});
        }
        console.log('Temp is', splitTemp[1]);
      }
    }
    ddp.call(
      'addValues',             // name of Meteor Method being called
      [sensorValues],            // parameters to send to Meteor Method
      function (err, result) {   // callback which returns the method call results
      },
      function () {              // callback which fires when server has finished
        ddp.close();
      }
    )
  })
})

<commit_msg>Each update now includes the current external IP address, in case it changes<commit_after>var fs = require('fs'),
    DDP = require('ddp'),
    moment = require('moment'),
    ddpLogin = require('ddp-login'),
    config = require('./config.js'),
    os = require('os');

var ddp = new DDP({
  host: config.ddpHost,
  port: config.ddpPort,
  use_ejson: true
})

ddp.connect(function(err){
  if(err) throw err;
  ddpLogin(ddp, {
    env: "METEOR_TOKEN",
    method: "account",
    account: config.ddpEmail,
    pass: config.ddpPassword,
    retry: 5,
    plaintext: false
  }, function(err, userInfo){
    if(err) throw err;

    //Since our IP address may shift, check with each push and let the server know. Slightly simpler than setting this up to email changes.
    var ifaces = os.networkInterfaces();
    var currentIP = "";
    for (var dev in ifaces) {

      // ... and find the one that matches the criteria
      var iface = ifaces[dev].filter(function(details) {
        return details.family === 'IPv4' && details.internal === false;
      });

      if(iface.length > 0) currentIP = iface[0].address;
    }

    var allSensors = fs.readdirSync('/sys/bus/w1/devices');
    var sensorValues = [];

    for(var i = 0; i < allSensors.length; i++){
      if(allSensors[i] != 'w1_bus_master1'){
        var logPath = '/sys/bus/w1/devices/' + allSensors[i] + '/w1_slave';
        var tempFile = fs.readFileSync(logPath,'utf8');
        var splitTemp = tempFile.split('t=');
        if(splitTemp.length > 1){
          var currentTemp = splitTemp[1];
          sensorValues.push({sensorID: allSensors[i], value: currentTemp, currentIP: currentIP});
        }
        console.log('Temp is', splitTemp[1]);
      }
    }
    ddp.call(
      'addValues',             // name of Meteor Method being called
      [sensorValues],            // parameters to send to Meteor Method
      function (err, result) {   // callback which returns the method call results
      },
      function () {              // callback which fires when server has finished
        ddp.close();
      }
    )
  })
})

<|endoftext|>


<commit_before>var path = require('path');
var url = require('url');
var parallel = require('run-parallel');
var series = require('run-series');
var template = require('string-template');

var read = require('./read.js');
var purgeExcess = require('./purge-excess.js');
var installModule = require('./install-module.js');

var NPM_URI = 'https://registry.npmjs.org/{name}/-/{name}-{version}.tgz';

module.exports = forceInstall;

function forceInstall(nodeModules, shrinkwrap, opts, cb) {
    if (typeof opts === 'function') {
        cb = opts;
        opts = {};
    }

    // if no dependencies object then terminate recursion
    if (shrinkwrap.name && !shrinkwrap.dependencies) {
        return purgeExcess(nodeModules, shrinkwrap, opts, cb);
    }

    var deps = shrinkwrap.dependencies;
    // console.log('shrinkwrap', shrinkwrap);
    var tasks = Object.keys(deps).map(function (key) {
        var dep = deps[key];
        if (!dep.name) {
            dep.name = key;
        }
        var filePath = path.join(nodeModules, key);

        return isCorrect.bind(null, filePath, dep, opts);
    });

    tasks.push(purgeExcess.bind(
        null, nodeModules, shrinkwrap, opts));

    parallel(tasks, function (err, results) {
        if (err) {
            return cb(err);
        }

        opts.dev = false;

        // remove purgeExcess result
        results.pop();

        var incorrects = results.filter(function (dep) {
            return !dep.correct;
        });
        var corrects = results.filter(function (dep) {
            return dep.correct;
        });

        /*  for each incorrect

             - install it
             - remove excess
             - force install all children

        */
        var inCorrectTasks = incorrects.map(function (incorrect) {
            var name = incorrect.name;
            var folder = path.join(nodeModules,
                name, 'node_modules');

            return series.bind(null, [
                installModule.bind(
                    null, nodeModules, incorrect, opts),
                forceInstall.bind(null, folder, incorrect, opts)
            ]);
        });
        var correctTasks = corrects.map(function (correct) {
            var name = correct.name;
            var folder = path.join(nodeModules, name,
                'node_modules');

            return forceInstall.bind(
                null, folder, correct, opts);
        });

        /* for each correct

            - force install all children
        */

        var tasks = [].concat(inCorrectTasks, correctTasks);

        parallel(tasks, cb);
    });
}

function isCorrect(filePath, dep, opts, cb) {
    var createUri = opts.createUri || defaultCreateUri;

    dep.resolved = dep.resolved ||
        createUri(dep.name, dep.version);

    var resolvedUri = url.parse(dep.resolved);

    if (resolvedUri.protocol === 'http:' ||
        resolvedUri.protocol === 'https:'
    ) {
        return isCorrectVersion(filePath, dep, cb);
    } else if (resolvedUri.protocol === 'git:' ||
        resolvedUri.protocol === 'git+ssh:' ||
        resolvedUri.protocol === 'git+https:'
    ) {
        isCorrectSHA(filePath, dep, cb);
    } else {
        cb(new Error('unsupported protocol ' +
            resolvedUri.protocol));
    }
}

function isCorrectVersion(filePath, dep, cb) {
    var expectedVersion = dep.version;

    read.package(filePath, function (err, json) {
        if (err) {
            if (err && err.code === 'ENOENT') {
                dep.correct = false;
                return cb(null, dep);
            } else if (err && !err.code) {
                dep.correct = false;
                return cb(null, dep);
            }

            return cb(err);
        }

        var actualVersion = json.version;

        dep.correct = actualVersion === expectedVersion;
        cb(null, dep);
    });
}

function isCorrectSHA(filePath, dep, cb) {
    var expectedSha = getSha(dep.resolved);

    read.package(filePath, function (err, json) {
        if (err) {
            if (err && err.code === 'ENOENT') {
                dep.correct = false;
                return cb(null, dep);
            }

            return cb(err);
        }

        // gaurd against malformed node_modules by forcing
        // a re-install
        if (!json._resolved) {
            dep.correct = false;
            return cb(null, dep);
        }

        var actualSha = getSha(json._resolved);

        dep.correct = actualSha === expectedSha;

        cb(null, dep);
    });
}

function getSha(uri) {
    var parts = url.parse(uri);
    return parts.hash && parts.hash.substr(1);
}

function defaultCreateUri(name, version) {
    return template(NPM_URI, {
        name: name,
        version: version
    });
}
<commit_msg>fix http+git<commit_after>var path = require('path');
var url = require('url');
var parallel = require('run-parallel');
var series = require('run-series');
var template = require('string-template');

var read = require('./read.js');
var purgeExcess = require('./purge-excess.js');
var installModule = require('./install-module.js');

var NPM_URI = 'https://registry.npmjs.org/{name}/-/{name}-{version}.tgz';

module.exports = forceInstall;

function forceInstall(nodeModules, shrinkwrap, opts, cb) {
    if (typeof opts === 'function') {
        cb = opts;
        opts = {};
    }

    // if no dependencies object then terminate recursion
    if (shrinkwrap.name && !shrinkwrap.dependencies) {
        return purgeExcess(nodeModules, shrinkwrap, opts, cb);
    }

    var deps = shrinkwrap.dependencies;
    // console.log('shrinkwrap', shrinkwrap);
    var tasks = Object.keys(deps).map(function (key) {
        var dep = deps[key];
        if (!dep.name) {
            dep.name = key;
        }
        var filePath = path.join(nodeModules, key);

        return isCorrect.bind(null, filePath, dep, opts);
    });

    tasks.push(purgeExcess.bind(
        null, nodeModules, shrinkwrap, opts));

    parallel(tasks, function (err, results) {
        if (err) {
            return cb(err);
        }

        opts.dev = false;

        // remove purgeExcess result
        results.pop();

        var incorrects = results.filter(function (dep) {
            return !dep.correct;
        });
        var corrects = results.filter(function (dep) {
            return dep.correct;
        });

        /*  for each incorrect

             - install it
             - remove excess
             - force install all children

        */
        var inCorrectTasks = incorrects.map(function (incorrect) {
            var name = incorrect.name;
            var folder = path.join(nodeModules,
                name, 'node_modules');

            return series.bind(null, [
                installModule.bind(
                    null, nodeModules, incorrect, opts),
                forceInstall.bind(null, folder, incorrect, opts)
            ]);
        });
        var correctTasks = corrects.map(function (correct) {
            var name = correct.name;
            var folder = path.join(nodeModules, name,
                'node_modules');

            return forceInstall.bind(
                null, folder, correct, opts);
        });

        /* for each correct

            - force install all children
        */

        var tasks = [].concat(inCorrectTasks, correctTasks);

        parallel(tasks, cb);
    });
}

function isCorrect(filePath, dep, opts, cb) {
    var createUri = opts.createUri || defaultCreateUri;

    dep.resolved = dep.resolved ||
        createUri(dep.name, dep.version);

    var resolvedUri = url.parse(dep.resolved);

    if (resolvedUri.protocol === 'http:' ||
        resolvedUri.protocol === 'https:'
    ) {
        return isCorrectVersion(filePath, dep, cb);
    } else if (resolvedUri.protocol === 'git:' ||
        resolvedUri.protocol === 'git+ssh:' ||
        resolvedUri.protocol === 'git+http:' ||
        resolvedUri.protocol === 'git+https:'
    ) {
        isCorrectSHA(filePath, dep, cb);
    } else {
        cb(new Error('unsupported protocol ' +
            resolvedUri.protocol));
    }
}

function isCorrectVersion(filePath, dep, cb) {
    var expectedVersion = dep.version;

    read.package(filePath, function (err, json) {
        if (err) {
            if (err && err.code === 'ENOENT') {
                dep.correct = false;
                return cb(null, dep);
            } else if (err && !err.code) {
                dep.correct = false;
                return cb(null, dep);
            }

            return cb(err);
        }

        var actualVersion = json.version;

        dep.correct = actualVersion === expectedVersion;
        cb(null, dep);
    });
}

function isCorrectSHA(filePath, dep, cb) {
    var expectedSha = getSha(dep.resolved);

    read.package(filePath, function (err, json) {
        if (err) {
            if (err && err.code === 'ENOENT') {
                dep.correct = false;
                return cb(null, dep);
            }

            return cb(err);
        }

        // gaurd against malformed node_modules by forcing
        // a re-install
        if (!json._resolved) {
            dep.correct = false;
            return cb(null, dep);
        }

        var actualSha = getSha(json._resolved);

        dep.correct = actualSha === expectedSha;

        cb(null, dep);
    });
}

function getSha(uri) {
    var parts = url.parse(uri);
    return parts.hash && parts.hash.substr(1);
}

function defaultCreateUri(name, version) {
    return template(NPM_URI, {
        name: name,
        version: version
    });
}
<|endoftext|>


<commit_before>var game = {
  currentQuestion: null,
  //see other file for questiondb variable
  questiondb: questiondb,
  questionOrder: shuffle(serialArray(questiondb.length)),
  wins: 0,
  losses: 0,
  defaultAnswerTime:20,
  timeLeft:20,
  interval:null,
  timerStarted: 0,
  rate:1000,

  startTimer: function(){
    if (!this.timerStarted) {
      //reset the time left
      this.timeLeft = this.defaultAnswerTime;
      this.interval = setInterval(this.updateTimer, this.rate);
      this.timerStarted = true;
      //set html timer display
      $('#timer').html(game.timeLeft);
      $('#timer').removeClass("font-color-red");
    }
  },

  stopTimer: function(){
    clearInterval(game.interval);
    game.timerStarted = false;
  },

  updateTimer: function(){
    //decrement timer
    game.timeLeft--;
    //set html timer display
    $('#timer').html(game.timeLeft);
    //if timeup, stop timer and check with a blank answer
    if(game.timeLeft<=0){
      game.stopTimer();
      game.checkAnswer(null);
    }
    else if(game.timeLeft<=5){
      $('#timer').addClass("font-color-red");
    }
  },

  nextQuestion: function(){
    //grab the question index from the front of the order array
    var index = game.questionOrder.shift();
    //set current question var
    game.currentQuestion = this.questiondb[index];
    //display question
    $('#question').html(game.createQuestionHTML());
    game.startTimer();
  },

  createQuestionHTML: function(){
    //create containing div, with id
    var questionContainer = $('
').addClass("question").attr("id", "myQuestion");
    //randomize question order
    var answers = shuffle(this.currentQuestion.answers);
    //write string for the question and answers, starting with question and the div for the answers
    var qtext = '

'+
    this.currentQuestion.question +
    '

'+'

';
    for(var i=0;i<answers.length;i++){
      // for each answer, add an answer button
      qtext += '
'+
        ''+answers[i][0]+'<input id="answer'+answers[i][1]+'" type="radio" name="answer" value='+answers[i][1]+'>'+
      '
';
    }
    qtext += "

";
    questionContainer.append(qtext);
    //This is the code to add a submit button for submitting answers. It's helpful if you want to give users the change to choose different answers, instead of going with the first one they click
    // https://stackoverflow.com/a/8936678
    // questionContainer.append($('<button/>', {
    //     text: 'Submit',
    //     id: 'submit_btn',
    //     click: game.checkAnswer}).addClass("btn"));
    return questionContainer;
  },

  checkAnswer: function(answer){
    game.stopTimer();

    if(parseInt(answer)===game.currentQuestion.correctAnswer){
      //add correctness class to corect answer
      $(".js-addLabel"+game.currentQuestion.correctAnswer).addClass("answerLabelCorrect");
      $("#message").text("You got it right!");
      game.wins++;
      if(game.rate>=400){
        game.rate-=200;
      }
    }
    else{
      //add wrongness class to chosen answer, and correctness class to correct answer
      $(".js-addLabel"+game.currentQuestion.correctAnswer).addClass("answerLabelCorrect");
      $(".js-addLabel"+answer).addClass("answerLabelWrong");
      $("#message").text("Not quite! Green shows the correct answer!");
      game.losses++;
      if(game.rate<=2000){
        game.rate+=200;
      }
    }

    if(game.questionOrder.length===0){
      setTimeout(function(){game.gameOver();}, 1000 * 3);
    }
    else{
      setTimeout(function(){game.nextQuestion();}, 1000 * 3);
    }
  },

  gameOver: function(){
    //display stats, return buttons to initial states
    $('#score').removeClass("hidden").html("
Wins: "+this.wins+"

Losses:"+this.losses+"
");
    $('#startbutton').toggle();
    $('#timer').toggle();
    $('#question').empty();
  },

  startGame: function(){
    $('#timer').toggle();
    $('#startbutton').toggle();
    $('#score').addClass("hidden").empty();
    //reset and shuffle question order
    this.currentQuestion = null;
    this.rate = 1000;
    this.questionOrder= shuffle(serialArray(game.questiondb.length));
    this.wins = 0;
    this.losses = 0;
    this.nextQuestion();
  }

};

$(document).ready(function() {
  $('#startbutton').click(function(){
    game.startGame();
  });

  $(document).on('click', '.answerLabel', function(){
    if(game.currentQuestion&&game.timerStarted){
      //check the answer with the value from the clicked label
      game.checkAnswer($(this).attr("for"));
    }
  });
});

function randomNumber(max, min=0){
  return Math.floor(Math.random()*(max-min+1)+min);
}

function serialArray(n){
  var arr = [];
  for (var i = 0; i <= n-1; i++) {
   arr.push(i);
  }
  return arr;
}

//from: https://stackoverflow.com/a/2450976
function shuffle(array) {
  var currentIndex = array.length, temporaryValue, randomIndex;

  // While there remain elements to shuffle...
  while (0 !== currentIndex) {

    // Pick a remaining element...
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    // And swap it with the current element.
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }

  return array;
}
<commit_msg>master - changed checkAnswer to use jquery this for clicked object instead of passing it in the listener function<commit_after>var game = {
  currentQuestion: null,
  //see other file for questiondb variable
  questiondb: questiondb,
  questionOrder: shuffle(serialArray(questiondb.length)),
  wins: 0,
  losses: 0,
  defaultAnswerTime:20,
  timeLeft:20,
  interval:null,
  timerStarted: 0,
  rate:1000,

  startTimer: function(){
    if (!this.timerStarted) {
      //reset the time left
      this.timeLeft = this.defaultAnswerTime;
      this.interval = setInterval(this.updateTimer, this.rate);
      this.timerStarted = true;
      //set html timer display
      $('#timer').html(game.timeLeft);
      $('#timer').removeClass("font-color-red");
    }
  },

  stopTimer: function(){
    clearInterval(game.interval);
    game.timerStarted = false;
  },

  updateTimer: function(){
    //decrement timer
    game.timeLeft--;
    //set html timer display
    $('#timer').html(game.timeLeft);
    //if timeup, stop timer and check with a blank answer
    if(game.timeLeft<=0){
      game.stopTimer();
      game.checkAnswer(null);
    }
    else if(game.timeLeft<=5){
      $('#timer').addClass("font-color-red");
    }
  },

  nextQuestion: function(){
    //grab the question index from the front of the order array
    var index = game.questionOrder.shift();
    //set current question var
    game.currentQuestion = this.questiondb[index];
    //display question
    $('#question').html(game.createQuestionHTML());
    game.startTimer();
  },

  createQuestionHTML: function(){
    //create containing div, with id
    var questionContainer = $('
').addClass("question").attr("id", "myQuestion");
    //randomize question order
    var answers = shuffle(this.currentQuestion.answers);
    //write string for the question and answers, starting with question and the div for the answers
    var qtext = '

'+
    this.currentQuestion.question +
    '

'+'

';
    for(var i=0;i<answers.length;i++){
      // for each answer, add an answer button
      qtext += '
'+
        ''+answers[i][0]+'<input id="answer'+answers[i][1]+'" type="radio" name="answer" value='+answers[i][1]+'>'+
      '
';
    }
    qtext += "

";
    questionContainer.append(qtext);
    //This is the code to add a submit button for submitting answers. It's helpful if you want to give users the change to choose different answers, instead of going with the first one they click
    // https://stackoverflow.com/a/8936678
    // questionContainer.append($('<button/>', {
    //     text: 'Submit',
    //     id: 'submit_btn',
    //     click: game.checkAnswer}).addClass("btn"));
    return questionContainer;
  },

  checkAnswer: function(){
    if(game.currentQuestion&&game.timerStarted){
      var answer =$(this).attr("for");
      game.stopTimer();

      if(parseInt(answer)===game.currentQuestion.correctAnswer){
        //add correctness class to corect answer
        $(".js-addLabel"+game.currentQuestion.correctAnswer).addClass("answerLabelCorrect");
        $("#message").text("You got it right!");
        game.wins++;
        if(game.rate>=400){
          game.rate-=200;
        }
      }
      else{
        //add wrongness class to chosen answer, and correctness class to correct answer
        $(".js-addLabel"+game.currentQuestion.correctAnswer).addClass("answerLabelCorrect");
        $(".js-addLabel"+answer).addClass("answerLabelWrong");
        $("#message").text("Not quite! Green shows the correct answer!");
        game.losses++;
        if(game.rate<=2000){
          game.rate+=200;
        }
      }

      if(game.questionOrder.length===0){
        setTimeout(function(){game.gameOver();}, 1000 * 3);
      }
      else{
        setTimeout(function(){game.nextQuestion();}, 1000 * 3);
      }
    }
  },

  gameOver: function(){
    //display stats, return buttons to initial states
    $('#score').removeClass("hidden").html("
Wins: "+this.wins+"

Losses:"+this.losses+"
");
    $('#startbutton').toggle();
    $('#timer').toggle();
    $('#question').empty();
  },

  startGame: function(){
    $('#timer').toggle();
    $('#startbutton').toggle();
    $('#score').addClass("hidden").empty();
    //reset and shuffle question order
    this.currentQuestion = null;
    this.rate = 1000;
    this.questionOrder= shuffle(serialArray(game.questiondb.length));
    this.wins = 0;
    this.losses = 0;
    this.nextQuestion();
  }

};

$(document).ready(function() {
  $('#startbutton').click(function(){
    game.startGame();
  });

  // $(document).on('click', '.answerLabel', function(){
  //   if(game.currentQuestion&&game.timerStarted){
  //     //check the answer with the value from the clicked label
  //     game.checkAnswer($(this).attr("for"));
  //   }
  // });

  $(document).on('click', '.answerLabel', game.checkAnswer);
});

function randomNumber(max, min=0){
  return Math.floor(Math.random()*(max-min+1)+min);
}

function serialArray(n){
  var arr = [];
  for (var i = 0; i <= n-1; i++) {
   arr.push(i);
  }
  return arr;
}

//from: https://stackoverflow.com/a/2450976
function shuffle(array) {
  var currentIndex = array.length, temporaryValue, randomIndex;

  // While there remain elements to shuffle...
  while (0 !== currentIndex) {

    // Pick a remaining element...
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    // And swap it with the current element.
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }

  return array;
}
<|endoftext|>


<commit_before>var bump = require('gulp-bump');
var exec = require('child_process').exec;
var fs = require('fs-extra');
var git = require('gulp-git');
var gulp = require('gulp');
var mocha = require('gulp-mocha');
var rename = require('gulp-rename');
var tagVersion = require('gulp-tag-version');
var template = require('gulp-template');
var util = require('util');
var yaml = require('js-yaml');
var resource = require('./src/resource');
var helpers = require('./src/helpers');

/**
 * Paths
 */
var test = 'test/**/*';

/**
 * Environment
 */
var languages = {
  js: {
    repo: 'Asana/node-asana',
    branch: 'api-meta-incoming',
    templatePath: 'src/templates',
    outputPath: 'lib/resources/gen'
  },
  php: {
    repo: 'Asana/php-asana',
    branch: 'api-meta-incoming',
    templatePath: 'templates',
    outputPath: 'src/Asana/Resources/Gen',
  },
  python: {
    repo: 'Asana/python-asana',
    branch: 'api-meta-incoming',
    // templatePath: 'src/templates',
    destPath: 'asana/resources/gen',
  },
  ruby: {
    repo: 'Asana/ruby-asana',
    branch: 'api-meta-incoming',
    templatePath: 'lib/templates',
    outputPath: 'lib/asana/resources',
  },
  ts_tester: {
    repo: 'Asana/node-asana-tester',
    branch: 'api-meta-incoming',
    templatePath: 'src/resources/templates',
    outputPath: 'src/resources/gen'
  }
};

var paths = {
  dist: function(lang) {
    return 'dist/' + lang;
  },
  repo: function(lang) {
    return 'dist/git/' + lang;
  },
  repoOutput: function(lang) {
    return paths.repo(lang) + '/' + paths.repoOutputRelative(lang);
  },
  repoOutputRelative: function(lang) {
    return languages[lang].outputPath;
  }
};

function readPackage(filename) {
  return fs.readJSONSync(filename || 'package.json');
}

function writePackage(filename, data) {
  return fs.writeJSONSync(filename || 'package.json', data);
}

/**
 * High-level tasks
 */

// Build all languages
gulp.task('build', ['test'].concat(Object.keys(languages).map(function(lang) {
  return 'build-' + lang;
})));

// Deploy languages
gulp.task('deploy', ['ensure-git-clean', 'build'].concat(Object.keys(languages).map(function(lang) {
  return 'deploy-' + lang;
})));

/**
 * Generate build and deploy rules for each language
 */
var resourceNames = resource.names();
Object.keys(languages).forEach(function(lang) {
  var config = languages[lang];
  var outputPath = paths.repoOutput(lang);
  var repoRoot = paths.repo(lang);
  var token = process.env.ASANA_GITHUB_TOKEN || null;

  function echoAndExec() {
    if (process.env.GULP_DEBUG) {
      console.log('+ ' + arguments[0]);
    }
    return exec.apply(null, arguments);
  }

  function resTaskName(resourceName) {
    return 'build-' + lang + '-' + resourceName;
  }

  /**
   * Clean work area for target repo
   */
  Object.keys(languages).forEach(function(lang) {
    gulp.task('clean-' + lang, function() {
      fs.removeSync(paths.dist(lang));
    });
  });

  /**
   * Checkout target repo, for build and deploy
   */
  gulp.task('checkout-' + lang, ['clean-' + lang], function(cb) {

    cloneRepo(cb);

    function cloneRepo(cb) {
      fs.removeSync(repoRoot);
      var url = (token !== null)
          ? util.format('https://github.com/%s', config.repo)
          : util.format('git@github.com:%s', config.repo);
      echoAndExec(
          util.format('git clone %s %s', url, repoRoot),
          switchToBranch);
    }

    function switchToBranch(err, stdout, stderr) {
      if (err) { cb(err); return; }
      var branch = config.branch;
      echoAndExec(
          util.format('git checkout --track -b %s origin/%s', branch, branch),
          {cwd: repoRoot},
          done);
    }

    function done(err, stdout, stderr) {
      if (err) { cb(err); return; }
      cb();
    }
  });

  /**
   * Build rules, per resource.
   */
  resourceNames.forEach(function(resourceName) {
    gulp.task(resTaskName(resourceName), ['checkout-' + lang], function() {
      // Support templates existing either locally or in target repo.
      var templatePath = config.templatePath ?
          (paths.repo(lang) + '/' + config.templatePath):
          ('src/templates/' + lang);
      var resourceTemplateInfo = require('./' + templatePath).resource;

      // Find the template info for resources
      var resourceInstance = resource.load(resourceName);
      var templateHelpers = helpers(lang);
      return gulp.src(templatePath + '/' + resourceTemplateInfo.template)
          .pipe(
              template(resourceInstance, {
                imports: templateHelpers,
                variable: 'resource'
              }))
          .pipe(
              rename(resourceTemplateInfo.filename(resourceInstance, templateHelpers)))
          .pipe(
              gulp.dest(paths.dist(lang)));
    });
  });
  gulp.task(
      'build-' + lang,
      resourceNames.map(resTaskName));

  /**
   * Deploy
   */
  gulp.task('deploy-' + lang, ['build-' + lang], function(cb) {
    var version;

    // We depend on the build step which checks out the repo, so we start by
    // setting our credentials so we can push to it.
    configureCredentials();

    // TODO: use some kind of promisify libraries to clean all this async code

    function configureCredentials(err, stdout, stderr) {
      if (err) { cb(err); return; }
      if (token !== null) {
        echoAndExec(
            'git config credential.helper "store --file=.git/credentials"',
            {cwd: repoRoot},
            writeCredentials);
      } else {
        copyToRepo();
      }
    }

    function writeCredentials(err, stdout, stderr) {
      if (err) { cb(err); return; }
      fs.writeFileSync(
          util.format('%s/.git/credentials', repoRoot),
          util.format('https://%s:@github.com', token));
      copyToRepo();
    }

    function copyToRepo(err, stdout, stderr) {
      if (err) { cb(err); return; }
      fs.mkdirpSync(outputPath);
      fs.copy(paths.dist(lang), outputPath, gitAdd);
    }

    function gitAdd(err) {
      if (err) { cb(err); return; }
      echoAndExec('git add ' + paths.repoOutputRelative(lang), {cwd: repoRoot}, gitCommit);
    }

    function gitCommit(err) {
      if (err) { cb(err); return; }
      echoAndExec(util.format('git commit --allow-empty -a -m "Deploy from asana-api-meta v%s"', version), {cwd: repoRoot}, gitTag);
    }

    function gitTag(err, stdout, stderr) {
      if (err) { cb(err); return; }
      version = readPackage().version;
      echoAndExec(util.format('git tag -f "v%s"', version), {cwd: repoRoot}, gitPush);
    }

    function gitPush(err) {
      if (err) { cb(err); return; }
      echoAndExec(
          util.format('git push --tags origin %s', config.branch),
          {cwd: repoRoot},
          done);
    }

    function done(err, stdout, stderr) {
      if (err) { cb(err); return; }
      cb();
    }
  });
});

/**
 * Bumping version number and tagging the repository with it.
 * Please read http://semver.org/
 *
 * You can use the commands
 *
 *     gulp bump-patch     # makes v0.1.0 → v0.1.1
 *     gulp bump-feature   # makes v0.1.1 → v0.2.0
 *     gulp bump-release   # makes v0.2.1 → v1.0.0
 *
 * To bump the version numbers accordingly after you did a patch,
 * introduced a feature or made a backwards-incompatible release.
 */
function bumpVersion(importance) {
  return gulp.src(['./package.json'])
      .pipe(bump({type: importance}))
      .pipe(gulp.dest('./'))
      .pipe(git.commit('bump package version'))
      .pipe(tagVersion());
}
gulp.task('bump-patch', ['ensure-git-clean'], function() {
  return bumpVersion('patch');
});
gulp.task('bump-feature', ['ensure-git-clean'], function() {
  return bumpVersion('minor');
});
gulp.task('bump-release', ['ensure-git-clean'], function() {
  return bumpVersion('major');
});

/**
 * Ensure that the git working directory is clean.
 */
gulp.task('ensure-git-clean', function() {
  git.status(function(err, out) {
    if (err) { throw err; }
    if (!/working directory clean/.exec(out)) {
      throw new Error('Git working directory not clean, will not bump version');
    }
  });
});

/**
 * Tests the code with mocha.
 */
gulp.task('test', function(callback) {
  gulp.src(test)
      .pipe(mocha({
        reporter: process.env.TRAVIS ? 'spec' : 'nyan'
      }));
});

<commit_msg>Make resource names available in templates<commit_after>var bump = require('gulp-bump');
var exec = require('child_process').exec;
var fs = require('fs-extra');
var git = require('gulp-git');
var gulp = require('gulp');
var mocha = require('gulp-mocha');
var rename = require('gulp-rename');
var tagVersion = require('gulp-tag-version');
var template = require('gulp-template');
var util = require('util');
var yaml = require('js-yaml');
var resource = require('./src/resource');
var helpers = require('./src/helpers');

/**
 * Paths
 */
var test = 'test/**/*';

/**
 * Environment
 */
var languages = {
  js: {
    repo: 'Asana/node-asana',
    branch: 'api-meta-incoming',
    templatePath: 'src/templates',
    outputPath: 'lib/resources/gen'
  },
  php: {
    repo: 'Asana/php-asana',
    branch: 'api-meta-incoming',
    templatePath: 'templates',
    outputPath: 'src/Asana/Resources/Gen',
  },
  python: {
    repo: 'Asana/python-asana',
    branch: 'api-meta-incoming',
    // templatePath: 'src/templates',
    destPath: 'asana/resources/gen',
  },
  ruby: {
    repo: 'Asana/ruby-asana',
    branch: 'api-meta-incoming',
    templatePath: 'lib/templates',
    outputPath: 'lib/asana/resources',
  },
  ts_tester: {
    repo: 'Asana/node-asana-tester',
    branch: 'api-meta-incoming',
    templatePath: 'src/resources/templates',
    outputPath: 'src/resources/gen'
  }
};

var paths = {
  dist: function(lang) {
    return 'dist/' + lang;
  },
  repo: function(lang) {
    return 'dist/git/' + lang;
  },
  repoOutput: function(lang) {
    return paths.repo(lang) + '/' + paths.repoOutputRelative(lang);
  },
  repoOutputRelative: function(lang) {
    return languages[lang].outputPath;
  }
};

function readPackage(filename) {
  return fs.readJSONSync(filename || 'package.json');
}

function writePackage(filename, data) {
  return fs.writeJSONSync(filename || 'package.json', data);
}

/**
 * High-level tasks
 */

// Build all languages
gulp.task('build', ['test'].concat(Object.keys(languages).map(function(lang) {
  return 'build-' + lang;
})));

// Deploy languages
gulp.task('deploy', ['ensure-git-clean', 'build'].concat(Object.keys(languages).map(function(lang) {
  return 'deploy-' + lang;
})));

/**
 * Generate build and deploy rules for each language
 */
var resourceNames = resource.names();
Object.keys(languages).forEach(function(lang) {
  var config = languages[lang];
  var outputPath = paths.repoOutput(lang);
  var repoRoot = paths.repo(lang);
  var token = process.env.ASANA_GITHUB_TOKEN || null;

  function echoAndExec() {
    if (process.env.GULP_DEBUG) {
      console.log('+ ' + arguments[0]);
    }
    return exec.apply(null, arguments);
  }

  function resTaskName(resourceName) {
    return 'build-' + lang + '-' + resourceName;
  }

  /**
   * Clean work area for target repo
   */
  Object.keys(languages).forEach(function(lang) {
    gulp.task('clean-' + lang, function() {
      fs.removeSync(paths.dist(lang));
    });
  });

  /**
   * Checkout target repo, for build and deploy
   */
  gulp.task('checkout-' + lang, ['clean-' + lang], function(cb) {

    cloneRepo(cb);

    function cloneRepo(cb) {
      fs.removeSync(repoRoot);
      var url = (token !== null)
          ? util.format('https://github.com/%s', config.repo)
          : util.format('git@github.com:%s', config.repo);
      echoAndExec(
          util.format('git clone %s %s', url, repoRoot),
          switchToBranch);
    }

    function switchToBranch(err, stdout, stderr) {
      if (err) { cb(err); return; }
      var branch = config.branch;
      echoAndExec(
          util.format('git checkout --track -b %s origin/%s', branch, branch),
          {cwd: repoRoot},
          done);
    }

    function done(err, stdout, stderr) {
      if (err) { cb(err); return; }
      cb();
    }
  });

  /**
   * Build rules, per resource.
   */
  resourceNames.forEach(function(resourceName) {
    gulp.task(resTaskName(resourceName), ['checkout-' + lang], function() {
      // Support templates existing either locally or in target repo.
      var templatePath = config.templatePath ?
          (paths.repo(lang) + '/' + config.templatePath):
          ('src/templates/' + lang);
      var resourceTemplateInfo = require('./' + templatePath).resource;

      // Find the template info for resources
      var resourceInstance = resource.load(resourceName);
      var templateHelpers = helpers(lang);
      templateHelpers.resources = resourceNames
      return gulp.src(templatePath + '/' + resourceTemplateInfo.template)
          .pipe(
              template(resourceInstance, {
                imports: templateHelpers,
                variable: 'resource'
              }))
          .pipe(
              rename(resourceTemplateInfo.filename(resourceInstance, templateHelpers)))
          .pipe(
              gulp.dest(paths.dist(lang)));
    });
  });
  gulp.task(
      'build-' + lang,
      resourceNames.map(resTaskName));

  /**
   * Deploy
   */
  gulp.task('deploy-' + lang, ['build-' + lang], function(cb) {
    var version;

    // We depend on the build step which checks out the repo, so we start by
    // setting our credentials so we can push to it.
    configureCredentials();

    // TODO: use some kind of promisify libraries to clean all this async code

    function configureCredentials(err, stdout, stderr) {
      if (err) { cb(err); return; }
      if (token !== null) {
        echoAndExec(
            'git config credential.helper "store --file=.git/credentials"',
            {cwd: repoRoot},
            writeCredentials);
      } else {
        copyToRepo();
      }
    }

    function writeCredentials(err, stdout, stderr) {
      if (err) { cb(err); return; }
      fs.writeFileSync(
          util.format('%s/.git/credentials', repoRoot),
          util.format('https://%s:@github.com', token));
      copyToRepo();
    }

    function copyToRepo(err, stdout, stderr) {
      if (err) { cb(err); return; }
      fs.mkdirpSync(outputPath);
      fs.copy(paths.dist(lang), outputPath, gitAdd);
    }

    function gitAdd(err) {
      if (err) { cb(err); return; }
      echoAndExec('git add ' + paths.repoOutputRelative(lang), {cwd: repoRoot}, gitCommit);
    }

    function gitCommit(err) {
      if (err) { cb(err); return; }
      echoAndExec(util.format('git commit --allow-empty -a -m "Deploy from asana-api-meta v%s"', version), {cwd: repoRoot}, gitTag);
    }

    function gitTag(err, stdout, stderr) {
      if (err) { cb(err); return; }
      version = readPackage().version;
      echoAndExec(util.format('git tag -f "v%s"', version), {cwd: repoRoot}, gitPush);
    }

    function gitPush(err) {
      if (err) { cb(err); return; }
      echoAndExec(
          util.format('git push --tags origin %s', config.branch),
          {cwd: repoRoot},
          done);
    }

    function done(err, stdout, stderr) {
      if (err) { cb(err); return; }
      cb();
    }
  });
});

/**
 * Bumping version number and tagging the repository with it.
 * Please read http://semver.org/
 *
 * You can use the commands
 *
 *     gulp bump-patch     # makes v0.1.0 → v0.1.1
 *     gulp bump-feature   # makes v0.1.1 → v0.2.0
 *     gulp bump-release   # makes v0.2.1 → v1.0.0
 *
 * To bump the version numbers accordingly after you did a patch,
 * introduced a feature or made a backwards-incompatible release.
 */
function bumpVersion(importance) {
  return gulp.src(['./package.json'])
      .pipe(bump({type: importance}))
      .pipe(gulp.dest('./'))
      .pipe(git.commit('bump package version'))
      .pipe(tagVersion());
}
gulp.task('bump-patch', ['ensure-git-clean'], function() {
  return bumpVersion('patch');
});
gulp.task('bump-feature', ['ensure-git-clean'], function() {
  return bumpVersion('minor');
});
gulp.task('bump-release', ['ensure-git-clean'], function() {
  return bumpVersion('major');
});

/**
 * Ensure that the git working directory is clean.
 */
gulp.task('ensure-git-clean', function() {
  git.status(function(err, out) {
    if (err) { throw err; }
    if (!/working directory clean/.exec(out)) {
      throw new Error('Git working directory not clean, will not bump version');
    }
  });
});

/**
 * Tests the code with mocha.
 */
gulp.task('test', function(callback) {
  gulp.src(test)
      .pipe(mocha({
        reporter: process.env.TRAVIS ? 'spec' : 'nyan'
      }));
});

<|endoftext|>


<commit_before>'use strict';

module.exports = function(walletData) {
  return `
window.unicoisaConfig = {
  walletName: "${walletData.walletName}",
  mainColor: "${walletData.mainColor}",
  secondaryColor: "${walletData.secondaryColor}",
  assets: [
    {
      assetId: '${walletData.assetId}',
      name: '${walletData.assetName}',
      symbol: '${walletData.symbol}',
      pluralSymbol: '${walletData.pluralSymbol}'
    }
  ],
  defaultAsset: '${walletData.assetId}',
  logo: "${walletData.logo}",
  coluApiKey: "${walletData.coluApiKey}"
};
  `
};
<commit_msg>Handle defaults<commit_after>'use strict';

module.exports = function(walletData) {

  return `
window.unicoisaConfig = {
  walletName: "${walletData.walletName}",
  mainColor: "${walletData.mainColor || ''}",
  secondaryColor: "${walletData.secondaryColor || ''}",
  assets: [
    {
      assetId: '${walletData.assetId}',
      name: '${walletData.assetName}',
      symbol: '${walletData.symbol || ''}',
      pluralSymbol: '${walletData.pluralSymbol || ''}'
    }
  ],
  defaultAsset: '${walletData.assetId}',
  logo: "${walletData.logo || ''}",
  coluApiKey: "${walletData.coluApiKey || ''}"
};
  `
};
<|endoftext|>


<commit_before>var path = require('path');

function getRoot(file) {
  return path.join(process.cwd(), file);
}

module.exports = {
  cssSourceMap: {
    src: '<%= config.temp %>/css/styles.css.map',
    dest: '<%= config.dist %>/assets/css/styles.css.map'
  },
  libraryCSS: {
    src: '<%= config.bowerDir %>/magnific-popup/dist/magnific-popup.css',
    dest: '<%= config.dist %>/assets/css/magnific-popup.css'
  },
  fonts: {
    files: [
      {
        cwd: '<%= config.guts %>/assets/fonts/',
        src: '**',
        dest: '<%= config.dist %>/assets/fonts/',
        expand: true
      }
    ]
  },
  libs: {
    files: [
      {
        '<%= config.dist %>/assets/js/libraries/fastclick.js': ['<%= config.bowerDir %>/fastclick/lib/fastclick.js']
      },
      {
        '<%= config.dist %>/assets/js/libraries/magnific.js': ['<%= config.guts %>/assets/js/libraries/magnific.js']
      }
    ]
  },
  img: {
    files: [
      {
        cwd: '<%= config.guts %>/assets/img/',
        src: '**',
        dest: '<%= config.dist %>/assets/img/',
        expand: true
      },
      {src: ['<%= config.guts %>/assets/img/favicon.ico'], dest: '<%= config.dist %>/favicon.ico'},
    ]
  },
  js: {
    files: [
      {
        cwd: '<%= config.guts %>/assets/js/om/libraries',
        src: '**',
        dest: '<%= config.dist %>/assets/js/om/libraries/',
        expand: true
      }
    ]
  },
  seo: {
    files: [
      {src: [getRoot('robots.txt')], dest: '<%= config.dist %>/robots.txt'},
      {src: [getRoot('sitemap.xml')], dest: '<%= config.dist %>/sitemap.xml'}
    ]
  },
  omUITest: {
    files: [
      {
        src: '<%= config.guts %>/assets/js/om/test/test.js',
        dest: '<%= config.dist %>/assets/js/om/test/',
        expand: true,
        flatten: true
      },
      {
        src: '<%= config.guts %>/assets/css/om/libraries/qunit-1.17.1.css',
        dest: '<%= config.dist %>/assets/css/',
        expand: true,
        flatten: true
      },
      {
        src: '<%= config.guts %>/assets/js/om/libraries/qunit-1.17.1.js',
        dest: '<%= config.dist %>/assets/js/om/libraries/',
        expand: true,
        flatten: true
      }
    ]
  }
};
<commit_msg>new scribe task<commit_after>var path = require('path');

function getRoot(file) {
  return path.join(process.cwd(), file);
}

module.exports = {
  cssSourceMap: {
    src: '<%= config.temp %>/css/styles.css.map',
    dest: '<%= config.dist %>/assets/css/styles.css.map'
  },
  libraryCSS: {
    src: '<%= config.bowerDir %>/magnific-popup/dist/magnific-popup.css',
    dest: '<%= config.dist %>/assets/css/magnific-popup.css'
  },
  fonts: {
    files: [
      {
        cwd: '<%= config.guts %>/assets/fonts/',
        src: '**',
        dest: '<%= config.dist %>/assets/fonts/',
        expand: true
      }
    ]
  },
  libs: {
    files: [
      {
        '<%= config.dist %>/assets/js/libraries/fastclick.js': ['<%= config.bowerDir %>/fastclick/lib/fastclick.js']
      },
      {
        '<%= config.dist %>/assets/js/libraries/magnific.js': ['<%= config.guts %>/assets/js/libraries/magnific.js']
      }
    ]
  },
  img: {
    files: [
      {
        cwd: '<%= config.guts %>/assets/img/',
        src: '**',
        dest: '<%= config.dist %>/assets/img/',
        expand: true
      },
      {src: ['<%= config.guts %>/assets/img/favicon.ico'], dest: '<%= config.dist %>/favicon.ico'},
    ]
  },
  js: {
    files: [
      {
        cwd: '<%= config.guts %>/assets/js/om/libraries',
        src: '**',
        dest: '<%= config.dist %>/assets/js/om/libraries/',
        expand: true
      }
    ]
  },
  scribe: {
    files: [
      {
        src: [getRoot('node_modules/scribe/build/stories/*')],
        dest: '<%= config.content %>/case-studies/',
        rename: function(dest, src) {
          return dest + '/' + src.substring(src.lastIndexOf('/') + 1, src.indexOf('.')) + '/index.hbs';
        },
        expand: true
      },
    ]
  },
  seo: {
    files: [
      {src: [getRoot('robots.txt')], dest: '<%= config.dist %>/robots.txt'},
      {src: [getRoot('sitemap.xml')], dest: '<%= config.dist %>/sitemap.xml'}
    ]
  },
  omUITest: {
    files: [
      {
        src: '<%= config.guts %>/assets/js/om/test/test.js',
        dest: '<%= config.dist %>/assets/js/om/test/',
        expand: true,
        flatten: true
      },
      {
        src: '<%= config.guts %>/assets/css/om/libraries/qunit-1.17.1.css',
        dest: '<%= config.dist %>/assets/css/',
        expand: true,
        flatten: true
      },
      {
        src: '<%= config.guts %>/assets/js/om/libraries/qunit-1.17.1.js',
        dest: '<%= config.dist %>/assets/js/om/libraries/',
        expand: true,
        flatten: true
      }
    ]
  }
};
<|endoftext|>


<commit_before>(function($){
  $.bowline = {
    setup: function(name, el){
      var rb = eval("bowline_" + name + "_setup");
      if(!rb) throw 'Unknown class';
      rb(el);
    },

    klass: function(name){
      var rb = eval("bowline_" + name);
      if(!rb) throw 'Unknown class';
      return rb;
    },

    instance: function(name, el){
      var rb = eval("bowline_" + name + "_instance");
      if(!rb) throw 'Unknown class';
      return rb(el);
    },

    setupForms: function(){
      // $('form').bind('submit', function(e){
      //   var src = $(this).attr('src').split('.');
      //   var rb = $.bowline.klass[src[0]];
      //   rb.params = $(this).serialize();
      //   rb.send(src[1]);
      //   return false;
      // });
    },

    // A lot of JS libs require hashes
    // without any functions in them
    rubyHash: function( hsh ) {
      res = {};
      $.each(hsh, function(key, value){
        if(typeof(value) != 'function'){
          res[key] = value;
        }
      });
      return res;
    }
  },

  $.helper = function(){
    return(
      bowline_helper.apply(
        bowline_helper,
        arguments
      )
    );
  };

  $.fn.bowline = function(name, options){
    $(this).chain(options);
    $.bowline.setup(name, $(this));
    $(this).data('bowline', name);
    $(this).trigger('setup.bowline');
    return this;
  };

  $.fn.invoke = function(){
    if($(this).chain('active')){
      if($(this).data('bowline')){
        // Class method
        var name = $(this).data('bowline');
        var func = $.bowline.klass(name);
      } else {
        // Instance method
        var name = $(this).item('root').data('bowline');
        var func = $.bowline.instance(name, $(this));
      }
      return func.apply(func, arguments);
    } else {
      throw 'Chain not active';
    }
  };

  $.fn.updateCollection = function( items ){
    items = $.map(items, function(n){
      return $.bowline.rubyHash(n);
    });
    $(this).items('replace', items);
    $(this).trigger('update.bowline');
	};

	$.fn.updateSingleton = function( item ){
    item = $.bowline.rubyHash(item);
    $(this).item('replace', item);
    $(this).trigger('update.bowline');
	};

	$(function(){
	  $(document.body).trigger('loading.bowline');
    var script = $("<script />");
    script.attr('type', 'text/ruby');
    script.attr('src',  '../script/init');
    $('head').append(script);
	  $(document.body).trigger('loaded.bowline');
	})
})(jQuery)<commit_msg>forgot to commit js fixes<commit_after>(function($){
  var init = false;

  $.bowline = {
    setup: function(name, el){
      var rb = eval("bowline_" + name + "_setup");
      if(!rb) throw 'Unknown class';
      rb(el);
    },

    klass: function(name){
      var rb = eval("bowline_" + name);
      if(!rb) throw 'Unknown class';
      return rb;
    },

    instance: function(name, el){
      var rb = eval("bowline_" + name + "_instance");
      if(!rb) throw 'Unknown class';
      return rb(el);
    },

    helper: function(){
      return(
        bowline_helper.apply(
          bowline_helper,
          arguments
        )
      );
    },

    ready: function(func){
      if(init) return func();
      $(document).bind('loaded.bowline', func);
    },

    setupForms: function(){
      // $('form').bind('submit', function(e){
      //   var src = $(this).attr('src').split('.');
      //   var rb = $.bowline.klass[src[0]];
      //   rb.params = $(this).serialize();
      //   rb.send(src[1]);
      //   return false;
      // });
    },

    // A lot of JS libs require hashes
    // without any functions in them
    _rubyHash: function( hsh ) {
      res = {};
      var key;
      for(key in hsh){
        var value = hsh[key];
        if(typeof(value) != 'function'){
          res[key] = value;
        }
      }
      return res;
    }
  },

  window.bowline_loaded = function(){
    init = true;
    $(document.body).trigger('loaded.bowline');
  }

  $.fn.bowline = function(name, options){
    var self = $(this);
    $.bowline.ready(function(){
      self.chain(options);
      $.bowline.setup(name, self);
      self.data('bowline', name);
      self.trigger('setup.bowline');
    });
    return self;
  };

  $.fn.invoke = function(){
    if($(this).chain('active')){
      if($(this).data('bowline')){
        // Class method
        var name = $(this).data('bowline');
        var func = $.bowline.klass(name);
      } else {
        // Instance method
        var name = $(this).item('root').data('bowline');
        var func = $.bowline.instance(name, $(this));
      }
      return func.apply(func, arguments);
    } else {
      throw 'Chain not active';
    }
  };

  $.fn.updateCollection = function( items ){
    items = $.map(items, function(n){
      return $.bowline._rubyHash(n);
    });
    $(this).items('replace', items);
    $(this).trigger('update.bowline');
	};

	$.fn.updateSingleton = function( item ){
    item = $.bowline._rubyHash(item);
    $(this).item('replace', item);
    $(this).trigger('update.bowline');
	};

	$(function(){
	  $(document.body).trigger('loading.bowline');
    var script = $("<script />");
    script.attr('type', 'text/ruby');
    script.attr('src',  '../script/init');
    $('head').append(script);
	})
})(jQuery)<|endoftext|>


<commit_before>/* Gulp set up
 --------------------------------------------------------------------------------- */

var gulp = require('gulp');

// load all plugins with prefix 'gulp'
const $ = require('gulp-load-plugins')();

const connect  = require('gulp-connect-php');
const sequence = require('run-sequence');

const _ = require('./resources/build')(gulp);

/* Task: Compile SCSS
 --------------------------------------------------------------------------------- */

gulp.task('build:styles', () => {
    _.conf.sass.includePaths = _.depsDir;

    const styles = gulp.src(_.paths.styles, { base: _.paths.src })
        .pipe($.sass(_.conf.sass).on('error', $.sass.logError))
        .pipe($.autoprefixer(_.conf.autoprefixer))
        .pipe($.cleanCss())
        .on('error', _.errorHandler);

    return _.build(styles);
});

/* Task: Minify JS
 --------------------------------------------------------------------------------- */

gulp.task('build:scripts', () => {
    const scripts = gulp.src(_.paths.scripts, { base: _.paths.src })
        .pipe($.babel({ presets: ['es2015'] }))
        .on('error', _.errorHandler)
        .pipe($.uglify(_.conf.uglify))
        .on('error', _.errorHandler);

    return _.build(scripts);
});

/* Task: Optimize image
 --------------------------------------------------------------------------------- */

gulp.task('build:images', () => {
    const images = gulp.src(_.paths.images, { base: _.paths.src })
        .pipe($.changed(_.paths.dest))
        .pipe($.imagemin(_.conf.imagemin))
        .on('error', _.errorHandler);

    return _.build(images);
});

/* Task: Optimize image
 --------------------------------------------------------------------------------- */

gulp.task('build:fonts', (done) => {
    const path = require('path');

    gulp.src(_.paths.fonts, { base: _.paths.src })
        .pipe(gulp.dest((file) => {
            file.path = file.base + path.basename(file.path);
            return _.paths.dest + 'fonts/';
        }));

    return done();
});

/* Task: Vendor
 --------------------------------------------------------------------------------- */

gulp.task('vendor:copy', ['modernizr'], function () {
    return gulp.src(_.vendors)
        .pipe(gulp.dest(_.paths.vendor));
});

/* Task: Minify Vendor scripts
 --------------------------------------------------------------------------------- */

gulp.task('vendor:scripts', function () {
    return gulp.src(_.paths.vendor + '/**/*.js')
        .pipe($.uglify(_.conf.uglify))
        .on('error', _.errorHandler)
        .pipe(gulp.dest(_.paths.vendor));
});

/* Task: Minify Vendor scripts
 --------------------------------------------------------------------------------- */

gulp.task('vendor:styles', function () {
    return gulp.src(_.paths.vendor + '/**/*.css')
        .pipe($.cleanCss())
        .on('error', _.errorHandler)
        .pipe(gulp.dest(_.paths.vendor));
});

/* Task: Modernizr
 --------------------------------------------------------------------------------- */

gulp.task('modernizr', function () {
    const conf = _.conf.modernizr;

    return gulp.src(_.paths.src + '**/*.{js,scss}')
        .pipe($.modernizr(conf.filename, conf.settings))
        .pipe(gulp.dest(_.paths.vendor));
});

/* Task: Serve
 --------------------------------------------------------------------------------- */

gulp.task('serve', () => {
    if (_.isLocal) {
        connect.server(_.server, _.sync);
    } else {
        _.sync();
    }
});

/* Task: Watch
 --------------------------------------------------------------------------------- */

gulp.task('watch', ['serve'], (done) => {
    // SCSS & Minify
    gulp.watch(_.paths.styles,  ['build:styles']);
    // ES2015 & Uglify
    gulp.watch(_.paths.scripts, ['build:scripts']);
    // Imagemin
    gulp.watch(_.paths.images,  ['build:images']);
    // Reload
    gulp.watch(_.conf.patterns.server)
        .on('change', _._bSync.reload);

    // Done
    return done();
});

/* Task: Test Behaviour
 --------------------------------------------------------------------------------- */

gulp.task('test:bdd', (done) => {
    gulp.src('./tests/webdriver.js')
        .pipe($.webdriver(_.wdio));

    return done();
});

/* Task: Clean
 --------------------------------------------------------------------------------- */

gulp.task('clean', () => {
    const del = require('del');

    return del([_.paths.dest, _.paths.vendor]).then(() => {
        _.e('Assets directory cleaned', 'green');
    });
});

/* Task: Vendor
 --------------------------------------------------------------------------------- */

gulp.task('vendor', (done) => {
    sequence('vendor:copy', 'vendor:scripts', 'vendor:styles', done);
});

/* Task: Build
 --------------------------------------------------------------------------------- */

gulp.task('build', (done) => {
    sequence('build:styles', 'build:scripts', 'build:images', 'build:fonts', done);
});

/* Task: Default
 --------------------------------------------------------------------------------- */

gulp.task('default', (done) => {
    sequence('clean', 'build', 'vendor', done);
});
<commit_msg>Update gulp serve<commit_after>/* Gulp set up
 --------------------------------------------------------------------------------- */

var gulp = require('gulp');

// load all plugins with prefix 'gulp'
const $ = require('gulp-load-plugins')();

const connect  = require('gulp-connect-php');
const sequence = require('run-sequence');

const _ = require('./resources/build')(gulp);

/* Task: Compile SCSS
 --------------------------------------------------------------------------------- */

gulp.task('build:styles', () => {
    _.conf.sass.includePaths = _.depsDir;

    const styles = gulp.src(_.paths.styles, { base: _.paths.src })
        .pipe($.sass(_.conf.sass).on('error', $.sass.logError))
        .pipe($.autoprefixer(_.conf.autoprefixer))
        .pipe($.cleanCss())
        .on('error', _.errorHandler);

    return _.build(styles);
});

/* Task: Minify JS
 --------------------------------------------------------------------------------- */

gulp.task('build:scripts', () => {
    const scripts = gulp.src(_.paths.scripts, { base: _.paths.src })
        .pipe($.babel({ presets: ['es2015'] }))
        .on('error', _.errorHandler)
        .pipe($.uglify(_.conf.uglify))
        .on('error', _.errorHandler);

    return _.build(scripts);
});

/* Task: Optimize image
 --------------------------------------------------------------------------------- */

gulp.task('build:images', () => {
    const images = gulp.src(_.paths.images, { base: _.paths.src })
        .pipe($.changed(_.paths.dest))
        .pipe($.imagemin(_.conf.imagemin))
        .on('error', _.errorHandler);

    return _.build(images);
});

/* Task: Optimize image
 --------------------------------------------------------------------------------- */

gulp.task('build:fonts', (done) => {
    const path = require('path');

    gulp.src(_.paths.fonts, { base: _.paths.src })
        .pipe(gulp.dest((file) => {
            file.path = file.base + path.basename(file.path);
            return _.paths.dest + 'fonts/';
        }));

    return done();
});

/* Task: Vendor
 --------------------------------------------------------------------------------- */

gulp.task('vendor:copy', ['modernizr'], function () {
    return gulp.src(_.vendors)
        .pipe(gulp.dest(_.paths.vendor));
});

/* Task: Minify Vendor scripts
 --------------------------------------------------------------------------------- */

gulp.task('vendor:scripts', function () {
    return gulp.src(_.paths.vendor + '/**/*.js')
        .pipe($.uglify(_.conf.uglify))
        .on('error', _.errorHandler)
        .pipe(gulp.dest(_.paths.vendor));
});

/* Task: Minify Vendor scripts
 --------------------------------------------------------------------------------- */

gulp.task('vendor:styles', function () {
    return gulp.src(_.paths.vendor + '/**/*.css')
        .pipe($.cleanCss())
        .on('error', _.errorHandler)
        .pipe(gulp.dest(_.paths.vendor));
});

/* Task: Modernizr
 --------------------------------------------------------------------------------- */

gulp.task('modernizr', function () {
    const conf = _.conf.modernizr;

    return gulp.src(_.paths.src + '**/*.{js,scss}')
        .pipe($.modernizr(conf.filename, conf.settings))
        .pipe(gulp.dest(_.paths.vendor));
});

/* Task: Serve
 --------------------------------------------------------------------------------- */

gulp.task('serve', () => {
    if (_.isLocal) {
        return connect.server(_.server, _.sync);
    }

    return _.sync();
});

/* Task: Watch
 --------------------------------------------------------------------------------- */

gulp.task('watch', ['serve'], (done) => {
    // SCSS & Minify
    gulp.watch(_.paths.styles,  ['build:styles']);
    // ES2015 & Uglify
    gulp.watch(_.paths.scripts, ['build:scripts']);
    // Imagemin
    gulp.watch(_.paths.images,  ['build:images']);
    // Reload
    gulp.watch(_.conf.patterns.server)
        .on('change', _._bSync.reload);

    // Done
    return done();
});

/* Task: Test Behaviour
 --------------------------------------------------------------------------------- */

gulp.task('test:bdd', (done) => {
    gulp.src('./tests/webdriver.js')
        .pipe($.webdriver(_.wdio));

    return done();
});

/* Task: Clean
 --------------------------------------------------------------------------------- */

gulp.task('clean', () => {
    const del = require('del');

    return del([_.paths.dest, _.paths.vendor]).then(() => {
        _.e('Assets directory cleaned', 'green');
    });
});

/* Task: Vendor
 --------------------------------------------------------------------------------- */

gulp.task('vendor', (done) => {
    sequence('vendor:copy', 'vendor:scripts', 'vendor:styles', done);
});

/* Task: Build
 --------------------------------------------------------------------------------- */

gulp.task('build', (done) => {
    sequence('build:styles', 'build:scripts', 'build:images', 'build:fonts', done);
});

/* Task: Default
 --------------------------------------------------------------------------------- */

gulp.task('default', (done) => {
    sequence('clean', 'build', 'vendor', done);
});
<|endoftext|>


<commit_before>function carregaLivroAberto() {

  // Criando um aliase de scene[2].item
  var item = scene[2].item;

  var livro = new Game.Bookshelf();
  var tituloLivroAberto = null;

  scene[2].openBook = function(titulo) {
    disableInteractiveness();

    // Salva nome do livro
    tituloLivroAberto = titulo;

    // Desabilita interação com os livros do armario
    groupDisable(scene[2].livros);
    item.setaSalaDeAula.setInteractive(false);

    // Mostra o livro
    item.livroAberto.enable();
    item.livroAberto.changeAlpha(1, 600);
    item.fechaLivro.enable();
    item.fechaLivro.changeAlpha(1, 600);

    livro[tituloLivroAberto].open();

    setTimeout(function() {
      enableInteractiveness();
    }, 700);
  }

  // Conteudo dos livros

  // LIVRO: OBJETO DE APRENDIZAGEM
  livro.newBook("ObjetoDeApendizagem");

  // Conteúdo do livro Objeto de Aprendizagem
  livro.ObjetoDeApendizagem.pagina[0] = new Game.Page();
  livro.ObjetoDeApendizagem.pagina[0].titulo = new Game.Text(
    "       O Objeto de Aprendizagem"
  , estiloTitulo);
  livro.ObjetoDeApendizagem.pagina[0].titulo.setPosition(248, 120);
  livro.ObjetoDeApendizagem.pagina[0].titulo.setAlpha(0);
  livro.ObjetoDeApendizagem.pagina[0].titulo.disable();

  livro.ObjetoDeApendizagem.pagina[0].texto1 = new Game.Text(
    "     Os Objetos de Aprendizagem são uma\n" +
    "tecnologia recente que abre caminhos na\n" +
    "educação à distância e que serve de material\n" +
    "de apoio a aula presencial tradicional. São\n" +
    "elementos de uma nova metodologia de\n" +
    "ensino e aprendizagem baseada no uso do\n" +
    "computador e da Internet.\n" +
    "     Apesar de sua definição ainda ser vaga, o\n" +
    "o consenso é de que o Objeto de Aprendiza-\n" +
    "gem deva possuir um propósito educacional\n" +
    "definido, um elemento que estimule a refle-\n" +
    "xão do estudante e que sua construção seja\n" +
    "de forma a facilitar a reutilização dentro de\n" +
    "outros contextos de aprendizagem.\n" +
    "     Desta forma, as autoras apresentam o\n" +
    "presente Objeto de Aprendizagem em Para-\n" +
    "sitologia.\n" +
    "     O software (ou “jogo”) conta com regiões\n" +
    "clicáveis e interativas, as quais revelarão ao\n" +
    "usuário informações adicionais sobre o objeto\n" +
    "interativo, como os ciclos de vida dos para-\n" +
    "sitas em questão e as suas consequentes doen-"
    , estiloTextoLivro);
  livro.ObjetoDeApendizagem.pagina[0].texto1.setPosition(248, 190);
  livro.ObjetoDeApendizagem.pagina[0].texto1.setAlpha(0);
  livro.ObjetoDeApendizagem.pagina[0].texto1.disable();

  livro.ObjetoDeApendizagem.pagina[0].texto2 = new Game.Text(
    "ças. Visualmente, o jogo é repleto de imagens\n" +
    "e se é intencionado que estas sejam autoexpli-\n" +
    "cativas, contando, num primeiro momento,\n" +
    "com os auxílios das legendas.\n" +
    "     São expostas três telas: a principal, a sala\n" +
    "de aula, na qual serão encontradas representa-\n" +
    "ções de quatro doenças e seus respectivos\n" +
    "parasitas. À direita da tela principal será ex-\n" +
    "posto o exterior da escola, com mais quatro\n" +
    "doenças e seus três parasitas. À esquerda da\n" +
    "sala de aula será apresentada uma estante re-\n" +
    "pleta de livros interativos, nos quais serão\n" +
    "explicadas as teorias sobre o Parasitismo e\n" +
    "cada parasita abordado neste Objeto de Apren-\n" +
    "dizagem."
    , estiloTextoLivro);
  livro.ObjetoDeApendizagem.pagina[0].texto2.setPosition(990, 120);
  livro.ObjetoDeApendizagem.pagina[0].texto2.setAlpha(0);
  livro.ObjetoDeApendizagem.pagina[0].texto2.disable();

  livro.ObjetoDeApendizagem.pagina[0].texto3 = new Game.Text(
    "Vamos lá!"
    , estiloTextoLivro);
  livro.ObjetoDeApendizagem.pagina[0].texto3.setPosition(1414, 669);
  livro.ObjetoDeApendizagem.pagina[0].texto3.setAlpha(0);
  livro.ObjetoDeApendizagem.pagina[0].texto3.disable();

  // LIVRO: PARASITOLOGIA
  livro.newBook("Parasitologia");

  // Conteúdo do livro Objeto de Aprendizagem
  livro.Parasitologia.pagina[0] = new Game.Page();
  livro.Parasitologia.pagina[0].titulo = new Game.Text(
    "                   Parasitologia"
  , estiloTitulo);
  livro.Parasitologia.pagina[0].titulo.setPosition(248, 120);
  livro.Parasitologia.pagina[0].titulo.setAlpha(0);
  livro.Parasitologia.pagina[0].titulo.disable();

  livro.Parasitologia.pagina[0].texto1 = new Game.Text(
    "     A parasitologia é o estudo dos parasitas\n" +
    "animais e vegetais e da relação entre parasi-\n" +
    "tas e seus hospedeiros.\n" +
    "     O parasitismo é a associação entre os se-\n" +
    "res vivos, na qual existe unilateralidade de\n" +
    "benefícios, ou seja, apenas um dos lados é\n" +
    "beneficiado. Neste sentido, o hospedeiro\n" +
    "provê abrigo e proteção ao parasita, o qual\n" +
    "prejudica e promove danos ao hospedeiro.\n" +
    "De um modo geral, afirma-se que a associa-\n" +
    "ção parasitária tende ao equilíbrio porque se\n" +
    "o hospedeiro morre, o parasita também morre.\n" +
    "Entretanto, percebe-se que na prática tal fato\n" +
    "não ocorre, visto que ao evitar a morte, o pa-\n" +
    "rasita não mata seu hospedeiro.\n" +
    "     Para haver doenças parasitárias é necessá-\n" +
    "rio que existam alguns fatores, quanto:\n" +
    "     - ao parasito: como o número de indivídu-\n" +
    "os que atingirão o hospedeiro, a sua virulência\n" +
    "e a localização do parasito;\n" +
    "     - ao hospedeiro: idade, nutrição, tipo de\n" +
    "resposta imune."
    , estiloTextoLivro);
  livro.Parasitologia.pagina[0].texto1.setPosition(248, 190);
  livro.Parasitologia.pagina[0].texto1.setAlpha(0);
  livro.Parasitologia.pagina[0].texto1.disable();

  livro.Parasitologia.pagina[0].texto2 = new Game.Text(
    "     A ação do parasita no hospedeiro é de gran-\n" +
    "de importância na parasitologia, visto que é\n" +
    "através dela que ocorrem as doenças. Dentre os\n" +
    "tipos de ação dos parasitos, os principais são:\n" +
    "     - Mecânica: ação obstrutiva ou destrutiva\n" +
    "que parasito exerce sobre algum órgão do hos-\n" +
    "pedeiro;\n" +
    "      - Espoliativa: ocorre quando o parasito re-\n" +
    "tira nutrientes do hospedeiro;\n" +
    "      - Traumática: quando o parasito promove\n" +
    "traumas no hospedeiro, como fixação e migra-\n" +
    "ção;\n" +
    "      - Tóxica: produtos do metabolismo do pa-\n" +
    "rasito é tóxico ao hospedeiro."
    , estiloTextoLivro);
  livro.Parasitologia.pagina[0].texto2.setPosition(990, 120);
  livro.Parasitologia.pagina[0].texto2.setAlpha(0);
  livro.Parasitologia.pagina[0].texto2.disable();

  livro.Parasitologia.pagina[0].texto3 = new Game.Text(
    "     Os helmintos (ou vermes) são grandes e vi-\n" +
    "síveis a olho nu. Podem ser metazoários, para-\n" +
    "sitos de animais, vegetais ou de vida livre.\n" +
    "     São classificados em quatro filos:\n" +
    "     - Platyelminthes: vermes achatados, os\n" +
    "quais se subdividem em duas classes: Trema-\n" +
    "toda: vermes em forma de folha e Cestoda:\n" +
    "vermes em forma de fita."
    , estiloTextoLivro);
  livro.Parasitologia.pagina[0].texto3.setPosition(990, 650);
  livro.Parasitologia.pagina[0].texto3.setAlpha(0);
  livro.Parasitologia.pagina[0].texto3.disable();

  livro.Parasitologia.pagina[1] = new Game.Page();
  livro.Parasitologia.pagina[1].texto1 = new Game.Text(
    "     YYYYYYYYY é o estudo dos parasitas\n" +
    "animais e vegetais e da relação entre parasi-\n" +
    "tas e seus hospedeiros.\n" +
    "     O parasitismo é a associação entre os se-\n" +
    "res vivos, na qual existe unilateralidade de\n" +
    "benefícios, ou seja, apenas um dos lados é\n" +
    "beneficiado. Neste sentido, o hospedeiro\n" +
    "provê abrigo e proteção ao parasita, o qual\n" +
    "prejudica e promove danos ao hospedeiro.\n" +
    "De um modo geral, afirma-se que a associa-\n" +
    "ção parasitária tende ao equilíbrio porque se\n" +
    "o hospedeiro morre, o parasita também morre.\n" +
    "Entretanto, percebe-se que na prática tal fato\n" +
    "não ocorre, visto que ao evitar a morte, o pa-\n" +
    "rasita não mata seu hospedeiro.\n" +
    "     Para haver doenças parasitárias é necessá-\n" +
    "rio que existam alguns fatores, quanto:\n" +
    "     - ao parasito: como o número de indivídu-\n" +
    "os que atingirão o hospedeiro, a sua virulência\n" +
    "e a localização do parasito;\n" +
    "     - ao hospedeiro: idade, nutrição, tipo de\n" +
    "resposta imune."
    , estiloTextoLivro);
  livro.Parasitologia.pagina[1].texto1.setPosition(248, 190);
  livro.Parasitologia.pagina[1].texto1.setAlpha(0);
  livro.Parasitologia.pagina[1].texto1.disable();

  // Cria os itens com o conteudo dos livros
  livro.createItems();

  // Margem direita - Para debug
  item.margemDir1 = new Game.Line(800, 120, 800, 950, 2);
  item.margemDir1.setZorder(1);

  item.margemDir2 = new Game.Line(1550, 120, 1550, 950, 2);
  item.margemDir2.setZorder(1);

  // Margem inferior
  item.margemInf = new Game.Line(220, 935, 1580, 935, 2);
  item.margemInf.setZorder(1);

  // Imagens do livro e do X de fechar
  item.livroAberto = new Game.Image("livroAberto.png");
  item.livroAberto.setZorder(4);
  item.livroAberto.setPosition(960, 540);
  item.livroAberto.setAlpha(0);
  item.livroAberto.disable();

  item.fechaLivro = new Game.Item("botaoFechar.png");
  item.fechaLivro.setPosition(1840, 70);
  item.fechaLivro.setZorder(1);
  item.fechaLivro.setAlpha(0);
  item.fechaLivro.disable();
  item.fechaLivro.onMouseOver = function() {
    item.fechaLivro.addGlow();
  }
  item.fechaLivro.onMouseOut = function() {
    item.fechaLivro.removeGlow();
  }
  item.fechaLivro.onClick = function(mouse) {
    disableInteractiveness();

    // Habilita interação com os livros do armario
    groupEnable(scene[2].livros);
    item.setaSalaDeAula.setInteractive(true);

    // Esconde o livro
    item.livroAberto.changeAlpha(0, 600);
    item.fechaLivro.changeAlpha(0, 600);

    // Esconde o texto
    livro[tituloLivroAberto].close();

    setTimeout(function() {
      item.livroAberto.disable();
      item.fechaLivro.disable();
      enableInteractiveness();
    }, 700);
  }

}
<commit_msg>wrote some text on Parasitologia book<commit_after>function carregaLivroAberto() {

  // Criando um aliase de scene[2].item
  var item = scene[2].item;

  var livro = new Game.Bookshelf();
  var tituloLivroAberto = null;

  scene[2].openBook = function(titulo) {
    disableInteractiveness();

    // Salva nome do livro
    tituloLivroAberto = titulo;

    // Desabilita interação com os livros do armario
    groupDisable(scene[2].livros);
    item.setaSalaDeAula.setInteractive(false);

    // Mostra o livro
    item.livroAberto.enable();
    item.livroAberto.changeAlpha(1, 600);
    item.fechaLivro.enable();
    item.fechaLivro.changeAlpha(1, 600);

    livro[tituloLivroAberto].open();

    setTimeout(function() {
      enableInteractiveness();
    }, 700);
  }

  // Conteudo dos livros

  // LIVRO: OBJETO DE APRENDIZAGEM
  livro.newBook("ObjetoDeApendizagem");

  // Conteúdo do livro Objeto de Aprendizagem
  livro.ObjetoDeApendizagem.pagina[0] = new Game.Page();
  livro.ObjetoDeApendizagem.pagina[0].titulo = new Game.Text(
    "       O Objeto de Aprendizagem"
  , estiloTitulo);
  livro.ObjetoDeApendizagem.pagina[0].titulo.setPosition(248, 120);
  livro.ObjetoDeApendizagem.pagina[0].titulo.setAlpha(0);
  livro.ObjetoDeApendizagem.pagina[0].titulo.disable();

  livro.ObjetoDeApendizagem.pagina[0].texto1 = new Game.Text(
    "     Os Objetos de Aprendizagem são uma\n" +
    "tecnologia recente que abre caminhos na\n" +
    "educação à distância e que serve de material\n" +
    "de apoio a aula presencial tradicional. São\n" +
    "elementos de uma nova metodologia de\n" +
    "ensino e aprendizagem baseada no uso do\n" +
    "computador e da Internet.\n" +
    "     Apesar de sua definição ainda ser vaga, o\n" +
    "o consenso é de que o Objeto de Aprendiza-\n" +
    "gem deva possuir um propósito educacional\n" +
    "definido, um elemento que estimule a refle-\n" +
    "xão do estudante e que sua construção seja\n" +
    "de forma a facilitar a reutilização dentro de\n" +
    "outros contextos de aprendizagem.\n" +
    "     Desta forma, as autoras apresentam o\n" +
    "presente Objeto de Aprendizagem em Para-\n" +
    "sitologia.\n" +
    "     O software (ou “jogo”) conta com regiões\n" +
    "clicáveis e interativas, as quais revelarão ao\n" +
    "usuário informações adicionais sobre o objeto\n" +
    "interativo, como os ciclos de vida dos para-\n" +
    "sitas em questão e as suas consequentes doen-"
    , estiloTextoLivro);
  livro.ObjetoDeApendizagem.pagina[0].texto1.setPosition(248, 190);
  livro.ObjetoDeApendizagem.pagina[0].texto1.setAlpha(0);
  livro.ObjetoDeApendizagem.pagina[0].texto1.disable();

  livro.ObjetoDeApendizagem.pagina[0].texto2 = new Game.Text(
    "ças. Visualmente, o jogo é repleto de imagens\n" +
    "e se é intencionado que estas sejam autoexpli-\n" +
    "cativas, contando, num primeiro momento,\n" +
    "com os auxílios das legendas.\n" +
    "     São expostas três telas: a principal, a sala\n" +
    "de aula, na qual serão encontradas representa-\n" +
    "ções de quatro doenças e seus respectivos\n" +
    "parasitas. À direita da tela principal será ex-\n" +
    "posto o exterior da escola, com mais quatro\n" +
    "doenças e seus três parasitas. À esquerda da\n" +
    "sala de aula será apresentada uma estante re-\n" +
    "pleta de livros interativos, nos quais serão\n" +
    "explicadas as teorias sobre o Parasitismo e\n" +
    "cada parasita abordado neste Objeto de Apren-\n" +
    "dizagem."
    , estiloTextoLivro);
  livro.ObjetoDeApendizagem.pagina[0].texto2.setPosition(990, 120);
  livro.ObjetoDeApendizagem.pagina[0].texto2.setAlpha(0);
  livro.ObjetoDeApendizagem.pagina[0].texto2.disable();

  livro.ObjetoDeApendizagem.pagina[0].texto3 = new Game.Text(
    "Vamos lá!"
    , estiloTextoLivro);
  livro.ObjetoDeApendizagem.pagina[0].texto3.setPosition(1414, 669);
  livro.ObjetoDeApendizagem.pagina[0].texto3.setAlpha(0);
  livro.ObjetoDeApendizagem.pagina[0].texto3.disable();

  // LIVRO: PARASITOLOGIA
  livro.newBook("Parasitologia");

  // Conteúdo do livro Objeto de Aprendizagem
  livro.Parasitologia.pagina[0] = new Game.Page();
  livro.Parasitologia.pagina[0].titulo = new Game.Text(
    "                   Parasitologia"
  , estiloTitulo);
  livro.Parasitologia.pagina[0].titulo.setPosition(248, 120);
  livro.Parasitologia.pagina[0].titulo.setAlpha(0);
  livro.Parasitologia.pagina[0].titulo.disable();

  livro.Parasitologia.pagina[0].texto1 = new Game.Text(
    "     A parasitologia é o estudo dos parasitas\n" +
    "animais e vegetais e da relação entre parasi-\n" +
    "tas e seus hospedeiros.\n" +
    "     O parasitismo é a associação entre os se-\n" +
    "res vivos, na qual existe unilateralidade de\n" +
    "benefícios, ou seja, apenas um dos lados é\n" +
    "beneficiado. Neste sentido, o hospedeiro\n" +
    "provê abrigo e proteção ao parasita, o qual\n" +
    "prejudica e promove danos ao hospedeiro.\n" +
    "De um modo geral, afirma-se que a associa-\n" +
    "ção parasitária tende ao equilíbrio porque se\n" +
    "o hospedeiro morre, o parasita também morre.\n" +
    "Entretanto, percebe-se que na prática tal fato\n" +
    "não ocorre, visto que ao evitar a morte, o pa-\n" +
    "rasita não mata seu hospedeiro.\n" +
    "     Para haver doenças parasitárias é necessá-\n" +
    "rio que existam alguns fatores, quanto:\n" +
    "     - ao parasito: como o número de indivídu-\n" +
    "os que atingirão o hospedeiro, a sua virulência\n" +
    "e a localização do parasito;\n" +
    "     - ao hospedeiro: idade, nutrição, tipo de\n" +
    "resposta imune."
    , estiloTextoLivro);
  livro.Parasitologia.pagina[0].texto1.setPosition(248, 190);
  livro.Parasitologia.pagina[0].texto1.setAlpha(0);
  livro.Parasitologia.pagina[0].texto1.disable();

  livro.Parasitologia.pagina[0].texto2 = new Game.Text(
    "     A ação do parasita no hospedeiro é de gran-\n" +
    "de importância na parasitologia, visto que é\n" +
    "através dela que ocorrem as doenças. Dentre os\n" +
    "tipos de ação dos parasitos, os principais são:\n" +
    "     - Mecânica: ação obstrutiva ou destrutiva\n" +
    "que parasito exerce sobre algum órgão do hos-\n" +
    "pedeiro;\n" +
    "      - Espoliativa: ocorre quando o parasito re-\n" +
    "tira nutrientes do hospedeiro;\n" +
    "      - Traumática: quando o parasito promove\n" +
    "traumas no hospedeiro, como fixação e migra-\n" +
    "ção;\n" +
    "      - Tóxica: produtos do metabolismo do pa-\n" +
    "rasito é tóxico ao hospedeiro."
    , estiloTextoLivro);
  livro.Parasitologia.pagina[0].texto2.setPosition(990, 120);
  livro.Parasitologia.pagina[0].texto2.setAlpha(0);
  livro.Parasitologia.pagina[0].texto2.disable();

  livro.Parasitologia.pagina[0].texto3 = new Game.Text(
    "     Os helmintos (ou vermes) são grandes e vi-\n" +
    "síveis a olho nu. Podem ser metazoários, para-\n" +
    "sitos de animais, vegetais ou de vida livre.\n" +
    "     São classificados em quatro filos:\n" +
    "     - Platyelminthes: vermes achatados, os\n" +
    "quais se subdividem em duas classes: Trema-\n" +
    "toda: vermes em forma de folha e Cestoda:\n" +
    "vermes em forma de fita."
    , estiloTextoLivro);
  livro.Parasitologia.pagina[0].texto3.setPosition(990, 650);
  livro.Parasitologia.pagina[0].texto3.setAlpha(0);
  livro.Parasitologia.pagina[0].texto3.disable();

  livro.Parasitologia.pagina[1] = new Game.Page();
  livro.Parasitologia.pagina[1].texto1 = new Game.Text(
    "     - Nematoda: vermes redondos, os quais se\n" +
    "subdividem em: Adenophorea (não-parasitas\n" +
    "do ser humano) e Sercenentea (parasitam o\n" +
    "Homem e animais).\n" +
    "      - Acanthocephala: vermes pseudoceloma-\n" +
    "dos e pseudossegmentados.\n" +
    "      - Annelida: grupo de metazoários, como a\n" +
    "classe Oligochaeta (minhocas) e Hirudinea\n" +
    "(sanguessugas).\n" +
    "      No interior, ou não, de um hospedeiro, o\n" +
    "parasita se desenvolve por meio de seu ciclo\n" +
    "biológico. Como resultado da evolução dos\n" +
    "parasitas, algumas fases de seus ciclos bioló-\n" +
    "gicos são complicadas e outras mais simples,\n" +
    "obtendo, de uma forma ou de outra, sucesso\n" +
    "em sua reprodução e dispersão.\n" +
    "rio que existam alguns fatores, quanto:\n" +
    "     - ao parasito: como o número de indivídu-\n" +
    "os que atingirão o hospedeiro, a sua virulência\n" +
    "e a localização do parasito;\n" +
    "     - ao hospedeiro: idade, nutrição, tipo de\n" +
    "resposta imune."
    , estiloTextoLivro);
  livro.Parasitologia.pagina[1].texto1.setPosition(248, 120);
  livro.Parasitologia.pagina[1].texto1.setAlpha(0);
  livro.Parasitologia.pagina[1].texto1.disable();

  // Cria os itens com o conteudo dos livros
  livro.createItems();

  // Margem direita - Para debug
  item.margemDir1 = new Game.Line(800, 120, 800, 950, 2);
  item.margemDir1.setZorder(1);

  item.margemDir2 = new Game.Line(1550, 120, 1550, 950, 2);
  item.margemDir2.setZorder(1);

  // Margem inferior
  item.margemInf = new Game.Line(220, 935, 1580, 935, 2);
  item.margemInf.setZorder(1);

  // Imagens do livro e do X de fechar
  item.livroAberto = new Game.Image("livroAberto.png");
  item.livroAberto.setZorder(4);
  item.livroAberto.setPosition(960, 540);
  item.livroAberto.setAlpha(0);
  item.livroAberto.disable();

  item.fechaLivro = new Game.Item("botaoFechar.png");
  item.fechaLivro.setPosition(1840, 70);
  item.fechaLivro.setZorder(1);
  item.fechaLivro.setAlpha(0);
  item.fechaLivro.disable();
  item.fechaLivro.onMouseOver = function() {
    item.fechaLivro.addGlow();
  }
  item.fechaLivro.onMouseOut = function() {
    item.fechaLivro.removeGlow();
  }
  item.fechaLivro.onClick = function(mouse) {
    disableInteractiveness();

    // Habilita interação com os livros do armario
    groupEnable(scene[2].livros);
    item.setaSalaDeAula.setInteractive(true);

    // Esconde o livro
    item.livroAberto.changeAlpha(0, 600);
    item.fechaLivro.changeAlpha(0, 600);

    // Esconde o texto
    livro[tituloLivroAberto].close();

    setTimeout(function() {
      item.livroAberto.disable();
      item.fechaLivro.disable();
      enableInteractiveness();
    }, 700);
  }

}
<|endoftext|>


<commit_before>define(["require", "exports", "underscore", "koutils/utils", "koutils/underscore"], function(require, exports, _, utils) {
    var lastEmpty = 0, tempRegex = /00000000-0000-0000-0000-\d{12}/, guidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;

    exports.empty = "00000000-0000-0000-0000-000000000000";

    function S4() {
        return utils.str_pad(Math.floor(Math.random() * 0x10000).toString(16), 4, "0");
    }

    function generate() {
        return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
    }
    exports.generate = generate;

    function generateTemp() {
        return "00000000-0000-0000-0000-" + utils.str_pad((lastEmpty++).toString(), 12, "0");
    }
    exports.generateTemp = generateTemp;

    function generateMin() {
        var guid = exports.generate().split("-");
        return _.sum(guid, function (part) {
            return parseInt(part, 16);
        }).toString(16);
    }
    exports.generateMin = generateMin;

    function isGuid(guid) {
        return guidRegex.test(guid);
    }
    exports.isGuid = isGuid;

    function isTemp(guid) {
        return tempRegex.test(guid);
    }
    exports.isTemp = isTemp;
});
<commit_msg>Update distribution<commit_after>define(["require", "exports", "underscore", "koutils/utils", "koutils/underscore"], function(require, exports, _, utils) {
    var lastEmpty = 0, tempRegex = /00000000-0000-0000-0000-\d{12}/, guidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;

    exports.empty = "00000000-0000-0000-0000-000000000000";

    function S4() {
        return utils.str_pad(Math.floor(Math.random() * 0x10000).toString(16), 4, "0");
    }

    function generate() {
        return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
    }
    exports.generate = generate;

    function generateTemp() {
        return "00000000-0000-0000-0000-" + utils.str_pad((lastEmpty++).toString(), 12, "0");
    }
    exports.generateTemp = generateTemp;

    function generateMin() {
        return Math.floor(Math.random() * 3656158440062975).toString(36);
    }
    exports.generateMin = generateMin;

    function isGuid(guid) {
        return guidRegex.test(guid);
    }
    exports.isGuid = isGuid;

    function isTemp(guid) {
        return tempRegex.test(guid);
    }
    exports.isTemp = isTemp;
});
<|endoftext|>