underscore-rails 1.5.1 → 1.5.2

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: 286bd9442baeafa07471d15d84985adbfd8e79d7
4
- data.tar.gz: 0a258dd89f728e9c245e80cb7722d73187ce666f
3
+ metadata.gz: 121c2f4878563957cac04e83f26f8f007b3a3152
4
+ data.tar.gz: 0c1082f042569bf4d16f3813894bd41bce82dc88
5
5
  SHA512:
6
- metadata.gz: b40555f186dada31374297d07df18e550a080274b4e9745f1d45988775f7ac479552589a8dfe4babddb1ff761e8f9ae8805245e0635d9dce5dd2e6e5111ce1a7
7
- data.tar.gz: e1deef85e8268f0f8963e84e651c422d67156f216ae297772046e8977b037cb44cd00dc6ffbe5caa15724de7894f011551c19b8d4bd8a9f2abaa942afd272502
6
+ metadata.gz: 0f217295aec0b04bc1d6df709a13a4864530d778febc168b96bd9ac23658977efd0c47d7eaeea68a12aa6fdd6fc1a60c9d637d9a206cd647a91096e6a26717fb
7
+ data.tar.gz: 5ec01cbf3d18fa12addb51e516ed25f9d329518997bc9cfdbbce11d82e4128b8224cfbe4e87a779be99535343b75d54132b6d62da58e414067b4b2171c62e2e9
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013 Robin Wenglewski, Travis Jeffery
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/Readme.md CHANGED
@@ -1,16 +1,15 @@
1
1
  Rails 3.1 asset-pipeline gem to provide underscore.js
2
2
 
3
- # Install
4
-
5
- gem 'underscore-rails'
3
+ # Setup
6
4
 
5
+ Have in your Gemfile:
7
6
 
8
- # Use
7
+ gem 'underscore-rails'
9
8
 
10
- In your application.js manifest:
9
+ And, have in your application.js manifest:
11
10
 
12
11
  //= require underscore
13
12
 
14
- or directly available under `/assets/underscore.js`
13
+ (also directly available under `/assets/underscore.js`)
15
14
 
16
- Easy as pie.
15
+ Easy as pie.
@@ -1,5 +1,5 @@
1
1
  module Underscore
2
2
  module Rails
3
- VERSION = "1.5.1"
3
+ VERSION = "1.5.2"
4
4
  end
5
5
  end
@@ -9,7 +9,8 @@ Gem::Specification.new do |s|
9
9
  s.email = ["robin@wenglewski.de"]
10
10
  s.homepage = "https://github.com/rweng/underscore-rails"
11
11
  s.summary = %q{underscore.js asset pipeline provider/wrapper}
12
-
12
+ s.license = "MIT"
13
+
13
14
  s.rubyforge_project = "underscore-rails"
14
15
 
15
16
  s.files = `git ls-files`.split("\n")
@@ -1,4 +1,4 @@
1
- // Underscore.js 1.5.1
1
+ // Underscore.js 1.5.2
2
2
  // http://underscorejs.org
3
3
  // (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
4
4
  // Underscore may be freely distributed under the MIT license.
@@ -8,7 +8,7 @@
8
8
  // Baseline setup
9
9
  // --------------
10
10
 
11
- // Establish the root object, `window` in the browser, or `global` on the server.
11
+ // Establish the root object, `window` in the browser, or `exports` on the server.
12
12
  var root = this;
13
13
 
14
14
  // Save the previous value of the `_` variable.
@@ -65,7 +65,7 @@
65
65
  }
66
66
 
67
67
  // Current version.
68
- _.VERSION = '1.5.1';
68
+ _.VERSION = '1.5.2';
69
69
 
70
70
  // Collection Functions
71
71
  // --------------------
