underscore_plus 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ N2Y0MDMzMGNlZGI5ZDNlNTMwNDkwOTg0ZGU4MWE1NzdjMDk1M2IxMw==
5
+ data.tar.gz: !binary |-
6
+ MGZmM2Y1MTc1YzYyNjUxNmE1MmNhMjM1Yzc1NjdiZjMzYmJiZTEzYg==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ NzE4YTAyNjZjYWQzMTA3ZjY3ZDI1ZWNiNGM2YTZmZTg5Y2RiYTljYjMxN2Y1
10
+ YmExMGNmMWFhYmI3MmI5MGU2NjQ0MWYyNWI0NzMwNTQ4NDFmNjFkMmViMWQy
11
+ ZmQ2NWRjZmVjNTI0ZWFiZGY3NGIyZDUwNzdiNjE0ODBlNDQ2NGU=
12
+ data.tar.gz: !binary |-
13
+ N2ZmYWYwNDJmODRhMjBkYmNkNmM4NTNjMmYxNDg1MDYwYjVkNGFmY2VlMzEz
14
+ ODkwMDgyMmI4MmIwNWQ3OTdhMTE4N2M5NDdiZTgxNTFlNmRmZmM4ZDk4ZjMw
15
+ MzRhZjFhYmNjYTBiNTFmNDA4M2FhM2RiNzk2MjRiYmNhYTYxZjI=
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .DS_Store
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in underscore_plus.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Gary McGhee
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ underscore_plus
2
+ ===============
3
+
4
+ An extension to the popular underscore javascript library
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,458 @@
1
+ // underscore_plus.js
2
+ // (c) 2013 Gary McGhee, Buzzware Solutions
3
+ // https://github.com/buzzware/underscore_plus
4
+ // Underscore may be freely distributed under the MIT license.
5
+
6
+ (function() {
7
+
8
+ //BEGIN copied from underscore
9
+ var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
10
+ // Create quick reference variables for speed access to core prototypes.
11
+ var slice = ArrayProto.slice;
12
+ //END copied from underscore
13
+
14
+ _.stringify = function(aObject) {
15
+ if (_.isString(aObject))
16
+ return aObject;
17
+ if (aObject===null || aObject===undefined)
18
+ return '';
19
+ if (aObject.toString)
20
+ return aObject.toString();
21
+ return '';
22
+ };
23
+
24
+ //var MAX_DUMP_DEPTH = 10;
25
+ //
26
+ // function dumpObj(obj, name, indent, depth) {
27
+ // if (depth > MAX_DUMP_DEPTH) {
28
+ // return indent + name + ": <Maximum Depth Reached>\n";
29
+ // }
30
+ // if (typeof obj == "object") {
31
+ // var child = null;
32
+ // var output = indent + name + "\n";
33
+ // indent += "\t";
34
+ // for (var item in obj)
35
+ // {
36
+ // try {
37
+ // child = obj[item];
38
+ // } catch (e) {
39
+ // child = "<Unable to Evaluate>";
40
+ // }
41
+ // if (typeof child == "object") {
42
+ // output += dumpObj(child, item, indent, depth + 1);
43
+ // } else {
44
+ // output += indent + item + ": " + child + "\n";
45
+ // }
46
+ // }
47
+ // return output;
48
+ // } else {
49
+ // return obj;
50
+ // }
51
+ // }
52
+
53
+ _.concat = function(aArray,aAnotherArray) {
54
+ var result = [];
55
+ result.push.apply(result, aArray);
56
+ result.push.apply(result, aAnotherArray);
57
+ return result;
58
+ };
59
+
60
+ _.nameValueString = function(aObject) {
61
+ return _.map(_.keys(aObject),function(k) { return k+'="'+_.stringify(aObject[k])+'"'}).join(' ');
62
+ };
63
+
64
+ _.classEnsure = function(aOrig,aNew) {
65
+ if (!aOrig)
66
+ return aNew;
67
+ if (!aNew)
68
+ return aOrig;
69
+ return _.union(aOrig.split(' '),aNew.split(' '));
70
+ };
71
+
72
+ _.getPath = function(aObject,aPath,aDefault) {
73
+ if ((typeof aObject)=='string') { // allow aObject to be left out and assume this
74
+ if (arguments.length==1) {
75
+ aPath = aObject;
76
+ aObject = window;
77
+ } else if (arguments.length==2) {
78
+ aDefault = aPath;
79
+ aPath = aObject;
80
+ aObject = window;
81
+ }
82
+ }
83
+ var nodes = aPath.split('.');
84
+ var curr = aObject;
85
+ for (var i=0;i<nodes.length;i++) {
86
+ var name = nodes[i];
87
+ if ((curr===undefined)||(curr===null))
88
+ return aDefault;
89
+ if ((name in curr) || curr[name]) {
90
+ var val = curr[name];
91
+ if ((typeof val)=='function')
92
+ curr = val.call(curr);
93
+ else
94
+ curr = val;
95
+ } else {
96
+ return aDefault; // name doesn't exist
97
+ }
98
+ }
99
+ return curr;
100
+ }
101
+
102
+ _.moveKeys = function(aDest,aSource,aKeys) {
103
+ if (!aSource)
104
+ return aDest;
105
+ if (!aKeys)
106
+ aKeys = _.keys(aSource);
107
+ for (var i=0;i<aKeys.length;i++) {
108
+ var k = aKeys[i];
109
+ if (!(k in aSource))
110
+ continue;
111
+ aDest[k] = aSource[k];
112
+ delete aSource[k];
113
+ }
114
+ return aDest;
115
+ };
116
+
117
+ _.removeKey = function(aObject,aKey) {
118
+ var result = aObject[aKey];
119
+ delete aObject[aKey];
120
+ return result;
121
+ };
122
+
123
+ // for Twitter Typeahead. See http://code.whatcould.com/2013/02/28/underscore-templates-with-twitter-typeahead.html
124
+ _.templateTypeaheadCompatible = {
125
+ compile: function(str) {
126
+ return new _.templateTypeaheadCompiled(str);
127
+ }
128
+ }
129
+ _.templateTypeaheadCompiled = (function() {
130
+ function templateTypeaheadCompiled(str) {
131
+ this.compiledTemplate = _.template(str);
132
+ }
133
+
134
+ templateTypeaheadCompiled.prototype.render = function(context) {
135
+ return this.compiledTemplate(context);
136
+ };
137
+
138
+ return templateTypeaheadCompiled;
139
+ })();
140
+
141
+ // // find all dynamic objects in an array that have matching values for the contents of aAndCriteria
142
+ // public static function ObjectArrayFind(aArray:Array, aAndCriteria:Object):Array {
143
+ // return aArray.filter(
144
+ // function(item:*, index:int, array:Array):Boolean {
145
+ // // for all items in aAndCriteria, aItem has matching values
146
+ // for (var i:String in aAndCriteria) {
147
+ // if (aAndCriteria[i] != item[i])
148
+ // return false;
149
+ // }
150
+ // return true;
151
+ // }
152
+ // );
153
+ // }
154
+ //
155
+ // // like ObjectArrayFind except only returns one object. Could be optimised to quit searching when one is found
156
+ // // adds listener and removes on first occurrence
157
+ // public static function ObjectArrayFindOne(aArray:Array, aAndCriteria:Object):Object {
158
+ // var results:Array = ObjectArrayFind(aArray, aAndCriteria);
159
+ // return results[0];
160
+ // }
161
+ //
162
+ // public static function ObjectArrayLookup(aArray:Array, aAndCriteria:Object, aProperty:String):Object {
163
+ // var results:Array = ObjectArrayFind(aArray, aAndCriteria);
164
+ // var item:Object = results[0];
165
+ // if (!item)
166
+ // return null;
167
+ // return item[aProperty];
168
+ // }
169
+
170
+ _.hasMatchingProperties = function(aObject,aCriteria) {
171
+ for (var p in aCriteria) {
172
+ if (!(p in aObject) || (aObject[p]!==aCriteria[p]))
173
+ return false;
174
+ }
175
+ return true;
176
+ };
177
+
178
+ // find one item matching object properties
179
+ _.findByCriteria = function(aArray,aCriteria) {
180
+ return _.find(aArray,function(obj){
181
+ return _.hasMatchingProperties(obj,aCriteria);
182
+ });
183
+ };
184
+
185
+ // find one item matching object properties
186
+ _.filterByCriteria = function(aArray,aCriteria) {
187
+ return _.filter(aArray,function(obj){
188
+ return _.hasMatchingProperties(obj,aCriteria);
189
+ });
190
+ };
191
+
192
+ _.isObjectStrict = function(aSomething) {
193
+ return Object.prototype.toString.call(aSomething)==='[object Object]';
194
+ }
195
+
196
+ // create an object using key,value arguments eg. createObject('a',2) returns {a: 2}
197
+ _.createObject = function() {
198
+ var result = {};
199
+ result[arguments[0]] = arguments[1];
200
+ return result;
201
+ }
202
+
203
+ _.endsWith = function(aString, aSuffix) {
204
+ var i = aString.lastIndexOf(aSuffix);
205
+ return (i>=0 && i===aString.length-aSuffix.length);
206
+ }
207
+
208
+ _.beginsWith = function(aString, aPrefix) {
209
+ var i = aString.indexOf(aPrefix);
210
+ return (i==0);
211
+ }
212
+
213
+ _.chop = function(aString, aSuffix) {
214
+ var i = aString.lastIndexOf(aSuffix);
215
+ return (i===aString.length-aSuffix.length) ? aString.substring(0,i) : aString;
216
+ }
217
+
218
+ _.bite = function(aString, aPrefix) {
219
+ var i = aString.indexOf(aPrefix);
220
+ return (i===0) ? aString.substring(aPrefix.length) : aString;
221
+ }
222
+
223
+ // undefined null function arguments string number date regexp object
224
+ _.typeOf = function(aSomething) {
225
+ if (aSomething===undefined)
226
+ return 'undefined';
227
+ if (aSomething===null)
228
+ return 'null';
229
+
230
+ var result = Object.prototype.toString.call(aSomething);
231
+ result = _.bite(result,'[object ');
232
+ result = _.chop(result,']');
233
+ return result.toLowerCase();
234
+ }
235
+
236
+ /**
237
+ * Clone properties that are objects or arrays, otherwise if aSource and aDestination are different, properties will be copied
238
+ * @param aDestination
239
+ * @param aSource (optional, defaults to aSource)
240
+ * @return aDestination
241
+ */
242
+ _.cloneComplexValues = function (aDestination, aSource) {
243
+ if (!aSource)
244
+ aSource = aDestination;
245
+ for (var p in aSource) {
246
+ var t = _.typeOf(aSource[p]);
247
+ if (t==='array' || t==='object')
248
+ aDestination[p] = _.clone(aSource[p]);
249
+ else if (aDestination!==aSource)
250
+ aDestination[p] = aSource[p];
251
+ }
252
+ return aDestination;
253
+ }
254
+
255
+ // http://justtalkaboutweb.com/2008/01/06/javascript-object-extension/
256
+
257
+ _.originalClone = _.originalClone || _.clone;
258
+ // Create a copy (shallow or deep) of an object from https://github.com/cederberg/underscore/commits/feature-clone
259
+ _.clone = function(obj, deep) {
260
+ if (!deep)
261
+ return _.originalClone(obj);
262
+ if (!_.isObject(obj) || _.isFunction(obj)) return obj;
263
+ if (_.isDate(obj)) return new Date(obj.getTime());
264
+ if (_.isRegExp(obj)) return new RegExp(obj.source, obj.toString().replace(/.*\//, ""));
265
+ var isArr = (_.isArray(obj) || _.isArguments(obj));
266
+ if (deep) {
267
+ var func = function (memo, value, key) {
268
+ if (isArr)
269
+ memo.push(_.clone(value, true));
270
+ else
271
+ memo[key] = _.clone(value, true);
272
+ return memo;
273
+ };
274
+ return _.reduce(obj, func, isArr ? [] : {});
275
+ } else {
276
+ return isArr ? slice.call(obj) : _.extend({}, obj);
277
+ }
278
+ };
279
+
280
+ _.randomString = function (aLength, aCharSet) {
281
+ var result = [];
282
+
283
+ aLength = aLength || 5;
284
+ aCharSet = aCharSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
285
+ aCharSet = aCharSet.split('');
286
+
287
+ while (--aLength) {
288
+ result.push(aCharSet[Math.floor(Math.random() * aCharSet.length)]);
289
+ }
290
+
291
+ return result.join('');
292
+ };
293
+
294
+ _.formatNumber = function(aValue,aDecimals) {
295
+ if (aValue===null)
296
+ return '';
297
+ if (!aDecimals && aDecimals!==0)
298
+ aDecimals = 2;
299
+ return aValue.toFixed(aDecimals);
300
+ };
301
+
302
+ _.groupDigits = function(x) {
303
+ var parts = x.toString().split(".");
304
+ parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
305
+ return parts.join(".");
306
+ };
307
+
308
+ _.sum = function() {
309
+ var result = NaN;
310
+ for (var i=0;i<arguments.length;i++) {
311
+ var v = arguments[i];
312
+ if (!_.isNumber(v))
313
+ return NaN;
314
+ if (i==0)
315
+ result = 0;
316
+ result += v;
317
+ }
318
+ return result;
319
+ };
320
+
321
+ _.formatCurrency = function(aNumber,aPrecision,aSymbol) {
322
+ if (!aPrecision)
323
+ aPrecision = 0;
324
+ if (!aSymbol)
325
+ aSymbol = '$';
326
+ return _.isFinite(aNumber) ? aSymbol+_.groupDigits(_.formatNumber(aNumber,aPrecision)) : '';
327
+ };
328
+
329
+ _.formatPercent = function(aNumber,aPrecision,aSymbol) {
330
+ if (!aPrecision)
331
+ aPrecision = 0;
332
+ if (!aSymbol)
333
+ aSymbol = '%';
334
+ return _.isFinite(aNumber) ? _.groupDigits(_.formatNumber(aNumber*100.0,aPrecision))+aSymbol : '';
335
+ };
336
+
337
+ _.toNull = function(aValue,aDefault) {
338
+ if (arguments.length==1)
339
+ aDefault = null;
340
+ return ((aValue===null) || (aValue===undefined) || (aValue===[]) || (aValue===0) || (aValue==={}) || _.isNaN(aValue)) ? aDefault : aValue;
341
+ }
342
+
343
+ _.toFinite = function(aValue) {
344
+ if (_.isString(aValue))
345
+ aValue = Number(aValue);
346
+ return _.isFinite(aValue) ? aValue : 0;
347
+ }
348
+
349
+ _.toInt = function(aValue,aDefault) {
350
+ if (arguments.length==1)
351
+ aDefault = null;
352
+ var t = _.typeOf(aValue);
353
+ var result;
354
+ switch(t) {
355
+ case 'undefined':
356
+ case 'null':
357
+ case 'array':
358
+ case 'object':
359
+ case 'function':
360
+ case 'class':
361
+ case 'instance':
362
+ case 'error':
363
+ result = aDefault;
364
+ break;
365
+ case 'number':
366
+ if (isNaN(aValue))
367
+ result = aDefault;
368
+ else
369
+ result = Math.round(aValue);
370
+ break;
371
+ case 'string':
372
+ result = Math.round(Number(aValue));
373
+ break;
374
+ case 'boolean':
375
+ result = aValue ? 1 : 0;
376
+ break;
377
+ default:
378
+ result = aDefault;
379
+ break;
380
+ }
381
+ return result;
382
+ };
383
+
384
+ _.toBoolean = function(aValue,aDefault) {
385
+ if (arguments.length==1)
386
+ aDefault = false;
387
+ if (aValue===true || aValue===false)
388
+ return aValue;
389
+ if (aValue===0)
390
+ return false;
391
+ if (_.isString(aValue)) {
392
+ var t = Number(aValue);
393
+ if (_.isFinite(t)) {
394
+ return !!t;
395
+ } else {
396
+ t = aValue.toLowerCase();
397
+ if (t==="true" || t==="yes" || t==="on")
398
+ return true;
399
+ if (t==="false" || t==="no" || t==="off")
400
+ return false;
401
+ }
402
+ }
403
+ return aDefault;
404
+ };
405
+
406
+ // converts simple object to array of object with id and name fields
407
+ // eg.
408
+ // _.expand_options({"cash": "Cash","consumer_mortgage": "Consumer Mortgage")
409
+ // => [{id: "cash", name:"Cash"}, {id: "consumer_mortgage",name: "Consumer Mortgage"}]
410
+ // _.expand_options(["cash","consumer_mortgage"])
411
+ // => [{id: "cash", name:"cash"}, {id: "consumer_mortgage",name: "consumer_mortgage"}]
412
+ _.expand_options = function(aObject,aIdField,aNameField) {
413
+ if (!aIdField)
414
+ aIdField = 'id';
415
+ if (!aNameField)
416
+ aNameField = 'name';
417
+ if (_.isArray(aObject)) {
418
+ return _.map(aObject,function(v){
419
+ var result = {};
420
+ result[aIdField] = v;
421
+ result[aNameField] = String(v);
422
+ return result;
423
+ });
424
+ } else {
425
+ return _.map(aObject,function(v,k){
426
+ var result = {};
427
+ result[aIdField] = k;
428
+ result[aNameField] = v;
429
+ return result;
430
+ });
431
+ }
432
+ };
433
+
434
+ // returns array of keys on object beginning with aPrefix
435
+ _.keysWithPrefix = function(aObject,aPrefix) {
436
+ var results = [];
437
+ var keys = _.keys(aObject);
438
+ for (var i=0;i<keys.length;i++) {
439
+ var k = keys[i];
440
+ if (!_.beginsWith(k,aPrefix))
441
+ continue;
442
+ results.push(k);
443
+ }
444
+ return results;
445
+ };
446
+
447
+ // returns copy of object containing only properties beginning with aPrefix
448
+ _.pickWithPrefix = function(aObject,aPrefix) {
449
+ var result = {};
450
+ _.each(aObject,function(v, k){
451
+ if (!_.beginsWith(k,aPrefix))
452
+ return;
453
+ result[k] = v;
454
+ });
455
+ return result;
456
+ };
457
+
458
+ }).call(this);
@@ -0,0 +1,3 @@
1
+ module UnderscorePlus
2
+ VERSION = "0.9.0"
3
+ end
@@ -0,0 +1,8 @@
1
+ require "underscore_plus/version"
2
+
3
+ module UnderscorePlus
4
+ module Rails
5
+ class Engine < ::Rails::Engine
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'underscore_plus/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "underscore_plus"
8
+ spec.version = UnderscorePlus::VERSION
9
+ spec.authors = ["Gary McGhee"]
10
+ spec.email = ["contact@buzzware.com.au"]
11
+ spec.description = "Additions to underscore as a rails pipeline asset"
12
+ spec.summary = "Additions to underscore as a rails pipeline asset"
13
+ spec.homepage = "https://github.com/buzzware/underscore_plus"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+ spec.add_dependency "railties", "~> 3.1"
21
+ spec.add_dependency "underscore-rails", "= 1.4.3"
22
+ spec.add_development_dependency "bundler", "~> 1.3"
23
+ spec.add_development_dependency "rake"
24
+ end
metadata ADDED
@@ -0,0 +1,110 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: underscore_plus
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ platform: ruby
6
+ authors:
7
+ - Gary McGhee
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: railties
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '3.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '3.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: underscore-rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 1.4.3
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 1.4.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Additions to underscore as a rails pipeline asset
70
+ email:
71
+ - contact@buzzware.com.au
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - app/assets/javascripts/underscore_plus.js
82
+ - lib/underscore_plus.rb
83
+ - lib/underscore_plus/version.rb
84
+ - underscore_plus.gemspec
85
+ homepage: https://github.com/buzzware/underscore_plus
86
+ licenses:
87
+ - MIT
88
+ metadata: {}
89
+ post_install_message:
90
+ rdoc_options: []
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ requirements: []
104
+ rubyforge_project:
105
+ rubygems_version: 2.0.3
106
+ signing_key:
107
+ specification_version: 4
108
+ summary: Additions to underscore as a rails pipeline asset
109
+ test_files: []
110
+ has_rdoc: