rails-backbone 0.7.2 → 0.8.0

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.
@@ -260,7 +260,7 @@
260
260
  set: function(key, value, options) {
261
261
  var attrs, attr, val;
262
262
 
263
- // Handle both
263
+ // Handle both `"key", value` and `{key: value}` -style arguments.
264
264
  if (_.isObject(key) || key == null) {
265
265
  attrs = key;
266
266
  options = value;
@@ -1,4 +1,4 @@
1
- (function() {
1
+ (function($) {
2
2
  var methodMap = {
3
3
  'create': 'POST',
4
4
  'update': 'PUT',
@@ -23,9 +23,10 @@
23
23
  type: type,
24
24
  dataType: 'json',
25
25
  beforeSend: function( xhr ) {
26
- var token = $('meta[name="csrf-token"]').attr('content');
27
- if (token) xhr.setRequestHeader('X-CSRF-Token', token);
28
-
26
+ if (!options.noCSRF) {
27
+ var token = $('meta[name="csrf-token"]').attr('content');
28
+ if (token) xhr.setRequestHeader('X-CSRF-Token', token);
29
+ }
29
30
  model.trigger('sync:start');
30
31
  }
31
32
  }, options);
@@ -65,4 +66,4 @@
65
66
  return $.ajax(params);
66
67
  }
67
68
 
68
- }).call(this);
69
+ })(jQuery);
@@ -1,10 +1,7 @@
1
- // Underscore.js 1.3.3
1
+ // Underscore.js 1.4.0
2
+ // http://underscorejs.org
2
3
  // (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
3
- // Underscore is freely distributable under the MIT license.
4
- // Portions of Underscore are inspired or borrowed from Prototype,
5
- // Oliver Steele's Functional, and John Resig's Micro-Templating.
6
- // For all details and documentation:
7
- // http://documentcloud.github.com/underscore
4
+ // Underscore may be freely distributed under the MIT license.
8
5
 
