underscore-rails 1.8.2 → 1.8.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ce8085a066bdc1f92a0f5acb443d499285a8e00f
4
- data.tar.gz: 0d019d9874583f7394925d972d1e1c7da5397af8
3
+ metadata.gz: a008d80de418155c46e0bf3ff3d5bf900e345e29
4
+ data.tar.gz: 0d2d31ed44f7e2111f89a36b08aa64dc2098b475
5
5
  SHA512:
6
- metadata.gz: 5982f54fb6ff4e9a100186bfeae138868314c39c29fef3a3e3ce6aaba3c80375fc984d30923119316af15bfde9e1a497adf3a303cc3f4f29d9a9151a922152ad
7
- data.tar.gz: 32b31f13a3ae31573a74df38c63e143940caadea355102f486d418953a8dff4a0b0afb688e25d07f5851de318ee90bf3beb2c9d38d31551af7a1c874d7bad7f7
6
+ metadata.gz: 0cd5241459324537261917568fa0d95aacf9934d875621dbe115c4c1e6d29177efc8e844929378959947fcca575a585f629a5d07d3095bee72ed1ab2a00d3b29
7
+ data.tar.gz: 0470722ea6b70b43696b47f18c585f3328c33f90968e037858a31032e4a56630aa3946ba1488b106ebca9671a0d040be78a58b0456bbb7e8c28648c106e8d3f2
@@ -1,5 +1,5 @@
1
1
  module Underscore
2
2
  module Rails
3
- VERSION = "1.8.2"
3
+ VERSION = "1.8.3"
4
4
  end
5
5
  end
@@ -1,4 +1,4 @@
1
- // Underscore.js 1.8.2
1
+ // Underscore.js 1.8.3
2
2
  // http://underscorejs.org
3
3
  // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
4
4
  // Underscore may be freely distributed under the MIT license.
@@ -55,7 +55,7 @@
55
55
  }
56
56
 
57
57
  // Current version.
58
- _.VERSION = '1.8.2';
58
+ _.VERSION = '1.8.3';
59
59
 
60
60
  // Internal function that returns an efficient (for current engines) version
61
61
  // of the passed-in callback, to be repeatedly applied in other Underscore
@@ -122,12 +122,20 @@
122
122
  return result;
123
123
  };
124
124
 
125
+ var property = function(key) {
126
+ return function(obj) {
127
+ return obj == null ? void 0 : obj[key];
128
+ };
129
+ };
130
+
125
131
  // Helper for collection methods to determine whether a collection
126
132
  // should be iterated as an array or as an object
127
133
  // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
134
+ // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
128
135
  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
136
+ var getLength = property('length');
129
137
  var isArrayLike = function(collection) {
130
- var length = collection && collection.length;
138
+ var length = getLength(collection);
131
139
  return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
132
140
  };
133
141
 
@@ -252,11 +260,12 @@
252
260
  return false;
253
261
  };
254
262
 
255
- // Determine if the array or object contains a given value (using `===`).
263
+ // Determine if the array or object contains a given item (using `===`).
256
264
  // Aliased as `includes` and `include`.
257
- _.contains = _.includes = _.include = function(obj, target, fromIndex) {
265
+ _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
258
266
  if (!isArrayLike(obj)) obj = _.values(obj);
259
- return _.indexOf(obj, target, typeof fromIndex == 'number' && fromIndex) >= 0;
267
+ if (typeof fromIndex != 'number' || guard) fromIndex = 0;
268
+ return _.indexOf(obj, item, fromIndex) >= 0;
260
269
  };
261
270
 
262
271
  // Invoke a method (with arguments) on every item in a collection.
@@ -480,7 +489,7 @@
480
489
  // Internal implementation of a recursive `flatten` function.
