From cc71b745c3c821f5e012a363ae3267252a81fddb Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Mon, 15 Mar 2010 14:36:50 -0700 Subject: added resources; removed compiled code --- src/Resource.js | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 src/Resource.js (limited to 'src/Resource.js') diff --git a/src/Resource.js b/src/Resource.js new file mode 100644 index 00000000..c0c6d220 --- /dev/null +++ b/src/Resource.js @@ -0,0 +1,117 @@ +function Route(template, defaults) { + this.template = template = template + '#'; + this.defaults = defaults || {}; + var urlParams = this.urlParams = {}; + foreach(template.split(/\W/), function(param){ + if (param && template.match(new RegExp(":" + param + "\\W"))) { + urlParams[param] = true; + } + }); +} + +Route.prototype = { + url: function(params) { + var path = []; + var self = this; + var url = this.template; + params = params || {}; + foreach(this.urlParams, function(value, urlParam){ + var value = params[urlParam] || self.defaults[urlParam] || ""; + url = url.replace(new RegExp(":" + urlParam + "(\\W)"), value + "$1"); + }); + url = url.replace(/\/?#$/, ''); + var query = []; + foreach(params, function(value, key){ + if (!self.urlParams[key]) { + query.push(encodeURI(key) + '=' + encodeURI(value)); + } + }); + return url + (query.length ? '?' + query.join('&') : ''); + } +}; + +function ResourceFactory(xhr) { + this.xhr = xhr; +} + +ResourceFactory.DEFAULT_ACTIONS = { + 'get': {method:'GET'}, + 'save': {method:'POST'}, + 'query': {method:'GET', isArray:true}, + 'remove': {method:'DELETE'}, + 'delete': {method:'DELETE'} +}; + +ResourceFactory.prototype = { + route: function(url, idPaths, actions){ + var self = this; + var route = new Route(url); + actions = $.extend({}, ResourceFactory.DEFAULT_ACTIONS, actions); + function extractIds(data){ + var ids = {}; + foreach(idPaths, function(path, id){ + ids[id] = Scope.getter(data, path); + }); + return ids; + } + + function Resource(value){ + copy(value || {}, this); + }; + + foreach(actions, function(action, name){ + var isGet = action.method == 'GET'; + var isPost = action.method == 'POST'; + Resource[name] = function (a1, a2, a3) { + var params = {}; + var data; + var callback = noop; + switch(arguments.length) { + case 3: callback = a3; + case 2: + if (typeof a2 == 'function') { + callback = a2; + } else { + params = a1; + data = a2; + break; + } + case 1: if (isPost) data = a1; else params = a1; break; + case 0: break; + default: + throw "Expected between 0-3 arguments [params, data, callback], got " + arguments.length + " arguments." + } + + var value = action.isArray ? [] : new Resource(data); + self.xhr.method(action.method, route.url($.extend({}, action.params || {}, extractIds(data), params)), data, function(response) { + if (action.isArray) { + foreach(response, function(item){ + value.push(new Resource(item)); + }); + } else { + copy(response, value); + } + (callback||noop)(value); + }); + return value; + }; + + if (!isGet) { + Resource.prototype['$' + name] = function(a1, a2){ + var params = {}; + var callback = noop; + switch(arguments.length) { + case 2: params = a1, callback = a2; + case 1: if (typeof a1 == 'function') callback = a1; else params = a1; + case 0: break; + default: + throw "Expected between 1-3 arguments [params, data, callback], got " + arguments.length + " arguments." + } + Resource[name](params, this, callback); + }; + } + }); + return Resource; + } +}; + -- cgit v1.2.3 From f9f181a33e10bb698ff437bb3939f544ca92e39f Mon Sep 17 00:00:00 2001 From: Adam Abrons Date: Mon, 15 Mar 2010 15:02:52 -0700 Subject: copy response into resource on save. update jstestdriver --- src/Resource.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src/Resource.js') diff --git a/src/Resource.js b/src/Resource.js index c0c6d220..bed3def6 100644 --- a/src/Resource.js +++ b/src/Resource.js @@ -107,7 +107,11 @@ ResourceFactory.prototype = { default: throw "Expected between 1-3 arguments [params, data, callback], got " + arguments.length + " arguments." } - Resource[name](params, this, callback); + var self = this; + Resource[name](params, this, function(response){ + copy(response, self); + callback(self); + }); }; } }); -- cgit v1.2.3 From 79b743e52feb2c57ba0ae42d6d2742bc2189b22f Mon Sep 17 00:00:00 2001 From: Adam Abrons Date: Mon, 15 Mar 2010 15:57:12 -0700 Subject: resources, with bind() --- src/Resource.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'src/Resource.js') diff --git a/src/Resource.js b/src/Resource.js index bed3def6..c0c7934c 100644 --- a/src/Resource.js +++ b/src/Resource.js @@ -43,14 +43,14 @@ ResourceFactory.DEFAULT_ACTIONS = { }; ResourceFactory.prototype = { - route: function(url, idPaths, actions){ + route: function(url, paramDefaults, actions){ var self = this; var route = new Route(url); actions = $.extend({}, ResourceFactory.DEFAULT_ACTIONS, actions); - function extractIds(data){ + function extractParams(data){ var ids = {}; - foreach(idPaths, function(path, id){ - ids[id] = Scope.getter(data, path); + foreach(paramDefaults, function(value, key){ + ids[key] = value.charAt && value.charAt(0) == '@' ? Scope.getter(data, value.substr(1)) : value; }); return ids; } @@ -83,7 +83,7 @@ ResourceFactory.prototype = { } var value = action.isArray ? [] : new Resource(data); - self.xhr.method(action.method, route.url($.extend({}, action.params || {}, extractIds(data), params)), data, function(response) { + self.xhr.method(action.method, route.url($.extend({}, action.params || {}, extractParams(data), params)), data, function(response) { if (action.isArray) { foreach(response, function(item){ value.push(new Resource(item)); @@ -96,6 +96,10 @@ ResourceFactory.prototype = { return value; }; + Resource.bind = function(additionalParamDefaults){ + return self.route(url, $.extend({}, paramDefaults, additionalParamDefaults), actions); + }; + if (!isGet) { Resource.prototype['$' + name] = function(a1, a2){ var params = {}; -- cgit v1.2.3 From 2df072e3f89e8998b06b5a9e5ffb10fa32155136 Mon Sep 17 00:00:00 2001 From: Adam Abrons Date: Tue, 16 Mar 2010 14:38:56 -0700 Subject: twitter using resources --- src/Resource.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/Resource.js') diff --git a/src/Resource.js b/src/Resource.js index c0c7934c..0ff46726 100644 --- a/src/Resource.js +++ b/src/Resource.js @@ -49,7 +49,7 @@ ResourceFactory.prototype = { actions = $.extend({}, ResourceFactory.DEFAULT_ACTIONS, actions); function extractParams(data){ var ids = {}; - foreach(paramDefaults, function(value, key){ + foreach(paramDefaults || {}, function(value, key){ ids[key] = value.charAt && value.charAt(0) == '@' ? Scope.getter(data, value.substr(1)) : value; }); return ids; -- cgit v1.2.3 From c9aba8b442adce496f0600c88764f7ffcc166879 Mon Sep 17 00:00:00 2001 From: Adam Abrons Date: Tue, 16 Mar 2010 14:48:11 -0700 Subject: make xhr just a method --- src/Resource.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/Resource.js') diff --git a/src/Resource.js b/src/Resource.js index 0ff46726..587c331e 100644 --- a/src/Resource.js +++ b/src/Resource.js @@ -83,7 +83,7 @@ ResourceFactory.prototype = { } var value = action.isArray ? [] : new Resource(data); - self.xhr.method(action.method, route.url($.extend({}, action.params || {}, extractParams(data), params)), data, function(response) { + self.xhr(action.method, route.url($.extend({}, action.params || {}, extractParams(data), params)), data, function(response) { if (action.isArray) { foreach(response, function(item){ value.push(new Resource(item)); -- cgit v1.2.3 From 7634a3ed5227f8bc2a2ba83752d0e2c78adb6051 Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Thu, 18 Mar 2010 12:20:06 -0700 Subject: initial revision of new plugable compiler --- src/Resource.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/Resource.js') diff --git a/src/Resource.js b/src/Resource.js index 587c331e..971ad6e5 100644 --- a/src/Resource.js +++ b/src/Resource.js @@ -79,7 +79,7 @@ ResourceFactory.prototype = { case 1: if (isPost) data = a1; else params = a1; break; case 0: break; default: - throw "Expected between 0-3 arguments [params, data, callback], got " + arguments.length + " arguments." + throw "Expected between 0-3 arguments [params, data, callback], got " + arguments.length + " arguments."; } var value = action.isArray ? [] : new Resource(data); @@ -109,7 +109,7 @@ ResourceFactory.prototype = { case 1: if (typeof a1 == 'function') callback = a1; else params = a1; case 0: break; default: - throw "Expected between 1-3 arguments [params, data, callback], got " + arguments.length + " arguments." + throw "Expected between 1-3 arguments [params, data, callback], got " + arguments.length + " arguments."; } var self = this; Resource[name](params, this, function(response){ -- cgit v1.2.3 From e55c97debaa0ef8487ece219b6eadbc147ece1f9 Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Mon, 29 Mar 2010 20:25:42 -0700 Subject: dissabled a lot of tests, and made the core test set pass. --- src/Resource.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/Resource.js') diff --git a/src/Resource.js b/src/Resource.js index 971ad6e5..27ce8aa9 100644 --- a/src/Resource.js +++ b/src/Resource.js @@ -46,11 +46,11 @@ ResourceFactory.prototype = { route: function(url, paramDefaults, actions){ var self = this; var route = new Route(url); - actions = $.extend({}, ResourceFactory.DEFAULT_ACTIONS, actions); + actions = extend({}, ResourceFactory.DEFAULT_ACTIONS, actions); function extractParams(data){ var ids = {}; foreach(paramDefaults || {}, function(value, key){ - ids[key] = value.charAt && value.charAt(0) == '@' ? Scope.getter(data, value.substr(1)) : value; + ids[key] = value.charAt && value.charAt(0) == '@' ? getter(data, value.substr(1)) : value; }); return ids; } @@ -83,7 +83,7 @@ ResourceFactory.prototype = { } var value = action.isArray ? [] : new Resource(data); - self.xhr(action.method, route.url($.extend({}, action.params || {}, extractParams(data), params)), data, function(response) { + self.xhr(action.method, route.url(extend({}, action.params || {}, extractParams(data), params)), data, function(response) { if (action.isArray) { foreach(response, function(item){ value.push(new Resource(item)); @@ -97,7 +97,7 @@ ResourceFactory.prototype = { }; Resource.bind = function(additionalParamDefaults){ - return self.route(url, $.extend({}, paramDefaults, additionalParamDefaults), actions); + return self.route(url, extend({}, paramDefaults, additionalParamDefaults), actions); }; if (!isGet) { -- cgit v1.2.3 From a80a61839a66d244c8bb14bbe2975746e02516c8 Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Sat, 3 Apr 2010 17:04:36 -0700 Subject: injection is now working --- src/Resource.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/Resource.js') diff --git a/src/Resource.js b/src/Resource.js index 27ce8aa9..9fe60788 100644 --- a/src/Resource.js +++ b/src/Resource.js @@ -15,7 +15,7 @@ Route.prototype = { var self = this; var url = this.template; params = params || {}; - foreach(this.urlParams, function(value, urlParam){ + foreach(this.urlParams, function(_, urlParam){ var value = params[urlParam] || self.defaults[urlParam] || ""; url = url.replace(new RegExp(":" + urlParam + "(\\W)"), value + "$1"); }); @@ -57,7 +57,7 @@ ResourceFactory.prototype = { function Resource(value){ copy(value || {}, this); - }; + } foreach(actions, function(action, name){ var isGet = action.method == 'GET'; @@ -105,7 +105,7 @@ ResourceFactory.prototype = { var params = {}; var callback = noop; switch(arguments.length) { - case 2: params = a1, callback = a2; + case 2: params = a1; callback = a2; case 1: if (typeof a1 == 'function') callback = a1; else params = a1; case 0: break; default: -- cgit v1.2.3 From fce48eb60a47be87a3d95e0750e54c19c2a346d0 Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Tue, 27 Apr 2010 11:18:08 -0700 Subject: resources now use browser mock --- src/Resource.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/Resource.js') diff --git a/src/Resource.js b/src/Resource.js index 9fe60788..34ad1c5d 100644 --- a/src/Resource.js +++ b/src/Resource.js @@ -83,7 +83,7 @@ ResourceFactory.prototype = { } var value = action.isArray ? [] : new Resource(data); - self.xhr(action.method, route.url(extend({}, action.params || {}, extractParams(data), params)), data, function(response) { + self.xhr(action.method, route.url(extend({}, action.params || {}, extractParams(data), params)), data, function(status, response) { if (action.isArray) { foreach(response, function(item){ value.push(new Resource(item)); -- cgit v1.2.3 From 038a743e6f49c347a38edc0e54dcbb175905a475 Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Fri, 7 May 2010 12:09:14 -0700 Subject: xhr bulk fixes --- src/Resource.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'src/Resource.js') diff --git a/src/Resource.js b/src/Resource.js index 34ad1c5d..c9bad0c0 100644 --- a/src/Resource.js +++ b/src/Resource.js @@ -21,7 +21,7 @@ Route.prototype = { }); url = url.replace(/\/?#$/, ''); var query = []; - foreach(params, function(value, key){ + foreachSorted(params, function(value, key){ if (!self.urlParams[key]) { query.push(encodeURI(key) + '=' + encodeURI(value)); } @@ -69,14 +69,18 @@ ResourceFactory.prototype = { switch(arguments.length) { case 3: callback = a3; case 2: - if (typeof a2 == 'function') { + if (isFunction(a2)) { callback = a2; } else { params = a1; data = a2; break; } - case 1: if (isPost) data = a1; else params = a1; break; + case 1: + if (isFunction(a1)) callback = a1; + else if (isPost) data = a1; + else params = a1; + break; case 0: break; default: throw "Expected between 0-3 arguments [params, data, callback], got " + arguments.length + " arguments."; @@ -109,7 +113,7 @@ ResourceFactory.prototype = { case 1: if (typeof a1 == 'function') callback = a1; else params = a1; case 0: break; default: - throw "Expected between 1-3 arguments [params, data, callback], got " + arguments.length + " arguments."; + throw "Expected between 1-2 arguments [params, callback], got " + arguments.length + " arguments."; } var self = this; Resource[name](params, this, function(response){ -- cgit v1.2.3 From 0f73084e9d21cea99f0535e6ca30a1341b7047dc Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Wed, 19 May 2010 11:51:17 -0700 Subject: added error handler to xhr requests --- src/Resource.js | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'src/Resource.js') diff --git a/src/Resource.js b/src/Resource.js index c9bad0c0..724121b7 100644 --- a/src/Resource.js +++ b/src/Resource.js @@ -87,16 +87,25 @@ ResourceFactory.prototype = { } var value = action.isArray ? [] : new Resource(data); - self.xhr(action.method, route.url(extend({}, action.params || {}, extractParams(data), params)), data, function(status, response) { - if (action.isArray) { - foreach(response, function(item){ - value.push(new Resource(item)); - }); - } else { - copy(response, value); + self.xhr( + action.method, + route.url(extend({}, action.params || {}, extractParams(data), params)), + data, + function(status, response) { + if (status == 200) { + if (action.isArray) { + foreach(response, function(item){ + value.push(new Resource(item)); + }); + } else { + copy(response, value); + } + (callback||noop)(value); + } else { + throw {status: status, response:response, message: status + ": " + response}; + } } - (callback||noop)(value); - }); + ); return value; }; -- cgit v1.2.3