9
6
  (function() {
10
7
 
@@ -24,7 +21,9 @@
24
21
  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
25
22
 
26
23
  // Create quick reference variables for speed access to core prototypes.
27
- var slice = ArrayProto.slice,
24
+ var push = ArrayProto.push,
25
+ slice = ArrayProto.slice,
26
+ concat = ArrayProto.concat,
28
27
  unshift = ArrayProto.unshift,
29
28
  toString = ObjProto.toString,
30
29
  hasOwnProperty = ObjProto.hasOwnProperty;
@@ -46,7 +45,11 @@
46
45
  nativeBind = FuncProto.bind;
47
46
 
48
47
  // Create a safe reference to the Underscore object for use below.
49
- var _ = function(obj) { return new wrapper(obj); };
48
+ var _ = function(obj) {
49
+ if (obj instanceof _) return obj;
50
+ if (!(this instanceof _)) return new _(obj);
51
+ this._wrapped = obj;
52
+ };
50
53
 
51
54
  // Export the Underscore object for **Node.js**, with
52
55
  // backwards-compatibility for the old `require()` API. If we're in
@@ -62,7 +65,7 @@
62
65
  }
63
66
 
64
67
  // Current version.
65
- _.VERSION = '1.3.3';
68
+ _.VERSION = '1.4.0';
66
69
 
67
70
  // Collection Functions
68
71
  // --------------------
@@ -71,12 +74,11 @@
71
74
  // Handles objects with the built-in `forEach`, arrays, and raw objects.
72
75
  // Delegates to **ECMAScript 5**'s native `forEach` if available.
73
76
  var each = _.each = _.forEach = function(obj, iterator, context) {
74
- if (obj == null) return;
75
77
  if (nativeForEach && obj.forEach === nativeForEach) {
76
78
  obj.forEach(iterator, context);
77
79
  } else if (obj.length === +obj.length) {
78
80
  for (var i = 0, l = obj.length; i < l; i++) {
79
- if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
81
+ if (iterator.call(context, obj[i], i, obj) === breaker) return;
80
82
  }
81
83
  } else {
82
84
  for (var key in obj) {
@@ -91,12 +93,10 @@
91
93
  // Delegates to **ECMAScript 5**'s native `map` if available.
92
94
  _.map = _.collect = function(obj, iterator, context) {
93
95
  var results = [];
94
- if (obj == null) return results;
95
96
  if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
96
97
  each(obj, function(value, index, list) {
97
98
  results[results.length] = iterator.call(context, value, index, list);
98
99
  });
99
- if (obj.length === +obj.length) results.length = obj.length;
100
100
  return results;
101
101
  };
102
102
 
@@ -104,7 +104,6 @@
104
104
  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
105
105
  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
106
106
  var initial = arguments.length > 2;
107
- if (obj == null) obj = [];
108
107
  if (nativeReduce && obj.reduce === nativeReduce) {
109
108
  if (context) iterator = _.bind(iterator, context);
110
109
  return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
@@ -125,14 +124,26 @@
125
124
  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.
126
125
  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
127
126
  var initial = arguments.length > 2;
128
- if (obj == null) obj = [];
129
127
  if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
130
128
  if (context) iterator = _.bind(iterator, context);
131
- return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
129
+ return arguments.length > 2 ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
130
+ }
131
+ var length = obj.length;
132
+ if (length !== +length) {
133
+ var keys = _.keys(obj);
134
+ length = keys.length;
132
135
  }
133
- var reversed = _.toArray(obj).reverse();
134
- if (context && !initial) iterator = _.bind(iterator, context);
135
- return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator);
136
+ each(obj, function(value, index, list) {
137
+ index = keys ? keys[--length] : --length;
138
+ if (!initial) {
139
+ memo = obj[index];
140
+ initial = true;
141
+ } else {
142
+ memo = iterator.call(context, memo, obj[index], index, list);
143
+ }
144
+ });
145
+ if (!initial) throw new TypeError('Reduce of empty array with no initial value');
146
+ return memo;
136
147
  };
137
148
 
138
149
  // Return the first value which passes a truth test. Aliased as `detect`.
@@ -152,7 +163,6 @@
152
163
  // Aliased as `select`.
153
164
  _.filter = _.select = function(obj, iterator, context) {
154
165
  var results = [];
155
- if (obj == null) return results;
156
166
  if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
157
167
  each(obj, function(value, index, list) {
158
168
  if (iterator.call(context, value, index, list)) results[results.length] = value;
@@ -163,7 +173,6 @@
163
173
  // Return all the elements for which a truth test fails.
164
174
  _.reject = function(obj, iterator, context) {
165
175
  var results = [];
166
- if (obj == null) return results;
167
176
  each(obj, function(value, index, list) {
168
177
  if (!iterator.call(context, value, index, list)) results[results.length] = value;
169
178
  });
@@ -174,8 +183,8 @@
174
183
  // Delegates to **ECMAScript 5**'s native `every` if available.
175
184
  // Aliased as `all`.
176
185
  _.every = _.all = function(obj, iterator, context) {
186
+ iterator || (iterator = _.identity);
177
187
  var result = true;
178
- if (obj == null) return result;
179
188
  if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
180
189
  each(obj, function(value, index, list) {
181
190
  if (!(result = result && iterator.call(context, value, index, list))) return breaker;
@@ -189,7 +198,6 @@
189
198
  var any = _.some = _.any = function(obj, iterator, context) {
190
199
  iterator || (iterator = _.identity);
191
200
  var result = false;
192
- if (obj == null) return result;
193
201
  if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
194
202
  each(obj, function(value, index, list) {
195
203
  if (result || (result = iterator.call(context, value, index, list))) return breaker;
@@ -197,11 +205,10 @@
197
205
  return !!result;
198
206
  };
199
207
 
200
- // Determine if a given value is included in the array or object using `===`.
201
- // Aliased as `contains`.
202
- _.include = _.contains = function(obj, target) {
208
+ // Determine if the array or object contains a given value (using `===`).
209
+ // Aliased as `include`.
210
+ _.contains = _.include = function(obj, target) {
203
211
  var found = false;
204
- if (obj == null) return found;
205
212
  if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
206
213
  found = any(obj, function(value) {
207
214
  return value === target;
@@ -213,7 +220,7 @@
213
220
  _.invoke = function(obj, method) {
214
221
  var args = slice.call(arguments, 2);
215
222
  return _.map(obj, function(value) {
216
- return (_.isFunction(method) ? method || value : value[method]).apply(value, args);
223
+ return (_.isFunction(method) ? method : value[method]).apply(value, args);
217
224
  });
218
225
  };
219
226
 
@@ -222,9 +229,25 @@
222
229
  return _.map(obj, function(value){ return value[key]; });
223
230
  };
224
231
 
232
+ // Convenience version of a common use case of `filter`: selecting only objects
233
+ // with specific `key:value` pairs.
234
+ _.where = function(obj, attrs) {
235
+ if (_.isEmpty(attrs)) return [];
236
+ return _.filter(obj, function(value) {
237
+ for (var key in attrs) {
238
+ if (attrs[key] !== value[key]) return false;
239
+ }
240
+ return true;
241
+ });
242
+ };
243
+
225
244
  // Return the maximum element or (element-based computation).
245
+ // Can't optimize arrays of integers longer than 65,535 elements.
246
+ // See: https://bugs.webkit.org/show_bug.cgi?id=80797
226
247
  _.max = function(obj, iterator, context) {
227
- if (!iterator && _.isArray(obj) && obj[0] === +obj[0]) return Math.max.apply(Math, obj);
248
+ if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
249
+ return Math.max.apply(Math, obj);
250
+ }
228
251
  if (!iterator && _.isEmpty(obj)) return -Infinity;
229
252
  var result = {computed : -Infinity};
230
253
  each(obj, function(value, index, list) {
@@ -236,7 +259,9 @@
236
259
 
237
260
  // Return the minimum element (or element-based computation).
238
261
  _.min = function(obj, iterator, context) {
239
- if (!iterator && _.isArray(obj) && obj[0] === +obj[0]) return Math.min.apply(Math, obj);
262
+ if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
263
+ return Math.min.apply(Math, obj);
264
+ }
240
265
  if (!iterator && _.isEmpty(obj)) return Infinity;
241
266
  var result = {computed : Infinity};
242
267
  each(obj, function(value, index, list) {
@@ -248,67 +273,94 @@
248
273
 
249
274
  // Shuffle an array.
250
275
  _.shuffle = function(obj) {
251
- var shuffled = [], rand;
252
- each(obj, function(value, index, list) {
253
- rand = Math.floor(Math.random() * (index + 1));
254
- shuffled[index] = shuffled[rand];
276
+ var rand;
277
+ var index = 0;
278
+ var shuffled = [];
279
+ each(obj, function(value) {
280
+ rand = _.random(index++);
281
+ shuffled[index - 1] = shuffled[rand];
255
282
  shuffled[rand] = value;
256
283
  });
257
284
  return shuffled;
258
285
  };
259
286
 
287
+ // An internal function to generate lookup iterators.
288
+ var lookupIterator = function(value) {
289
+ return _.isFunction(value) ? value : function(obj){ return obj[value]; };
290
+ };
291
+
260
292
  // Sort the object's values by a criterion produced by an iterator.
261
- _.sortBy = function(obj, val, context) {
262
- var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };
293
+ _.sortBy = function(obj, value, context) {
294
+ var iterator = lookupIterator(value);
263
295
  return _.pluck(_.map(obj, function(value, index, list) {
264
296
  return {
265
297
  value : value,
298
+ index : index,
266
299
  criteria : iterator.call(context, value, index, list)
267
300
  };
268
301
  }).sort(function(left, right) {
269
- var a = left.criteria, b = right.criteria;
270
- if (a === void 0) return 1;
271
- if (b === void 0) return -1;
272
- return a < b ? -1 : a > b ? 1 : 0;
302
+ var a = left.criteria;
303
+ var b = right.criteria;
304
+ if (a !== b) {
305
+ if (a > b || a === void 0) return 1;
306
+ if (a < b || b === void 0) return -1;
307
+ }
308
+ return left.index < right.index ? -1 : 1;
273
309
  }), 'value');
274
310
  };
275
311
 
276
- // Groups the object's values by a criterion. Pass either a string attribute
277
- // to group by, or a function that returns the criterion.
278
- _.groupBy = function(obj, val) {
312
+ // An internal function used for aggregate "group by" operations.
313
+ var group = function(obj, value, context, behavior) {
279
314
  var result = {};
280
- var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };
315
+ var iterator = lookupIterator(value);
281
316
  each(obj, function(value, index) {
282
- var key = iterator(value, index);
283
- (result[key] || (result[key] = [])).push(value);
317
+ var key = iterator.call(context, value, index, obj);
318
+ behavior(result, key, value);
284
319
  });
285
320
  return result;
286
321
  };
287
322
 
288
- // Use a comparator function to figure out at what index an object should
289
- // be inserted so as to maintain order. Uses binary search.
290
- _.sortedIndex = function(array, obj, iterator) {
291
- iterator || (iterator = _.identity);
323
+ // Groups the object's values by a criterion. Pass either a string attribute
324
+ // to group by, or a function that returns the criterion.
325
+ _.groupBy = function(obj, value, context) {
326
+ return group(obj, value, context, function(result, key, value) {
327
+ (_.has(result, key) ? result[key] : (result[key] = [])).push(value);
328
+ });
329
+ };
330
+
331
+ // Counts instances of an object that group by a certain criterion. Pass
332
+ // either a string attribute to count by, or a function that returns the
333
+ // criterion.
334
+ _.countBy = function(obj, value, context) {
335
+ return group(obj, value, context, function(result, key, value) {
336
+ if (!_.has(result, key)) result[key] = 0;
337
+ result[key]++;
338
+ });
339
+ };
340
+
341
+ // Use a comparator function to figure out the smallest index at which
342
+ // an object should be inserted so as to maintain order. Uses binary search.
343
+ _.sortedIndex = function(array, obj, iterator, context) {
344
+ iterator = iterator == null ? _.identity : lookupIterator(iterator);
345
+ var value = iterator.call(context, obj);
292
346
  var low = 0, high = array.length;
293
347
  while (low < high) {
294
- var mid = (low + high) >> 1;
295
- iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;
348
+ var mid = (low + high) >>> 1;
349
+ iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;
296
350
  }
297
351
  return low;
298
352
  };
299
353
 
300
354
  // Safely convert anything iterable into a real, live array.
301
355
  _.toArray = function(obj) {
302
- if (!obj) return [];
303
- if (_.isArray(obj)) return slice.call(obj);
304
- if (_.isArguments(obj)) return slice.call(obj);
305
- if (obj.toArray && _.isFunction(obj.toArray)) return obj.toArray();
356
+ if (!obj) return [];
357
+ if (obj.length === +obj.length) return slice.call(obj);
306
358
  return _.values(obj);
307
359
  };
308
360
 
309
361
  // Return the number of elements in an object.
310
362
  _.size = function(obj) {
311
- return _.isArray(obj) ? obj.length : _.keys(obj).length;
363
+ return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
312
364
  };
313
365
 
314
366
  // Array Functions
@@ -321,7 +373,7 @@
321
373
  return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
322
374
  };
323
375
 
324
- // Returns everything but the last entry of the array. Especcialy useful on
376
+ // Returns everything but the last entry of the array. Especially useful on
325
377
  // the arguments object. Passing **n** will return all the values in
326
378
  // the array, excluding the last N. The **guard** check allows it to work with
327
379
  // `_.map`.
@@ -339,12 +391,12 @@
339
391
  }
340
392
  };
341
393
 
342
- // Returns everything but the first entry of the array. Aliased as `tail`.
343
- // Especially useful on the arguments object. Passing an **index** will return
344
- // the rest of the values in the array from that index onward. The **guard**
394
+ // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
395
+ // Especially useful on the arguments object. Passing an **n** will return
396
+ // the rest N values in the array. The **guard**
345
397
  // check allows it to work with `_.map`.
346
- _.rest = _.tail = function(array, index, guard) {
347
- return slice.call(array, (index == null) || guard ? 1 : index);
398
+ _.rest = _.tail = _.drop = function(array, n, guard) {
399
+ return slice.call(array, (n == null) || guard ? 1 : n);
348
400
  };
349
401
 
350
402
  // Trim out all falsy values from an array.
@@ -352,13 +404,21 @@
352
404
  return _.filter(array, function(value){ return !!value; });
353
405
  };
354
406
 
407
+ // Internal implementation of a recursive `flatten` function.
408
+ var flatten = function(input, shallow, output) {
409
+ each(input, function(value) {
410
+ if (_.isArray(value)) {
411
+ shallow ? push.apply(output, value) : flatten(value, shallow, output);
412
+ } else {
413
+ output.push(value);
414
+ }
415
+ });
416
+ return output;
417
+ };
418
+
355
419
  // Return a completely flattened version of an array.
356
420
  _.flatten = function(array, shallow) {
357
- return _.reduce(array, function(memo, value) {
358
- if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value));
359
- memo[memo.length] = value;
360
- return memo;
361
- }, []);
421
+ return flatten(array, shallow, []);
362
422
  };
363
423
 
364
424
  // Return a version of the array that does not contain the specified value(s).
@@ -369,30 +429,28 @@
369
429
  // Produce a duplicate-free version of the array. If the array has already
370
430
  // been sorted, you have the option of using a faster algorithm.
371
431
  // Aliased as `unique`.
372
- _.uniq = _.unique = function(array, isSorted, iterator) {
373
- var initial = iterator ? _.map(array, iterator) : array;
432
+ _.uniq = _.unique = function(array, isSorted, iterator, context) {
433
+ var initial = iterator ? _.map(array, iterator, context) : array;
374
434
  var results = [];
375
- // The `isSorted` flag is irrelevant if the array only contains two elements.
376
- if (array.length < 3) isSorted = true;
377
- _.reduce(initial, function (memo, value, index) {
378
- if (isSorted ? _.last(memo) !== value || !memo.length : !_.include(memo, value)) {
379
- memo.push(value);
435
+ var seen = [];
436
+ each(initial, function(value, index) {
437
+ if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {
438
+ seen.push(value);
380
439
  results.push(array[index]);
381
440
  }
382
- return memo;
383
- }, []);
441
+ });
384
442
  return results;
385
443
  };
386
444
 
387
445
  // Produce an array that contains the union: each distinct element from all of
388
446
  // the passed-in arrays.
389
447
  _.union = function() {
390
- return _.uniq(_.flatten(arguments, true));
448
+ return _.uniq(concat.apply(ArrayProto, arguments));
391
449
  };
392
450
 
393
451
  // Produce an array that contains every item shared between all the
394
- // passed-in arrays. (Aliased as "intersect" for back-compat.)
395
- _.intersection = _.intersect = function(array) {
452
+ // passed-in arrays.
453
+ _.intersection = function(array) {
396
454
  var rest = slice.call(arguments, 1);
397
455
  return _.filter(_.uniq(array), function(item) {
398
456
  return _.every(rest, function(other) {
@@ -404,8 +462,8 @@
404
462
  // Take the difference between one array and a number of other arrays.
405
463
  // Only the elements present in just the first array will remain.
406
464
  _.difference = function(array) {
407
- var rest = _.flatten(slice.call(arguments, 1), true);
408
- return _.filter(array, function(value){ return !_.include(rest, value); });
465
+ var rest = concat.apply(ArrayProto, slice.call(arguments, 1));
466
+ return _.filter(array, function(value){ return !_.contains(rest, value); });
409
467
  };
410
468
 
411
469
  // Zip together multiple lists into a single array -- elements that share
@@ -414,10 +472,27 @@
414
472
  var args = slice.call(arguments);
415
473
  var length = _.max(_.pluck(args, 'length'));
416
474
  var results = new Array(length);
417
- for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i);
475
+ for (var i = 0; i < length; i++) {
476
+ results[i] = _.pluck(args, "" + i);
477
+ }
418
478
  return results;
419
479
  };
420
480
 
481
+ // Converts lists into objects. Pass either a single array of `[key, value]`
482
+ // pairs, or two parallel arrays of the same length -- one of keys, and one of
483
+ // the corresponding values.
484
+ _.object = function(list, values) {
485
+ var result = {};
486
+ for (var i = 0, l = list.length; i < l; i++) {
487
+ if (values) {
488
+ result[list[i]] = values[i];
489
+ } else {
490
+ result[list[i][0]] = list[i][1];
491
+ }
492
+ }
493
+ return result;
494
+ };
495
+
421
496
  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
422
497
  // we need this function. Return the position of the first occurrence of an
423
498
  // item in an array, or -1 if the item is not included in the array.
@@ -425,23 +500,25 @@
425
500
  // If the array is large and already in sort order, pass `true`
426
501
  // for **isSorted** to use binary search.
427
502
  _.indexOf = function(array, item, isSorted) {
428
- if (array == null) return -1;
429
- var i, l;
503
+ var i = 0, l = array.length;
430
504
  if (isSorted) {
431
- i = _.sortedIndex(array, item);
432
- return array[i] === item ? i : -1;
505
+ if (typeof isSorted == 'number') {
506
+ i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);
507
+ } else {
508
+ i = _.sortedIndex(array, item);
509
+ return array[i] === item ? i : -1;
510
+ }
433
511
  }
434
- if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
435
- for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;
512
+ if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
513
+ for (; i < l; i++) if (array[i] === item) return i;
436
514
  return -1;
437
515
  };
438
516
 
439
517
  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
440
- _.lastIndexOf = function(array, item) {
441
- if (array == null) return -1;
442
- if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
443
- var i = array.length;
444
- while (i--) if (i in array && array[i] === item) return i;
518
+ _.lastIndexOf = function(array, item, fromIndex) {
519
+ if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item, fromIndex);
520
+ var i = (fromIndex != null ? fromIndex : array.length);
521
+ while (i--) if (array[i] === item) return i;
445
522
  return -1;
446
523
  };
447
524
 
@@ -533,17 +610,19 @@
533
610
  context = this; args = arguments;
534
611
  var later = function() {
535
612
  timeout = null;
536
- if (more) func.apply(context, args);
613
+ if (more) {
614
+ result = func.apply(context, args);
615
+ }
537
616
  whenDone();
538
617
  };
539
618
  if (!timeout) timeout = setTimeout(later, wait);
540
619
  if (throttling) {
541
620
  more = true;
542
621
  } else {
622
+ throttling = true;
543
623
  result = func.apply(context, args);
544
624
  }
545
625
  whenDone();
546
- throttling = true;
547
626
  return result;
548
627
  };
549
628
  };
@@ -553,16 +632,18 @@
553
632
  // N milliseconds. If `immediate` is passed, trigger the function on the
554
633
  // leading edge, instead of the trailing.
555
634
  _.debounce = function(func, wait, immediate) {
556
- var timeout;
635
+ var timeout, result;
557
636
  return function() {
558
637
  var context = this, args = arguments;
559
638
  var later = function() {
560
639
  timeout = null;
561
- if (!immediate) func.apply(context, args);
640
+ if (!immediate) result = func.apply(context, args);
562
641
  };
563
- if (immediate && !timeout) func.apply(context, args);
642
+ var callNow = immediate && !timeout;
564
643
  clearTimeout(timeout);
565
644
  timeout = setTimeout(later, wait);
645
+ if (callNow) result = func.apply(context, args);
646
+ return result;
566
647
  };
567
648
  };
568
649
 
@@ -573,7 +654,9 @@
573
654
  return function() {
574
655
  if (ran) return memo;
575
656
  ran = true;
576
- return memo = func.apply(this, arguments);
657
+ memo = func.apply(this, arguments);
658
+ func = null;
659
+ return memo;
577
660
  };
578
661
  };
579
662
 
@@ -582,7 +665,8 @@
582
665
  // conditionally execute the original function.
583
666
  _.wrap = function(func, wrapper) {
584
667
  return function() {
585
- var args = [func].concat(slice.call(arguments, 0));
668
+ var args = [func];
669
+ push.apply(args, arguments);
586
670
  return wrapper.apply(this, args);
587
671
  };
588
672
  };
@@ -604,7 +688,9 @@
604
688
  _.after = function(times, func) {
605
689
  if (times <= 0) return func();
606
690
  return function() {
607
- if (--times < 1) { return func.apply(this, arguments); }
691
+ if (--times < 1) {
692
+ return func.apply(this, arguments);
693
+ }
608
694
  };
609
695
  };
610
696
 
@@ -622,7 +708,23 @@
622
708
 
623
709
  // Retrieve the values of an object's properties.
624
710
  _.values = function(obj) {
625
- return _.map(obj, _.identity);
711
+ var values = [];
712
+ for (var key in obj) if (_.has(obj, key)) values.push(obj[key]);
713
+ return values;
714
+ };
715
+
716
+ // Convert an object into a list of `[key, value]` pairs.
717
+ _.pairs = function(obj) {
718
+ var pairs = [];
719
+ for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]);
720
+ return pairs;
721
+ };
722
+
723
+ // Invert the keys and values of an object. The values must be serializable.
724
+ _.invert = function(obj) {
725
+ var result = {};
726
+ for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key;
727
+ return result;
626
728
  };
627
729
 
628
730
  // Return a sorted list of the function names available on the object.
@@ -647,11 +749,22 @@
647
749
 
648
750
  // Return a copy of the object only containing the whitelisted properties.
649
751
  _.pick = function(obj) {
650
- var result = {};
651
- each(_.flatten(slice.call(arguments, 1)), function(key) {
652
- if (key in obj) result[key] = obj[key];
752
+ var copy = {};
753
+ var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
754
+ each(keys, function(key) {
755
+ if (key in obj) copy[key] = obj[key];
653
756
  });
654
- return result;
757
+ return copy;
758
+ };
759
+
760
+ // Return a copy of the object without the blacklisted properties.
761
+ _.omit = function(obj) {
762
+ var copy = {};
763
+ var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
764
+ for (var key in obj) {
765
+ if (!_.contains(keys, key)) copy[key] = obj[key];
766
+ }
767
+ return copy;
655
768
  };
656
769
 
657
770
  // Fill in a given object with default properties.
@@ -678,19 +791,16 @@
678
791
  return obj;
679
792
  };
680
793
 
681
- // Internal recursive comparison function.
682
- function eq(a, b, stack) {
794
+ // Internal recursive comparison function for `isEqual`.
795
+ var eq = function(a, b, aStack, bStack) {
683
796
  // Identical objects are equal. `0 === -0`, but they aren't identical.
684
797
  // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
685
798
  if (a === b) return a !== 0 || 1 / a == 1 / b;
686
799
  // A strict comparison is necessary because `null == undefined`.
687
800
  if (a == null || b == null) return a === b;
688
801
  // Unwrap any wrapped objects.
689
- if (a._chain) a = a._wrapped;
690
- if (b._chain) b = b._wrapped;
691
- // Invoke a custom `isEqual` method if one is provided.
692
- if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b);
693
- if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a);
802
+ if (a instanceof _) a = a._wrapped;
803
+ if (b instanceof _) b = b._wrapped;
694
804
  // Compare `[[Class]]` names.
695
805
  var className = toString.call(a);
696
806
  if (className != toString.call(b)) return false;
@@ -720,14 +830,15 @@
720
830
  if (typeof a != 'object' || typeof b != 'object') return false;
721
831
  // Assume equality for cyclic structures. The algorithm for detecting cyclic
722
832
  // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
723
- var length = stack.length;
833
+ var length = aStack.length;
724
834
  while (length--) {
725
835
  // Linear search. Performance is inversely proportional to the number of
726
836
  // unique nested structures.
727
- if (stack[length] == a) return true;
837
+ if (aStack[length] == a) return bStack[length] == b;
728
838
  }
729
839
  // Add the first object to the stack of traversed objects.
730
- stack.push(a);
840
+ aStack.push(a);
841
+ bStack.push(b);
731
842
  var size = 0, result = true;
732
843
  // Recursively compare objects and arrays.
733
844
  if (className == '[object Array]') {
@@ -737,20 +848,24 @@
737
848
  if (result) {
738
849
  // Deep compare the contents, ignoring non-numeric properties.
739
850
  while (size--) {
740
- // Ensure commutative equality for sparse arrays.
741
- if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break;
851
+ if (!(result = eq(a[size], b[size], aStack, bStack))) break;
742
852
  }
743
853
  }
744
854
  } else {
745
- // Objects with different constructors are not equivalent.
746
- if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false;
855
+ // Objects with different constructors are not equivalent, but `Object`s
856
+ // from different frames are.
857
+ var aCtor = a.constructor, bCtor = b.constructor;
858
+ if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&
859
+ _.isFunction(bCtor) && (bCtor instanceof bCtor))) {
860
+ return false;
861
+ }
747
862
  // Deep compare objects.
748
863
  for (var key in a) {
749
864
  if (_.has(a, key)) {
750
865
  // Count the expected number of properties.
751
866
  size++;
752
867
  // Deep compare each member.
753
- if (!(result = _.has(b, key) && eq(a[key], b[key], stack))) break;
868
+ if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
754
869
  }
755
870
  }
756
871
  // Ensure that both objects contain the same number of properties.
@@ -762,13 +877,14 @@
762
877
  }
763
878
  }
764
879
  // Remove the first object from the stack of traversed objects.
765
- stack.pop();
880
+ aStack.pop();
881
+ bStack.pop();
766
882
  return result;
767
- }
883
+ };
768
884
 
769
885
  // Perform a deep comparison to check if two objects are equal.
770
886
  _.isEqual = function(a, b) {
771
- return eq(a, b, []);
887
+ return eq(a, b, [], []);
772
888
  };
773
889
 
774
890
  // Is a given array, string, or object empty?
@@ -782,7 +898,7 @@
782
898
 
783
899
  // Is a given value a DOM element?
784
900
  _.isElement = function(obj) {
785
- return !!(obj && obj.nodeType == 1);
901
+ return !!(obj && obj.nodeType === 1);
786
902
  };
787
903
 
788
904
  // Is a given value an array?
@@ -796,40 +912,36 @@
796
912
  return obj === Object(obj);
797
913
  };
798
914
 
799
- // Is a given variable an arguments object?
800
- _.isArguments = function(obj) {
801
- return toString.call(obj) == '[object Arguments]';
802
- };
915
+ // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
916
+ each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
917
+ _['is' + name] = function(obj) {
918
+ return toString.call(obj) == '[object ' + name + ']';
919
+ };
920
+ });
921
+
922
+ // Define a fallback version of the method in browsers (ahem, IE), where
923
+ // there isn't any inspectable "Arguments" type.
803
924
  if (!_.isArguments(arguments)) {
804
925
  _.isArguments = function(obj) {
805
926
  return !!(obj && _.has(obj, 'callee'));
806
927
  };
807
928
  }
808
929
 
809
- // Is a given value a function?
810
- _.isFunction = function(obj) {
811
- return toString.call(obj) == '[object Function]';
812
- };
813
-
814
- // Is a given value a string?
815
- _.isString = function(obj) {
816
- return toString.call(obj) == '[object String]';
817
- };
818
-
819
- // Is a given value a number?
820
- _.isNumber = function(obj) {
821
- return toString.call(obj) == '[object Number]';
822
- };
930
+ // Optimize `isFunction` if appropriate.
931
+ if (typeof (/./) !== 'function') {
932
+ _.isFunction = function(obj) {
933
+ return typeof obj === 'function';
934
+ };
935
+ }
823
936
 
824
937
  // Is a given object a finite number?
825
938
  _.isFinite = function(obj) {
826
939
  return _.isNumber(obj) && isFinite(obj);
827
940
  };
828
941
 
829
- // Is the given value `NaN`?
942
+ // Is the given value `NaN`? (NaN is the only number which does not equal itself).
830
943
  _.isNaN = function(obj) {
831
- // `NaN` is the only value for which `===` is not reflexive.
832
- return obj !== obj;
944
+ return _.isNumber(obj) && obj != +obj;
833
945
  };
834
946
 
835
947
  // Is a given value a boolean?
@@ -837,16 +949,6 @@
837
949
  return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
838
950
  };
839
951
 
840
- // Is a given value a date?
841
- _.isDate = function(obj) {
842
- return toString.call(obj) == '[object Date]';
843
- };
844
-
845
- // Is the given value a regular expression?
846
- _.isRegExp = function(obj) {
847
- return toString.call(obj) == '[object RegExp]';
848
- };
849
-
850
952
  // Is a given value equal to null?
851
953
  _.isNull = function(obj) {
852
954
  return obj === null;
@@ -857,7 +959,8 @@
857
959
  return obj === void 0;
858
960
  };
859
961
 
860
- // Has own property?
962
+ // Shortcut function for checking if an object has a given property directly
963
+ // on itself (in other words, not on a prototype).
861
964
  _.has = function(obj, key) {
862
965
  return hasOwnProperty.call(obj, key);
863
966
  };
@@ -878,15 +981,48 @@
878
981
  };
879
982
 
880
983
  // Run a function **n** times.
881
- _.times = function (n, iterator, context) {
984
+ _.times = function(n, iterator, context) {
882
985
  for (var i = 0; i < n; i++) iterator.call(context, i);
883
986
  };
884
987
 
885
- // Escape a string for HTML interpolation.
886
- _.escape = function(string) {
887
- return (''+string).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/\//g,'&#x2F;');
988
+ // Return a random integer between min and max (inclusive).
989
+ _.random = function(min, max) {
990
+ if (max == null) {
991
+ max = min;
992
+ min = 0;
993
+ }
994
+ return min + (0 | Math.random() * (max - min + 1));
995
+ };
996
+
997
+ // List of HTML entities for escaping.
998
+ var entityMap = {
999
+ escape: {
1000
+ '&': '&amp;',
1001
+ '<': '&lt;',
1002
+ '>': '&gt;',
1003
+ '"': '&quot;',
1004
+ "'": '&#x27;',
1005
+ '/': '&#x2F;'
1006
+ }
1007
+ };
1008
+ entityMap.unescape = _.invert(entityMap.escape);
1009
+
1010
+ // Regexes containing the keys and values listed immediately above.
1011
+ var entityRegexes = {
1012
+ escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),
1013
+ unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')
888
1014
  };
889
1015
 
1016
+ // Functions for escaping and unescaping strings to/from HTML interpolation.
1017
+ _.each(['escape', 'unescape'], function(method) {
1018
+ _[method] = function(string) {
1019
+ if (string == null) return '';
1020
+ return ('' + string).replace(entityRegexes[method], function(match) {
1021
+ return entityMap[method][match];
1022
+ });
1023
+ };
1024
+ });
1025
+
890
1026
  // If the value of the named property is a function then invoke it;
891
1027
  // otherwise, return it.
892
1028
  _.result = function(object, property) {
@@ -895,11 +1031,15 @@
895
1031
  return _.isFunction(value) ? value.call(object) : value;
896
1032
  };
897
1033
 
898
- // Add your own custom functions to the Underscore object, ensuring that
899
- // they're correctly added to the OOP wrapper as well.
1034
+ // Add your own custom functions to the Underscore object.
900
1035
  _.mixin = function(obj) {
901
1036
  each(_.functions(obj), function(name){
902
- addToWrapper(name, _[name] = obj[name]);
1037
+ var func = _[name] = obj[name];
1038
+ _.prototype[name] = function() {
1039
+ var args = [this._wrapped];
1040
+ push.apply(args, arguments);
1041
+ return result.call(this, func.apply(_, args));
1042
+ };
903
1043
  });
904
1044
  };
905
1045
 
@@ -922,72 +1062,70 @@
922
1062
  // When customizing `templateSettings`, if you don't want to define an
923
1063
  // interpolation, evaluation or escaping regex, we need one that is
924
1064
  // guaranteed not to match.
925
- var noMatch = /.^/;
1065
+ var noMatch = /(.)^/;
926
1066
 
927
1067
  // Certain characters need to be escaped so that they can be put into a
928
1068
  // string literal.
929
1069
  var escapes = {
930
- '\\': '\\',
931
- "'": "'",
932
- 'r': '\r',
933
- 'n': '\n',
934
- 't': '\t',
935
- 'u2028': '\u2028',
936
- 'u2029': '\u2029'
1070
+ "'": "'",
1071
+ '\\': '\\',
1072
+ '\r': 'r',
1073
+ '\n': 'n',
1074
+ '\t': 't',
1075
+ '\u2028': 'u2028',
1076
+ '\u2029': 'u2029'
937
1077
  };
938
1078
 
939
- for (var p in escapes) escapes[escapes[p]] = p;
940
1079
  var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
941
- var unescaper = /\\(\\|'|r|n|t|u2028|u2029)/g;
942
-
943
- // Within an interpolation, evaluation, or escaping, remove HTML escaping
944
- // that had been previously added.
945
- var unescape = function(code) {
946
- return code.replace(unescaper, function(match, escape) {
947
- return escapes[escape];
948
- });
949
- };
950
1080
 
951
1081
  // JavaScript micro-templating, similar to John Resig's implementation.
952
1082
  // Underscore templating handles arbitrary delimiters, preserves whitespace,
953
1083
  // and correctly escapes quotes within interpolated code.
954
1084
  _.template = function(text, data, settings) {
955
- settings = _.defaults(settings || {}, _.templateSettings);
956
-
957
- // Compile the template source, taking care to escape characters that
958
- // cannot be included in a string literal and then unescape them in code
959
- // blocks.
960
- var source = "__p+='" + text
961
- .replace(escaper, function(match) {
962
- return '\\' + escapes[match];
963
- })
964
- .replace(settings.escape || noMatch, function(match, code) {
965
- return "'+\n_.escape(" + unescape(code) + ")+\n'";
966
- })
967
- .replace(settings.interpolate || noMatch, function(match, code) {
968
- return "'+\n(" + unescape(code) + ")+\n'";
969
- })
970
- .replace(settings.evaluate || noMatch, function(match, code) {
971
- return "';\n" + unescape(code) + "\n;__p+='";
972
- }) + "';\n";
1085
+ settings = _.defaults({}, settings, _.templateSettings);
1086
+
1087
+ // Combine delimiters into one regular expression via alternation.
1088
+ var matcher = new RegExp([
1089
+ (settings.escape || noMatch).source,
1090
+ (settings.interpolate || noMatch).source,
1091
+ (settings.evaluate || noMatch).source
1092
+ ].join('|') + '|$', 'g');
1093
+
1094
+ // Compile the template source, escaping string literals appropriately.
1095
+ var index = 0;
1096
+ var source = "__p+='";
1097
+ text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
1098
+ source += text.slice(index, offset)
1099
+ .replace(escaper, function(match) { return '\\' + escapes[match]; });
1100
+ source +=
1101
+ escape ? "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'" :
1102
+ interpolate ? "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'" :
1103
+ evaluate ? "';\n" + evaluate + "\n__p+='" : '';
1104
+ index = offset + match.length;
1105
+ });
1106
+ source += "';\n";
973
1107
 
974
1108
  // If a variable is not specified, place data values in local scope.
975
1109
  if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
976
1110
 
977
- source = "var __p='';" +
978
- "var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n" +
1111
+ source = "var __t,__p='',__j=Array.prototype.join," +
1112
+ "print=function(){__p+=__j.call(arguments,'');};\n" +
979
1113
  source + "return __p;\n";
980
1114
 
981
- var render = new Function(settings.variable || 'obj', '_', source);
1115
+ try {
1116
+ var render = new Function(settings.variable || 'obj', '_', source);
1117
+ } catch (e) {
1118
+ e.source = source;
1119
+ throw e;
1120
+ }
1121
+
982
1122
  if (data) return render(data, _);
983
1123
  var template = function(data) {
984
1124
  return render.call(this, data, _);
985
1125
  };
986
1126
 
987
- // Provide the compiled function source as a convenience for build time
988
- // precompilation.
989
- template.source = 'function(' + (settings.variable || 'obj') + '){\n' +
990
- source + '}';
1127
+ // Provide the compiled function source as a convenience for precompilation.
1128
+ template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
991
1129
 
992
1130
  return template;
993
1131
  };
@@ -997,29 +1135,15 @@
997
1135
  return _(obj).chain();
998
1136
  };
999
1137
 
1000
- // The OOP Wrapper
1138
+ // OOP
1001
1139
  // ---------------
1002
-
1003
1140
  // If Underscore is called as a function, it returns a wrapped object that
1004
1141
  // can be used OO-style. This wrapper holds altered versions of all the
1005
1142
  // underscore functions. Wrapped objects may be chained.
1006
- var wrapper = function(obj) { this._wrapped = obj; };
1007
-
1008
- // Expose `wrapper.prototype` as `_.prototype`
1009
- _.prototype = wrapper.prototype;
1010
1143
 
1011
1144
  // Helper function to continue chaining intermediate results.
1012
- var result = function(obj, chain) {
1013
- return chain ? _(obj).chain() : obj;
1014
- };
1015
-
1016
- // A method to easily add functions to the OOP wrapper.
1017
- var addToWrapper = function(name, func) {
1018
- wrapper.prototype[name] = function() {
1019
- var args = slice.call(arguments);
1020
- unshift.call(args, this._wrapped);
1021
- return result(func.apply(_, args), this._chain);
1022
- };
1145
+ var result = function(obj) {
1146
+ return this._chain ? _(obj).chain() : obj;
1023
1147
  };
1024
1148
 
1025
1149
  // Add all of the Underscore functions to the wrapper object.
@@ -1028,32 +1152,35 @@
1028
1152
  // Add all mutator Array functions to the wrapper.
1029
1153
  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
1030
1154
  var method = ArrayProto[name];
1031
- wrapper.prototype[name] = function() {
1032
- var wrapped = this._wrapped;
1033
- method.apply(wrapped, arguments);
1034
- var length = wrapped.length;
1035
- if ((name == 'shift' || name == 'splice') && length === 0) delete wrapped[0];
1036
- return result(wrapped, this._chain);
1155
+ _.prototype[name] = function() {
1156
+ var obj = this._wrapped;
1157
+ method.apply(obj, arguments);
1158
+ if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
1159
+ return result.call(this, obj);
1037
1160
  };
1038
1161
  });
1039
1162
 
1040
1163
  // Add all accessor Array functions to the wrapper.
1041
1164
  each(['concat', 'join', 'slice'], function(name) {
1042
1165
  var method = ArrayProto[name];
1043
- wrapper.prototype[name] = function() {
1044
- return result(method.apply(this._wrapped, arguments), this._chain);
1166
+ _.prototype[name] = function() {
1167
+ return result.call(this, method.apply(this._wrapped, arguments));
1045
1168
  };
1046
1169
  });
1047
1170
 
1048
- // Start chaining a wrapped Underscore object.
1049
- wrapper.prototype.chain = function() {
1050
- this._chain = true;
1051
- return this;
1052
- };
1171
+ _.extend(_.prototype, {
1053
1172
 
1054
- // Extracts the result from a wrapped and chained object.
1055
- wrapper.prototype.value = function() {
1056
- return this._wrapped;
1057
- };
1173
+ // Start chaining a wrapped Underscore object.
1174
+ chain: function() {
1175
+ this._chain = true;
1176
+ return this;
1177
+ },
1178
+
1179
+ // Extracts the result from a wrapped and chained object.
1180
+ value: function() {
1181
+ return this._wrapped;
1182
+ }
1183
+
1184
+ });
1058
1185
 
1059
1186
  }).call(this);
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-backbone
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.8.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-04-16 00:00:00.000000000 Z
13
+ date: 2012-09-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: railties
17
- requirement: &70361938130960 !ruby/object:Gem::Requirement
17
+ requirement: &70328437701900 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 3.1.0
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70361938130960
25
+ version_requirements: *70328437701900
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: coffee-script
28
- requirement: &70361938129620 !ruby/object:Gem::Requirement
28
+ requirement: &70328437697400 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,18 +33,106 @@ dependencies:
33
33
  version: 2.2.0
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *70361938129620
36
+ version_requirements: *70328437697400
37
+ - !ruby/object:Gem::Dependency
38
+ name: jquery-rails
39
+ requirement: &70328437695940 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ version: 2.1.3
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: *70328437695940
37
48
  - !ruby/object:Gem::Dependency
38
49
  name: ejs
39
- requirement: &70361938127340 !ruby/object:Gem::Requirement
50
+ requirement: &70328437707540 !ruby/object:Gem::Requirement
40
51
  none: false
41
52
  requirements:
42
53
  - - ~>
43
54
  - !ruby/object:Gem::Version
44
- version: 1.0.0
55
+ version: 1.1.1
45
56
  type: :runtime
46
57
  prerelease: false
47
- version_requirements: *70361938127340
58
+ version_requirements: *70328437707540
59
+ - !ruby/object:Gem::Dependency
60
+ name: rails
61
+ requirement: &70328437765580 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ~>
65
+ - !ruby/object:Gem::Version
66
+ version: 3.2.0
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: *70328437765580
70
+ - !ruby/object:Gem::Dependency
71
+ name: sqlite3
72
+ requirement: &70328437778880 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: *70328437778880
81
+ - !ruby/object:Gem::Dependency
82
+ name: sass
83
+ requirement: &70328437776700 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: *70328437776700
92
+ - !ruby/object:Gem::Dependency
93
+ name: uglifier
94
+ requirement: &70328437772440 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ type: :development
101
+ prerelease: false
102
+ version_requirements: *70328437772440
103
+ - !ruby/object:Gem::Dependency
104
+ name: mocha
105
+ requirement: &70328437785780 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 0.10.3
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: *70328437785780
114
+ - !ruby/object:Gem::Dependency
115
+ name: turn
116
+ requirement: &70328437802400 !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ~>
120
+ - !ruby/object:Gem::Version
121
+ version: 0.8.3
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: *70328437802400
125
+ - !ruby/object:Gem::Dependency
126
+ name: minitest
127
+ requirement: &70328437800700 !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ~>
131
+ - !ruby/object:Gem::Version
132
+ version: 2.10.1
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: *70328437800700
48
136
  description: Quickly setup backbone.js for use with rails 3.1. Generators are provided
49
137
  to quickly get started.
50
138
  email:
@@ -99,13 +187,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
99
187
  version: '0'
100
188
  segments:
101
189
  - 0
102
- hash: 172993818231828983
190
+ hash: -1632237313035377260
103
191
  required_rubygems_version: !ruby/object:Gem::Requirement
104
192
  none: false
105
193
  requirements:
106
194
  - - ! '>='
107
195
  - !ruby/object:Gem::Version
108
196
  version: '0'
197
+ segments:
198
+ - 0
199
+ hash: -1632237313035377260
109
200
  requirements: []
110
201
  rubyforge_project:
111
202
  rubygems_version: 1.8.11