@@ -78,14 +78,13 @@
78
78
  if (nativeForEach && obj.forEach === nativeForEach) {
79
79
  obj.forEach(iterator, context);
80
80
  } else if (obj.length === +obj.length) {
81
- for (var i = 0, l = obj.length; i < l; i++) {
81
+ for (var i = 0, length = obj.length; i < length; i++) {
82
82
  if (iterator.call(context, obj[i], i, obj) === breaker) return;
83
83
  }
84
84
  } else {
85
- for (var key in obj) {
86
- if (_.has(obj, key)) {
87
- if (iterator.call(context, obj[key], key, obj) === breaker) return;
88
- }
85
+ var keys = _.keys(obj);
86
+ for (var i = 0, length = keys.length; i < length; i++) {
87
+ if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
89
88
  }
90
89
  }
91
90
  };
@@ -284,7 +283,8 @@
284
283
  return result.value;
285
284
  };
286
285
 
287
- // Shuffle an array.
286
+ // Shuffle an array, using the modern version of the
287
+ // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
288
288
  _.shuffle = function(obj) {
289
289
  var rand;
290
290
  var index = 0;
@@ -297,6 +297,16 @@
297
297
  return shuffled;
298
298
  };
299
299
 
300
+ // Sample **n** random values from an array.
301
+ // If **n** is not specified, returns a single random element from the array.
302
+ // The internal `guard` argument allows it to work with `map`.
303
+ _.sample = function(obj, n, guard) {
304
+ if (arguments.length < 2 || guard) {
305
+ return obj[_.random(obj.length - 1)];
306
+ }
307
+ return _.shuffle(obj).slice(0, Math.max(0, n));
308
+ };
309
+
300
310
  // An internal function to generate lookup iterators.
301
311
  var lookupIterator = function(value) {
302
312
  return _.isFunction(value) ? value : function(obj){ return obj[value]; };
@@ -307,9 +317,9 @@
307
317
  var iterator = lookupIterator(value);
308
318
  return _.pluck(_.map(obj, function(value, index, list) {
309
319
  return {
310
- value : value,
311
- index : index,
312
- criteria : iterator.call(context, value, index, list)
320
+ value: value,
321
+ index: index,
322
+ criteria: iterator.call(context, value, index, list)
313
323
  };
314
324
  }).sort(function(left, right) {
315
325
  var a = left.criteria;
@@ -318,38 +328,41 @@
318
328
  if (a > b || a === void 0) return 1;
319
329
  if (a < b || b === void 0) return -1;
320
330
  }
321
- return left.index < right.index ? -1 : 1;
331
+ return left.index - right.index;
322
332
  }), 'value');
323
333
  };
324
334
 
325
335
  // An internal function used for aggregate "group by" operations.
326
- var group = function(obj, value, context, behavior) {
327
- var result = {};
328
- var iterator = lookupIterator(value == null ? _.identity : value);
329
- each(obj, function(value, index) {
330
- var key = iterator.call(context, value, index, obj);
331
- behavior(result, key, value);
332
- });
333
- return result;
336
+ var group = function(behavior) {
337
+ return function(obj, value, context) {
338
+ var result = {};
339
+ var iterator = value == null ? _.identity : lookupIterator(value);
340
+ each(obj, function(value, index) {
341
+ var key = iterator.call(context, value, index, obj);
342
+ behavior(result, key, value);
343
+ });
344
+ return result;
345
+ };
334
346
  };
335
347
 
336
348
  // Groups the object's values by a criterion. Pass either a string attribute
337
349
  // to group by, or a function that returns the criterion.
338
- _.groupBy = function(obj, value, context) {
339
- return group(obj, value, context, function(result, key, value) {
340
- (_.has(result, key) ? result[key] : (result[key] = [])).push(value);
341
- });
342
- };
350
+ _.groupBy = group(function(result, key, value) {
351
+ (_.has(result, key) ? result[key] : (result[key] = [])).push(value);
352
+ });
353
+
354
+ // Indexes the object's values by a criterion, similar to `groupBy`, but for
355
+ // when you know that your index values will be unique.
356
+ _.indexBy = group(function(result, key, value) {
357
+ result[key] = value;
358
+ });
343
359
 
344
360
  // Counts instances of an object that group by a certain criterion. Pass
345
361
  // either a string attribute to count by, or a function that returns the
346
362
  // criterion.
347
- _.countBy = function(obj, value, context) {
348
- return group(obj, value, context, function(result, key) {
349
- if (!_.has(result, key)) result[key] = 0;
350
- result[key]++;
351
- });
352
- };
363
+ _.countBy = group(function(result, key) {
364
+ _.has(result, key) ? result[key]++ : result[key] = 1;
365
+ });
353
366
 
354
367
  // Use a comparator function to figure out the smallest index at which
355
368
  // an object should be inserted so as to maintain order. Uses binary search.
@@ -386,7 +399,7 @@
386
399
  // allows it to work with `_.map`.
387
400
  _.first = _.head = _.take = function(array, n, guard) {
388
401
  if (array == null) return void 0;
389
- return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
402
+ return (n == null) || guard ? array[0] : slice.call(array, 0, n);
390
403
  };
391
404
 
392
405
  // Returns everything but the last entry of the array. Especially useful on
@@ -401,10 +414,10 @@
401
414
  // values in the array. The **guard** check allows it to work with `_.map`.
402
415
  _.last = function(array, n, guard) {
403
416
  if (array == null) return void 0;
404
- if ((n != null) && !guard) {
405
- return slice.call(array, Math.max(array.length - n, 0));
406
- } else {
417
+ if ((n == null) || guard) {
407
418
  return array[array.length - 1];
419
+ } else {
420
+ return slice.call(array, Math.max(array.length - n, 0));
408
421
  }
409
422
  };
410
423
 
@@ -436,7 +449,7 @@
436
449
  return output;
437
450
  };
438
451
 
439
- // Return a completely flattened version of an array.
452
+ // Flatten out an array, either recursively (by default), or just one level.
440
453
  _.flatten = function(array, shallow) {
441
454
  return flatten(array, shallow, []);
442
455
  };
@@ -508,7 +521,7 @@
508
521
  _.object = function(list, values) {
509
522
  if (list == null) return {};
510
523
  var result = {};
511
- for (var i = 0, l = list.length; i < l; i++) {
524
+ for (var i = 0, length = list.length; i < length; i++) {
512
525
  if (values) {
513
526
  result[list[i]] = values[i];
514
527
  } else {
@@ -526,17 +539,17 @@
526
539
  // for **isSorted** to use binary search.
527
540
  _.indexOf = function(array, item, isSorted) {
528
541
  if (array == null) return -1;
529
- var i = 0, l = array.length;
542
+ var i = 0, length = array.length;
530
543
  if (isSorted) {
531
544
  if (typeof isSorted == 'number') {
532
- i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);
545
+ i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted);
533
546
  } else {
534
547
  i = _.sortedIndex(array, item);
535
548
  return array[i] === item ? i : -1;
536
549
  }
537
550
  }
538
551
  if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
539
- for (; i < l; i++) if (array[i] === item) return i;
552
+ for (; i < length; i++) if (array[i] === item) return i;
540
553
  return -1;
541
554
  };
542
555
 
@@ -562,11 +575,11 @@
562
575
  }
563
576
  step = arguments[2] || 1;
564
577
 
565
- var len = Math.max(Math.ceil((stop - start) / step), 0);
578
+ var length = Math.max(Math.ceil((stop - start) / step), 0);
566
579
  var idx = 0;
567
- var range = new Array(len);
580
+ var range = new Array(length);
568
581
 
569
- while(idx < len) {
582
+ while(idx < length) {
570
583
  range[idx++] = start;
571
584
  start += step;
572
585
  }
@@ -678,17 +691,24 @@
678
691
  // N milliseconds. If `immediate` is passed, trigger the function on the
679
692
  // leading edge, instead of the trailing.
680
693
  _.debounce = function(func, wait, immediate) {
681
- var result;
682
- var timeout = null;
694
+ var timeout, args, context, timestamp, result;
683
695
  return function() {
684
- var context = this, args = arguments;
696
+ context = this;
697
+ args = arguments;
698
+ timestamp = new Date();
685
699
  var later = function() {
686
- timeout = null;
687
- if (!immediate) result = func.apply(context, args);
700
+ var last = (new Date()) - timestamp;
701
+ if (last < wait) {
702
+ timeout = setTimeout(later, wait - last);
703
+ } else {
704
+ timeout = null;
705
+ if (!immediate) result = func.apply(context, args);
706
+ }
688
707
  };
689
708
  var callNow = immediate && !timeout;
690
- clearTimeout(timeout);
691
- timeout = setTimeout(later, wait);
709
+ if (!timeout) {
710
+ timeout = setTimeout(later, wait);
711
+ }
692
712
  if (callNow) result = func.apply(context, args);
693
713
  return result;
694
714
  };
@@ -754,22 +774,33 @@
754
774
 
755
775
  // Retrieve the values of an object's properties.
756
776
  _.values = function(obj) {
757
- var values = [];
758
- for (var key in obj) if (_.has(obj, key)) values.push(obj[key]);
777
+ var keys = _.keys(obj);
778
+ var length = keys.length;
779
+ var values = new Array(length);
780
+ for (var i = 0; i < length; i++) {
781
+ values[i] = obj[keys[i]];
782
+ }
759
783
  return values;
760
784
  };
761
785
 
762
786
  // Convert an object into a list of `[key, value]` pairs.
763
787
  _.pairs = function(obj) {
764
- var pairs = [];
765
- for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]);
788
+ var keys = _.keys(obj);
789
+ var length = keys.length;
790
+ var pairs = new Array(length);
791
+ for (var i = 0; i < length; i++) {
792
+ pairs[i] = [keys[i], obj[keys[i]]];
793
+ }
766
794
  return pairs;
767
795
  };
768
796
 
769
797
  // Invert the keys and values of an object. The values must be serializable.
770
798
  _.invert = function(obj) {
771
799
  var result = {};
772
- for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key;
800
+ var keys = _.keys(obj);
801
+ for (var i = 0, length = keys.length; i < length; i++) {
802
+ result[obj[keys[i]]] = keys[i];
803
+ }
773
804
  return result;
774
805
  };
775
806
 
@@ -1084,7 +1115,7 @@
1084
1115
 
1085
1116
  // Add your own custom functions to the Underscore object.
1086
1117
  _.mixin = function(obj) {
1087
- each(_.functions(obj), function(name){
1118
+ each(_.functions(obj), function(name) {
1088
1119
  var func = _[name] = obj[name];
1089
1120
  _.prototype[name] = function() {
1090
1121
  var args = [this._wrapped];
@@ -1242,4 +1273,4 @@
1242
1273
 
1243
1274
  });
1244
1275
 
1245
- }).call(this);
1276
+ }).call(this);
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.5.1
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robin Wenglewski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-07-12 00:00:00.000000000 Z
11
+ date: 2013-10-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -19,6 +19,7 @@ extra_rdoc_files: []
19
19
  files:
20
20
  - .gitignore
21
21
  - Gemfile
22
+ - LICENSE.md
22
23
  - Rakefile
23
24
  - Readme.md
24
25
  - lib/underscore-rails.rb
@@ -26,7 +27,8 @@ files:
26
27
  - underscore-rails.gemspec
27
28
  - vendor/assets/javascripts/underscore.js
28
29
  homepage: https://github.com/rweng/underscore-rails
29
- licenses: []
30
+ licenses:
31
+ - MIT
30
32
  metadata: {}
31
33
  post_install_message:
32
34
  rdoc_options: []