rails-backbone-generator 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. data/.gitignore +19 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +22 -0
  4. data/README.md +135 -0
  5. data/Rakefile +2 -0
  6. data/lib/generators/backbone/collection_generator.rb +65 -0
  7. data/lib/generators/backbone/model_generator.rb +56 -0
  8. data/lib/generators/backbone/namespace_generator.rb +68 -0
  9. data/lib/generators/backbone/templates/app/assets/javascripts/%namespace%/collections/%collection_name%.coffee.tt +4 -0
  10. data/lib/generators/backbone/templates/app/assets/javascripts/%namespace%/collections/.gitkeep +0 -0
  11. data/lib/generators/backbone/templates/app/assets/javascripts/%namespace%/models/%model_name%.coffee.tt +15 -0
  12. data/lib/generators/backbone/templates/app/assets/javascripts/%namespace%/models/.gitkeep +0 -0
  13. data/lib/generators/backbone/templates/app/assets/javascripts/%namespace%/routes/.gitkeep +0 -0
  14. data/lib/generators/backbone/templates/app/assets/javascripts/%namespace%/templates/.gitkeep +0 -0
  15. data/lib/generators/backbone/templates/app/assets/javascripts/%namespace%/views/.gitkeep +0 -0
  16. data/lib/generators/backbone/templates/app/assets/javascripts/%namespace%.coffee.tt +16 -0
  17. data/lib/generators/backbone/templates/app/assets/javascripts/shared/.gitkeep +0 -0
  18. data/lib/generators/backbone/templates/app/assets/javascripts/shared/core_extentions/collections_extentions.coffee +30 -0
  19. data/lib/generators/backbone/templates/app/assets/javascripts/shared/helpers/.gitkeep +0 -0
  20. data/lib/generators/backbone/templates/app/assets/javascripts/shared/utils/.gitkeep +0 -0
  21. data/lib/generators/backbone/templates/spec/javascripts/%namespace%/collections/%collection_name%_spec.coffee.tt +8 -0
  22. data/lib/generators/backbone/templates/spec/javascripts/%namespace%/collections/.gitkeep +0 -0
  23. data/lib/generators/backbone/templates/spec/javascripts/%namespace%/factories/%model_name%_factory.coffee.tt +43 -0
  24. data/lib/generators/backbone/templates/spec/javascripts/%namespace%/factories/.gitkeep +0 -0
  25. data/lib/generators/backbone/templates/spec/javascripts/%namespace%/models/%model_name%_spec.coffee.tt +12 -0
  26. data/lib/generators/backbone/templates/spec/javascripts/%namespace%/models/.gitkeep +0 -0
  27. data/lib/generators/backbone/templates/spec/javascripts/%namespace%/views/.gitkeep +0 -0
  28. data/lib/generators/backbone/templates/spec/javascripts/helpers/association_helpers.coffee +3 -0
  29. data/lib/generators/backbone/templates/spec/javascripts/helpers/common_helpers.coffee +13 -0
  30. data/lib/generators/backbone/templates/spec/javascripts/helpers/fake_host.coffee +18 -0
  31. data/lib/generators/backbone/templates/spec/javascripts/helpers/headless_webkit_helper.coffee +9 -0
  32. data/lib/generators/backbone/templates/spec/javascripts/helpers/state_helpers.coffee +4 -0
  33. data/lib/generators/backbone/templates/spec/javascripts/support/jasmine.yml +81 -0
  34. data/lib/generators/backbone/templates/vendor/javascripts/.gitkeep +0 -0
  35. data/lib/generators/backbone/templates/vendor/javascripts/backbone/backbone-0.9.2.js +1431 -0
  36. data/lib/generators/backbone/templates/vendor/javascripts/backbone/backbone-bind-to-1.0.0.coffee +47 -0
  37. data/lib/generators/backbone/templates/vendor/javascripts/backbone/backbone-handlebars-1.0.0.coffee +1920 -0
  38. data/lib/generators/backbone/templates/vendor/javascripts/backbone/backbone-query-0.1.2.js +325 -0
  39. data/lib/generators/backbone/templates/vendor/javascripts/backbone/backbone-relational-0.6.0.js +1687 -0
  40. data/lib/generators/backbone/templates/vendor/javascripts/backbone/handlebars-1.0.rc.1.js +1920 -0
  41. data/lib/generators/backbone/templates/vendor/javascripts/backbone/underscore-1.3.3.js +1059 -0
  42. data/lib/generators/backbone/templates/vendor/javascripts/browser_compatibility/json2.js +487 -0
  43. data/lib/generators/backbone/templates/vendor/javascripts/browser_compatibility/localstorage-polyfill.js +92 -0
  44. data/lib/generators/backbone/templates/vendor/javascripts/jquery/jquery-1.8.0.js +9227 -0
  45. data/lib/generators/backbone/templates/vendor/javascripts/jquery/jquery-ui.min.js +17 -0
  46. data/lib/generators/backbone/templates/vendor/javascripts/jquery/jquery.easing-1.3.js +205 -0
  47. data/lib/generators/backbone/templates/vendor/javascripts/jquery/jquery_ujs.js +368 -0
  48. data/lib/generators/backbone/templates/vendor/javascripts/testing/backbone-factory.js +53 -0
  49. data/lib/generators/backbone/templates/vendor/javascripts/testing/jasmine-jquery-1.3.1.js +288 -0
  50. data/lib/generators/backbone/templates/vendor/javascripts/testing/jasmine-sinon.js +43 -0
  51. data/lib/generators/backbone/templates/vendor/javascripts/testing/mock-ajax.js +207 -0
  52. data/lib/generators/backbone/templates/vendor/javascripts/testing/sinon-1.4.2.js +4081 -0
  53. data/lib/generators/backbone_generator.rb +3 -0
  54. data/lib/rails_backbone_generator/version.rb +3 -0
  55. data/lib/rails_backbone_generator.rb +4 -0
  56. data/rails_backbone_generator.gemspec +20 -0
  57. metadata +135 -0
