Skip to content

Instantly share code, notes, and snippets.

@silentrob
Created August 13, 2009 21:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save silentrob/167456 to your computer and use it in GitHub Desktop.
Save silentrob/167456 to your computer and use it in GitHub Desktop.
system.use("com.joyent.Sammy");
function resources( name , options) {
// var db = new DebugConsole();
// system.console.log(db.processMessage(this.name));
name = name.toLowerCase();
objName = name.substr(0,1).toUpperCase() + name.substr(1);
indexUrl = new RegExp(name+"$|"+name+"\/index"); // -- /task or /task/index
showUrl = new RegExp(name+"\/([0-9]+)\/show"); // -- /task/:id/show
newUrl = new RegExp(name+"\/new"); // -- /task/new
editGetUrl = new RegExp(name+"\/([0-9]+)\/edit"); // -- /task/:id/edit
delGetUrl = new RegExp(name+"\/([0-9]+)\/delete"); // -- /task/:id/delete
editUrl = new RegExp(name+"\/([0-9]+)$"); // -- /task/:id
var c = eval(objName + "Controller");
Stack.add(new Sammy.Handler(c['index'], Sammy.generate_test([Sammy.Test.Method.GET,indexUrl])));
Stack.add(new Sammy.Handler(c['show'], Sammy.generate_test([Sammy.Test.Method.GET,showUrl])));
Stack.add(new Sammy.Handler(c['new'], Sammy.generate_test([Sammy.Test.Method.GET,newUrl])));
Stack.add(new Sammy.Handler(c['create'], Sammy.generate_test([Sammy.Test.Method.POST,indexUrl])));
Stack.add(new Sammy.Handler(c['update'], Sammy.generate_test([Sammy.Test.Method.PUT,editUrl])));
Stack.add(new Sammy.Handler(c['destroy'], Sammy.generate_test([Sammy.Test.Method.DELETE,editUrl])));
Stack.add(new Sammy.Handler(c['show'], Sammy.generate_test([Sammy.Test.Method.GET,editUrl])));
Stack.add(new Sammy.Handler(c['edit'], Sammy.generate_test([Sammy.Test.Method.GET,editGetUrl])));
Stack.add(new Sammy.Handler(c['delete'], Sammy.generate_test([Sammy.Test.Method.GET,delGetUrl])));
return this;
}
function match(aTest) {
this.segments = [];
aSegments = aTest.split('/');
aSegments.shift();
var re = /^:([a-z0-9]+)$/;
for (var i=0; i < aSegments.length; i++) {
if (re.exec(aSegments[i]) != null) {
var m = re.exec(aSegments[i])[1];
this.segments.push(m);
}
}
var s = '';
// if we have any segments, we need to modify the test
if (this.segments.length != 0) {
for(var i=0; i < this.segments.length; i++) {
s += "\/([a-z0-9]+)";
}
base = aTest.substring(0,(aTest.indexOf(":") - 1))
this.aTest = new RegExp(base + s + "$");
} else {
this.aTest = aTest;
}
return this;
}
function to(option) {
// var db = new DebugConsole();
var that = this;
this.data = {};
this.data['segment_item'] = [];
// Convert segments to data with the same name if they dont exist in the option list
for (var x = 0; x < this.segments.length; x++) {
if (option) {
//system.console.log("=== Looking for Segment === " + this.segments[x] );
if (option[this.segments[x]]) {
//system.console.log("=== Option Exists for Segment === " + option[this.segments[x]] );
this.data[this.segments[x]] = option[this.segments[x]];
this.data['segment_item'].push(this.segments[x]);
} else {
//system.console.log("=== No Option, PUSH it === ");
this.data['segment_item'].push(this.segments[x]);
}
} else {
//system.console.log("=== No Option, PUSH it === ");
this.data['segment_item'].push(this.segments[x]);
}
}
if (size(option) != 0) {
for(var i in option ) {
this.data[i] = option[i];
}
}
Stack.add(new Router.Handler(Sammy.generate_test([Sammy.Test.Method.GET,that.aTest]), this.data ));
Stack.add(new Router.Handler(Sammy.generate_test([Sammy.Test.Method.POST,that.aTest]), this.data ));
Stack.add(new Router.Handler(Sammy.generate_test([Sammy.Test.Method.PUT,that.aTest]), this.data));
Stack.add(new Router.Handler(Sammy.generate_test([Sammy.Test.Method.DELETE, that.aTest]), this.data));
return this;
}
Router = {}
Router.Handler = function( shouldRun, p ) {
this.name = "unnamed";
this.test = shouldRun;
this.run = function() {
args = [];
var dict = {};
dict['params'] = {};
// Asign the arguments to the keys
for(var a = 0; a < arguments.length; a++ ) {
dict['params'][p['segment_item'][a]] = arguments[a];
}
dict['params']['controller'] = (p.controller || dict['params'].controller);
dict['params']['action'] = (p.action || dict['params'].action );
dict['obj'] = getConctollerName(dict['params'].controller); ;
args.push(dict);
var controller = new Controller(args,this);
controller.extend(dict['obj']);
// Maybe add this to the early phase?
if (controller['before']) {
controller['before']();
}
if (typeof(controller[dict.params.action]) == 'function') {
controller[dict['params'].action](dict['params']);
} else {
controller.display("Action '" + dict['params'].action + "' is not a function, did you forget to add it to your '" + dict['params'].controller + "' Controller? " + dict['params'].action );
}
if (controller['after']) {
controller['after']();
}
return controller.getResponse();
};
};
var getConctollerName = function(c) {
var name = c.toLowerCase();
var objName = name.substr(0,1).toUpperCase() + name.substr(1);
var c = eval(objName + "Controller");
return c;
}
size = function(obj) {
var size = 0, key;
for (key in obj) {
if (obj.hasOwnProperty(key)) size++;
}
return size;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment