underscore-source 1.1.4 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,5 @@
1
1
  module Underscore
2
2
  module Source
3
- VERSION = "1.1.4"
3
+ VERSION = "1.1.5"
4
4
  end
5
5
  end
@@ -1,4 +1,4 @@
1
- // Underscore.js 1.1.4
1
+ // Underscore.js 1.1.5
2
2
  // (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.
3
3
  // Underscore is freely distributable under the MIT license.
4
4
  // Portions of Underscore are inspired or borrowed from Prototype,
@@ -21,7 +21,7 @@
21
21
  var breaker = {};
22
22
 
23
23
  // Save bytes in the minified (but not gzipped) version:
24
- var ArrayProto = Array.prototype, ObjProto = Object.prototype;
24
+ var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
25
25
 
26
26
  // Create quick reference variables for speed access to core prototypes.
27
27
  var slice = ArrayProto.slice,
@@ -42,7 +42,8 @@
42
42
  nativeIndexOf = ArrayProto.indexOf,
43
43
  nativeLastIndexOf = ArrayProto.lastIndexOf,
44
44
  nativeIsArray = Array.isArray,
45
- nativeKeys = Object.keys;
45
+ nativeKeys = Object.keys,
46
+ nativeBind = FuncProto.bind;
46
47
 
47
48
  // Create a safe reference to the Underscore object for use below.
48
49
  var _ = function(obj) { return new wrapper(obj); };
@@ -58,7 +59,7 @@
58
59
  }
59
60
 
60
61
  // Current version.
61
- _.VERSION = '1.1.4';
62
+ _.VERSION = '1.1.5';
62
63
 
63
64
  // Collection Functions
64
65
  // --------------------
@@ -67,7 +68,6 @@
67
68
  // Handles objects implementing `forEach`, arrays, and raw objects.
68
69
  // Delegates to **ECMAScript 5**'s native `forEach` if available.