@@ -0,0 +1,325 @@
1
+
2
+ /*
3
+ Backbone Query - A lightweight query API for Backbone Collections
4
+ (c)2012 - Dave Tonge
5
+ May be freely distributed according to MIT license.
6
+ */
7
+
8
+ (function() {
9
+ var detect, filter, get_cache, get_models, get_sorted_models, iterator, page_models, parse_query, perform_query, process_query, reject, sort_models, test_model_attribute, test_query_value,
10
+ __indexOf = Array.prototype.indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
11
+
12
+ parse_query = function(raw_query) {
13
+ var key, o, q, query_param, type, value, _results;
14
+ _results = [];
15
+ for (key in raw_query) {
16
+ query_param = raw_query[key];
17
+ o = {
18
+ key: key
19
+ };
20
+ if (_.isRegExp(query_param)) {
21
+ o.type = "$regex";
22
+ o.value = query_param;
23
+ } else if (_(query_param).isObject() && !_(query_param).isArray()) {
24
+ for (type in query_param) {
25
+ value = query_param[type];
26
+ if (test_query_value(type, value)) {
27
+ o.type = type;
28
+ switch (type) {
29
+ case "$elemMatch":
30
+ case "$relationMatch":
31
+ o.value = parse_query(value);
32
+ break;
33
+ case "$computed":
34
+ q = {};
35
+ q[key] = value;
36
+ o.value = parse_query(q);
37
+ break;
38
+ default:
39
+ o.value = value;
40
+ }
41
+ }
42
+ }
43
+ } else {
44
+ o.type = "$equal";
45
+ o.value = query_param;
46
+ }
47
+ if (o.type === "$equal" && _(o.value).isObject()) o.type = "$oEqual";
48
+ _results.push(o);
49
+ }
50
+ return _results;
51
+ };
52
+
53
+ test_query_value = function(type, value) {
54
+ switch (type) {
55
+ case "$in":
56
+ case "$nin":
57
+ case "$all":
58
+ case "$any":
59
+ return _(value).isArray();
60
+ case "$size":
61
+ return _(value).isNumber();
62
+ case "$regex":
63
+ return _(value).isRegExp();
64
+ case "$like":
65
+ case "$likeI":
66
+ return _(value).isString();
67
+ case "$between":
68
+ return _(value).isArray() && (value.length === 2);
69
+ case "$cb":
70
+ return _(value).isFunction();
71
+ default:
72
+ return true;
73
+ }
74
+ };
75
+
76
+ test_model_attribute = function(type, value) {
77
+ switch (type) {
78
+ case "$like":
79
+ case "$likeI":
80
+ case "$regex":
81
+ return _(value).isString();
82
+ case "$contains":
83
+ case "$all":
84
+ case "$any":
85
+ case "$elemMatch":
86
+ return _(value).isArray();
87
+ case "$size":
88
+ return _(value).isArray() || _(value).isString();
89
+ case "$in":
90
+ case "$nin":
91
+ return value != null;
92
+ case "$relationMatch":
93
+ return (value != null) && value.models;
94
+ default:
95
+ return true;
96
+ }
97
+ };
98
+
99
+ perform_query = function(type, value, attr, model, key) {
100
+ switch (type) {
101
+ case "$equal":
102
+ if (_(attr).isArray()) {
103
+ return __indexOf.call(attr, value) >= 0;
104
+ } else {
105
+ return attr === value;
106
+ }
107
+ break;
108
+ case "$oEqual":
109
+ return _(attr).isEqual(value);
110
+ case "$contains":
111
+ return __indexOf.call(attr, value) >= 0;
112
+ case "$ne":
113
+ return attr !== value;
114
+ case "$lt":
115
+ return attr < value;
116
+ case "$gt":
117
+ return attr > value;
118
+ case "$lte":
119
+ return attr <= value;
120
+ case "$gte":
121
+ return attr >= value;
122
+ case "$between":
123
+ return (value[0] < attr && attr < value[1]);
124
+ case "$in":
125
+ return __indexOf.call(value, attr) >= 0;
126
+ case "$nin":
127
+ return __indexOf.call(value, attr) < 0;
128
+ case "$all":
129
+ return _(value).all(function(item) {
130
+ return __indexOf.call(attr, item) >= 0;
131
+ });
132
+ case "$any":
133
+ return _(attr).any(function(item) {
134
+ return __indexOf.call(value, item) >= 0;
135
+ });
136
+ case "$size":
137
+ return attr.length === value;
138
+ case "$exists":
139
+ case "$has":
140
+ return (attr != null) === value;
141
+ case "$like":
142
+ return attr.indexOf(value) !== -1;
143
+ case "$likeI":
144
+ return attr.toLowerCase().indexOf(value.toLowerCase()) !== -1;
145
+ case "$regex":
146
+ return value.test(attr);
147
+ case "$cb":
148
+ return value.call(model, attr);
149
+ case "$elemMatch":
150
+ return iterator(attr, value, false, detect, "elemMatch");
151
+ case "$relationMatch":
152
+ return iterator(attr.models, value, false, detect, "relationMatch");
153
+ case "$computed":
154
+ return iterator([model], value, false, detect, "computed");
155
+ default:
156
+ return false;
157
+ }
158
+ };
159
+
160
+ iterator = function(models, query, andOr, filterFunction, subQuery) {
161
+ var parsed_query;
162
+ if (subQuery == null) subQuery = false;
163
+ parsed_query = subQuery ? query : parse_query(query);
164
+ return filterFunction(models, function(model) {
165
+ var attr, q, test, _i, _len;
166
+ for (_i = 0, _len = parsed_query.length; _i < _len; _i++) {
167
+ q = parsed_query[_i];
168
+ attr = (function() {
169
+ switch (subQuery) {
170
+ case "elemMatch":
171
+ return model[q.key];
172
+ case "computed":
173
+ return model[q.key]();
174
+ default:
175
+ return model.get(q.key);
176
+ }
177
+ })();
178
+ test = test_model_attribute(q.type, attr);
179
+ if (test) test = perform_query(q.type, q.value, attr, model, q.key);
180
+ if (andOr === test) return andOr;
181
+ }
182
+ return !andOr;
183
+ });
184
+ };
185
+
186
+ filter = function(array, test) {
187
+ var val, _i, _len, _results;
188
+ _results = [];
189
+ for (_i = 0, _len = array.length; _i < _len; _i++) {
190
+ val = array[_i];
191
+ if (test(val)) _results.push(val);
192
+ }
193
+ return _results;
194
+ };
195
+
196
+ reject = function(array, test) {
197
+ var val, _i, _len, _results;
198
+ _results = [];
199
+ for (_i = 0, _len = array.length; _i < _len; _i++) {
200
+ val = array[_i];
201
+ if (!test(val)) _results.push(val);
202
+ }
203
+ return _results;
204
+ };
205
+
206
+ detect = function(array, test) {
207
+ var val, _i, _len;
208
+ for (_i = 0, _len = array.length; _i < _len; _i++) {
209
+ val = array[_i];
210
+ if (test(val)) return true;
211
+ }
212
+ return false;
213
+ };
214
+
215
+ process_query = {
216
+ $and: function(models, query) {
217
+ return iterator(models, query, false, filter);
218
+ },
219
+ $or: function(models, query) {
220
+ return iterator(models, query, true, filter);
221
+ },
222
+ $nor: function(models, query) {
223
+ return iterator(models, query, true, reject);
224
+ },
225
+ $not: function(models, query) {
226
+ return iterator(models, query, false, reject);
227
+ }
228
+ };
229
+
230
+ get_cache = function(collection, query, options) {
231
+ var cache, models, query_string, _ref;
232
+ query_string = JSON.stringify(query);
233
+ cache = (_ref = collection._query_cache) != null ? _ref : collection._query_cache = {};
234
+ models = cache[query_string];
235
+ if (!models) {
236
+ models = get_sorted_models(collection, query, options);
237
+ cache[query_string] = models;
238
+ }
239
+ return models;
240
+ };
241
+
242
+ get_models = function(collection, query) {
243
+ var compound_query, models, reduce_iterator;
244
+ compound_query = _.intersection(["$and", "$not", "$or", "$nor"], _(query).keys());
245
+ models = collection.models;
246
+ if (compound_query.length === 0) {
247
+ return process_query.$and(models, query);
248
+ } else {
249
+ reduce_iterator = function(memo, query_type) {
250
+ return process_query[query_type](memo, query[query_type]);
251
+ };
252
+ return _.reduce(compound_query, reduce_iterator, models);
253
+ }
254
+ };
255
+
256
+ get_sorted_models = function(collection, query, options) {
257
+ var models;
258
+ models = get_models(collection, query);
259
+ if (options.sortBy) models = sort_models(models, options);
260
+ return models;
261
+ };
262
+
263
+ sort_models = function(models, options) {
264
+ if (_(options.sortBy).isString()) {
265
+ models = _(models).sortBy(function(model) {
266
+ return model.get(options.sortBy);
267
+ });
268
+ } else if (_(options.sortBy).isFunction()) {
269
+ models = _(models).sortBy(options.sortBy);
270
+ }
271
+ if (options.order === "desc") models = models.reverse();
272
+ return models;
273
+ };
274
+
275
+ page_models = function(models, options) {
276
+ var end, sliced_models, start, total_pages;
277
+ if (options.offset) {
278
+ start = options.offset;
279
+ } else if (options.page) {
280
+ start = (options.page - 1) * options.limit;
281
+ } else {
282
+ start = 0;
283
+ }
284
+ end = start + options.limit;
285
+ sliced_models = models.slice(start, end);
286
+ if (options.pager && _.isFunction(options.pager)) {
287
+ total_pages = Math.ceil(models.length / options.limit);
288
+ options.pager(total_pages, sliced_models);
289
+ }
290
+ return sliced_models;
291
+ };
292
+
293
+ if (typeof require !== 'undefined') {
294
+ if (typeof _ === "undefined" || _ === null) _ = require('underscore');
295
+ if (typeof Backbone === "undefined" || Backbone === null) {
296
+ Backbone = require('backbone');
297
+ }
298
+ }
299
+
300
+ Backbone.QueryCollection = Backbone.Collection.extend({
301
+ query: function(query, options) {
302
+ var models;
303
+ if (options == null) options = {};
304
+ if (options.cache) {
305
+ models = get_cache(this, query, options);
306
+ } else {
307
+ models = get_sorted_models(this, query, options);
308
+ }
309
+ if (options.limit) models = page_models(models, options);
310
+ return models;
311
+ },
312
+ where: function(params, options) {
313
+ if (options == null) options = {};
314
+ return new this.constructor(this.query(params, options));
315
+ },
316
+ reset_query_cache: function() {
317
+ return this._query_cache = {};
318
+ }
319
+ });
320
+
321
+ if (typeof exports !== "undefined") {
322
+ exports.QueryCollection = Backbone.QueryCollection;
323
+ }
324
+
325
+ }).call(this);