Ver Fonte

Update all the JavaScripts (#2575)

* quick vagrant fix

* all that js

* add queryCache back in for ringojs
Nate há 8 anos atrás
pai
commit
172b64b2e5
38 ficheiros alterados com 512 adições e 677 exclusões
  1. 2 2
      frameworks/JavaScript/express/README.md
  2. 83 102
      frameworks/JavaScript/express/app.js
  3. 7 7
      frameworks/JavaScript/express/package.json
  4. 10 10
      frameworks/JavaScript/hapi/README.md
  5. 4 4
      frameworks/JavaScript/hapi/app.js
  6. 22 43
      frameworks/JavaScript/hapi/create-server.js
  7. 43 68
      frameworks/JavaScript/hapi/handlers/mongoose.js
  8. 47 69
      frameworks/JavaScript/hapi/handlers/sequelize-postgres.js
  9. 45 62
      frameworks/JavaScript/hapi/handlers/sequelize.js
  10. 10 12
      frameworks/JavaScript/hapi/helper.js
  11. 9 11
      frameworks/JavaScript/hapi/package.json
  12. 2 0
      frameworks/JavaScript/hapi/source_code
  13. 5 0
      frameworks/JavaScript/koa/README.md
  14. 32 37
      frameworks/JavaScript/koa/app.js
  15. 4 4
      frameworks/JavaScript/koa/package.json
  16. 3 0
      frameworks/JavaScript/koa/source_code
  17. 6 9
      frameworks/JavaScript/nodejs/README.md
  18. 4 4
      frameworks/JavaScript/nodejs/app.js
  19. 10 12
      frameworks/JavaScript/nodejs/create-server.js
  20. 3 3
      frameworks/JavaScript/nodejs/handlers/mongodb-raw.js
  21. 4 4
      frameworks/JavaScript/nodejs/handlers/mongoose.js
  22. 7 12
      frameworks/JavaScript/nodejs/handlers/mysql-raw.js
  23. 11 6
      frameworks/JavaScript/nodejs/handlers/sequelize-postgres.js
  24. 11 6
      frameworks/JavaScript/nodejs/handlers/sequelize.js
  25. 20 26
      frameworks/JavaScript/nodejs/helper.js
  26. 7 8
      frameworks/JavaScript/nodejs/package.json
  27. 19 26
      frameworks/JavaScript/nodejs/routing.js
  28. 1 1
      frameworks/JavaScript/ringojs/README.md
  29. 9 13
      frameworks/JavaScript/ringojs/app/models.js
  30. 12 12
      frameworks/JavaScript/ringojs/app/views.js
  31. 0 1
      frameworks/JavaScript/ringojs/benchmark_config.json
  32. 2 2
      frameworks/JavaScript/ringojs/ringo-convenient-main.js
  33. 52 77
      frameworks/JavaScript/ringojs/ringo-main.js
  34. 1 1
      frameworks/JavaScript/ringojs/setup.sh
  35. 2 0
      frameworks/JavaScript/ringojs/source_code
  36. 0 20
      frameworks/JavaScript/ringojs/templates/fortune.mustache
  37. 2 2
      toolset/setup/linux/frameworks/ringojs.sh
  38. 1 1
      toolset/setup/linux/webservers/nodejs.sh

+ 2 - 2
frameworks/JavaScript/express/README.md

@@ -12,8 +12,8 @@ This is the Express portion of a [benchmarking test suite](../) comparing a vari
 
 ## Infrastructure Software Versions
 The tests were run with:
-* [Node.js v0.12.2](http://nodejs.org/)
-* [Express 4.12.3](http://expressjs.com/)
+* [Node.js v7.5.0](http://nodejs.org/)
+* [Express 4.14.1](http://expressjs.com/)
 
 ## Resources
 * http://nodejs.org/api/cluster.html

+ 83 - 102
frameworks/JavaScript/express/app.js

@@ -3,23 +3,23 @@
  * Module dependencies.
  */
 
-var cluster = require('cluster')
-  , numCPUs = require('os').cpus().length
-  , express = require('express')
-  , Sequelize = require('sequelize')
-  , mongoose = require('mongoose')
-  , conn = mongoose.connect('mongodb://TFB-database/hello_world')
-  , async = require('async');
+const cluster = require('cluster'),
+  numCPUs = require('os').cpus().length,
+  express = require('express'),
+  Sequelize = require('sequelize'),
+  mongoose = require('mongoose'),
+  conn = mongoose.connect('mongodb://TFB-database/hello_world'),
+  async = require('async');
 
 // Middleware
-var bodyParser = require('body-parser')
-  , methodOverride = require('method-override')
-  , errorHandler = require('errorhandler');
+const bodyParser = require('body-parser'),
+  methodOverride = require('method-override'),
+  errorHandler = require('errorhandler');
 
-var Schema = mongoose.Schema
-  , ObjectId = Schema.ObjectId;
+const Schema = mongoose.Schema,
+  ObjectId = Schema.ObjectId;
 
-var WorldSchema = new mongoose.Schema({
+const WorldSchema = new mongoose.Schema({
     id          : Number,
     randomNumber: Number
   }, {
@@ -27,7 +27,7 @@ var WorldSchema = new mongoose.Schema({
   }),
   MWorld = conn.model('world', WorldSchema);
 
-var FortuneSchema = new mongoose.Schema({
+const FortuneSchema = new mongoose.Schema({
     id          : Number,
     message     : String
   }, {
@@ -35,15 +35,16 @@ var FortuneSchema = new mongoose.Schema({
   }),
   MFortune = conn.model('fortune', FortuneSchema);
 
-var sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
+const sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
   host: 'TFB-database',
   dialect: 'mysql',
   logging: false
 });
 
-var World = sequelize.define('World', {
+const World = sequelize.define('World', {
   id: {
-    type: 'Sequelize.INTEGER'
+    type: 'Sequelize.INTEGER',
+    primaryKey: true
   },
   randomNumber: {
     type: 'Sequelize.INTEGER'
@@ -52,9 +53,10 @@ var World = sequelize.define('World', {
   timestamps: false,
   freezeTableName: true
 });
-var Fortune = sequelize.define('Fortune', {
+const Fortune = sequelize.define('Fortune', {
   id: {
-    type: 'Sequelize.INTEGER'
+    type: 'Sequelize.INTEGER',
+    primaryKey: true
   },
   message: {
     type: 'Sequelize.STRING'
@@ -66,30 +68,29 @@ var Fortune = sequelize.define('Fortune', {
 
 if (cluster.isMaster) {
   // Fork workers.
-  for (var i = 0; i < numCPUs; i++) {
+  for (let i = 0; i < numCPUs; i++) {
     cluster.fork();
   }
 
-  cluster.on('exit', function(worker, code, signal) {
-    console.log('worker ' + worker.pid + ' died');
-  });
+  cluster.on('exit', (worker, code, signal) =>
+    console.log('worker ' + worker.pid + ' died'));
 } else {
-  var app = module.exports = express();
+  const app = module.exports = express();
 
   // Configuration
   // https://github.com/expressjs/method-override#custom-logic
-  app.use(bodyParser.urlencoded({extended: true}));
-  app.use(methodOverride(function(req, res){
+  app.use(bodyParser.urlencoded({ extended: true }));
+  app.use(methodOverride((req, res) => {
     if (req.body && typeof req.body === 'object' && '_method' in req.body) {
       // look in urlencoded POST bodies and delete it
-      var method = req.body._method
-      delete req.body._method
-      return method
+      const method = req.body._method;
+      delete req.body._method;
+      return method;
     }
   }));
 
   // Set headers for all routes
-  app.use(function(req, res, next) {
+  app.use((req, res, next) => {
     res.setHeader("Server", "Express");
     return next();
   });
@@ -98,7 +99,7 @@ if (cluster.isMaster) {
   app.set('views', __dirname + '/views');
 
   // Check Node env.
-  var env = process.env.NODE_ENV || 'development';
+  const env = process.env.NODE_ENV || 'development';
   if ('development' == env) {
     app.use(errorHandler({ dumpExceptions: true, showStack: true }));
   }
@@ -107,55 +108,45 @@ if (cluster.isMaster) {
   }
 
   // Routes
+  app.get('/json', (req, res) => res.send({ message: 'Hello, World!' }));
 
-  app.get('/json', function(req, res) {
-    res.send({ message: 'Hello, World!' });
-  });
-
-  app.get('/plaintext', function(req, res) {
-    res.header('Content-Type', 'text/plain').send('Hello, World!');
-  });
+  app.get('/plaintext', (req, res) =>
+    res.header('Content-Type', 'text/plain').send('Hello, World!'));
 
-  app.get('/mongoose', function(req, res) {
-    var queries = isNaN(req.query.queries) ? 1 : parseInt(req.query.queries, 10)
-      , queryFunctions = [];
+  app.get('/mongoose', (req, res) => {
+    let queries = isNaN(req.query.queries) ? 1 : parseInt(req.query.queries, 10);
+    const queryFunctions = [];
 
     queries = Math.min(Math.max(queries, 1), 500);
 
-    for (var i = 1; i <= queries; i++ ) {
-      queryFunctions.push(function(callback) {
-        MWorld.findOne({ id: (Math.floor(Math.random() * 10000) + 1) }).exec(callback);
-      });
+    for (let i = 1; i <= queries; i++ ) {
+      queryFunctions.push((callback) =>
+        MWorld.findOne({ id: (Math.floor(Math.random() * 10000) + 1) })
+          .exec(callback));
     }
 
-    async.parallel(queryFunctions, function(err, results) {
-      if (!req.query.queries) {
-        results = results[0];
-      }
-      res.send(results);
-    });
+    async.parallel(queryFunctions, (err, results) =>
+      res.send(!req.query.queries ? results[0] : results));
   });
 
-  app.get('/mysql-orm', function(req, res) {
-    var queriesRaw = parseInt(req.query.queries, 10)
-      , queries = isNaN(queriesRaw) ? 1 : queriesRaw
-      , queryFunctions = [];
+  app.get('/mysql-orm', (req, res) => {
+    let queriesRaw = parseInt(req.query.queries, 10),
+      queries = isNaN(queriesRaw) ? 1 : queriesRaw;
+    const queryFunctions = [];
 
     queries = Math.min(Math.max(queries, 1), 500);
 
-    for (var i = 1; i <= queries; i++ ) {
-      queryFunctions.push(function(callback) {
+    for (let i = 1; i <= queries; i++ ) {
+      queryFunctions.push((callback) => {
         World.findOne({
           where: {
             id: Math.floor(Math.random() * 10000) + 1}
           }
-        ).then(function(world) {
-            callback(null, world);
-        });
+        ).then((world) => callback(null, world));
       });
     }
 
-    async.parallel(queryFunctions, function(err, results) {
+    async.parallel(queryFunctions, (err, results) => {
       if (req.query.queries == undefined) {
         results = results[0];
       }
@@ -164,46 +155,42 @@ if (cluster.isMaster) {
     });
   });
 
-  app.get('/mongoose-fortune', function(req, res) {
-    MFortune.find({}, function(err, fortunes) {
-      var newFortune = {id: 0, message: "Additional fortune added at request time."};
+  app.get('/mongoose-fortune', (req, res) => {
+    MFortune.find({}, (err, fortunes) => {
+      const newFortune = {id: 0, message: "Additional fortune added at request time."};
       fortunes.push(newFortune);
-      fortunes.sort(function (a, b) {
-        return (a.message < b.message) ? -1 : 1;
-      });
+      fortunes.sort((a, b) => (a.message < b.message) ? -1 : 1);
 
       res.render('fortunes', {fortunes: fortunes});
     });
   });
 
-  app.get('/mysql-orm-fortune', function(req, res) {
-    Fortune.findAll().then(function (fortunes) {
-      var newFortune = {id: 0, message: "Additional fortune added at request time."};
+  app.get('/mysql-orm-fortune', (req, res) => {
+    Fortune.findAll().then((fortunes) => {
+      const newFortune = {id: 0, message: "Additional fortune added at request time."};
       fortunes.push(newFortune);
-      fortunes.sort(function (a, b) {
-        return (a.message < b.message) ? -1 : 1;
-      });
+      fortunes.sort((a, b) => (a.message < b.message) ? -1 : 1);
 
       res.render('fortunes', {fortunes: fortunes});
     });
   });
 
-  app.get('/mongoose-update', function(req, res) {
-    var selectFunctions = [],
+  app.get('/mongoose-update', (req, res) => {
+    const selectFunctions = [],
         queries = Math.min(parseInt(req.query.queries) || 1, 500);
 
-    for (var i = 1; i <= queries; i++ ) {
-      selectFunctions.push(function(callback) {
-        MWorld.findOne({ id: Math.floor(Math.random() * 10000) + 1 }).exec(callback);
-      });
+    for (let i = 1; i <= queries; i++ ) {
+      selectFunctions.push((callback) =>
+        MWorld.findOne({ id: Math.floor(Math.random() * 10000) + 1 })
+          .exec(callback));
     }
 
-    async.parallel(selectFunctions, function(err, worlds) {
-      var updateFunctions = [];
+    async.parallel(selectFunctions, (err, worlds) => {
+      const updateFunctions = [];
 
-      for (var i = 0; i < queries; i++) {
-        (function(i){
-          updateFunctions.push(function(callback){
+      for (let i = 0; i < queries; i++) {
+        ((i) => {
+          updateFunctions.push((callback) => {
             worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
             MWorld.update({
               id: worlds[i]
@@ -214,43 +201,37 @@ if (cluster.isMaster) {
         })(i);
       }
 
-      async.parallel(updateFunctions, function(err, updates) {
-        res.send(worlds);
-      });
+      async.parallel(updateFunctions, (err, updates) => res.send(worlds));
     });
   });
 
-  app.get('/mysql-orm-update', function(req, res) {
-    var selectFunctions = [],
+  app.get('/mysql-orm-update', (req, res) => {
+    const selectFunctions = [],
         queries = Math.min(parseInt(req.query.queries) || 1, 500);
 
-    for (var i = 1; i <= queries; i++ ) {
-      selectFunctions.push(function(callback) {
+    for (let i = 1; i <= queries; i++ ) {
+      selectFunctions.push((callback) => {
         World.findOne({
           where: {
             id: Math.floor(Math.random() * 10000) + 1}
           }
-        ).then(function(world) {
-          callback(null, world);
-        });
+        ).then((world) => callback(null, world));
       });
     }
 
-    async.parallel(selectFunctions, function(err, worlds) {
-      var updateFunctions = [];
+    async.parallel(selectFunctions, (err, worlds) => {
+      const updateFunctions = [];
 
-      for (var i = 0; i < queries; i++) {
-        (function(i){
-          updateFunctions.push(function(callback){
+      for (let i = 0; i < queries; i++) {
+        ((i) => {
+          updateFunctions.push((callback) => {
             worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
             worlds[i].save().then(callback());
           });
         })(i);
       }
 
-      async.parallel(updateFunctions, function(err, updates) {
-        res.send(worlds);
-      });
+      async.parallel(updateFunctions, (err, updates) => res.send(worlds));
     });
 
   });

+ 7 - 7
frameworks/JavaScript/express/package.json

@@ -3,14 +3,14 @@
   "version": "0.0.1",
   "private": true,
   "dependencies": {
-    "express": "4.14.0",
-    "body-parser": "1.15.2",
-    "method-override": "2.3.6",
+    "express": "4.14.1",
+    "body-parser": "1.16.1",
+    "method-override": "2.3.7",
     "errorhandler": "1.4.3",
-    "async": "1.5.2",
+    "async": "2.1.5",
     "jade": "1.11.0",
-    "sequelize": "3.6.0",
-    "mysql": "2.11.1",
-    "mongoose": "4.5.3"
+    "sequelize": "3.30.0",
+    "mysql": "2.13.0",
+    "mongoose": "4.8.4"
   }
 }

+ 10 - 10
frameworks/JavaScript/hapi/README.md

@@ -12,8 +12,8 @@ This is the Hapi portion of a [benchmarking test suite](../) comparing a variety
 
 ## Infrastructure Software Versions
 The tests were run with:
-* [Node.js v0.12.2](http://nodejs.org/)
-* [Hapi 8.4.0](http://hapijs.com/)
+* [Node.js v7.5.0](http://nodejs.org/)
+* [Hapi 16.1.0](http://hapijs.com/)
 
 ## Resources
 * http://nodejs.org/api/cluster.html
@@ -21,34 +21,34 @@ The tests were run with:
 ## Test URLs
 ### JSON Encoding Test
 
-http://localhost:8080/json
+http://TFB-server:8080/json
 
 ### Data-Store/Database Mapping Test
 
 MongoDB:
-http://localhost:8080/mongoose/
+http://TFB-server:8080/mongoose/
 
 MySQL:
-http://localhost:8080/mysql-orm/
+http://TFB-server:8080/mysql-orm/
 
 ### Variable Query Test
 
 MongoDB:
-http://localhost:8080/mongoose/2
+http://TFB-server:8080/mongoose/2
 
 MySQL:
-http://localhost:8080/mysql-orm/2
+http://TFB-server:8080/mysql-orm/2
 
 ### Fortune Test
 
 MySQL:
-http://localhost:8080/fortune
+http://TFB-server:8080/fortune
 
 ### Database Update Test
 
 MongoDB:
-http://localhost:8080/mongoose-update/2
+http://TFB-server:8080/mongoose-update/2
 
 MySQL:
-http://localhost:8080/mysql-orm-update/2
+http://TFB-server:8080/mysql-orm-update/2
 

+ 4 - 4
frameworks/JavaScript/hapi/app.js

@@ -1,14 +1,14 @@
-var cluster = require('cluster');
-var numCPUs = require('os').cpus().length;
+const cluster = require('cluster');
+const numCPUs = require('os').cpus().length;
 
 if (cluster.isMaster) {
   // Fork workers.
-  for (var i = 0; i < numCPUs; i++) {
+  for (let i = 0; i < numCPUs; i++) {
     cluster.fork();
   }
 
   console.log('Master starting ' + new Date().toISOString(" "));
-  cluster.on('exit', function (worker, code, signal) {
+  cluster.on('exit', (worker, code, signal) => {
     process.exit(1);
   });
 } else {

+ 22 - 43
frameworks/JavaScript/hapi/create-server.js

@@ -3,9 +3,10 @@
  * working implementation for the benchmark suite.
  */
 
-var Hapi = require('hapi');
-var Vision = require('vision');
-var server = new Hapi.Server();
+const Hapi = require('hapi');
+const Vision = require('vision');
+const server = new Hapi.Server();
+
 server.connection({port: 8080});
 server.register(Vision, (err) => {
     if (err) {
@@ -18,25 +19,23 @@ server.register(Vision, (err) => {
     });
 });
 
-var Promise = require('bluebird');
-var MongooseHandler;
-var SequelizeHandler;
-var SequelizePgHandler;
+const MongooseHandler = require('./handlers/mongoose');
+const SequelizeHandler = require('./handlers/sequelize');
+const SequelizePgHandler = require('./handlers/sequelize-postgres');
+
+// Makes routing simpler as tfb routes are all GET's
+// We also don't use the nifty route features that Hapi has
+// to offer such as attaching a validator
+const Route = (path, handler) =>
+  server.route({ method: 'GET', path, handler });
+
+const JsonSerialization = (req, reply) =>
+  reply({ message: 'Hello, World!' }).header('Server', 'hapi');
 
-// Slight start-up improvement loading handlers in parallel
-Promise.join(
-  require('./handlers/mongoose'),
-  require('./handlers/sequelize'),
-  require('./handlers/sequelize-postgres'),
-  function (mongo, mysql, pg) {
-    MongooseHandler = mongo;
-    SequelizeHandler = mysql;
-    SequelizePgHandler = pg;
-  })
-  .catch(function (err) {
-    console.log('There was a problem setting up the handlers');
-    process.exit(1);
-  });
+const Plaintext = (req, reply) =>
+  reply('Hello, World!')
+    .header('Server', 'hapi')
+    .header('Content-Type', 'text/plain');
 
 
 Route('/json', JsonSerialization);
@@ -57,26 +56,6 @@ Route('/sequelize-pg/queries', SequelizePgHandler.MultipleQueries);
 Route('/sequelize-pg/fortunes', SequelizePgHandler.Fortunes);
 Route('/sequelize-pg/updates', SequelizePgHandler.Updates);
 
-
-function JsonSerialization(req, reply) {
-  reply({ message: 'Hello, World!' })
-    .header('Server', 'hapi');
-}
-
-function Plaintext(req, reply) {
-  reply('Hello, World!')
-    .header('Server', 'hapi')
-    .header('Content-Type', 'text/plain');
-}
-
-// Makes routing simpler as tfb routes are all GET's
-// We also don't use the nifty route features that Hapi has
-// to offer such as attaching a validator
-function Route(path, handler) {
-  server.route({ method: 'GET', path: path, handler: handler})
-}
-
-server.start(function (err) {
+server.start((err) =>
   console.log('Hapi worker started and listening on ' + server.info.uri + " "
-    + new Date().toISOString(" "));
-});
+    + new Date().toISOString(" ")));

+ 43 - 68
frameworks/JavaScript/hapi/handlers/mongoose.js

@@ -1,101 +1,76 @@
 // Connects to MongoDB using the mongoose driver
 // Handles related routes
 
-var h = require('../helper');
-var Promise = require('bluebird');
+const Promise = require('bluebird');
+const h = require('../helper');
 // Can treat mongoose library as one that supports Promises
 // these methods will then have "-Async" appended to them.
-var Mongoose = Promise.promisifyAll(require('mongoose'));
-var connection = Mongoose.connect('mongodb://127.0.0.1/hello_world');
+const Mongoose = Promise.promisifyAll(require('mongoose'));
+const connection = Mongoose.connect('mongodb://TFB-database/hello_world');
 
-var WorldSchema = new Mongoose.Schema({
+const WorldSchema = new Mongoose.Schema({
     id :          Number,
     randomNumber: Number
   }, {
     collection: 'world'
   });
-var FortuneSchema = new Mongoose.Schema({
+const FortuneSchema = new Mongoose.Schema({
     id:      Number,
     message: String
   }, {
     collection: 'fortune'
   });
 
-var Worlds = connection.model('World', WorldSchema);
-var Fortunes = connection.model('Fortune', FortuneSchema);
-
-function randomWorldPromise() {
-  var id = h.randomTfbNumber();
-  var promise = Worlds
-    .findOneAsync({
-      id: id
-    })
-    .then(function (world) {
-      return world;
-    })
-    .catch(function (err) {
-      process.exit(1);
-    });
-  return promise;
-}
-
-function promiseAllFortunes() {
-  var promise = Fortunes
-    .findAsync({})
-    .then(function (fortunes) {
-      return fortunes;
-    })
-    .catch(function (err) {
-      process.exit(1);
-    });
-  return promise;
-}
-
-function updateWorld(world) {
-  var promise = Worlds
-    .updateAsync({
-      id: world.randomNumber
-    }, {
-      randomNumber: world.randomNumber
-    })
-    .then(function (result) {
-      return world;
-    })
-    .catch(function (err) {
-      process.exit(1);
-    });
-  return promise;
-}
+const Worlds = connection.model('World', WorldSchema);
+const Fortunes = connection.model('Fortune', FortuneSchema);
+
+const randomWorldPromise = () =>
+  Worlds.findOneAsync({ id: h.randomTfbNumber() })
+    .then((world) => world)
+    .catch((err) => process.exit(1));
+
+
+const promiseAllFortunes = () =>
+  Fortunes.findAsync({})
+    .then((fortunes) => fortunes)
+    .catch((err) => process.exit(1));
+
+const updateWorld = (world) =>
+  Worlds
+    .updateAsync(
+      { id: world.randomNumber },
+      { randomNumber: world.randomNumber }
+    )
+    .then((result) => world)
+    .catch((err) => process.exit(1));
 
 module.exports = {
 
-  SingleQuery: function(req, reply) {
+  SingleQuery: (req, reply) => {
     randomWorldPromise()
-      .then(function (world) {
+      .then((world) => {
         reply(world)
           .header('Server', 'hapi');
       });
   },
 
-  MultipleQueries: function(req, reply) {
-    var queries = h.getQueries(req);
-    var worldPromises = h.fillArray(randomWorldPromise(), queries);
+  MultipleQueries: (req, reply) => {
+    const queries = h.getQueries(req);
+    const worldPromises = h.fillArray(randomWorldPromise(), queries);
 
     Promise
       .all(worldPromises)
-      .then(function (worlds) {
+      .then((worlds) => {
         reply(worlds)
           .header('Server', 'hapi');
       });
   },
 
-  Fortunes: function(req, reply) {
+  Fortunes: (req, reply) => {
     promiseAllFortunes()
-      .then(function (fortunes) {
+      .then((fortunes) => {
         fortunes.push(h.ADDITIONAL_FORTUNE);
-        fortunes.sort(function (a, b) {
-          return a.message.localeCompare(b.message);
-        });
+        fortunes.sort((a, b) => a.message.localeCompare(b.message));
       
         reply.view('fortunes', {
           fortunes: fortunes
@@ -105,21 +80,21 @@ module.exports = {
       });
   },
 
-  Updates: function(req, reply) {
-    var queries = h.getQueries(req);
-    var worldPromises = [];
+  Updates: (req, reply) => {
+    const queries = h.getQueries(req);
+    const worldPromises = [];
 
-    for (var i = 0; i < queries; i++) {
+    for (let i = 0; i < queries; i++) {
       worldPromises.push(randomWorldPromise());
     }
 
     Promise
       .all(worldPromises)
-      .map(function (world) {
+      .map((world) => {
         world.randomNumber = h.randomTfbNumber();
         return updateWorld(world);
       })
-      .then(function (worlds) {
+      .then((worlds) => {
         reply(worlds)
           .header('Server', 'hapi');
       });

+ 47 - 69
frameworks/JavaScript/hapi/handlers/sequelize-postgres.js

@@ -1,117 +1,95 @@
 // Connects to Postgres using the sequelize driver
 // Handles related routes
 
-var h = require('../helper');
-var Promise = require('bluebird');
-var Sequelize = require('sequelize');
+const Promise = require('bluebird');
+const h = require('../helper');
+const Sequelize = require('sequelize');
 
-var sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
-  host: '127.0.0.1',
+const sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
+  host: 'TFB-database',
   dialect: 'postgres',
   logging: false
 });
 
-var Worlds = sequelize.define('World', {
-  id:           { type: 'Sequelize.INTEGER' },
+const Worlds = sequelize.define('World', {
+  id: {
+    type: 'Sequelize.INTEGER',
+    primaryKey: true
+  },
   randomnumber: { type: 'Sequelize.INTEGER' }
 }, {
   timestamps: false,
   freezeTableName: true
 });
 
-var Fortunes = sequelize.define('Fortune', {
-  id:           { type: 'Sequelize.INTEGER' },
+const Fortunes = sequelize.define('Fortune', {
+  id: {
+    type: 'Sequelize.INTEGER',
+    primaryKey: true
+  },
   message:      { type: 'Sequelize.STRING' }
 }, {
   timestamps: false,
   freezeTableName: true
 });
 
-var randomWorldPromise = function() {
-  return Worlds.findOne({
-    where: { id: h.randomTfbNumber() }
-  }).then(function (results) {
-    return results;
-  }).catch(function (err) {
-    process.exit(1);
-  });
-}
+const randomWorldPromise = () =>
+  Worlds.findOne({ where: { id: h.randomTfbNumber() } })
+    .then((results) => results)
+    .catch((err) => process.exit(1));
 
 module.exports = {
 
-  SingleQuery: function (req, reply) {
-    randomWorldPromise().then(function (world) {
-      reply(world)
-        .header('Server', 'hapi');
-    })
-  },
+  SingleQuery: (req, reply) =>
+    randomWorldPromise().then((world) => reply(world).header('Server', 'hapi')),
 
-  MultipleQueries: function (req, reply) {
-    var queries = h.getQueries(req);
-    var worldPromises = [];
+  MultipleQueries: (req, reply) => {
+    const queries = h.getQueries(req),
+      worldPromises = [];
 
-    for (var i = 0; i < queries; i++) {
+    for (let i = 0; i < queries; i++) {
       worldPromises.push(randomWorldPromise());
     }
 
-    Promise.all(worldPromises).then(function (worlds) {
-      reply(worlds)
-        .header('Server', 'hapi');
-    });
+    Promise.all(worldPromises)
+      .then((worlds) => reply(worlds).header('Server', 'hapi'));
   },
 
-  Fortunes: function (req, reply) {
-    Fortunes.findAll().then(function (fortunes) {
+  Fortunes: (req, reply) => {
+    Fortunes.findAll().then((fortunes) => {
       fortunes.push(h.ADDITIONAL_FORTUNE);
-      fortunes.sort(function (a, b) {
-        return a.message.localeCompare(b.message);
-      });
+      fortunes.sort((a, b) => a.message.localeCompare(b.message));
 
-      reply.view('fortunes', {
-        fortunes: fortunes
-      })
+      reply.view('fortunes', { fortunes: fortunes })
         .header('Content-Type', 'text/html')
         .header('Server', 'hapi');
-    }).catch(function (err) {
-      process.exit(1);
-    }); 
+    }).catch((err) => process.exit(1));
   },
 
-  Updates: function (req, reply) {
-    var queries = h.getQueries(req);
-    var worldPromises = [];
+  Updates: (req, reply) => {
+    const queries = h.getQueries(req),
+      worldPromises = [];
 
-    for (var i = 0; i < queries; i++) {
+    for (let i = 0; i < queries; i++) {
       worldPromises.push(randomWorldPromise());
     }
 
-    var worldUpdate = function (world) {
+    const worldUpdate = (world) => {
       world.randomNumber = h.randomTfbNumber();
 
       return Worlds.update(
-          { randomNumber: world.randomNumber },
-          { where: { id: world.id } }
-        )
-        .then(function (results) {
-          return world;
-        })
-        .catch(function (err) {
-          process.exit(1);
-        });
-    }
+        {randomNumber: world.randomNumber},
+        {where: {id: world.id}}
+      )
+        .then((results) => world)
+        .catch((err) => process.exit(1));
+    };
 
     Promise
       .all(worldPromises)
-      .map(function (world) {
-        return worldUpdate(world);
-      })
-      .then(function (updated) {
-        reply(updated)
-          .header('Server', 'hapi')
-      })
-      .catch(function (err) {
-        process.exit(1);
-      });
+      .map((world) => worldUpdate(world))
+      .then((updated) => reply(updated).header('Server', 'hapi'))
+      .catch((err) => process.exit(1));
   }
 
-};
+};

+ 45 - 62
frameworks/JavaScript/hapi/handlers/sequelize.js

@@ -1,116 +1,99 @@
 // Connects to MySQL using the sequelize driver
 // Handles related routes
 
-var h = require('../helper');
-var Promise = require('bluebird');
+const Promise = require('bluebird');
+const h = require('../helper');
 
-var Sequelize = require('sequelize');
-var sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
-  host: '127.0.0.1',
+const Sequelize = require('sequelize');
+const sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
+  host: 'TFB-database',
   dialect: 'mysql',
   logging: false
 });
 
-var Worlds = sequelize.define('World', {
-  id:           { type: 'Sequelize.INTEGER' },
+const Worlds = sequelize.define('World', {
+  id: {
+    type: 'Sequelize.INTEGER',
+    primaryKey: true
+  },
   randomNumber: { type: 'Sequelize.INTEGER' }
 }, {
   timestamps: false,
   freezeTableName: true
 });
 
-var Fortunes = sequelize.define('Fortune', {
-  id:           { type: 'Sequelize.INTEGER' },
+const Fortunes = sequelize.define('Fortune', {
+  id: {
+    type: 'Sequelize.INTEGER',
+    primaryKey: true
+  },
   message:      { type: 'Sequelize.STRING' }
 }, {
   timestamps: false,
   freezeTableName: true
 });
 
-var randomWorldPromise = function() {
-  return Worlds.findOne({
-    where: { id: h.randomTfbNumber() }
-  }).then(function (results) {
-    return results;
-  }).catch(function (err) {
-    process.exit(1);
-  });
-}
+const randomWorldPromise = () =>
+  Worlds.findOne({ where: { id: h.randomTfbNumber() } })
+    .then((results) => results)
+    .catch((err) => process.exit(1));
+
 
 module.exports = {
 
-  SingleQuery: function (req, reply) {
-    randomWorldPromise().then(function (world) {
+  SingleQuery: (req, reply) => {
+    randomWorldPromise().then((world) => {
       reply(world)
         .header('Server', 'hapi');
     })
   },
 
-  MultipleQueries: function (req, reply) {
-    var queries = h.getQueries(req);
-    var worldPromises = [];
+  MultipleQueries: (req, reply) => {
+    const queries = h.getQueries(req);
+    const worldPromises = [];
 
-    for (var i = 0; i < queries; i++) {
+    for (let i = 0; i < queries; i++) {
       worldPromises.push(randomWorldPromise());
     }
 
-    Promise.all(worldPromises).then(function (worlds) {
-      reply(worlds)
-        .header('Server', 'hapi');
-    });
+    Promise.all(worldPromises).then((worlds) =>
+      reply(worlds).header('Server', 'hapi'));
   },
 
-  Fortunes: function (req, reply) {
-    Fortunes.findAll().then(function (fortunes) {
+  Fortunes: (req, reply) => {
+    Fortunes.findAll().then((fortunes) => {
       fortunes.push(h.ADDITIONAL_FORTUNE);
-      fortunes.sort(function (a, b) {
-        return a.message.localeCompare(b.message);
-      });
+      fortunes.sort((a, b) => a.message.localeCompare(b.message));
 
-      reply.view('fortunes', {
-        fortunes: fortunes
-      })
+      reply.view('fortunes', { fortunes })
         .header('Content-Type', 'text/html')
         .header('Server', 'hapi');
-    }).catch(function (err) {
-      process.exit(1);
-    });
+    }).catch((err) => process.exit(1));
   },
 
-  Updates: function (req, reply) {
-    var queries = h.getQueries(req);
-    var worldPromises = [];
+  Updates: (req, reply) => {
+    const queries = h.getQueries(req);
+    const worldPromises = [];
 
-    for (var i = 0; i < queries; i++) {
+    for (let i = 0; i < queries; i++) {
       worldPromises.push(randomWorldPromise());
     }
 
-    var worldUpdate = function (world) {
+    const worldUpdate = (world) => {
       world.randomNumber = h.randomTfbNumber();
 
       return Worlds.update(
           { randomNumber: world.randomNumber },
           { where: { id: world.id } }
         )
-        .then(function (results) {
-          return world;
-        })
-        .catch(function (err) {
-          process.exit(1);
-        });
-    }
+        .then((results) => world)
+        .catch((err) => process.exit(1));
+    };
 
     Promise
       .all(worldPromises)
-      .map(function (world) {
-        return worldUpdate(world);
-      })
-      .then(function (updated) {
-        reply(updated)
-          .header('Server', 'hapi')
-      })
-      .catch(function (e) {
-        process.exit(1);
-      });
+      .map((world) => worldUpdate(world))
+      .then((updated) => reply(updated).header('Server', 'hapi'))
+      .catch((e) => process.exit(1));
   }
-}
+};

+ 10 - 12
frameworks/JavaScript/hapi/helper.js

@@ -1,24 +1,22 @@
-var Handlebars = require('handlebars');
+const Handlebars = require('handlebars');
 
-var GREETING = "Hello, World";
-var HELLO_OBJ = { message: GREETING }
+const GREETING = "Hello, World";
+const HELLO_OBJ = { message: GREETING };
 
 module.exports = {
-  randomTfbNumber: function() {
-    return Math.floor(Math.random() * 10000) + 1;
-  },
+  randomTfbNumber: () => Math.floor(Math.random() * 10000) + 1,
 
-  fillArray: function(value, len) {
-    var filled = [];
+  fillArray: (value, len) => {
+    const filled = [];
 
-    for (var i = 0; i < len; i++) {
+    for (let i = 0; i < len; i++) {
       filled.push(value);
     }
     return filled;
   },
 
-  getQueries: function(req) {
-    var queries = ~~(req.query.queries) || 1;
+  getQueries: (req) => {
+    let queries = ~~(req.query.queries) || 1;
     queries = Math.min(Math.max(queries, 1), 500);
     return queries;
   },
@@ -28,4 +26,4 @@ module.exports = {
     message: 'Additional fortune added at request time.'
   }
 
-}
+};

+ 9 - 11
frameworks/JavaScript/hapi/package.json

@@ -3,17 +3,15 @@
   "version": "0.0.1",
   "private": true,
   "dependencies": {
-    "async": "1.5.2",
-    "bluebird": "^2.9.27",
-    "handlebars": "4.0.5",
-    "hapi": "13.5.0",
+    "async": "2.1.5",
+    "bluebird": "3.4.7",
+    "handlebars": "4.0.6",
+    "hapi": "16.1.0",
     "vision":"4.1.0",
-    "hiredis": "^0.5.0",
-    "mongoose": "4.5.3",
-    "mysql": "2.11.1",
-    "pg": "^6.0.2",
-    "pg-hstore": "^2.3.2",
-    "redis": "^2.6.2",
-    "sequelize": "3.1.1"
+    "mongoose": "4.8.4",
+    "mysql": "2.13.0",
+    "pg": "6.1.2",
+    "pg-hstore": "2.3.2",
+    "sequelize": "3.30.2"
   }
 }

+ 2 - 0
frameworks/JavaScript/hapi/source_code

@@ -1,4 +1,6 @@
 ./hapi/app.js
 ./hapi/package.json
+./hapi/helper.js
+./hapi/create-server.js
 ./hapi/views/
 ./hapi/views/fortunes.handlebars

+ 5 - 0
frameworks/JavaScript/koa/README.md

@@ -0,0 +1,5 @@
+# Koa Benchmarking Test
+
+This is the Koa portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
+
+Information about Koa can be found at https://github.com/koajs/koa

+ 32 - 37
frameworks/JavaScript/koa/app.js

@@ -1,31 +1,30 @@
-var cluster = require('cluster')
-  , numCPUs = require('os').cpus().length;
+const cluster = require('cluster'),
+  numCPUs = require('os').cpus().length;
 
 // Koa Deps
-var koa = require('koa')
-  , route = require('koa-route')
-  , handlebars = require('koa-handlebars')
-  , bodyParser = require('koa-bodyparser')
-  , override = require('koa-override');
+const koa = require('koa'),
+  route = require('koa-route'),
+  handlebars = require('koa-handlebars'),
+  bodyParser = require('koa-bodyparser'),
+  override = require('koa-override');
 
 // Monk MongoDB Driver Deps
-var monk = require('monk')
-  , wrap = require('co-monk')
-  , db = monk('mongodb://localhost/hello_world')
-  , worlds = wrap(db.get('world'))
-  , fortunes = wrap(db.get('fortune'));
+const monk = require('monk'),
+  wrap = require('co-monk'),
+  db = monk('mongodb://TFB-database/hello_world'),
+  worlds = wrap(db.get('world')),
+  fortunes = wrap(db.get('fortune'));
 
 if (cluster.isMaster) {
   // Fork workers.
-  for (var i = 0; i < numCPUs; i++) {
+  for (let i = 0; i < numCPUs; i++) {
     cluster.fork();
   }
 
-  cluster.on('exit', function(worker, code, signal) {
-    console.log('worker ' + worker.process.pid + ' died');
-  });
+  cluster.on('exit', (worker, code, signal) =>
+    console.log('worker ' + worker.process.pid + ' died'));
 } else {
-  var app = module.exports = koa();
+  const app = module.exports = koa();
   app.use(bodyParser());
   app.use(override());
   app.use(handlebars({
@@ -42,25 +41,23 @@ if (cluster.isMaster) {
   app.use(route.get('/plaintext', textHandler));
 
   // Helpers
-  function getRandomNumber() {
-    return Math.floor(Math.random()*10000) + 1;
-  };
+  const getRandomNumber = () => ~~(Math.random()*10000) + 1;
 
-  function validateParam(param) {
-    var numOfQueries = isNaN(param) ? 1 : param;
+  const validateParam = (param) => {
+    let numOfQueries = isNaN(param) ? 1 : param;
     if (numOfQueries > 500) {
       numOfQueries = 500;
     } else if (numOfQueries < 1) {
       numOfQueries = 1;
     }
     return numOfQueries;
-  }
+  };
 
   // Query Helpers
   function *worldUpdateQuery() {
-    var randomId = getRandomNumber();
-    var randomNumber = getRandomNumber();
-    var result = yield worlds.update(
+    const randomId = getRandomNumber();
+    const randomNumber = getRandomNumber();
+    const result = yield worlds.update(
       {id: randomId}, 
       {$set: {randomNumber: randomNumber}}
     );
@@ -93,9 +90,9 @@ if (cluster.isMaster) {
 
   function *queriesHandler() {
     this.set('Server', 'Koa');
-    var numOfQueries = validateParam(this.query.queries);
-    var queries = [];
-    for (var i = 0; i < numOfQueries; i++) {
+    let numOfQueries = validateParam(this.query.queries);
+    const queries = [];
+    for (let i = 0; i < numOfQueries; i++) {
       queries.push(worldQuery);
     }
     this.body = yield queries;
@@ -103,22 +100,20 @@ if (cluster.isMaster) {
 
   function *fortuneHandler() {
     this.set('Server', 'Koa');
-    var fortunes = yield fortunesQuery;
+    const fortunes = yield fortunesQuery;
     fortunes.push({
       id: 0,
       message: 'Additional fortune added at request time.'
     });
-    fortunes.sort(function(a, b) {
-      return a.message < b.message ? -1 : 1;
-    });
+    fortunes.sort((a, b) => (a.message < b.message) ? -1 : 1);
     yield this.render("fortunes", {fortunes: fortunes});
   }
 
   function *updateHandler() {
     this.set('Server', 'Koa');
-    var numOfUpdates = validateParam(this.query.queries);
-    var queries = [];
-    for (var i = 0; i < numOfUpdates; i++) {
+    const numOfUpdates = validateParam(this.query.queries);
+    const queries = [];
+    for (let i = 0; i < numOfUpdates; i++) {
       queries.push(worldUpdateQuery);
     }
     this.body = yield queries;
@@ -130,4 +125,4 @@ if (cluster.isMaster) {
   }
 
   app.listen(8080);
-}
+}

+ 4 - 4
frameworks/JavaScript/koa/package.json

@@ -6,10 +6,10 @@
   "private": true,
   "dependencies": {
     "co-monk": "1.0.0",
-    "koa": "1.2.0",
-    "koa-bodyparser": "2.0.0",
-    "koa-handlebars": "0.5.7",
-    "koa-mongo": "0.5.0",
+    "koa": "1.2.5",
+    "koa-bodyparser": "2.3.0",
+    "koa-handlebars": "1.0.0",
+    "koa-mongo": "0.7.0",
     "koa-override": "1.0.0",
     "koa-route": "2.4.2",
     "monk": "3.0.6"

+ 3 - 0
frameworks/JavaScript/koa/source_code

@@ -0,0 +1,3 @@
+./koa/app.js
+./koa/package.json
+./koa/views/fortunes.hbs

+ 6 - 9
frameworks/JavaScript/nodejs/README.md

@@ -9,18 +9,15 @@ The logic for the test cases live in these.
 * [Sequelize (MySQL)](handlers/sequelize.js)
 * [MongoDB raw](handlers/mongodb-raw.js)
 * [Mongoose (MySQL)](handlers/mongoose.js)
-* [Hiredis (Redis)](handlers/redis)
 
 ## Infrastructure Software Versions
 The tests were run with:
-* [Node.js v6.3.0](http://nodejs.org/)
-
-* [Node MySQL 2.11.1](https://github.com/felixge/node-mysql/)
-* [Sequelize 3.6.0](https://github.com/sequelize/sequelize)
-* [Node MongoDB Driver 2.1.1](https://github.com/mongodb/node-mongodb-native)
-* [Mongoose 4.5.3](http://mongoosejs.com/)
-* [Node Redis 2.6.2](https://github.com/mranney/node_redis)
-* [Hiredis 0.4.0 (C lib for Redis)](https://github.com/redis/hiredis)
+* [Node.js v7.5.0](http://nodejs.org/)
+
+* [Node MySQL 2.13.0](https://github.com/felixge/node-mysql/)
+* [Sequelize 3.30.0](https://github.com/sequelize/sequelize)
+* [Node MongoDB Driver 2.2.24](https://github.com/mongodb/node-mongodb-native)
+* [Mongoose 4.8.4](http://mongoosejs.com/)
 
 ## Test URLs
 

+ 4 - 4
frameworks/JavaScript/nodejs/app.js

@@ -1,13 +1,13 @@
-var cluster = require('cluster');
-var numCPUs = require('os').cpus().length;
+const cluster = require('cluster');
+const numCPUs = require('os').cpus().length;
 
 if (cluster.isMaster) {
   // Fork workers.
-  for (var i = 0; i < numCPUs; i++) {
+  for (let i = 0; i < numCPUs; i++) {
     cluster.fork();
   }
 
-  cluster.on('exit', function (worker, code, signal) {
+  cluster.on('exit', (worker, code, signal) => {
   	console.log([
   	  'A process exit was triggered, most likely due to a failed database action',
   	  'NodeJS test server shutting down now'].join('\n'));

+ 10 - 12
frameworks/JavaScript/nodejs/create-server.js

@@ -1,25 +1,25 @@
 // Forked workers will run this code when found to not be
 // the master of the cluster.
 
-var http = require('http');
-var parseurl = require('parseurl'); // faster than native nodejs url package
+const http = require('http');
+const parseurl = require('parseurl'); // faster than native nodejs url package
 
 // Initialize routes & their handlers (once)
-var routing = require('./routing')
-var basicHandler = routing.BasicHandler;
-var queryHandler = routing.QueryHandler;
-var routeNotImplemented = require('./helper').responses.routeNotImplemented;
+const routing = require('./routing');
+const basicHandler = routing.BasicHandler;
+const queryHandler = routing.QueryHandler;
+const routeNotImplemented = require('./helper').responses.routeNotImplemented;
 
 module.exports = http.createServer(function (req, res) {
-  var url = parseurl(req);
-  var route = url.pathname;
+  const url = parseurl(req);
+  const route = url.pathname;
 
   // Routes that do no require a `queries` parameter
   if (basicHandler.has(route)) {
     return basicHandler.handle(route, req, res);
   } else {
     // naive: only works if there is one query param, as is the case in TFB
-    var queries = url.query && url.query.split('=')[1];
+    let queries = url.query && url.query.split('=')[1];
     queries = ~~(queries) || 1;
     queries = Math.min(Math.max(queries, 1), 500);
 
@@ -30,6 +30,4 @@ module.exports = http.createServer(function (req, res) {
     }
   }
 
-}).listen(8080, function() {
-  console.log("NodeJS worker listening on port 8080");
-});
+}).listen(8080, () => console.log("NodeJS worker listening on port 8080"));

+ 3 - 3
frameworks/JavaScript/nodejs/handlers/mongodb-raw.js

@@ -20,13 +20,13 @@ const mongodbRandomWorld = (callback) => {
     world._id = undefined; // remove _id from query response
     callback(err, world);
   });
-}
+};
 
 const mongodbGetAllFortunes = (callback) => {
   collections.Fortune.find().toArray((err, fortunes) => {
     callback(err, fortunes);
   })
-}
+};
 
 const mongodbDriverUpdateQuery = (callback) => {
   collections.World.findOne({id: h.randomTfbNumber()}, (err, world) => {
@@ -35,7 +35,7 @@ const mongodbDriverUpdateQuery = (callback) => {
       callback(err, { id: world.id, randomnumber: world.randomnumber } );
     });
   });
-}
+};
 
 
 module.exports = {

+ 4 - 4
frameworks/JavaScript/nodejs/handlers/mongoose.js

@@ -1,7 +1,7 @@
 const h = require('../helper');
 const async = require('async');
 const Mongoose = require('mongoose');
-const connection = Mongoose.connect('mongodb://TFB-database/hello_world')
+const connection = Mongoose.connect('mongodb://TFB-database/hello_world');
 
 // Mongoose Setup
 const WorldSchema = new Mongoose.Schema({
@@ -24,12 +24,12 @@ const mongooseRandomWorld = (callback) => {
   Worlds.findOne({
     id: h.randomTfbNumber()
   }).exec(callback);
-}
+};
 
 const mongooseGetAllFortunes = (callback) => {
   Fortunes.find({})
     .exec(callback);
-}
+};
 
 module.exports = {
 
@@ -43,7 +43,7 @@ module.exports = {
   },
 
   MultipleQueries: (queries, req, res) => {
-    const queryFunctions = h.fillArray(mongooseRandomWorld, queries)
+    const queryFunctions = h.fillArray(mongooseRandomWorld, queries);
 
     async.parallel(queryFunctions, (err, results) => {
       if (err) { return process.exit(1); }

+ 7 - 12
frameworks/JavaScript/nodejs/handlers/mysql-raw.js

@@ -19,21 +19,19 @@ const queries = {
       " WHERE id = ", rows[0]['id']
     ].join('');
   }
-}
+};
 
-const mysqlRandomWorld = (callback) => {
+const mysqlRandomWorld = (callback) =>
   connection.query(queries.RANDOM_WORLD, (err, rows, fields) => {
     callback(err, rows[0]);
   });
-}
 
-const mysqlGetAllFortunes = (callback) => {
+const mysqlGetAllFortunes = (callback) =>
   connection.query(queries.ALL_FORTUNES, (err, rows, fields) => {
     callback(err, rows);
-  })
-}
+  });
 
-const mysqlUpdateQuery = (callback) => {
+const mysqlUpdateQuery = (callback) =>
   connection.query(queries.RANDOM_WORLD, (err, rows, fields) => {
     if (err) { return process.exit(1); }
 
@@ -44,7 +42,6 @@ const mysqlUpdateQuery = (callback) => {
       callback(err, rows[0]);
     });
   });
-}
 
 module.exports = {
 
@@ -73,9 +70,7 @@ module.exports = {
       if (err) { return process.exit(1); }
 
       fortunes.push(h.ADDITIONAL_FORTUNE);
-      fortunes.sort((a, b) => {
-        return a.message.localeCompare(b.message);
-      })
+      fortunes.sort((a, b) => a.message.localeCompare(b.message));
       h.addTfbHeaders(res, 'html');
       res.end(h.fortunesTemplate({
         fortunes: fortunes
@@ -94,4 +89,4 @@ module.exports = {
     });
   } 
 
-}
+};

+ 11 - 6
frameworks/JavaScript/nodejs/handlers/sequelize-postgres.js

@@ -1,5 +1,4 @@
 const h = require('../helper');
-const Promise = require('bluebird');
 
 const Sequelize = require('sequelize');
 const sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
@@ -9,7 +8,10 @@ const sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpa
 });
 
 const Worlds = sequelize.define('World', {
-  id:           { type: 'Sequelize.INTEGER' },
+  id: {
+    type: 'Sequelize.INTEGER',
+    primaryKey: true
+  },
   randomnumber: { type: 'Sequelize.INTEGER' }
 }, {
   timestamps: false,
@@ -17,7 +19,10 @@ const Worlds = sequelize.define('World', {
 });
 
 const Fortunes = sequelize.define('Fortune', {
-  id:      { type: 'Sequelize.INTEGER' },
+  id: {
+    type: 'Sequelize.INTEGER',
+    primaryKey: true
+  },
   message: { type: 'Sequelize.STRING' }
 }, {
   timestamps: false,
@@ -30,7 +35,7 @@ const randomWorldPromise = () => {
   }).then((results) => {
     return results;
   }).catch((err) => process.exit(1));
-}
+};
 
 module.exports = {
 
@@ -84,7 +89,7 @@ module.exports = {
       }).then((results) => {
         return world;
       }).catch((err) => process.exit(1));
-    }
+    };
 
     Promise.all(worldPromises).then((worlds) => {
       const updates = worlds.map((e) => worldUpdate(e));
@@ -96,4 +101,4 @@ module.exports = {
     });
   }
 
-}
+};

+ 11 - 6
frameworks/JavaScript/nodejs/handlers/sequelize.js

@@ -1,5 +1,4 @@
 const h = require('../helper');
-const Promise = require('bluebird');
 
 const Sequelize = require('sequelize');
 const sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
@@ -9,7 +8,10 @@ const sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpa
 });
 
 const Worlds = sequelize.define('World', {
-  id:           { type: 'Sequelize.INTEGER' },
+  id: {
+    type: 'Sequelize.INTEGER',
+    primaryKey: true
+  },
   randomNumber: { type: 'Sequelize.INTEGER' }
 }, {
   timestamps: false,
@@ -17,7 +19,10 @@ const Worlds = sequelize.define('World', {
 });
 
 const Fortunes = sequelize.define('Fortune', {
-  id:      { type: 'Sequelize.INTEGER' },
+  id: {
+    type: 'Sequelize.INTEGER',
+    primaryKey: true
+  },
   message: { type: 'Sequelize.STRING' }
 }, {
   timestamps: false,
@@ -32,7 +37,7 @@ const randomWorldPromise = () => {
   }).catch((err) => {
     process.exit(1);
   });
-}
+};
 
 module.exports = {
 
@@ -93,7 +98,7 @@ module.exports = {
       }).catch((err) => {
         process.exit(1);
       });
-    }
+    };
 
     Promise.all(worldPromises).then((worlds) => {
       const updates = worlds.map((e) => worldUpdate(e));
@@ -105,4 +110,4 @@ module.exports = {
     });
   }
 
-}
+};

+ 20 - 26
frameworks/JavaScript/nodejs/helper.js

@@ -1,8 +1,8 @@
-var Handlebars = require('handlebars');
+const Handlebars = require('handlebars');
 
-var GREETING = "Hello, World!";
+const GREETING = "Hello, World!";
 
-var self = module.exports = {
+const self = module.exports = {
 
   ADDITIONAL_FORTUNE: {
     id: 0,
@@ -30,50 +30,44 @@ var self = module.exports = {
     "</html>"
   ].join('')),
 
-  randomTfbNumber: function () {
-    return Math.floor(Math.random() * 10000) + 1;
-  },
+  randomTfbNumber: () => Math.floor(Math.random() * 10000) + 1,
 
-  fillArray: function(value, len) {
-    var arr = [];
-    for (var i = 0; i < len; i++) {
+  fillArray: (value, len) => {
+    const arr = [];
+    for (let i = 0; i < len; i++) {
       arr.push(value);
     }
     return arr;
   },
 
-  addTfbHeaders: function (res, headerType) {
-    var headers = {
-      'Server': 'Node'
-    }
-
-    if (headerType === 'plain') {
-      headers['Content-Type'] = 'text/plain; charset=UTF-8';
-    } else if (headerType === 'json') {
-      headers['Content-Type'] = 'application/json';
-    } else if (headerType === 'html') {
-      headers['Content-Type'] = 'text/html; charset=UTF-8';
-    }
+  addTfbHeaders: (res, headerType) => {
+    const headers = { 'Server': 'Node' };
+    const headerTypes = {
+      plain: 'text/plain',
+      json:  'application/json',
+      html:  'text/html; charset=UTF-8'
+    };
+    headers['Content-Type'] = headerTypes[headerType];
 
     res.writeHead(200, headers);
   },
 
   responses: {
 
-    jsonSerialization: function (req, res) {
-      var HELLO_OBJ = { message: GREETING }
+    jsonSerialization: (req, res) => {
+      const HELLO_OBJ = { message: GREETING };
       self.addTfbHeaders(res, 'json');
       res.end(JSON.stringify(HELLO_OBJ));
     },
 
-    plaintext: function (req, res) {
+    plaintext: (req, res) => {
       self.addTfbHeaders(res, 'plain');
       res.end(GREETING);
     },
 
-    routeNotImplemented: function (req, res) {
+    routeNotImplemented: (req, res) => {
       res.writeHead(501, {'Content-Type': 'text/plain; charset=UTF-8'});
-      var reason = { reason: "`" + req.url + "` is not an implemented route" };
+      const reason = { reason: "`" + req.url + "` is not an implemented route" };
       res.end(JSON.stringify(reason));
     }
 

+ 7 - 8
frameworks/JavaScript/nodejs/package.json

@@ -3,16 +3,15 @@
   "version": "0.0.1",
   "private": true,
   "dependencies": {
-    "async": "1.5.2",
-    "bluebird": "3.4.1",
-    "handlebars": "4.0.5",
-    "mongodb": "2.1.1",
-    "mongoose": "4.5.3",
-    "mysql": "2.11.1",
+    "async": "2.1.5",
+    "handlebars": "4.0.6",
+    "mongodb": "2.2.24",
+    "mongoose": "4.8.4",
+    "mysql": "2.13.0",
     "parseurl": "1.3.1",
-    "pg": "6.0.2",
+    "pg": "6.1.2",
     "pg-hstore": "2.3.2",
-    "sequelize": "3.6.0"
+    "sequelize": "3.30.2"
   },
   "main": "app.js"
 }

+ 19 - 26
frameworks/JavaScript/nodejs/routing.js

@@ -1,16 +1,16 @@
 // Intialized database connections, one for each db config
 // * Mongoose is a popular Node/MongoDB driver
 // * Sequelize is a popular Node/SQL driver
-var MongodbRawHandler = require('./handlers/mongodb-raw');
-var MySQLRawHandler = require('./handlers/mysql-raw');
-var MongooseHandler = require('./handlers/mongoose');
-var SequelizeHandler = require('./handlers/sequelize');
-var SequelizePgHandler = require('./handlers/sequelize-postgres');
+const MongodbRawHandler = require('./handlers/mongodb-raw');
+const MySQLRawHandler = require('./handlers/mysql-raw');
+const MongooseHandler = require('./handlers/mongoose');
+const SequelizeHandler = require('./handlers/sequelize');
+const SequelizePgHandler = require('./handlers/sequelize-postgres');
 
-var h = require('./helper');
+const h = require('./helper');
 
-module.exports.BasicHandler = (function() {
-  var self = {}
+module.exports.BasicHandler = ((() => {
+  const self = {};
 
   self.routes = {
     '/json':               h.responses.jsonSerialization,
@@ -30,21 +30,17 @@ module.exports.BasicHandler = (function() {
 
     '/sequelize-pg/db':       SequelizePgHandler.SingleQuery,
     '/sequelize-pg/fortunes': SequelizePgHandler.Fortunes
-  }
+  };
 
-  self.has = function(path) {
-    return self.routes[path];
-  }
+  self.has = (path) => self.routes[path];
 
-  self.handle = function(path, req, res) {
-    return self.routes[path](req, res);
-  }
+  self.handle = (path, req, res) => self.routes[path](req, res);
 
   return self;
-}());
+})());
 
-module.exports.QueryHandler = (function () {
-  var self = {}
+module.exports.QueryHandler = ((() => {
+  const self = {};
 
   self.routes = {
     '/mongoose/queries':  MongooseHandler.MultipleQueries,
@@ -61,16 +57,13 @@ module.exports.QueryHandler = (function () {
 
     '/sequelize-pg/queries': SequelizePgHandler.MultipleQueries,
     '/sequelize-pg/updates': SequelizePgHandler.Updates
-  }
+  };
 
-  self.has = function(path) {
-    return self.routes[path];
-  }
+  self.has = (path) => self.routes[path];
 
-  self.handle = function(path, queries, req, res) {
-    return self.routes[path](queries, req, res);
-  }
+  self.handle = (path, queries, req, res) =>
+    self.routes[path](queries, req, res);
 
   return self;
-}());
+})());
 

+ 1 - 1
frameworks/JavaScript/ringojs/README.md

@@ -14,7 +14,7 @@ This is the Ringojs portion of a [benchmarking test suite](../) comparing a vari
 
 The tests were run with:
 
-* [RingoJs v0.9](http://ringojs.org/)
+* [RingoJs v1.1](http://ringojs.org/)
 * [MySQL 5.5.29](https://dev.mysql.com/)
 
 ## Test URLs

+ 9 - 13
frameworks/JavaScript/ringojs/app/models.js

@@ -1,14 +1,10 @@
-var {Store, Cache} = require('ringo-sqlstore');
-
-// DO NOT TOUCH THE FOLLOWING LINE.
-// THIS VARIABLE IS REGEX REPLACED BY setup.py
-var dbHost = 'TFB-database';
+const { Store, Cache } = require('ringo-sqlstore');
 
 // create and configure store
-var connectionPool = module.singleton("connectionPool", function() {
-    var mysqlConnectionProperties = "?jdbcCompliantTruncation=false&elideSetAutoCommits=true&useLocalSessionState=true&cachePrepStmts=true&cacheCallableStmts=true&alwaysSendSetIsolation=false&prepStmtCacheSize=4096&cacheServerConfiguration=true&prepStmtCacheSqlLimit=2048&zeroDateTimeBehavior=convertToNull&traceProtocol=false&useServerPrepStmts&enableQueryTimeouts=false&useUnbufferedIO=false&useReadAheadInput=false&maintainTimeStats=false&cacheRSMetadata=true";
+const connectionPool = module.singleton("connectionPool", function () {
+    const mysqlConnectionProperties = "?jdbcCompliantTruncation=false&elideSetAutoCommits=true&useLocalSessionState=true&cachePrepStmts=true&cacheCallableStmts=true&alwaysSendSetIsolation=false&prepStmtCacheSize=4096&cacheServerConfiguration=true&prepStmtCacheSqlLimit=2048&zeroDateTimeBehavior=convertToNull&traceProtocol=false&useServerPrepStmts&enableQueryTimeouts=false&useUnbufferedIO=false&useReadAheadInput=false&maintainTimeStats=false&cacheRSMetadata=true";
     return Store.initConnectionPool({
-        "url": "jdbc:mysql://" + dbHost + "/hello_world" + mysqlConnectionProperties,
+        "url": "jdbc:mysql://TFB-database/hello_world" + mysqlConnectionProperties,
         "driver": "com.mysql.jdbc.Driver",
         "username": "benchmarkdbuser",
         "password": "benchmarkdbpass",
@@ -16,9 +12,9 @@ var connectionPool = module.singleton("connectionPool", function() {
         "maximumPoolSize": 30
     });
 });
-var store = exports.store = new Store(connectionPool);
-var queryCache = module.singleton("queryCache", function() {
-    return new Cache(10000);
+const store = exports.store = new Store(connectionPool);
+const queryCache = module.singleton("queryCache", function() {
+  return new Cache(10000);
 });
 store.setQueryCache(queryCache);
 
@@ -33,7 +29,7 @@ exports.World = store.defineEntity('World', {
 	}
 });
 
-var Fortune = exports.Fortune = store.defineEntity('Fortune', {
+const Fortune = exports.Fortune = store.defineEntity('Fortune', {
 	table: 'Fortune',
 	properties: {
 		message: 'string'
@@ -41,5 +37,5 @@ var Fortune = exports.Fortune = store.defineEntity('Fortune', {
 });
 
 Fortune.sort = function(a, b) {
- return (a.message < b.message) ? -1 : (a.message > b.message) ? 1 : 0;
+  return (a.message < b.message) ? -1 : (a.message > b.message) ? 1 : 0;
 };

+ 12 - 12
frameworks/JavaScript/ringojs/app/views.js

@@ -1,24 +1,24 @@
-var {Application} = require("stick");
-var fs = require('fs');
-var response = require('ringo/jsgi/response');
-var models = require('./models');
+const {Application} = require("stick");
+const fs = require('fs');
+const response = require('ringo/jsgi/response');
+const models = require('./models');
 
-var {Template} = require('reinhardt/template');
-var fortuneTemplate = module.singleton('fortuneTemplate', function() {
+const { Template } = require('reinhardt/template');
+const fortuneTemplate = module.singleton('fortuneTemplate', function() {
    return new Template(fs.read(module.resolve('../templates/fortunes.reinhardt')));
 });
 
-var app = exports.app = Application();
+const app = exports.app = Application();
 app.configure("params", "route");
 
 app.get('/json', function() {
-   var helloObject = {message: "Hello, World!"};
+   const helloObject = {message: "Hello, World!"};
    return response.json(helloObject);
 });
 
 app.get('/db/:queries?', function(request, queries) {
    queries = parseInt(queries, 10) || 1;
-   var worlds = [];
+   let worlds = [];
    for (let i = 0; i < queries; i++) {
       let randId = ((Math.random() * 10000) | 0) + 1;
       let world = models.store.query('select * from World where id = :id', {id: randId})[0];
@@ -31,7 +31,7 @@ app.get('/db/:queries?', function(request, queries) {
 });
 
 app.get('/fortune', function() {
-   var fortunes = models.store.query('select Fortune.* from Fortune');
+   const fortunes = models.store.query('select Fortune.* from Fortune');
    fortunes.push({
       id: 0,
       message: 'Additional fortune added at request time.'
@@ -51,7 +51,7 @@ app.get('/updates/:queries?', function(request, queries) {
    } else if (queries > 500) {
       queries = 500;
    }
-   var worlds = [];
+   const worlds = [];
    for (let i = 0; i < queries; i++) {
       let randId = ((Math.random() * 10000) | 0) + 1;
       let world = models.store.query('select * from World where id = :id', {id: randId})[0];
@@ -64,4 +64,4 @@ app.get('/updates/:queries?', function(request, queries) {
       worlds.push({"id": world.id, "randomNumber": world.randomNumber});
    }
    return response.json(worlds);
-});
+});

+ 0 - 1
frameworks/JavaScript/ringojs/benchmark_config.json

@@ -6,7 +6,6 @@
       "json_url": "/json",
       "db_url": "/db",
       "query_url": "/db?queries=",
-      "fortune_url": "/fortune",
       "plaintext_url": "/plaintext",
       "update_url": "/updates?queries=",
       "port": 8080,

+ 2 - 2
frameworks/JavaScript/ringojs/ringo-convenient-main.js

@@ -1,6 +1,6 @@
-var {Application} = require("stick");
+const { Application } = require("stick");
 
-var app = exports.app = Application();
+const app = exports.app = Application();
 app.configure("mount");
 app.mount("/", require("./app/views"));
 

+ 52 - 77
frameworks/JavaScript/ringojs/ringo-main.js

@@ -1,101 +1,76 @@
-var sql = require('sql-ringojs-client');
-var mustache = require('ringo/mustache');
-
-// DO NOT TOUCH THE FOLLOWING LINE.
-// THIS VARIABLE IS REGEX REPLACED BY setup.py
-var dbHost = 'TFB-database';
-var mongodbUri = 'mongodb://TFB-database/hello_world';
-
-var sortFortunes = function(a, b) {
- return (a.message < b.message) ? -1 : (a.message > b.message) ? 1 : 0;
-};
-
-var fortuneTemplate = require('fs').read(module.resolve('./templates/fortune.mustache'));
+const sql = require('sql-ringojs-client');
+const fs = require('fs');
 
 exports.app = function(req) {
-   var path = req.pathInfo;
+   const path = req.pathInfo;
+   let connection, body;
+
    if (path === '/json') {
-      var helloObject = {message: "Hello, World!"};
+      const helloObject = { message: "Hello, World!" };
       // JSON Response Test
       return {
          status: 200,
-         headers: {"Content-Type": "application/json; charset=UTF-8"},
+         headers: { "Content-Type": "application/json" },
          body: [JSON.stringify(helloObject)]
       }
-   } else if (path === '/db') {
-      var queryCount = req.env.servletRequest.getParameter('queries');
-      try {
-         var connection = datasource.getConnection();
-         if (queryCount === null) {
-            var randId = ((Math.random() * 10000) | 0) + 1
-            var world = sql.query(connection, 'select * from World where World.id = ' + randId)[0];
-            return {
-               status: 200,
-               headers: {"Content-Type": "application/json; charset=UTF-8"},
-               body: [JSON.stringify(world)]
-            }
-         } else {
-            queryCount = parseInt(queryCount, 10);
-            var body = [];
-            var randId, world;
-            for (var i = 0; i < queryCount; i++) {
-               randId = ((Math.random() * 10000) | 0) + 1;
-               world = sql.query(connection, 'select * from World where World.id = ' + randId)[0];
-               body.push(world);
-            }
-            return {
-               status: 200,
-               headers: {"Content-Type": "application/json; charset=UTF-8"},
-               body: [JSON.stringify(body)]
-            }
+   }
+
+   if (path === '/db') {
+     let queryCount = req.env.servletRequest.getParameter('queries');
+     try {
+       connection = datasource.getConnection();
+       let randId, world;
+       if (queryCount === null) {
+         randId = ((Math.random() * 10000) | 0) + 1;
+         world = sql.query(connection, 'select * from World where World.id = ' + randId)[0];
+         return {
+           status: 200,
+           headers: { "Content-Type": "application/json" },
+           body: [JSON.stringify(world)]
          }
-      } catch (e) {
-         connection.close();
-         connection = null;
-      } finally {
-         if (connection !== null) {
-            connection.close();
+       } else {
+         queryCount = parseInt(queryCount, 10);
+         body = [];
+         for (let i = 0; i < queryCount; i++) {
+           randId = ((Math.random() * 10000) | 0) + 1;
+           world = sql.query(connection, 'select * from World where World.id = ' + randId)[0];
+           body.push(world);
          }
-      }
-   } else if (path === '/fortune') {
-      try {
-         var connection = datasource.getConnection();
-         var fortunes = sql.query(connection, 'select * from Fortune');
-         fortunes.push({
-            id: 0,
-            message: 'Additional fortune added at request time.'
-         });
-         fortunes.sort(sortFortunes);
          return {
-            status: 200,
-            headers: {"Content-Type": "text/html; charset=UTF-8"},
-            body: [mustache.to_html(fortuneTemplate, {fortunes: fortunes})]
+           status: 200,
+           headers: {"Content-Type": "application/json"},
+           body: [JSON.stringify(body)]
          }
-      } catch (e) {
+       }
+     } catch (e) {
+       connection.close();
+       connection = null;
+     } finally {
+       if (connection !== null) {
          connection.close();
-         connection = null;
-      } finally {
-         if (connection !== null) {
-            connection.close();
-         }
-      }
-   } else if (path === '/plaintext') {
+       }
+     }
+   }
+
+   if (path === '/plaintext') {
       return {
         status: 200,
         headers: {"Content-Type": 'text/plain'},
         body: ['Hello, World!']
       };
-   } else if (path === '/updates') {
-      var queryCount = parseInt(req.env.servletRequest.getParameter('queries'), 10);
+   }
+
+   if (path === '/updates') {
+      let queryCount = parseInt(req.env.servletRequest.getParameter('queries'), 10);
       if (isNaN(queryCount) || queryCount < 1) {
          queryCount = 1;
       } else if (queryCount > 500) {
          queryCount = 500;
       }
       try {
-         var connection = datasource.getConnection();
-         var body = [];
-         for (var i = 0; i < queryCount; i++) {
+         connection = datasource.getConnection();
+         body = [];
+         for (let i = 0; i < queryCount; i++) {
             let randId = ((Math.random() * 10000) | 0) + 1;
             world = sql.query(connection, 'select * from World where World.id = ' + randId)[0];
             world.randomNumber = ((Math.random() * 10000) | 0) + 1;
@@ -119,9 +94,9 @@ exports.app = function(req) {
 };
 
 
-var datasource = module.singleton('pooling-datasource', function() {
-  var mysqlConnectionProperties = "?jdbcCompliantTruncation=false&elideSetAutoCommits=true&useLocalSessionState=true&cachePrepStmts=true&cacheCallableStmts=true&alwaysSendSetIsolation=false&prepStmtCacheSize=4096&cacheServerConfiguration=true&prepStmtCacheSqlLimit=2048&zeroDateTimeBehavior=convertToNull&traceProtocol=false&useServerPrepStmts&enableQueryTimeouts=false&useUnbufferedIO=false&useReadAheadInput=false&maintainTimeStats=false&cacheRSMetadata=true";
-  return sql.connect("jdbc:mysql://" + dbHost + "/hello_world" + mysqlConnectionProperties, 'benchmarkdbuser', 'benchmarkdbpass');
+const datasource = module.singleton('pooling-datasource', function() {
+  const mysqlConnectionProperties = "?jdbcCompliantTruncation=false&elideSetAutoCommits=true&useLocalSessionState=true&cachePrepStmts=true&cacheCallableStmts=true&alwaysSendSetIsolation=false&prepStmtCacheSize=4096&cacheServerConfiguration=true&prepStmtCacheSqlLimit=2048&zeroDateTimeBehavior=convertToNull&traceProtocol=false&useServerPrepStmts&enableQueryTimeouts=false&useUnbufferedIO=false&useReadAheadInput=false&maintainTimeStats=false&cacheRSMetadata=true";
+  return sql.connect("jdbc:mysql://TFB-database/hello_world" + mysqlConnectionProperties, 'benchmarkdbuser', 'benchmarkdbpass');
 });
 
 if (require.main == module) {

+ 1 - 1
frameworks/JavaScript/ringojs/setup.sh

@@ -4,7 +4,7 @@ fw_depends mysql java ringojs
 
 rm -rf $RINGOJS_HOME/packages/*
 ringo-admin install oberhamsi/sql-ringojs-client
+ringo-admin install orfon/reinhardt
 (cd $RINGOJS_HOME/packages/sql-ringojs-client/jars && curl -s -o mysql.jar https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.39/mysql-connector-java-5.1.39.jar)
 
 ringo --production -J-server -J-Xmx1g -J-Xms1g ringo-main.js &
-

+ 2 - 0
frameworks/JavaScript/ringojs/source_code

@@ -1,3 +1,5 @@
 ./ringojs/ringo-main.js
 ./ringojs/templates/
 ./ringojs/templates/fortune.mustache
+./ringojs/app/models.js
+./ringojs/app/views.js

+ 0 - 20
frameworks/JavaScript/ringojs/templates/fortune.mustache

@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>Fortunes</title>
-</head>
-<body>
-<table>
-<tr>
-<th>id</th>
-<th>message</th>
-</tr>
-{{#fortunes}}
-<tr>
-<td>{{id}}</td>
-<td>{{message}}</td>
-</tr>
-{{/fortunes}}
-</table>
-</body>
-</html>

+ 2 - 2
toolset/setup/linux/frameworks/ringojs.sh

@@ -2,11 +2,11 @@
 
 fw_installed ringojs && return 0
 
-VERSION="0.11"
+VERSION="1.1.0"
 RINGOJS=$IROOT/ringojs_$VERSION
 RINGOJS_HOME=$IROOT/ringojs-$VERSION
 
-fw_get -O https://github.com/ringo/ringojs/releases/download/v$VERSION.0/ringojs-$VERSION.tar.gz
+fw_get -O https://github.com/ringo/ringojs/releases/download/v$VERSION/ringojs-$VERSION.tar.gz
 fw_untar ringojs-$VERSION.tar.gz
 
 echo "export RINGOJS_HOME=${RINGOJS_HOME}" > $IROOT/ringojs.installed

+ 1 - 1
toolset/setup/linux/languages/nodejs.sh → toolset/setup/linux/webservers/nodejs.sh

@@ -2,7 +2,7 @@
 
 fw_installed node && return 0
 
-VERSION="6.3.0"
+VERSION="7.5.0"
 
 fw_get -O http://nodejs.org/dist/v$VERSION/node-v$VERSION-linux-x64.tar.gz
 fw_untar node-v$VERSION-linux-x64.tar.gz