69
70
  var each = _.each = _.forEach = function(obj, iterator, context) {
70
- var value;
71
71
  if (obj == null) return;
72
72
  if (nativeForEach && obj.forEach === nativeForEach) {
73
73
  obj.forEach(iterator, context);
@@ -285,7 +285,7 @@
285
285
  // values in the array. Aliased as `head`. The **guard** check allows it to work
286
286
  // with `_.map`.
287
287
  _.first = _.head = function(array, n, guard) {
288
- return n && !guard ? slice.call(array, 0, n) : array[0];
288
+ return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
289
289
  };
290
290
 
291
291
  // Returns everything but the first entry of the array. Aliased as `tail`.
@@ -293,7 +293,7 @@
293
293
  // the rest of the values in the array from that index onward. The **guard**
294
294
  // check allows it to work with `_.map`.
295
295
  _.rest = _.tail = function(array, index, guard) {
296
- return slice.call(array, _.isUndefined(index) || guard ? 1 : index);
296
+ return slice.call(array, (index == null) || guard ? 1 : index);
297
297
  };
298
298
 
299
299
  // Get the last element of an array.
@@ -360,12 +360,13 @@
360
360
  // for **isSorted** to use binary search.
361
361
  _.indexOf = function(array, item, isSorted) {
362
362
  if (array == null) return -1;
363
+ var i, l;
363
364
  if (isSorted) {
364
- var i = _.sortedIndex(array, item);
365
+ i = _.sortedIndex(array, item);
365
366
  return array[i] === item ? i : -1;
366
367
  }
367
368
  if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
368
- for (var i = 0, l = array.length; i < l; i++) if (array[i] === item) return i;
369
+ for (i = 0, l = array.length; i < l; i++) if (array[i] === item) return i;
369
370
  return -1;
370
371
  };
371
372
 
@@ -383,18 +384,21 @@
383
384
  // the native Python `range()` function. See
384
385
  // [the Python documentation](http://docs.python.org/library/functions.html#range).
385
386
  _.range = function(start, stop, step) {
386
- var args = slice.call(arguments),
387
- solo = args.length <= 1,
388
- start = solo ? 0 : args[0],
389
- stop = solo ? args[0] : args[1],
390
- step = args[2] || 1,
391
- len = Math.max(Math.ceil((stop - start) / step), 0),
392
- idx = 0,
393
- range = new Array(len);
394
- while (idx < len) {
387
+ if (arguments.length <= 1) {
388
+ stop = start || 0;
389
+ start = 0;
390
+ }
391
+ step = arguments[2] || 1;
392
+
393
+ var len = Math.max(Math.ceil((stop - start) / step), 0);
394
+ var idx = 0;
395
+ var range = new Array(len);
396
+
397
+ while(idx < len) {
395
398
  range[idx++] = start;
396
399
  start += step;
397
400
  }
401
+
398
402
  return range;
399
403
  };
400
404
 
@@ -403,10 +407,12 @@
403
407
 
404
408
  // Create a function bound to a given object (assigning `this`, and arguments,
405
409
  // optionally). Binding with arguments is also known as `curry`.
410
+ // Delegates to **ECMAScript 5**'s native `Function.bind` if available.
406
411
  _.bind = function(func, obj) {
412
+ if (nativeBind && func.bind === nativeBind) return func.bind.apply(func, slice.call(arguments, 1));
407
413
  var args = slice.call(arguments, 2);
408
414
  return function() {
409
- return func.apply(obj || {}, args.concat(slice.call(arguments)));
415
+ return func.apply(obj, args.concat(slice.call(arguments)));
410
416
  };
411
417
  };
412
418
 
@@ -425,7 +431,7 @@
425
431
  hasher = hasher || _.identity;
426
432
  return function() {
427
433
  var key = hasher.apply(this, arguments);
428
- return key in memo ? memo[key] : (memo[key] = func.apply(this, arguments));
434
+ return hasOwnProperty.call(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
429
435
  };
430
436
  };
431
437
 
@@ -469,6 +475,17 @@
469
475
  return limit(func, wait, true);
470
476
  };
471
477
 
478
+ // Returns a function that will be executed at most one time, no matter how
479
+ // often you call it. Useful for lazy initialization.
480
+ _.once = function(func) {
481
+ var ran = false, memo;
482
+ return function() {
483
+ if (ran) return memo;
484
+ ran = true;
485
+ return memo = func.apply(this, arguments);
486
+ };
487
+ };
488
+
472
489
  // Returns the first function passed as an argument to the second,
473
490
  // allowing you to adjust arguments, run code before and after, and
474
491
  // conditionally execute the original function.
@@ -498,7 +515,7 @@
498
515
  // Retrieve the names of an object's properties.
499
516
  // Delegates to **ECMAScript 5**'s native `Object.keys`
500
517
  _.keys = nativeKeys || function(obj) {
501
- if (_.isArray(obj)) return _.range(0, obj.length);
518
+ if (obj !== Object(obj)) throw new TypeError('Invalid object');
502
519
  var keys = [];
503
520
  for (var key in obj) if (hasOwnProperty.call(obj, key)) keys[keys.length] = key;
504
521
  return keys;
@@ -523,6 +540,14 @@
523
540
  return obj;
524
541
  };
525
542
 
543
+ // Fill in a given object with default properties.
544
+ _.defaults = function(obj) {
545
+ each(slice.call(arguments, 1), function(source) {
546
+ for (var prop in source) if (obj[prop] == null) obj[prop] = source[prop];
547
+ });
548
+ return obj;
549
+ };
550
+
526
551
  // Create a (shallow-cloned) duplicate of an object.
527
552
  _.clone = function(obj) {
528
553
  return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: underscore-source
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.1.4
5
+ version: 1.1.5
6
6
  platform: ruby
7
7
  authors:
8
8
  - Daniel X. Moore