underscore_extensions 0.2.1 → 0.2.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.
data/.gitignore CHANGED
@@ -1,6 +1,5 @@
1
1
  *.gem
2
2
  .bundle
3
- ./idea/*
3
+ .idea/*
4
4
  Gemfile.lock
5
- ./chromedriver.log
6
5
  pkg/*
data/.rvmrc CHANGED
@@ -1 +1 @@
1
- rvm 1.9.3-p327-perf@underscore_extensions --create
1
+ rvm 1.9.3@underscore_extensions --create
data/Rakefile CHANGED
@@ -3,7 +3,7 @@ ENV['JASMINE_SPEC_FORMAT'] = 'Fuubar'
3
3
  # ENV['JASMINE_BROWSER'] = 'chrome'
4
4
 
5
5
  require 'bundler/gem_tasks'
6
- require 'jshint/tasks'
6
+ require 'jslint/tasks'
7
7
 
8
8
  begin
9
9
  require 'jasmine'
@@ -14,6 +14,6 @@ rescue LoadError
14
14
  end
15
15
  end
16
16
 
17
- JSHint.config_path = 'config/jshint.yml'
17
+ JSLint.config_path = 'config/jshint.yml'
18
18
 
19
- task :default => [:jshint, :'jasmine:ci']
19
+ task :default => [:jslint, :'jasmine:ci']
data/config/jshint.yml CHANGED
@@ -1,27 +1,26 @@
1
1
  # ------------ rake task options ------------
2
2
 
3
- # JS files to check by default, if no parameters are passed to rake jshint
3
+ # JS files to check by default, if no parameters are passed to rake jslint
4
4
  # (you may want to limit this only to your own scripts and exclude any external scripts and frameworks)
5
5
 
6
6
  # this can be overridden by adding 'paths' and 'exclude_paths' parameter to rake command:
7
- # rake jshint paths=path1,path2,... exclude_paths=library1,library2,...
7
+ # rake jslint paths=path1,path2,... exclude_paths=library1,library2,...
8
8
 
9
9
  paths:
10
10
  - lib/assets/javascripts/**/*.js
11
11
 
12
12
  exclude_paths:
13
- - vendor/assets/javascripts/**/*.js
14
13
 
15
14
 
16
- # ------------ jshint options ------------
17
- # visit http://jshint.com/ for complete documentation
15
+ # ------------ jslint options ------------
16
+ # see http://www.jslint.com/lint.html#options for more detailed explanations
18
17
 
19
18
  # "enforce" type options (true means potentially more warnings)
20
19
 
21
20
  adsafe: false # true if ADsafe rules should be enforced. See http://www.ADsafe.org/
22
21
  bitwise: true # true if bitwise operators should not be allowed
23
22
  newcap: true # true if Initial Caps must be used with constructor functions
24
- eqeqeq: true # true if === should be required (for ALL equality comparisons)
23
+ eqeqeq: false # true if === should be required (for ALL equality comparisons)
25
24
  immed: false # true if immediate function invocations must be wrapped in parens
26
25
  nomen: false # true if initial or trailing underscore in identifiers should be forbidden
27
26
  onevar: false # true if only one var statement per function should be allowed
@@ -29,51 +28,38 @@ plusplus: false # true if ++ and -- should not be allowed
29
28
  regexp: false # true if . and [^...] should not be allowed in RegExp literals
30
29
  safe: false # true if the safe subset rules are enforced (used by ADsafe)
31
30
  strict: false # true if the ES5 "use strict"; pragma is required
32
- undef: true # true if variables must be declared before used
31
+ undef: false # true if variables must be declared before used
33
32
  white: false # true if strict whitespace rules apply (see also 'indent' option)
34
33
 
35
34
  # "allow" type options (false means potentially more warnings)
36
35
 
37
36
  cap: false # true if upper case HTML should be allowed
38
- css: false # true if CSS workarounds should be tolerated
37
+ css: true # true if CSS workarounds should be tolerated
39
38
  debug: false # true if debugger statements should be allowed (set to false before going into production)
40
39
  es5: false # true if ECMAScript 5 syntax should be allowed
41
40
  evil: false # true if eval should be allowed
42
- forin: false # true if unfiltered 'for in' statements should be allowed
43
- fragment: false # true if HTML fragments should be allowed
41
+ forin: true # true if unfiltered 'for in' statements should be allowed
42
+ fragment: true # true if HTML fragments should be allowed
44
43
  laxbreak: false # true if statement breaks should not be checked
45
44
  on: false # true if HTML event handlers (e.g. onclick="...") should be allowed
46
45
  sub: false # true if subscript notation may be used for expressions better expressed in dot notation
47
46
 
48
47
  # other options
49
48
 
50
- maxlen: 160 # Maximum line length
49
+ maxlen: 120 # Maximum line length
51
50
  indent: 2 # Number of spaces that should be used for indentation - used only if 'white' option is set
52
51
  maxerr: 50 # The maximum number of warnings reported (per file)
53
52
  passfail: false # true if the scan should stop on first error (per file)
54
53
  # following are relevant only if undef = true
55
- predef:
56
- - _
57
- - InflectionJS
54
+ predef: '' # Names of predefined global variables - comma-separated string or a YAML array
58
55
  browser: true # true if the standard browser globals should be predefined
59
56
  rhino: false # true if the Rhino environment globals should be predefined
60
57
  windows: false # true if Windows-specific globals should be predefined
61
58
  widget: false # true if the Yahoo Widgets globals should be predefined
62
- devel: false # true if functions like alert, confirm, console, prompt etc. are predefined
59
+ devel: true # true if functions like alert, confirm, console, prompt etc. are predefined
63
60
 
64
- # jshint options
65
- loopfunc: true # true if functions should be allowed to be defined within loops
66
- asi: true # true if automatic semicolon insertion should be tolerated
67
- boss: true # true if advanced usage of assignments and == should be allowed
68
- couch: true # true if CouchDB globals should be predefined
69
- curly: false # true if curly braces around blocks should be required (even in if/for/while)
70
- noarg: true # true if arguments.caller and arguments.callee should be disallowed
71
- node: true # true if the Node.js environment globals should be predefined
72
- noempty: true # true if empty blocks should be disallowed
73
- nonew: true # true if using `new` for side-effects should be disallowed
74
61
 
75
-
76
- # ------------ jshint_on_rails custom lint options (switch to true to disable some annoying warnings) ------------
62
+ # ------------ jslint_on_rails custom lint options (switch to true to disable some annoying warnings) ------------
77
63
 
78
64
  # ignores "missing semicolon" warning at the end of a function; this lets you write one-liners
79
65
  # like: x.map(function(i) { return i + 1 }); without having to put a second semicolon inside the function
@@ -48,4 +48,4 @@
48
48
  }
49
49
  });
50
50
  }
51
- })(_);
51
+ }).call(this, _);
@@ -1,5 +1,5 @@
1
1
  module UnderscoreExtensions
2
- VERSION = '0.2.1'
3
- UNDERSCORE_VERSION = '1.4.2'
2
+ VERSION = '0.2.2'
3
+ UNDERSCORE_VERSION = '1.4.3'
4
4
  UNDERSCORE_STRING_VERSION = '2.3.0'
5
5
  end
@@ -1,10 +1,4 @@
1
1
  describe('_', function() {
2
- describe('#classify', function() {
3
- it('should return a string camelized with capital letters', function() {
4
- expect(_('the_quick_brown_fox').classify()).toEqual('TheQuickBrownFox');
5
- });
6
- });
7
-
8
2
  describe('#namespace', function() {
9
3
  describe('when the namespace is passed as a single parameter with period separator', function() {
10
4
  it('should create the namespace', function() {
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20
20
 
21
21
  s.add_development_dependency 'fuubar'
22
22
  s.add_development_dependency 'jasmine', ">= 1.2.1"
23
- s.add_development_dependency 'jshint_on_rails'
23
+ s.add_development_dependency 'jslint_on_rails'
24
24
  s.add_development_dependency 'thin'
25
25
  s.add_runtime_dependency 'rails', '>= 3.1'
26
26
  end
@@ -1,4 +1,4 @@
1
- // Underscore.js 1.4.2
1
+ // Underscore.js 1.4.3
2
2
  // http://underscorejs.org
3
3
  // (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
4
4
  // Underscore may be freely distributed under the MIT license.
@@ -24,7 +24,6 @@
24
24
  var push = ArrayProto.push,
25
25
  slice = ArrayProto.slice,
26
26
  concat = ArrayProto.concat,
27
- unshift = ArrayProto.unshift,
28
27
  toString = ObjProto.toString,
29
28
  hasOwnProperty = ObjProto.hasOwnProperty;
30
29
 
@@ -61,11 +60,11 @@
61
60
  }
62
61
  exports._ = _;
63
62
  } else {
64
- root['_'] = _;
63
+ root._ = _;
65
64
  }
66
65
 
67
66
  // Current version.
68
- _.VERSION = '1.4.2';
67
+ _.VERSION = '1.4.3';
69
68
 
70
69
  // Collection Functions
71
70
  // --------------------
@@ -102,6 +101,8 @@
102
101
  return results;
103
102
  };
104
103
 
104
+ var reduceError = 'Reduce of empty array with no initial value';
105
+
105
106
  // **Reduce** builds up a single result from a list of values, aka `inject`,
106
107
  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
107
108
  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
@@ -119,7 +120,7 @@
119
120
  memo = iterator.call(context, memo, value, index, list);
120
121
  }
121
122
  });
122
- if (!initial) throw new TypeError('Reduce of empty array with no initial value');
123
+ if (!initial) throw new TypeError(reduceError);
123
124
  return memo;
124
125
  };
125
126
 
@@ -130,7 +131,7 @@
130
131
  if (obj == null) obj = [];
131
132
  if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
132
133
  if (context) iterator = _.bind(iterator, context);
133
- return arguments.length > 2 ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
134
+ return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
134
135
  }
135
136
  var length = obj.length;
136
137
  if (length !== +length) {
@@ -146,7 +147,7 @@
146
147
  memo = iterator.call(context, memo, obj[index], index, list);
147
148
  }
148
149
  });
149
- if (!initial) throw new TypeError('Reduce of empty array with no initial value');
150
+ if (!initial) throw new TypeError(reduceError);
150
151
  return memo;
151
152
  };
152
153
 
@@ -177,12 +178,9 @@
177
178
 
178
179
  // Return all the elements for which a truth test fails.
179
180
  _.reject = function(obj, iterator, context) {
180
- var results = [];
181
- if (obj == null) return results;
182
- each(obj, function(value, index, list) {
183
- if (!iterator.call(context, value, index, list)) results[results.length] = value;
184
- });
185
- return results;
181
+ return _.filter(obj, function(value, index, list) {
182
+ return !iterator.call(context, value, index, list);
183
+ }, context);
186
184
  };
187
185
 
188
186
  // Determine whether all of the elements match a truth test.
@@ -216,13 +214,11 @@
216
214
  // Determine if the array or object contains a given value (using `===`).
217
215
  // Aliased as `include`.
