Skip to content

Commit 8118829

Browse files
committed
initial working acceptance test
1 parent 297e1db commit 8118829

File tree

19 files changed

+528
-30
lines changed

19 files changed

+528
-30
lines changed

.jshintrc

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
{
2+
// Settings
3+
"passfail" : false, // Stop on first error.
4+
"maxerr" : 500, // Maximum errors before stopping.
5+
"multistr" : true,
6+
7+
8+
// Predefined globals whom JSHint will ignore.
9+
"node" : false,
10+
11+
"predef" : [ // Extra globals.
12+
"__dirname",
13+
"Buffer",
14+
"event",
15+
"exports",
16+
"global",
17+
"main",
18+
"module",
19+
"process",
20+
"require",
21+
22+
"after",
23+
"afterEach",
24+
"before",
25+
"beforeEach",
26+
"context",
27+
"describe",
28+
"it"
29+
],
30+
31+
// Development.
32+
"debug" : false, // Allow debugger statements e.g. browser breakpoints.
33+
"devel" : true, // Allow development statements e.g. `console.log();`.
34+
35+
36+
// EcmaScript 5.
37+
"es5" : true, // Allow EcmaScript 5 syntax.
38+
"strict" : false, // Require `use strict` pragma in every file.
39+
"globalstrict" : false, // Allow global "use strict" (also enables 'strict').
40+
41+
42+
"asi" : false, // Tolerate Automatic Semicolon Insertion (no semicolons).
43+
"laxbreak" : false, // Tolerate unsafe line breaks e.g. `return [\n] x` without semicolons.
44+
"bitwise" : true, // Prohibit bitwise operators (&, |, ^, etc.).
45+
"boss" : false, // Tolerate assignments inside if, for & while. Usually conditions & loops are for comparison, not assignments.
46+
"curly" : true, // Require {} for every new block or scope.
47+
"eqeqeq" : false, // Require triple equals i.e. `===`.
48+
"eqnull" : false, // Tolerate use of `== null`.
49+
"evil" : false, // Tolerate use of `eval`.
50+
"expr" : false, // Tolerate `ExpressionStatement` as Programs.
51+
"forin" : false, // Tolerate `for in` loops without `hasOwnProperty`.
52+
"immed" : true, // Require immediate invocations to be wrapped in parens e.g. `( function(){}() );`
53+
"latedef" : true, // Prohibit variable use before definition.
54+
"loopfunc" : true, // Allow functions to be defined within loops.
55+
//"maxparams" : 4,
56+
//"maxdepth" : 5,
57+
//"maxcomplexity" : 10,
58+
"noarg" : true, // Prohibit use of `arguments.caller` and `arguments.callee`.
59+
"regexp" : false, // Prohibit `.` and `[^...]` in regular expressions.
60+
"regexdash" : false, // Tolerate unescaped last dash i.e. `[-...]`.
61+
"scripturl" : true, // Tolerate script-targeted URLs.
62+
"shadow" : false, // Allows re-define variables later in code e.g. `var x=1; x=2;`.
63+
"supernew" : false, // Tolerate `new function () { ... };` and `new Object;`.
64+
"undef" : true, // Require all non-global variables be declared before they are used.
65+
66+
67+
"newcap" : false, // Require capitalization of all constructor functions e.g. `new F()`.
68+
"noempty" : true, // Prohibit use of empty blocks.
69+
"nonew" : false, // Prohibit use of constructors for side-effects.
70+
"nomen" : false, // Prohibit use of initial or trailing underbars in names.
71+
"onevar" : false, // Allow only one `var` statement per function.
72+
"plusplus" : false, // Prohibit use of `++` & `--`.
73+
"sub" : true, // Tolerate all forms of subscript notation besides dot notation e.g. `dict['key']` instead of `dict.key`.
74+
"trailing" : true, // Prohibit trailing whitespaces. (only works if white is 'true')
75+
"white" : true, // Check against strict whitespace and indentation rules.
76+
"indent" : 4 // ignored because "white" is false.
77+
}

bin/launch

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#!/usr/bin/env node
2+
/**
3+
* Spawns one or more apps on multiple ports listed in apps' settings files.
4+
* TODO: Allow overriding settings.
5+
* TODO: This file probably needs review and refactoring.
6+
* TODO: Accept a 'copies' arg to specify how many instance of each app to launch.
7+
* (see sonos-js/app.js for example).
8+
*/
9+
var clc = require('cli-color');
10+
var path = require('path');
11+
var fs = require('fs');
12+
var spawn = require('child_process').spawn;
13+
14+
var help = 'Usage: launch [app_name1 [app_name2]](required))';
15+
var argv = require('optimist')
16+
.string('env')
17+
.describe('env', 'node.js env')
18+
.alias('env', 'e')
19+
.usage(help)
20+
.argv;
21+
22+
if (argv._.length === 0) {
23+
console.log(clc.red.bold(help));
24+
process.exit();
25+
}
26+
27+
process.env.NODE_ENV = process.env.NODE_ENV || argv.e || 'dev';
28+
var ENV = process.env.NODE_ENV;
29+
30+
require('../src/index.js');
31+
32+
// TODO: what path and file name for this combined log?
33+
// Or should it not be combined?
34+
function start_detached(module_name, app_port) {
35+
var out = fs.openSync(__dirname + '/../logs/multi.log', 'a');
36+
var err = fs.openSync(__dirname + '/../logs/multi.log', 'a');
37+
var start_opts = [module_name, '--port', app_port, '-e', ENV];
38+
var spawn_opts = {
39+
detached: true,
40+
stdio: ['ignore', out, err]
41+
};
42+
43+
var child = spawn(__dirname + '/start', start_opts, spawn_opts);
44+
child.unref();
45+
46+
console.log(clc.green.bold('Registered: ' + module_name + ':' + app_port));
47+
}
48+
49+
function get_app_ports(app_settings) {
50+
var ports = [];
51+
52+
if (app_settings && app_settings[ENV] && app_settings[ENV].server && app_settings[ENV].server.port) {
53+
var starting_port = app_settings[ENV].server.port;
54+
var nbr_of_proxies = app_settings[ENV].server.proxies;
55+
for (var i = 0; i < nbr_of_proxies; i++) {
56+
ports.push(starting_port + i);
57+
}
58+
}
59+
60+
return ports;
61+
}
62+
63+
argv._.forEach(function(module) {
64+
var app_settings = require('../settings/' + module).settings;
65+
var ports = get_app_ports(app_settings);
66+
67+
if (ports.length === 0) {
68+
throw new Error("Failed to get port from settings for module: " + module);
69+
}
70+
71+
ports.forEach(function(app_port) {
72+
start_detached(module, app_port);
73+
});
74+
});