481
490
  var flatten = function(input, shallow, strict, startIndex) {
482
491
  var output = [], idx = 0;
483
- for (var i = startIndex || 0, length = input && input.length; i < length; i++) {
492
+ for (var i = startIndex || 0, length = getLength(input); i < length; i++) {
484
493
  var value = input[i];
485
494
  if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
486
495
  //flatten current level of array or arguments object
@@ -511,7 +520,6 @@
511
520
  // been sorted, you have the option of using a faster algorithm.
512
521
  // Aliased as `unique`.
513
522
  _.uniq = _.unique = function(array, isSorted, iteratee, context) {
514
- if (array == null) return [];
515
523
  if (!_.isBoolean(isSorted)) {
516
524
  context = iteratee;
517
525
  iteratee = isSorted;
@@ -520,7 +528,7 @@
520
528
  if (iteratee != null) iteratee = cb(iteratee, context);
521
529
  var result = [];
522
530
  var seen = [];
523
- for (var i = 0, length = array.length; i < length; i++) {
531
+ for (var i = 0, length = getLength(array); i < length; i++) {
524
532
  var value = array[i],
525
533
  computed = iteratee ? iteratee(value, i, array) : value;
526
534
  if (isSorted) {
@@ -547,10 +555,9 @@
547
555
  // Produce an array that contains every item shared between all the
548
556
  // passed-in arrays.
549
557
  _.intersection = function(array) {
550
- if (array == null) return [];
551
558
  var result = [];
552
559
  var argsLength = arguments.length;
553
- for (var i = 0, length = array.length; i < length; i++) {
560
+ for (var i = 0, length = getLength(array); i < length; i++) {
554
561
  var item = array[i];
555
562
  if (_.contains(result, item)) continue;
556
563
  for (var j = 1; j < argsLength; j++) {
@@ -579,7 +586,7 @@
579
586
  // Complement of _.zip. Unzip accepts an array of arrays and groups
580
587
  // each array's elements on shared indices
581
588
  _.unzip = function(array) {
582
- var length = array && _.max(array, 'length').length || 0;
589
+ var length = array && _.max(array, getLength).length || 0;
583
590
  var result = Array(length);
584
591
 
585
592
  for (var index = 0; index < length; index++) {
@@ -593,7 +600,7 @@
593
600
  // the corresponding values.
594
601
  _.object = function(list, values) {
595
602
  var result = {};
596
- for (var i = 0, length = list && list.length; i < length; i++) {
603
+ for (var i = 0, length = getLength(list); i < length; i++) {
597
604
  if (values) {
598
605
  result[list[i]] = values[i];
599
606
  } else {
@@ -603,42 +610,11 @@
603
610
  return result;
604
611
  };
605
612
 
606
- // Return the position of the first occurrence of an item in an array,
607
- // or -1 if the item is not included in the array.
608
- // If the array is large and already in sort order, pass `true`
609
- // for **isSorted** to use binary search.
610
- _.indexOf = function(array, item, isSorted) {
611
- var i = 0, length = array && array.length;
612
- if (typeof isSorted == 'number') {
613
- i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
614
- } else if (isSorted && length) {
615
- i = _.sortedIndex(array, item);
616
- return array[i] === item ? i : -1;
617
- }
618
- if (item !== item) {
619
- return _.findIndex(slice.call(array, i), _.isNaN);
620
- }
621
- for (; i < length; i++) if (array[i] === item) return i;
622
- return -1;
623
- };
624
-
625
- _.lastIndexOf = function(array, item, from) {
626
- var idx = array ? array.length : 0;
627
- if (typeof from == 'number') {
628
- idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1);
629
- }
630
- if (item !== item) {
631
- return _.findLastIndex(slice.call(array, 0, idx), _.isNaN);
632
- }
633
- while (--idx >= 0) if (array[idx] === item) return idx;
634
- return -1;
635
- };
636
-
637
613
  // Generator function to create the findIndex and findLastIndex functions
638
- function createIndexFinder(dir) {
614
+ function createPredicateIndexFinder(dir) {
639
615
  return function(array, predicate, context) {
640
616
  predicate = cb(predicate, context);
641
- var length = array != null && array.length;
617
+ var length = getLength(array);
642
618
  var index = dir > 0 ? 0 : length - 1;
643
619
  for (; index >= 0 && index < length; index += dir) {
644
620
  if (predicate(array[index], index, array)) return index;
@@ -648,16 +624,15 @@
648
624
  }
649
625
 
650
626
  // Returns the first index on an array-like that passes a predicate test
651
- _.findIndex = createIndexFinder(1);
652
-
653
- _.findLastIndex = createIndexFinder(-1);
627
+ _.findIndex = createPredicateIndexFinder(1);
628
+ _.findLastIndex = createPredicateIndexFinder(-1);
654
629
 
655
630
  // Use a comparator function to figure out the smallest index at which
656
631
  // an object should be inserted so as to maintain order. Uses binary search.
657
632
  _.sortedIndex = function(array, obj, iteratee, context) {
658
633
  iteratee = cb(iteratee, context, 1);
659
634
  var value = iteratee(obj);
660
- var low = 0, high = array.length;
635
+ var low = 0, high = getLength(array);
661
636
  while (low < high) {
662
637
  var mid = Math.floor((low + high) / 2);
663
638
  if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
@@ -665,11 +640,43 @@
665
640
  return low;
666
641
  };
667
642
 
643
+ // Generator function to create the indexOf and lastIndexOf functions
644
+ function createIndexFinder(dir, predicateFind, sortedIndex) {
645
+ return function(array, item, idx) {
646
+ var i = 0, length = getLength(array);
647
+ if (typeof idx == 'number') {
648
+ if (dir > 0) {
649
+ i = idx >= 0 ? idx : Math.max(idx + length, i);
650
+ } else {
651
+ length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
652
+ }
653
+ } else if (sortedIndex && idx && length) {
654
+ idx = sortedIndex(array, item);
655
+ return array[idx] === item ? idx : -1;
656
+ }
657
+ if (item !== item) {
658
+ idx = predicateFind(slice.call(array, i, length), _.isNaN);
659
+ return idx >= 0 ? idx + i : -1;
660
+ }
661
+ for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
662
+ if (array[idx] === item) return idx;
663
+ }
664
+ return -1;
665
+ };
666
+ }
667
+
668
+ // Return the position of the first occurrence of an item in an array,
669
+ // or -1 if the item is not included in the array.
670
+ // If the array is large and already in sort order, pass `true`
671
+ // for **isSorted** to use binary search.
672
+ _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);
673
+ _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);
674
+
668
675
  // Generate an integer Array containing an arithmetic progression. A port of
669
676
  // the native Python `range()` function. See
670
677
  // [the Python documentation](http://docs.python.org/library/functions.html#range).
671
678
  _.range = function(start, stop, step) {
672
- if (arguments.length <= 1) {
679
+ if (stop == null) {
673
680
  stop = start || 0;
674
681
  start = 0;
675
682
  }
@@ -1048,6 +1055,15 @@
1048
1055
  // Fill in a given object with default properties.
1049
1056
  _.defaults = createAssigner(_.allKeys, true);
1050
1057
 
1058
+ // Creates an object that inherits from the given prototype object.
1059
+ // If additional properties are provided then they will be added to the
1060
+ // created object.
1061
+ _.create = function(prototype, props) {
1062
+ var result = baseCreate(prototype);
1063
+ if (props) _.extendOwn(result, props);
1064
+ return result;
1065
+ };
1066
+
1051
1067
  // Create a (shallow-cloned) duplicate of an object.
1052
1068
  _.clone = function(obj) {
1053
1069
  if (!_.isObject(obj)) return obj;
@@ -1125,7 +1141,7 @@
1125
1141
  }
1126
1142
  // Assume equality for cyclic structures. The algorithm for detecting cyclic
1127
1143
  // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
1128
-
1144
+
1129
1145
  // Initializing stack of traversed objects.
1130
1146
  // It's done here since we only need them for objects and arrays comparison.
1131
1147
  aStack = aStack || [];
@@ -1276,11 +1292,7 @@
1276
1292
 
1277
1293
  _.noop = function(){};
1278
1294
 
1279
- _.property = function(key) {
1280
- return function(obj) {
1281
- return obj == null ? void 0 : obj[key];
1282
- };
1283
- };
1295
+ _.property = property;
1284
1296
 
1285
1297
  // Generates a function for a given object that returns a given property.
1286
1298
  _.propertyOf = function(obj) {
@@ -1289,7 +1301,7 @@
1289
1301
  };
1290
1302
  };
1291
1303
 
1292
- // Returns a predicate for checking whether an object has a given set of
1304
+ // Returns a predicate for checking whether an object has a given set of
1293
1305
  // `key:value` pairs.
1294
1306
  _.matcher = _.matches = function(attrs) {
1295
1307
  attrs = _.extendOwn({}, attrs);
@@ -1516,7 +1528,7 @@
1516
1528
  // Provide unwrapping proxy for some methods used in engine operations
1517
1529
  // such as arithmetic and JSON stringification.
1518
1530
  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
1519
-
1531
+
1520
1532
  _.prototype.toString = function() {
1521
1533
  return '' + this._wrapped;
1522
1534
  };
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: underscore-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.2
4
+ version: 1.8.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robin Wenglewski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-01 00:00:00.000000000 Z
11
+ date: 2015-06-09 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -17,7 +17,7 @@ executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
- - ".gitignore"
20
+ - .gitignore
21
21
  - Gemfile
22
22
  - LICENSE.md
23
23
  - Rakefile
@@ -36,17 +36,17 @@ require_paths:
36
36
  - lib
37
37
  required_ruby_version: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - ">="
39
+ - - '>='
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
42
  required_rubygems_version: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - ">="
44
+ - - '>='
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0'
47
47
  requirements: []
48
48
  rubyforge_project: underscore-rails
49
- rubygems_version: 2.2.2
49
+ rubygems_version: 2.0.14
50
50
  signing_key:
51
51
  specification_version: 4
52
52
  summary: underscore.js asset pipeline provider/wrapper