218
216
  _.contains = _.include = function(obj, target) {
219
- var found = false;
220
- if (obj == null) return found;
217
+ if (obj == null) return false;
221
218
  if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
222
- found = any(obj, function(value) {
219
+ return any(obj, function(value) {
223
220
  return value === target;
224
221
  });
225
- return found;
226
222
  };
227
223
 
228
224
  // Invoke a method (with arguments) on every item in a collection.
@@ -258,7 +254,7 @@
258
254
  return Math.max.apply(Math, obj);
259
255
  }
260
256
  if (!iterator && _.isEmpty(obj)) return -Infinity;
261
- var result = {computed : -Infinity};
257
+ var result = {computed : -Infinity, value: -Infinity};
262
258
  each(obj, function(value, index, list) {
263
259
  var computed = iterator ? iterator.call(context, value, index, list) : value;
264
260
  computed >= result.computed && (result = {value : value, computed : computed});
@@ -272,7 +268,7 @@
272
268
  return Math.min.apply(Math, obj);
273
269
  }
274
270
  if (!iterator && _.isEmpty(obj)) return Infinity;
275
- var result = {computed : Infinity};
271
+ var result = {computed : Infinity, value: Infinity};
276
272
  each(obj, function(value, index, list) {
277
273
  var computed = iterator ? iterator.call(context, value, index, list) : value;
278
274
  computed < result.computed && (result = {value : value, computed : computed});
@@ -321,7 +317,7 @@
321
317
  // An internal function used for aggregate "group by" operations.
322
318
  var group = function(obj, value, context, behavior) {
323
319
  var result = {};
324
- var iterator = lookupIterator(value);
320
+ var iterator = lookupIterator(value || _.identity);
325
321
  each(obj, function(value, index) {
326
322
  var key = iterator.call(context, value, index, obj);
327
323
  behavior(result, key, value);
@@ -341,7 +337,7 @@
341
337
  // either a string attribute to count by, or a function that returns the
342
338
  // criterion.
343
339
  _.countBy = function(obj, value, context) {
344
- return group(obj, value, context, function(result, key, value) {
340
+ return group(obj, value, context, function(result, key) {
345
341
  if (!_.has(result, key)) result[key] = 0;
346
342
  result[key]++;
347
343
  });
@@ -363,12 +359,14 @@
363
359
  // Safely convert anything iterable into a real, live array.
364
360
  _.toArray = function(obj) {
365
361
  if (!obj) return [];
366
- if (obj.length === +obj.length) return slice.call(obj);
362
+ if (_.isArray(obj)) return slice.call(obj);
363
+ if (obj.length === +obj.length) return _.map(obj, _.identity);
367
364
  return _.values(obj);
368
365
  };
369
366
 
370
367
  // Return the number of elements in an object.
371
368
  _.size = function(obj) {
369
+ if (obj == null) return 0;
372
370
  return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
373
371
  };
374
372
 
@@ -379,6 +377,7 @@
379
377
  // values in the array. Aliased as `head` and `take`. The **guard** check
380
378
  // allows it to work with `_.map`.
381
379
  _.first = _.head = _.take = function(array, n, guard) {
380
+ if (array == null) return void 0;
382
381
  return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
383
382
  };
384
383
 
@@ -393,6 +392,7 @@
393
392
  // Get the last element of an array. Passing **n** will return the last N
394
393
  // values in the array. The **guard** check allows it to work with `_.map`.
395
394
  _.last = function(array, n, guard) {
395
+ if (array == null) return void 0;
396
396
  if ((n != null) && !guard) {
397
397
  return slice.call(array, Math.max(array.length - n, 0));
398
398
  } else {
@@ -410,7 +410,7 @@
410
410
 
411
411
  // Trim out all falsy values from an array.
412
412
  _.compact = function(array) {
413
- return _.filter(array, function(value){ return !!value; });
413
+ return _.filter(array, _.identity);
414
414
  };
415
415
 
416
416
  // Internal implementation of a recursive `flatten` function.
@@ -439,6 +439,11 @@
439
439
  // been sorted, you have the option of using a faster algorithm.
440
440
  // Aliased as `unique`.
441
441
  _.uniq = _.unique = function(array, isSorted, iterator, context) {
442
+ if (_.isFunction(isSorted)) {
443
+ context = iterator;
444
+ iterator = isSorted;
445
+ isSorted = false;
446
+ }
442
447
  var initial = iterator ? _.map(array, iterator, context) : array;
443
448
  var results = [];
444
449
  var seen = [];
@@ -491,6 +496,7 @@
491
496
  // pairs, or two parallel arrays of the same length -- one of keys, and one of
492
497
  // the corresponding values.
493
498
  _.object = function(list, values) {
499
+ if (list == null) return {};
494
500
  var result = {};
495
501
  for (var i = 0, l = list.length; i < l; i++) {
496
502
  if (values) {
@@ -568,8 +574,8 @@
568
574
  // optionally). Binding with arguments is also known as `curry`.
569
575
  // Delegates to **ECMAScript 5**'s native `Function.bind` if available.
570
576
  // We check for `func.bind` first, to fail fast when `func` is undefined.
571
- _.bind = function bind(func, context) {
572
- var bound, args;
577
+ _.bind = function(func, context) {
578
+ var args, bound;
573
579
  if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
574
580
  if (!_.isFunction(func)) throw new TypeError;
575
581
  args = slice.call(arguments, 2);
@@ -577,6 +583,7 @@
577
583
  if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
578
584
  ctor.prototype = func.prototype;
579
585
  var self = new ctor;
586
+ ctor.prototype = null;
580
587
  var result = func.apply(self, args.concat(slice.call(arguments)));
581
588
  if (Object(result) === result) return result;
582
589
  return self;
@@ -618,25 +625,26 @@
618
625
  // Returns a function, that, when invoked, will only be triggered at most once
619
626
  // during a given window of time.
620
627
  _.throttle = function(func, wait) {
621
- var context, args, timeout, throttling, more, result;
622
- var whenDone = _.debounce(function(){ more = throttling = false; }, wait);
628
+ var context, args, timeout, result;
629
+ var previous = 0;
630
+ var later = function() {
631
+ previous = new Date;
632
+ timeout = null;
633
+ result = func.apply(context, args);
634
+ };
623
635
  return function() {
624
- context = this; args = arguments;
625
- var later = function() {
636
+ var now = new Date;
637
+ var remaining = wait - (now - previous);
638
+ context = this;
639
+ args = arguments;
640
+ if (remaining <= 0) {
641
+ clearTimeout(timeout);
626
642
  timeout = null;
627
- if (more) {
628
- result = func.apply(context, args);
629
- }
630
- whenDone();
631
- };
632
- if (!timeout) timeout = setTimeout(later, wait);
633
- if (throttling) {
634
- more = true;
635
- } else {
636
- throttling = true;
643
+ previous = now;
637
644
  result = func.apply(context, args);
645
+ } else if (!timeout) {
646
+ timeout = setTimeout(later, remaining);
638
647
  }
639
- whenDone();
640
648
  return result;
641
649
  };
642
650
  };
@@ -754,8 +762,10 @@
754
762
  // Extend a given object with all the properties in passed-in object(s).
755
763
  _.extend = function(obj) {
756
764
  each(slice.call(arguments, 1), function(source) {
757
- for (var prop in source) {
758
- obj[prop] = source[prop];
765
+ if (source) {
766
+ for (var prop in source) {
767
+ obj[prop] = source[prop];
768
+ }
759
769
  }
760
770
  });
761
771
  return obj;
@@ -784,8 +794,10 @@
784
794
  // Fill in a given object with default properties.
785
795
  _.defaults = function(obj) {
786
796
  each(slice.call(arguments, 1), function(source) {
787
- for (var prop in source) {
788
- if (obj[prop] == null) obj[prop] = source[prop];
797
+ if (source) {
798
+ for (var prop in source) {
799
+ if (obj[prop] == null) obj[prop] = source[prop];
800
+ }
789
801
  }
790
802
  });
791
803
  return obj;
@@ -950,7 +962,7 @@
950
962
 
951
963
  // Is a given object a finite number?
952
964
  _.isFinite = function(obj) {
953
- return _.isNumber(obj) && isFinite(obj);
965
+ return isFinite(obj) && !isNaN(parseFloat(obj));
954
966
  };
955
967
 
956
968
  // Is the given value `NaN`? (NaN is the only number which does not equal itself).
@@ -996,7 +1008,9 @@
996
1008
 
997
1009
  // Run a function **n** times.
998
1010
  _.times = function(n, iterator, context) {
999
- for (var i = 0; i < n; i++) iterator.call(context, i);
1011
+ var accum = Array(n);
1012
+ for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);
1013
+ return accum;
1000
1014
  };
1001
1015
 
1002
1016
  // Return a random integer between min and max (inclusive).
@@ -1061,7 +1075,7 @@
1061
1075
  // Useful for temporary DOM ids.
1062
1076
  var idCounter = 0;
1063
1077
  _.uniqueId = function(prefix) {
1064
- var id = idCounter++;
1078
+ var id = '' + ++idCounter;
1065
1079
  return prefix ? prefix + id : id;
1066
1080
  };
1067
1081
 
@@ -1111,11 +1125,18 @@
1111
1125
  text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
1112
1126
  source += text.slice(index, offset)
1113
1127
  .replace(escaper, function(match) { return '\\' + escapes[match]; });
1114
- source +=
1115
- escape ? "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'" :
1116
- interpolate ? "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'" :
1117
- evaluate ? "';\n" + evaluate + "\n__p+='" : '';
1128
+
1129
+ if (escape) {
1130
+ source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
1131
+ }
1132
+ if (interpolate) {
1133
+ source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
1134
+ }
1135
+ if (evaluate) {
1136
+ source += "';\n" + evaluate + "\n__p+='";
1137
+ }
1118
1138
  index = offset + match.length;
1139
+ return match;
1119
1140
  });
1120
1141
  source += "';\n";
1121
1142
 
@@ -1197,4 +1218,4 @@
1197
1218
 
1198
1219
  });
1199
1220
 
1200
- }).call(this);
1221
+ }).call(this);
metadata CHANGED
@@ -1,96 +1,96 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: underscore_extensions
3
3
  version: !ruby/object:Gem::Version
4
+ version: 0.2.2
4
5
  prerelease:
5
- version: 0.2.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Ryan Dy
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-17 00:00:00.000000000 Z
12
+ date: 2013-01-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- version_requirements: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ! '>='
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- none: false
21
- prerelease: false
22
15
  name: fuubar
23
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
24
18
  requirements:
25
19
  - - ! '>='
26
20
  - !ruby/object:Gem::Version
27
21
  version: '0'
28
- none: false
29
22
  type: :development
30
- - !ruby/object:Gem::Dependency
23
+ prerelease: false
31
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
32
26
  requirements:
33
27
  - - ! '>='
34
28
  - !ruby/object:Gem::Version
35
- version: 1.2.1
36
- none: false
37
- prerelease: false
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
38
31
  name: jasmine
39
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
40
34
  requirements:
41
35
  - - ! '>='
42
36
  - !ruby/object:Gem::Version
43
37
  version: 1.2.1
44
- none: false
45
38
  type: :development
46
- - !ruby/object:Gem::Dependency
39
+ prerelease: false
47
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
48
42
  requirements:
49
43
  - - ! '>='
50
44
  - !ruby/object:Gem::Version
51
- version: '0'
52
- none: false
53
- prerelease: false
54
- name: jshint_on_rails
45
+ version: 1.2.1
46
+ - !ruby/object:Gem::Dependency
47
+ name: jslint_on_rails
55
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
56
50
  requirements:
57
51
  - - ! '>='
58
52
  - !ruby/object:Gem::Version
59
53
  version: '0'
60
- none: false
61
54
  type: :development
62
- - !ruby/object:Gem::Dependency
55
+ prerelease: false
63
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
64
58
  requirements:
65
59
  - - ! '>='
66
60
  - !ruby/object:Gem::Version
67
61
  version: '0'
68
- none: false
69
- prerelease: false
62
+ - !ruby/object:Gem::Dependency
70
63
  name: thin
71
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
72
66
  requirements:
73
67
  - - ! '>='
74
68
  - !ruby/object:Gem::Version
75
69
  version: '0'
76
- none: false
77
70
  type: :development
78
- - !ruby/object:Gem::Dependency
71
+ prerelease: false
79
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
80
74
  requirements:
81
75
  - - ! '>='
82
76
  - !ruby/object:Gem::Version
83
- version: '3.1'
84
- none: false
85
- prerelease: false
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
86
79
  name: rails
87
80
  requirement: !ruby/object:Gem::Requirement
81
+ none: false
88
82
  requirements:
89
83
  - - ! '>='
90
84
  - !ruby/object:Gem::Version
91
85
  version: '3.1'
92
- none: false
93
86
  type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '3.1'
94
94
  description: Adds extensions to the underscore javascript library. It adds the javascript
95
95
  as a rails engine to be included in to a Rails 3+ project. To use it make sure require
96
96
  underscore, underscore.string and underscore.extensions.
@@ -124,23 +124,23 @@ rdoc_options: []
124
124
  require_paths:
125
125
  - lib
126
126
  required_ruby_version: !ruby/object:Gem::Requirement
127
+ none: false
127
128
  requirements:
128
129
  - - ! '>='
129
130
  - !ruby/object:Gem::Version
130
131
  version: '0'
131
132
  segments:
132
133
  - 0
133
- hash: -3121695875512196244
134
- none: false
134
+ hash: 1602788331734609951
135
135
  required_rubygems_version: !ruby/object:Gem::Requirement
136
+ none: false
136
137
  requirements:
137
138
  - - ! '>='
138
139
  - !ruby/object:Gem::Version
139
140
  version: '0'
140
141
  segments:
141
142
  - 0
142
- hash: -3121695875512196244
143
- none: false
143
+ hash: 1602788331734609951
144
144
  requirements: []
145
145
  rubyforge_project: underscore_extensions
146
146
  rubygems_version: 1.8.24