bin/start

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
#!/usr/bin/env node
2+
/**
3+
* Starts one or more apps on a single port.
4+
*/
5+
var clc = require('cli-color');
6+
var path = require('path');
7+
var fs = require('fs');
8+
var util = require('util');
9+
10+
var log_red = function(msg) {
11+
console.log(clc.red.bold(msg));
12+
};
13+
14+
var help = 'Usage: $0 [app_name1, [app_name2]] -e dev';
15+
var optimist = require('optimist');
16+
argv = optimist
17+
.boolean(['port'])
18+
.alias('port', 'p')
19+
.describe('port', 'port to run server(s) on')
20+
.string('env')
21+
.describe('env', 'NodeJS env')
22+
.alias('env', 'e')
23+
.usage(help)
24+
.argv;
25+
26+
process.env.NODE_ENV = process.env.NODE_ENV || argv.e || 'dev';
27+
var ENV = process.env.NODE_ENV;
28+
29+
var port = argv.port;
30+
31+
require('../lib');
32+
33+
var app = require('../lib/app')();
34+
35+
if (port) {
36+
if (isNaN(parseInt(port, 10))) {
37+
throw "Invalid port number";
38+
}
39+
} else {
40+
port = 8080;
41+
}
42+
43+
if (argv._.length === 0) {
44+
optimist.showHelp(log_red);
45+
process.exit();
46+
}
47+
48+
function start(module_name, app_port) {
49+
app.register(module_name, {port: app_port});
50+
console.log(clc.green.bold('Registered: ' + module_name));
51+
}
52+
53+
function start_apps(app_names) {
54+
app_names.forEach(function(app_name) {
55+
if (app_name) {
56+
console.log("app_name: " + app_name);
57+
start(app_name, port);
58+
}
59+
});
60+
}
61+
62+
function get_all_app_names() {
63+
var app_dir = path.resolve(path.join(__dirname, "../lib/apps"));
64+
var app_dirnames = fs.readdirSync(app_dir);
65+
var route_path;
66+
var app_names = [];
67+
68+
app_dirnames.forEach(function(app_dirname) {
69+
route_path = path.join(app_dir, app_dirname, 'routes.js');
70+
if (fs.existsSync(route_path)) {
71+
app_names.push(app_dirname);
72+
} else {
73+
console.error("Error: routes not found at : " + route_path);
74+
}
75+
});
76+
77+
return app_names;
78+
}
79+
80+
var app_names = argv._;
81+
82+
if (app_names[0] === 'all') {
83+
app_names = get_all_app_names();
84+
}
85+
86+
start_apps(app_names);

config.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module.exports = {
2+
common: {
3+
server: {
4+
port: 8080
5+
}
6+
},
7+
8+
dev: {},
9+
10+
test: {}
11+
};

lib/app.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
var restify = require('restify');
2+
var Settings = require('settings');
3+
var config = new Settings(require('../config'));
4+
var AppServer = require('./server/app_server');
5+
var AppRegistrar = require('./server/app_registrar');
6+
7+
var app = function () {
8+
var self = {};
9+
10+
self.app_server = new AppServer(config);
11+
12+
self.register = function (app_name, options) {
13+
if (!self.app_server.started) {
14+
self.app_server.start(options);
15+
}
16+
17+
var registrar = new AppRegistrar(self.app_server.server, app_name, options);
18+
registrar.register();
19+
};
20+
21+
self.close_server = function () {
22+
if (self.app_server.started) {
23+
self.app_server.close();
24+
self.app_server.started = false;
25+
}
26+
};
27+
28+
return self;
29+
};
30+
31+
module.exports = app;

lib/apps/users/controller.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
var User = main.models.User;
2+
var responder = main.server.responder;
3+
4+
var methods = {
5+
create: function (req, res, next) {
6+
User.create(req.parsed_params, function (err, user) {
7+
responder.respond(res, err, {data: user}, next);
8+
});
9+
}
10+
};
11+
12+
module.exports = methods;

lib/apps/users/routes.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
var controller = require('./controller');
2+
3+
var routes = [
4+
{
5+
method : "post",
6+
url : "/users",
7+
func : controller.create,
8+
middleware : []
9+
}
10+
];
11+
12+
module.exports = routes;

lib/index.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
if (!global.main) {
2+
global.main = {};
3+
}
4+
5+
main.models = require('./models');
6+
main.server = require('./server');

lib/models/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports = {
2+
User: require('./user')
3+
};

lib/models/user.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
function User() {
2+
}
3+
4+
User.create = function (args, cb) {
5+
cb(null, {id: 123});
6+
};
7+
8+
module.exports = User;

0 commit comments

Comments
 (0)