underscore_extensions 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
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