ultimate-helpers 0.1.0.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,7 +1,7 @@
1
1
  *.gem
2
2
  .bundle
3
3
  pkg/*
4
- .idea/
4
+ Gemfile.lock
5
5
  test/dummy/db/*.sqlite3
6
6
  test/dummy/log/*.log
7
7
  test/dummy/tmp/
@@ -1,115 +1,117 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ultimate-helpers (0.1.0.1)
4
+ ultimate-helpers (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
8
8
  specs:
9
- actionmailer (3.2.8)
10
- actionpack (= 3.2.8)
11
- mail (~> 2.4.4)
12
- actionpack (3.2.8)
13
- activemodel (= 3.2.8)
14
- activesupport (= 3.2.8)
9
+ actionmailer (3.2.13)
10
+ actionpack (= 3.2.13)
11
+ mail (~> 2.5.3)
12
+ actionpack (3.2.13)
13
+ activemodel (= 3.2.13)
14
+ activesupport (= 3.2.13)
15
15
  builder (~> 3.0.0)
16
16
  erubis (~> 2.7.0)
17
17
  journey (~> 1.0.4)
18
- rack (~> 1.4.0)
18
+ rack (~> 1.4.5)
19
19
  rack-cache (~> 1.2)
20
20
  rack-test (~> 0.6.1)
21
- sprockets (~> 2.1.3)
22
- activemodel (3.2.8)
23
- activesupport (= 3.2.8)
21
+ sprockets (~> 2.2.1)
22
+ activemodel (3.2.13)
23
+ activesupport (= 3.2.13)
24
24
  builder (~> 3.0.0)
25
- activerecord (3.2.8)
26
- activemodel (= 3.2.8)
27
- activesupport (= 3.2.8)
25
+ activerecord (3.2.13)
26
+ activemodel (= 3.2.13)
27
+ activesupport (= 3.2.13)
28
28
  arel (~> 3.0.2)
29
29
  tzinfo (~> 0.3.29)
30
- activeresource (3.2.8)
31
- activemodel (= 3.2.8)
32
- activesupport (= 3.2.8)
33
- activesupport (3.2.8)
34
- i18n (~> 0.6)
30
+ activeresource (3.2.13)
31
+ activemodel (= 3.2.13)
32
+ activesupport (= 3.2.13)
33
+ activesupport (3.2.13)
34
+ i18n (= 0.6.1)
35
35
  multi_json (~> 1.0)
36
36
  arel (3.0.2)
37
- builder (3.0.3)
37
+ builder (3.0.4)
38
38
  coffee-rails (3.2.2)
39
39
  coffee-script (>= 2.2.0)
40
40
  railties (~> 3.2.0)
41
41
  coffee-script (2.2.0)
42
42
  coffee-script-source
43
43
  execjs
44
- coffee-script-source (1.3.3)
44
+ coffee-script-source (1.6.2)
45
45
  erubis (2.7.0)
46
46
  execjs (1.4.0)
47
47
  multi_json (~> 1.0)
48
- haml (3.1.7)
49
- haml-rails (0.3.5)
48
+ haml (4.0.1)
49
+ tilt
50
+ haml-rails (0.4)
50
51
  actionpack (>= 3.1, < 4.1)
51
52
  activesupport (>= 3.1, < 4.1)
52
- haml (~> 3.1)
53
+ haml (>= 3.1, < 4.1)
53
54
  railties (>= 3.1, < 4.1)
54
55
  hike (1.2.1)
55
56
  i18n (0.6.1)
56
57
  journey (1.0.4)
57
- jquery-rails (2.1.3)
58
- railties (>= 3.1.0, < 5.0)
59
- thor (~> 0.14)
60
- json (1.7.5)
61
- mail (2.4.4)
58
+ jquery-rails (2.2.1)
59
+ railties (>= 3.0, < 5.0)
60
+ thor (>= 0.14, < 2.0)
61
+ json (1.7.7)
62
+ mail (2.5.3)
62
63
  i18n (>= 0.4.0)
63
64
  mime-types (~> 1.16)
64
65
  treetop (~> 1.4.8)
65
- mime-types (1.19)
66
- multi_json (1.3.6)
66
+ mime-types (1.22)
67
+ multi_json (1.7.2)
67
68
  polyglot (0.3.3)
68
- quiet_assets (1.0.1)
69
- railties (~> 3.1)
70
- qunit-rails (0.0.2)
71
- railties (~> 3.2.3)
72
- rack (1.4.1)
69
+ quiet_assets (1.0.2)
70
+ railties (>= 3.1, < 5.0)
71
+ qunit-rails (0.0.3)
72
+ railties (>= 3.2.3)
73
+ rack (1.4.5)
73
74
  rack-cache (1.2)
74
75
  rack (>= 0.4)
75
- rack-ssl (1.3.2)
76
+ rack-ssl (1.3.3)
76
77
  rack
77
78
  rack-test (0.6.2)
78
79
  rack (>= 1.0)
79
- rails (3.2.8)
80
- actionmailer (= 3.2.8)
81
- actionpack (= 3.2.8)
82
- activerecord (= 3.2.8)
83
- activeresource (= 3.2.8)
84
- activesupport (= 3.2.8)
80
+ rails (3.2.13)
81
+ actionmailer (= 3.2.13)
82
+ actionpack (= 3.2.13)
83
+ activerecord (= 3.2.13)
84
+ activeresource (= 3.2.13)
85
+ activesupport (= 3.2.13)
85
86
  bundler (~> 1.0)
86
- railties (= 3.2.8)
87
- railties (3.2.8)
88
- actionpack (= 3.2.8)
89
- activesupport (= 3.2.8)
87
+ railties (= 3.2.13)
88
+ railties (3.2.13)
89
+ actionpack (= 3.2.13)
90
+ activesupport (= 3.2.13)
90
91
  rack-ssl (~> 1.3.2)
91
92
  rake (>= 0.8.7)
92
93
  rdoc (~> 3.4)
93
94
  thor (>= 0.14.6, < 2.0)
94
- rake (0.9.2.2)
95
- rdoc (3.12)
95
+ rake (10.0.4)
96
+ rdoc (3.12.2)
96
97
  json (~> 1.4)
97
- sass (3.2.1)
98
- sass-rails (3.2.5)
98
+ sass (3.2.7)
99
+ sass-rails (3.2.6)
99
100
  railties (~> 3.2.0)
100
101
  sass (>= 3.1.10)
101
102
  tilt (~> 1.3)
102
- sprockets (2.1.3)
103
+ sprockets (2.2.2)
103
104
  hike (~> 1.2)
105
+ multi_json (~> 1.0)
104
106
  rack (~> 1.0)
105
107
  tilt (~> 1.1, != 1.3.0)
106
- sqlite3 (1.3.6)
107
- thor (0.16.0)
108
- tilt (1.3.3)
109
- treetop (1.4.10)
108
+ sqlite3 (1.3.7)
109
+ thor (0.18.1)
110
+ tilt (1.3.6)
111
+ treetop (1.4.12)
110
112
  polyglot
111
113
  polyglot (>= 0.3.1)
112
- tzinfo (0.3.33)
114
+ tzinfo (0.3.37)
113
115
 
114
116
  PLATFORMS
115
117
  ruby
data/Rakefile CHANGED
@@ -1 +1 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler/gem_tasks'
@@ -1,11 +1 @@
1
- #= require ./helpers
2
-
3
- @Ultimate ||=
4
-
5
- debugMode: false
6
-
7
- debug: ->
8
- if @debugMode
9
- a = ["info", "Ultimate"]
10
- Array::push.apply a, arguments if arguments.length > 0
11
- cout.apply @, a
1
+ window.Ultimate ||= {}
@@ -1,8 +1,5 @@
1
1
  ###
2
- * front-end js helpers
3
- * 0.3.3.alpha / 2010-2011
4
- * Karpunin Dmitry / Evrone.com
5
- * koderfunk_at_gmail_dot_com
2
+ * global front-end js helpers
6
3
  ###
7
4
 
8
5
  @DEBUG_MODE ?= false
@@ -31,12 +28,6 @@
31
28
  if @LOG_TODO
32
29
  @cout 'warn', "TODO: #{subject}#{if location then " ### #{location}" else ''}#{if numberOrString then (if _.isNumber(numberOrString) then ":#{numberOrString}" else " > #{numberOrString}") else ''}"
33
30
 
34
- @args = (a) ->
35
- @deprecate 'arg()', '_.toArray()'
36
- r = []
37
- Array::push.apply(r, a) if a.length > 0
38
- r
39
-
40
31
  @logicalXOR = (a, b) ->
41
32
  ( a and not b ) or ( not a and b )
42
33
 
@@ -45,12 +36,12 @@
45
36
 
46
37
 
47
38
 
48
- @getParams = ->
49
- q = location.search.substring(1).split('&')
39
+ @getParams = (searchString = location.search) ->
40
+ q = searchString.replace(/^\?/, '').split('&')
50
41
  r = {}
51
42
  for e in q
52
43
  t = e.split('=')
53
- r[t[0]] = t[1]
44
+ r[decodeURIComponent(t[0])] = decodeURIComponent(t[1])
54
45
  r
55
46
 
56
47
  @respondFormat = (url, format = null) ->
@@ -64,59 +55,3 @@
64
55
  ah[0] = ad.join('.')
65
56
  aq[0] = ah.join('#')
66
57
  aq.join('?')
67
-
68
-
69
-
70
- ########### Deprecated ###########
71
-
72
- # Helper function to get a value from a object as a property or as a function.
73
- @getValue = (object, prop) ->
74
- @deprecate "getValue()", "_.result()"
75
- return null unless object and object[prop]
76
- return if _.isFunction(object[prop]) then object[prop]() else object[prop]
77
-
78
- @isset = (obj) =>
79
- @deprecate 'isset(obj)', '_.isUndefined(obj) OR "obj isnt undefined" OR "obj?'
80
- obj isnt undefined
81
-
82
- @isString = (v) =>
83
- @deprecate 'isString(v)', '_.isString(v)'
84
- _.isString v
85
-
86
- @isNumber = (v) =>
87
- @deprecate 'isNumber(v)', '_.isNumber(v)'
88
- not isNaN(parseInt(v))
89
-
90
- @isJQ = (obj) ->
91
- @deprecate 'isJQ(obj)', 'obj instanceof jQuery'
92
- _.isObject(obj) and _.isString(obj.jquery)
93
-
94
- @uniq = (arrOrString) ->
95
- @deprecate 'uniq(a)', '_.uniq(a)'
96
- isStr = _.isString(arrOrString)
97
- return arrOrString unless isStr or _.isArray(arrOrString)
98
- r = []
99
- r.push(e) for e in arrOrString when not _.include(r, e)
100
- if isStr then r.join('') else r
101
-
102
- @regexpSpace = /^\s*$/
103
- @regexpTrim = /^\s*(.*?)\s*$/
104
-
105
- @strTrim = (s) =>
106
- @deprecate "strTrim(s)", "_.trim(s)"
107
- s.match(@regexpTrim)[1]
108
-
109
-
110
-
111
- @rails_data = {}
112
-
113
- @rails_scope = (controller_name, action_name, scopedCloasure = null, scopedCloasureArguments...) =>
114
- @deprecate 'rails_scope'
115
- return false if _.isString(controller_name) and controller_name isnt @rails_data['controller_name']
116
- return false if _.isString(action_name) and action_name isnt @rails_data['action_name']
117
- if _.isFunction(scopedCloasure)
118
- arguments[2] scopedCloasureArguments...
119
- true
120
-
121
- $ =>
122
- @rails_data = $('body').data()
@@ -1,3 +1,20 @@
1
1
  #= require ultimate/base
2
2
 
3
- @Ultimate.Helpers ||= {}
3
+ @Ultimate.Helpers ||=
4
+ version: '0.2.0'
5
+
6
+ globalizeScopes: (include = false, exclude = false) ->
7
+ for scopeName, scope of @ when /^[A-Z]/.test(scopeName)
8
+ if (not include or scopeName in include) and not (exclude and scopeName in exclude)
9
+ _.extend window, scope
10
+
11
+ scopes: ->
12
+ _.filter( _.keys(@), (key) -> /^[A-Z]/.test(key) )
13
+
14
+ # underscored version
15
+ # globalizeScopes: (include = false, exclude = false) ->
16
+ # keys = _.filter( _.keys(@), (key) -> /^[A-Z]/.test(key) )
17
+ # keys = _.intersection(keys, include) if include
18
+ # keys = _.difference(keys, exclude) if exclude
19
+ # for scopeName in keys
20
+ # _.extend window, @[scopeName]
@@ -1,5 +1,6 @@
1
1
  #= require ./base
2
2
  #= require ./tag
3
+ # ! require underscore.inflection for use _.singularize()
3
4
 
4
5
  @Ultimate.Helpers.RecordTag =
5
6
 
@@ -28,10 +28,6 @@
28
28
  content = _.string.escapeHTML(content) if _escapeContent
29
29
  "<#{name}#{@tag_options(options, escape)}>#{@PRE_CONTENT_STRINGS[name] ? ''}#{content}</#{name}>"
30
30
 
31
- html_options_to_s: (html_options, escape = false, prefix = "") ->
32
- deprecate 'html_options_to_s()', "tag_options()"
33
- @tag_options arguments...
34
-
35
31
  tag_options: (options, escape = true) ->
36
32
  return "" if _.isEmpty(options)
37
33
  attrs = []
@@ -62,24 +62,3 @@ do ($ = jQuery) =>
62
62
  matches = content.match($.regexp.HTML)
63
63
  return false unless matches?
64
64
  not strong or matches[1] is matches[2]
65
-
66
- # TODO replace usages to underscore methods and using distribution
67
- unless $.isRegExp
68
- $.isRegExp = (candidate) ->
69
- deprecate '$.isRegExp', '_.isRegExp'
70
- typeof candidate is "object" and typeof candidate.test is "function"
71
-
72
- unless $.isBoolean
73
- $.isBoolean = (v) ->
74
- deprecate '$.isBoolean', '_.isBoolean'
75
- typeof v is "boolean"
76
-
77
- unless $.isString
78
- $.isString = (v) ->
79
- deprecate '$.isString', '_.isString'
80
- typeof v is "string"
81
-
82
- if typeof $.isEmptyString is "undefined"
83
- $.isEmptyString = (v) ->
84
- deprecate '$.isEmptyString', '_.isBlank'
85
- regexpSpace.test v
@@ -33,9 +33,10 @@
33
33
  pluralize : function( word, count, includeNumber )
34
34
  {
35
35
  var result;
36
-
36
+
37
37
  if( count !== undefined )
38
38
  {
39
+ count = Math.round(count);
39
40
  result = ( count === 1 ) ? this.singularize( word ) : this.pluralize( word );
40
41
  result = ( includeNumber ) ? [ count, result ].join( ' ' ) : result;
41
42
  }
@@ -56,7 +57,7 @@
56
57
  },
57
58
  this );
58
59
  }
59
-
60
+
60
61
  return result;
61
62
  },
62
63
 
@@ -172,5 +173,5 @@
172
173
  * Underscore integration
173
174
  */
174
175
  _.mixin( inflector.resetInflections( ) );
175
-
176
+
176
177
  } )( _ );
@@ -1,12 +1,13 @@
1
- // Underscore.js 1.4.2
2
- // http://underscorejs.org
3
- // (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
4
- // Underscore may be freely distributed under the MIT license.
1
+ // Underscore.js 1.4.4
2
+ // ===================
5
3
 
6
- (function() {
4
+ // > http://underscorejs.org
5
+ // > (c) 2009-2013 Jeremy Ashkenas, DocumentCloud Inc.
6
+ // > Underscore may be freely distributed under the MIT license.
7
7
 
8
- // Baseline setup
9
- // --------------
8
+ // Baseline setup
9
+ // --------------
10
+ (function() {
10
11
 
11
12
  // Establish the root object, `window` in the browser, or `global` on the server.
12
13
  var root = this;
@@ -24,7 +25,6 @@
24
25
  var push = ArrayProto.push,
25
26
  slice = ArrayProto.slice,
26
27
  concat = ArrayProto.concat,
27
- unshift = ArrayProto.unshift,
28
28
  toString = ObjProto.toString,
29
29
  hasOwnProperty = ObjProto.hasOwnProperty;
30
30
 
@@ -61,11 +61,11 @@
61
61
  }
62
62
  exports._ = _;
63
63
  } else {
64
- root['_'] = _;
64
+ root._ = _;
65
65
  }
66
66
 
67
67
  // Current version.
68
- _.VERSION = '1.4.2';
68
+ _.VERSION = '1.4.4';
69
69
 
70
70
  // Collection Functions
71
71
  // --------------------
@@ -102,6 +102,8 @@
102
102
  return results;
103
103
  };
104
104
 
105
+ var reduceError = 'Reduce of empty array with no initial value';
106
+
105
107
  // **Reduce** builds up a single result from a list of values, aka `inject`,
106
108
  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
107
109
  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
@@ -119,7 +121,7 @@
119
121
  memo = iterator.call(context, memo, value, index, list);
120
122
  }
121
123
  });
122
- if (!initial) throw new TypeError('Reduce of empty array with no initial value');
124
+ if (!initial) throw new TypeError(reduceError);
123
125
  return memo;
124
126
  };
125
127
 
@@ -130,7 +132,7 @@
130
132
  if (obj == null) obj = [];
131
133
  if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
132
134
  if (context) iterator = _.bind(iterator, context);
133
- return arguments.length > 2 ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
135
+ return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
134
136
  }
135
137
  var length = obj.length;
136
138
  if (length !== +length) {
@@ -146,7 +148,7 @@
146
148
  memo = iterator.call(context, memo, obj[index], index, list);
147
149
  }
148
150
  });
149
- if (!initial) throw new TypeError('Reduce of empty array with no initial value');
151
+ if (!initial) throw new TypeError(reduceError);
150
152
  return memo;
151
153
  };
152
154
 
@@ -177,12 +179,9 @@
177
179
 
178
180
  // Return all the elements for which a truth test fails.
179
181
  _.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;
182
+ return _.filter(obj, function(value, index, list) {
183
+ return !iterator.call(context, value, index, list);
184
+ }, context);
186
185
  };
187
186
 
188
187
  // Determine whether all of the elements match a truth test.
@@ -216,20 +215,19 @@
216
215
  // Determine if the array or object contains a given value (using `===`).
217
216
  // Aliased as `include`.
218
217
  _.contains = _.include = function(obj, target) {
219
- var found = false;
220
- if (obj == null) return found;
218
+ if (obj == null) return false;
221
219
  if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
222
- found = any(obj, function(value) {
220
+ return any(obj, function(value) {
223
221
  return value === target;
224
222
  });
225
- return found;
226
223
  };
227
224
 
228
225
  // Invoke a method (with arguments) on every item in a collection.
229
226
  _.invoke = function(obj, method) {
230
227
  var args = slice.call(arguments, 2);
228
+ var isFunc = _.isFunction(method);
231
229
  return _.map(obj, function(value) {
232
- return (_.isFunction(method) ? method : value[method]).apply(value, args);
230
+ return (isFunc ? method : value[method]).apply(value, args);
233
231
  });
234
232
  };
235
233
 
@@ -239,10 +237,10 @@
239
237
  };
240
238
 
241
239
  // Convenience version of a common use case of `filter`: selecting only objects
242
- // with specific `key:value` pairs.
243
- _.where = function(obj, attrs) {
244
- if (_.isEmpty(attrs)) return [];
245
- return _.filter(obj, function(value) {
240
+ // containing specific `key:value` pairs.
241
+ _.where = function(obj, attrs, first) {
242
+ if (_.isEmpty(attrs)) return first ? null : [];
243
+ return _[first ? 'find' : 'filter'](obj, function(value) {
246
244
  for (var key in attrs) {
247
245
  if (attrs[key] !== value[key]) return false;
248
246
  }
@@ -250,6 +248,12 @@
250
248
  });
251
249
  };
252
250
 
251
+ // Convenience version of a common use case of `find`: getting the first object
252
+ // containing specific `key:value` pairs.
253
+ _.findWhere = function(obj, attrs) {
254
+ return _.where(obj, attrs, true);
255
+ };
256
+
253
257
  // Return the maximum element or (element-based computation).
254
258
  // Can't optimize arrays of integers longer than 65,535 elements.
255
259
  // See: https://bugs.webkit.org/show_bug.cgi?id=80797
@@ -258,7 +262,7 @@
258
262
  return Math.max.apply(Math, obj);
259
263
  }
260
264
  if (!iterator && _.isEmpty(obj)) return -Infinity;
261
- var result = {computed : -Infinity};
265
+ var result = {computed : -Infinity, value: -Infinity};
262
266
  each(obj, function(value, index, list) {
263
267
  var computed = iterator ? iterator.call(context, value, index, list) : value;
264
268
  computed >= result.computed && (result = {value : value, computed : computed});
@@ -272,7 +276,7 @@
272
276
  return Math.min.apply(Math, obj);
273
277
  }
274
278
  if (!iterator && _.isEmpty(obj)) return Infinity;
275
- var result = {computed : Infinity};
279
+ var result = {computed : Infinity, value: Infinity};
276
280
  each(obj, function(value, index, list) {
277
281
  var computed = iterator ? iterator.call(context, value, index, list) : value;
278
282
  computed < result.computed && (result = {value : value, computed : computed});
@@ -321,7 +325,7 @@
321
325
  // An internal function used for aggregate "group by" operations.
322
326
  var group = function(obj, value, context, behavior) {
323
327
  var result = {};
324
- var iterator = lookupIterator(value);
328
+ var iterator = lookupIterator(value || _.identity);
325
329
  each(obj, function(value, index) {
326
330
  var key = iterator.call(context, value, index, obj);
327
331
  behavior(result, key, value);
@@ -341,7 +345,7 @@
341
345
  // either a string attribute to count by, or a function that returns the
342
346
  // criterion.
343
347
  _.countBy = function(obj, value, context) {
344
- return group(obj, value, context, function(result, key, value) {
348
+ return group(obj, value, context, function(result, key) {
345
349
  if (!_.has(result, key)) result[key] = 0;
346
350
  result[key]++;
347
351
  });
@@ -363,7 +367,8 @@
363
367
  // Safely convert anything iterable into a real, live array.
364
368
  _.toArray = function(obj) {
365
369
  if (!obj) return [];
366
- if (obj.length === +obj.length) return slice.call(obj);
370
+ if (_.isArray(obj)) return slice.call(obj);
371
+ if (obj.length === +obj.length) return _.map(obj, _.identity);
367
372
  return _.values(obj);
368
373
  };
369
374
 
@@ -413,7 +418,7 @@
413
418
 
414
419
  // Trim out all falsy values from an array.
415
420
  _.compact = function(array) {
416
- return _.filter(array, function(value){ return !!value; });
421
+ return _.filter(array, _.identity);
417
422
  };
418
423
 
419
424
  // Internal implementation of a recursive `flatten` function.
@@ -442,6 +447,11 @@
442
447
  // been sorted, you have the option of using a faster algorithm.
443
448
  // Aliased as `unique`.
444
449
  _.uniq = _.unique = function(array, isSorted, iterator, context) {
450
+ if (_.isFunction(isSorted)) {
451
+ context = iterator;
452
+ iterator = isSorted;
453
+ isSorted = false;
454
+ }
445
455
  var initial = iterator ? _.map(array, iterator, context) : array;
446
456
  var results = [];
447
457
  var seen = [];
@@ -565,25 +575,23 @@
565
575
  // Function (ahem) Functions
566
576
  // ------------------
567
577
 
568
- // Reusable constructor function for prototype setting.
569
- var ctor = function(){};
570
-
571
578
  // Create a function bound to a given object (assigning `this`, and arguments,
572
- // optionally). Binding with arguments is also known as `curry`.
573
- // Delegates to **ECMAScript 5**'s native `Function.bind` if available.
574
- // We check for `func.bind` first, to fail fast when `func` is undefined.
575
- _.bind = function bind(func, context) {
576
- var bound, args;
579
+ // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
580
+ // available.
581
+ _.bind = function(func, context) {
577
582
  if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
578
- if (!_.isFunction(func)) throw new TypeError;
579
- args = slice.call(arguments, 2);
580
- return bound = function() {
581
- if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
582
- ctor.prototype = func.prototype;
583
- var self = new ctor;
584
- var result = func.apply(self, args.concat(slice.call(arguments)));
585
- if (Object(result) === result) return result;
586
- return self;
583
+ var args = slice.call(arguments, 2);
584
+ return function() {
585
+ return func.apply(context, args.concat(slice.call(arguments)));
586
+ };
587
+ };
588
+
589
+ // Partially apply a function by creating a version that has had some of its
590
+ // arguments pre-filled, without changing its dynamic `this` context.
591
+ _.partial = function(func) {
592
+ var args = slice.call(arguments, 1);
593
+ return function() {
594
+ return func.apply(this, args.concat(slice.call(arguments)));
587
595
  };
588
596
  };
589
597
 
@@ -591,7 +599,7 @@
591
599
  // all callbacks defined on an object belong to it.
592
600
  _.bindAll = function(obj) {
593
601
  var funcs = slice.call(arguments, 1);
594
- if (funcs.length == 0) funcs = _.functions(obj);
602
+ if (funcs.length === 0) funcs = _.functions(obj);
595
603
  each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
596
604
  return obj;
597
605
  };
@@ -622,25 +630,26 @@
622
630
  // Returns a function, that, when invoked, will only be triggered at most once
623
631
  // during a given window of time.
624
632
  _.throttle = function(func, wait) {
625
- var context, args, timeout, throttling, more, result;
626
- var whenDone = _.debounce(function(){ more = throttling = false; }, wait);
633
+ var context, args, timeout, result;
634
+ var previous = 0;
635
+ var later = function() {
636
+ previous = new Date;
637
+ timeout = null;
638
+ result = func.apply(context, args);
639
+ };
627
640
  return function() {
628
- context = this; args = arguments;
629
- var later = function() {
641
+ var now = new Date;
642
+ var remaining = wait - (now - previous);
643
+ context = this;
644
+ args = arguments;
645
+ if (remaining <= 0) {
646
+ clearTimeout(timeout);
630
647
  timeout = null;
631
- if (more) {
632
- result = func.apply(context, args);
633
- }
634
- whenDone();
635
- };
636
- if (!timeout) timeout = setTimeout(later, wait);
637
- if (throttling) {
638
- more = true;
639
- } else {
640
- throttling = true;
648
+ previous = now;
641
649
  result = func.apply(context, args);
650
+ } else if (!timeout) {
651
+ timeout = setTimeout(later, remaining);
642
652
  }
643
- whenDone();
644
653
  return result;
645
654
  };
646
655
  };
@@ -758,8 +767,10 @@
758
767
  // Extend a given object with all the properties in passed-in object(s).
759
768
  _.extend = function(obj) {
760
769
  each(slice.call(arguments, 1), function(source) {
761
- for (var prop in source) {
762
- obj[prop] = source[prop];
770
+ if (source) {
771
+ for (var prop in source) {
772
+ obj[prop] = source[prop];
773
+ }
763
774
  }
764
775
  });
765
776
  return obj;
@@ -788,8 +799,10 @@
788
799
  // Fill in a given object with default properties.
789
800
  _.defaults = function(obj) {
790
801
  each(slice.call(arguments, 1), function(source) {
791
- for (var prop in source) {
792
- if (obj[prop] == null) obj[prop] = source[prop];
802
+ if (source) {
803
+ for (var prop in source) {
804
+ if (obj[prop] == null) obj[prop] = source[prop];
805
+ }
793
806
  }
794
807
  });
795
808
  return obj;
@@ -954,7 +967,7 @@
954
967
 
955
968
  // Is a given object a finite number?
956
969
  _.isFinite = function(obj) {
957
- return _.isNumber(obj) && isFinite(obj);
970
+ return isFinite(obj) && !isNaN(parseFloat(obj));
958
971
  };
959
972
 
960
973
  // Is the given value `NaN`? (NaN is the only number which does not equal itself).
@@ -1000,7 +1013,9 @@
1000
1013
 
1001
1014
  // Run a function **n** times.
1002
1015
  _.times = function(n, iterator, context) {
1003
- for (var i = 0; i < n; i++) iterator.call(context, i);
1016
+ var accum = Array(n);
1017
+ for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);
1018
+ return accum;
1004
1019
  };
1005
1020
 
1006
1021
  // Return a random integer between min and max (inclusive).
@@ -1009,7 +1024,7 @@
1009
1024
  max = min;
1010
1025
  min = 0;
1011
1026
  }
1012
- return min + (0 | Math.random() * (max - min + 1));
1027
+ return min + Math.floor(Math.random() * (max - min + 1));
1013
1028
  };
1014
1029
 
1015
1030
  // List of HTML entities for escaping.
@@ -1065,7 +1080,7 @@
1065
1080
  // Useful for temporary DOM ids.
1066
1081
  var idCounter = 0;
1067
1082
  _.uniqueId = function(prefix) {
1068
- var id = idCounter++;
1083
+ var id = ++idCounter + '';
1069
1084
  return prefix ? prefix + id : id;
1070
1085
  };
1071
1086
 
@@ -1100,6 +1115,7 @@
1100
1115
  // Underscore templating handles arbitrary delimiters, preserves whitespace,
1101
1116
  // and correctly escapes quotes within interpolated code.
1102
1117
  _.template = function(text, data, settings) {
1118
+ var render;
1103
1119
  settings = _.defaults({}, settings, _.templateSettings);
1104
1120
 
1105
1121
  // Combine delimiters into one regular expression via alternation.
@@ -1115,11 +1131,18 @@
1115
1131
  text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
1116
1132
  source += text.slice(index, offset)
1117
1133
  .replace(escaper, function(match) { return '\\' + escapes[match]; });
1118
- source +=
1119
- escape ? "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'" :
1120
- interpolate ? "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'" :
1121
- evaluate ? "';\n" + evaluate + "\n__p+='" : '';
1134
+
1135
+ if (escape) {
1136
+ source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
1137
+ }
1138
+ if (interpolate) {
1139
+ source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
1140
+ }
1141
+ if (evaluate) {
1142
+ source += "';\n" + evaluate + "\n__p+='";
1143
+ }
1122
1144
  index = offset + match.length;
1145
+ return match;
1123
1146
  });
1124
1147
  source += "';\n";
1125
1148
 
@@ -1131,7 +1154,7 @@
1131
1154
  source + "return __p;\n";
1132
1155
 
1133
1156
  try {
1134
- var render = new Function(settings.variable || 'obj', '_', source);
1157
+ render = new Function(settings.variable || 'obj', '_', source);
1135
1158
  } catch (e) {
1136
1159
  e.source = source;
1137
1160
  throw e;
@@ -41,12 +41,13 @@
41
41
  lt: '<',
42
42
  gt: '>',
43
43
  quot: '"',
44
- apos: "'",
45
- amp: '&'
44
+ amp: '&',
45
+ apos: "'"
46
46
  };
47
47
 
48
48
  var reversedEscapeChars = {};
49
- for(var key in escapeChars){ reversedEscapeChars[escapeChars[key]] = key; }
49
+ for(var key in escapeChars) reversedEscapeChars[escapeChars[key]] = key;
50
+ reversedEscapeChars["'"] = '#39';
50
51
 
51
52
  // sprintf() for JavaScript 0.7-beta1
52
53
  // http://www.diveintojavascript.com/projects/javascript-sprintf
@@ -206,7 +207,22 @@
206
207
 
207
208
  count: function(str, substr){
208
209
  if (str == null || substr == null) return 0;
209
- return String(str).split(substr).length - 1;
210
+
211
+ str = String(str);
212
+ substr = String(substr);
213
+
214
+ var count = 0,
215
+ pos = 0,
216
+ length = substr.length;
217
+
218
+ while (true) {
219
+ pos = str.indexOf(substr, pos);
220
+ if (pos === -1) break;
221
+ count++;
222
+ pos += length;
223
+ }
224
+
225
+ return count;
210
226
  },
211
227
 
212
228
  chars: function(str) {
@@ -320,7 +336,7 @@
320
336
  },
321
337
 
322
338
  classify: function(str){
323
- return _s.titleize(String(str).replace(/_/g, ' ')).replace(/\s/g, '');
339
+ return _s.titleize(String(str).replace(/[\W_]/g, ' ')).replace(/\s/g, '');
324
340
  },
325
341
 
326
342
  humanize: function(str){
@@ -429,17 +445,17 @@
429
445
  },
430
446
 
431
447
  toNumber: function(str, decimals) {
432
- if (str == null || str == '') return 0;
433
- str = String(str);
434
- var num = parseNumber(parseNumber(str).toFixed(~~decimals));
435
- return num === 0 && !str.match(/^0+$/) ? Number.NaN : num;
448
+ if (!str) return 0;
449
+ str = _s.trim(str);
450
+ if (!str.match(/^-?\d+(?:\.\d+)?$/)) return NaN;
451
+ return parseNumber(parseNumber(str).toFixed(~~decimals));
436
452
  },
437
453
 
438
454
  numberFormat : function(number, dec, dsep, tsep) {
439
455
  if (isNaN(number) || number == null) return '';
440
456
 
441
457
  number = number.toFixed(~~dec);
442
- tsep = tsep || ',';
458
+ tsep = typeof tsep == 'string' ? tsep : ',';
443
459
 
444
460
  var parts = number.split('.'), fnums = parts[0],
445
461
  decimals = parts[1] ? (dsep || '.') + parts[1] : '';
@@ -494,8 +510,8 @@
494
510
  slugify: function(str) {
495
511
  if (str == null) return '';
496
512
 
497
- var from = "ąàáäâãåæćęèéëêìíïîłńòóöôõøùúüûñçżź",
498
- to = "aaaaaaaaceeeeeiiiilnoooooouuuunczz",
513
+ var from = "ąàáäâãåæćęèéëêìíïîłńòóöôõøśùúüûñçżź",
514
+ to = "aaaaaaaaceeeeeiiiilnoooooosuuuunczz",
499
515
  regex = new RegExp(defaultToWhiteSpace(from), 'g');
500
516
 
501
517
  str = String(str).toLowerCase().replace(regex, function(c){
@@ -538,6 +554,36 @@
538
554
  return repeat.join(separator);
539
555
  },
540
556
 
557
+ naturalCmp: function(str1, str2){
558
+ if (str1 == str2) return 0;
559
+ if (!str1) return -1;
560
+ if (!str2) return 1;
561
+
562
+ var cmpRegex = /(\.\d+)|(\d+)|(\D+)/g,
563
+ tokens1 = String(str1).toLowerCase().match(cmpRegex),
564
+ tokens2 = String(str2).toLowerCase().match(cmpRegex),
565
+ count = Math.min(tokens1.length, tokens2.length);
566
+
567
+ for(var i = 0; i < count; i++) {
568
+ var a = tokens1[i], b = tokens2[i];
569
+
570
+ if (a !== b){
571
+ var num1 = parseInt(a, 10);
572
+ if (!isNaN(num1)){
573
+ var num2 = parseInt(b, 10);
574
+ if (!isNaN(num2) && num1 - num2)
575
+ return num1 - num2;
576
+ }
577
+ return a < b ? -1 : 1;
578
+ }
579
+ }
580
+
581
+ if (tokens1.length === tokens2.length)
582
+ return tokens1.length - tokens2.length;
583
+
584
+ return str1 < str2 ? -1 : 1;
585
+ },
586
+
541
587
  levenshtein: function(str1, str2) {
542
588
  if (str1 == null && str2 == null) return 0;
543
589
  if (str1 == null) return String(str2).length;
@@ -576,25 +622,23 @@
576
622
  _s.contains = _s.include;
577
623
  _s.q = _s.quote;
578
624
 
625
+ // Exporting
626
+
579
627
  // CommonJS module is defined
580
628
  if (typeof exports !== 'undefined') {
581
- if (typeof module !== 'undefined' && module.exports) {
582
- // Export module
629
+ if (typeof module !== 'undefined' && module.exports)
583
630
  module.exports = _s;
584
- }
585
- exports._s = _s;
586
631
 
587
- } else if (typeof define === 'function' && define.amd) {
588
- // Register as a named module with AMD.
589
- define('underscore.string', [], function() {
590
- return _s;
591
- });
592
-
593
- } else {
594
- // Integrate with Underscore.js if defined
595
- // or create our own underscore object.
596
- root._ = root._ || {};
597
- root._.string = root._.str = _s;
632
+ exports._s = _s;
598
633
  }
599
634
 
635
+ // Register as a named module with AMD.
636
+ if (typeof define === 'function' && define.amd)
637
+ define('underscore.string', [], function(){ return _s; });
638
+
639
+
640
+ // Integrate with Underscore.js if defined
641
+ // or create our own underscore object.
642
+ root._ = root._ || {};
643
+ root._.string = root._.str = _s;
600
644
  }(this, String);
@@ -1,5 +1,5 @@
1
1
  module Ultimate
2
2
  module Helpers
3
- VERSION = '0.1.0.1'
3
+ VERSION = '0.2.0'
4
4
  end
5
5
  end
@@ -0,0 +1,42 @@
1
+ #= require ultimate/underscore/underscore
2
+ #= require ultimate/underscore/underscore.string
3
+ #= require ultimate/jquery.base
4
+
5
+ module "ultimate/jquery.base"
6
+
7
+ test "ror_id", ->
8
+ strictEqual ror_id("some_id_123"), "123"
9
+ strictEqual ror_id("some_id"), null
10
+ strictEqual ror_id($('')), null
11
+ strictEqual ror_id(), null
12
+ strictEqual ror_id($('<div></div>')), null
13
+ jObj = $('<div id="some_123"></div>')
14
+ strictEqual ror_id(jObj), "123"
15
+ strictEqual jObj.data("rorId"), "123"
16
+
17
+ test "$.fn.rorId", ->
18
+ jObj = $('<div></div>')
19
+ strictEqual jObj.rorId(), null
20
+ strictEqual jObj.rorId(123)[0], jObj[0]
21
+ strictEqual jObj.attr("id"), undefined
22
+ strictEqual jObj.rorId(), 123
23
+ strictEqual jObj.rorId(777, "book").attr("id"), "book_777"
24
+ strictEqual jObj.rorId(), 777
25
+
26
+ test "$.fn.getClasses", ->
27
+ jObj = $('<div class="apple banana coconut"></div>')
28
+ deepEqual jObj.getClasses(), ["apple", "banana", "coconut"]
29
+ deepEqual jObj.attr('class', '').getClasses(), []
30
+
31
+ test "$.fn.getAttributes", ->
32
+ deepEqual $("").getAttributes(), {}
33
+ deepEqual $("<div></div>").getAttributes(), {}
34
+ deepEqual $('<div id="some_id_123" class="apple" data-loading-text="Loading..."></div>').getAttributes(), {id: "some_id_123", class: "apple", "data-loading-text": "Loading..."}
35
+
36
+ test "$.isHTML", ->
37
+ strictEqual $.isHTML(''), false
38
+ strictEqual $.isHTML('Some plain text'), false
39
+ strictEqual $.isHTML('Some plain text with <html></html>'), false
40
+ strictEqual $.isHTML('<span></span><p></p>'), true
41
+ strictEqual $.isHTML('<span></span><p></p>', true), false
42
+ strictEqual $.isHTML('<p><span></span></p>', true), true
@@ -40,7 +40,7 @@ test "options_for_select", ->
40
40
  equal options_for_select({ "$": "Dollar", "<DKR>": "<Kroner>" }, [ "Dollar", "<Kroner>" ]),
41
41
  "<option selected=\"selected\" value=\"Dollar\">$</option>\n<option selected=\"selected\" value=\"&lt;Kroner&gt;\">&lt;DKR&gt;</option>"
42
42
  equal options_for_select([ [ "<Denmark>", { class: 'bold' } ], [ "USA", { onclick: "alert('Hello World');" } ], [ "Sweden" ], "Germany" ]),
43
- "<option class=\"bold\" value=\"&lt;Denmark&gt;\">&lt;Denmark&gt;</option>\n<option onclick=\"alert(&apos;Hello World&apos;);\" value=\"USA\">USA</option>\n<option value=\"Sweden\">Sweden</option>\n<option value=\"Germany\">Germany</option>"
43
+ "<option class=\"bold\" value=\"&lt;Denmark&gt;\">&lt;Denmark&gt;</option>\n<option onclick=\"alert(&#39;Hello World&#39;);\" value=\"USA\">USA</option>\n<option value=\"Sweden\">Sweden</option>\n<option value=\"Germany\">Germany</option>"
44
44
  equal options_for_select([ [ "<Denmark>", { data: { test: 'bold' } } ] ]),
45
45
  "<option data-test=\"bold\" value=\"&lt;Denmark&gt;\">&lt;Denmark&gt;</option>"
46
46
  equal options_for_select([ [ "<Denmark>", { data: { test: '<bold>' } } ] ]),
@@ -124,7 +124,7 @@ test "radio_button_tag", ->
124
124
 
125
125
  test "submit_tag", ->
126
126
  equal submit_tag("Save", onclick: "alert('hello!')", data: { disable_with: "Saving..." }),
127
- '<input data-disable-with="Saving..." name="commit" onclick="alert(&apos;hello!&apos;)" type="submit" value="Save" />'
127
+ '<input data-disable-with="Saving..." name="commit" onclick="alert(&#39;hello!&#39;)" type="submit" value="Save" />'
128
128
  equal submit_tag("Save", data: { disable_with: "Saving..." }),
129
129
  '<input data-disable-with="Saving..." name="commit" type="submit" value="Save" />'
130
130
  equal submit_tag("Save", data: { confirm: "Are you sure?" }),
@@ -39,6 +39,7 @@ test "number_to_currency", ->
39
39
  equal number_to_currency(1234567891.50, precision: 0), "$1,234,567,892"
40
40
  equal number_to_currency(1234567890.50, precision: 1), "$1,234,567,890.5"
41
41
  equal number_to_currency(1234567890.50, unit: "&pound;", separator: ",", delimiter: ""), "&pound;1234567890,50"
42
+ equal number_to_currency(1234567890.50, unit: '<span class="unit">Руб.</span>', format: "%n %u"), "1,234,567,890.50 <span class=\"unit\">Руб.</span>"
42
43
  equal number_to_currency("1234567890.50"), "$1,234,567,890.50"
43
44
  equal number_to_currency("1234567890.50", unit: "K&#269;", format: "%n %u"), "1,234,567,890.50 K&#269;"
44
45
  equal number_to_currency("-1234567890.50", unit: "K&#269;", format: "%n %u", negative_format: "%n - %u"), "1,234,567,890.50 - K&#269;"
@@ -0,0 +1,47 @@
1
+ #= require ultimate/underscore/underscore
2
+ #= require ultimate/helpers
3
+
4
+ module "ultimate/helpers"
5
+
6
+ test "cout", ->
7
+ ok _.isBoolean(window.DEBUG_MODE), "global DEBUG_MODE is Boolean"
8
+ window.DEBUG_MODE = true
9
+ strictEqual cout(123), 123, "cout() must return first argument"
10
+ window.DEBUG_MODE = false
11
+ for method in ['log', 'info', 'warn', 'error', 'assert', 'clear']
12
+ strictEqual cout(method, 123), 123, "cout() must return second argument if first is `#{method}` as method"
13
+ window.DEBUG_MODE = true
14
+
15
+ test "_cout", ->
16
+ strictEqual _cout(123), 123, "_cout() must return first argument"
17
+ for method in ['log', 'info', 'warn', 'error', 'assert', 'clear']
18
+ strictEqual _cout(method, 123), method, "_cout() on so strong that it does not use the method `#{method}` as first argument, and return first argument always"
19
+
20
+ test "deprecate", ->
21
+ equal deprecate('first thing'), "`first thing` DEPRECATED!", "log and return message about deprecated function"
22
+ equal deprecate('first thing', 'second thing'), "`first thing` DEPRECATED! Use instead `second thing`", "log and return message about deprecated function, and hint about using instead"
23
+
24
+ test "todo", ->
25
+ ok _.isBoolean(window.LOG_TODO), "global LOG_TODO is Boolean"
26
+ window.LOG_TODO = true
27
+ equal todo('some todo'), "TODO: some todo", "log and return todo"
28
+ equal todo('some todo', "helpers_test.js.coffee"), "TODO: some todo ### helpers_test.js.coffee", "log and return todo with location string"
29
+ equal todo('some todo', "helpers_test.js.coffee", "test \"deprecate\""), "TODO: some todo ### helpers_test.js.coffee > test \"deprecate\"", "log and return todo with description of function"
30
+ equal todo('some todo', "helpers_test.js.coffee", 12), "TODO: some todo ### helpers_test.js.coffee:12", "log and return message with string number"
31
+ window.LOG_TODO = false
32
+ equal todo('some todo'), undefined, "don't log and return `undefined` if global LOG_TODO == false"
33
+ window.LOG_TODO = true
34
+
35
+ test "logicalXOR", ->
36
+ strictEqual logicalXOR(false, false), false, "false XOR false === false"
37
+ strictEqual logicalXOR(false, true), true, "false XOR true === true"
38
+ strictEqual logicalXOR(true, false), true, "true XOR false === true"
39
+ strictEqual logicalXOR(true, true), false, "true XOR true === false"
40
+
41
+ test "bound", ->
42
+ equal bound(0, 10, 100), 10
43
+ equal bound(100, 10, 100), 100
44
+ equal bound(50, 10, 100), 50
45
+ equal bound(-20, -10, 100), -10
46
+ equal bound(-20, 10, -10), 10
47
+ equal bound(20, 10, -10), 10
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ultimate-helpers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.1
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-27 00:00:00.000000000 Z
12
+ date: 2013-05-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -67,8 +67,6 @@ extensions: []
67
67
  extra_rdoc_files: []
68
68
  files:
69
69
  - .gitignore
70
- - .rvmrc
71
- - .rvmrc.example
72
70
  - Gemfile
73
71
  - Gemfile.lock
74
72
  - LICENSE
@@ -147,6 +145,7 @@ files:
147
145
  - test/dummy/script/rails
148
146
  - test/javascripts/all_tests.js.coffee
149
147
  - test/javascripts/test_helper.js.coffee
148
+ - test/javascripts/tests/base_test.js.coffee
150
149
  - test/javascripts/tests/helpers/asset_tag_test.js.coffee
151
150
  - test/javascripts/tests/helpers/form_options_test.js.coffee
152
151
  - test/javascripts/tests/helpers/form_tag_test.js.coffee
@@ -155,6 +154,7 @@ files:
155
154
  - test/javascripts/tests/helpers/record_tag_test.js.coffee
156
155
  - test/javascripts/tests/helpers/tag_test.js.coffee
157
156
  - test/javascripts/tests/helpers/url_test.js.coffee
157
+ - test/javascripts/tests/helpers_test.js.coffee
158
158
  - test/javascripts/tests/underscore/underscore.outcasts.test.js.coffee
159
159
  - test/javascripts/vendors/backbone.js
160
160
  - test/javascripts/vendors/i18n-lite.js.coffee
@@ -186,8 +186,79 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
186
  version: '0'
187
187
  requirements: []
188
188
  rubyforge_project: ultimate-helpers
189
- rubygems_version: 1.8.24
189
+ rubygems_version: 1.8.25
190
190
  signing_key:
191
191
  specification_version: 3
192
192
  summary: Ultimate Helpers, Rails ActionView helpers ported to CoffeeScript
193
- test_files: []
193
+ test_files:
194
+ - test/dummy/Rakefile
195
+ - test/dummy/_emfile
196
+ - test/dummy/app/assets/images/.gitkeep
197
+ - test/dummy/app/assets/javascripts/application.js
198
+ - test/dummy/app/assets/stylesheets/application.css
199
+ - test/dummy/app/assets/stylesheets/global/forms.css.scss
200
+ - test/dummy/app/assets/stylesheets/global/layout.css.scss
201
+ - test/dummy/app/assets/stylesheets/global/layout/footer.scss
202
+ - test/dummy/app/assets/stylesheets/global/layout/header.scss
203
+ - test/dummy/app/assets/stylesheets/global/layout/main-menu.scss
204
+ - test/dummy/app/assets/stylesheets/global/reserved.css.scss
205
+ - test/dummy/app/assets/stylesheets/global/reset.css.scss
206
+ - test/dummy/app/assets/stylesheets/global/structures.css.scss
207
+ - test/dummy/app/assets/stylesheets/import/base.scss
208
+ - test/dummy/app/assets/stylesheets/plugins/qunit.css.scss
209
+ - test/dummy/app/controllers/application_controller.rb
210
+ - test/dummy/app/controllers/main_controller.rb
211
+ - test/dummy/app/helpers/application_helper.rb
212
+ - test/dummy/app/mailers/.gitkeep
213
+ - test/dummy/app/models/.gitkeep
214
+ - test/dummy/app/views/application/_footer.html.haml
215
+ - test/dummy/app/views/application/_header.html.haml
216
+ - test/dummy/app/views/application/_main_menu.html.haml
217
+ - test/dummy/app/views/layouts/application.html.haml
218
+ - test/dummy/app/views/main/index.html.haml
219
+ - test/dummy/app/views/main/qunit.html.haml
220
+ - test/dummy/config.ru
221
+ - test/dummy/config/application.rb
222
+ - test/dummy/config/boot.rb
223
+ - test/dummy/config/database.yml
224
+ - test/dummy/config/environment.rb
225
+ - test/dummy/config/environments/development.rb
226
+ - test/dummy/config/environments/production.rb
227
+ - test/dummy/config/environments/test.rb
228
+ - test/dummy/config/initializers/backtrace_silencers.rb
229
+ - test/dummy/config/initializers/inflections.rb
230
+ - test/dummy/config/initializers/mime_types.rb
231
+ - test/dummy/config/initializers/qunit-rails.rb
232
+ - test/dummy/config/initializers/secret_token.rb
233
+ - test/dummy/config/initializers/session_store.rb
234
+ - test/dummy/config/initializers/wrap_parameters.rb
235
+ - test/dummy/config/locales/en.yml
236
+ - test/dummy/config/routes.rb
237
+ - test/dummy/log/.gitkeep
238
+ - test/dummy/public/404.html
239
+ - test/dummy/public/422.html
240
+ - test/dummy/public/500.html
241
+ - test/dummy/public/favicon.ico
242
+ - test/dummy/script/rails
243
+ - test/javascripts/all_tests.js.coffee
244
+ - test/javascripts/test_helper.js.coffee
245
+ - test/javascripts/tests/base_test.js.coffee
246
+ - test/javascripts/tests/helpers/asset_tag_test.js.coffee
247
+ - test/javascripts/tests/helpers/form_options_test.js.coffee
248
+ - test/javascripts/tests/helpers/form_tag_test.js.coffee
249
+ - test/javascripts/tests/helpers/javascript_test.js.coffee
250
+ - test/javascripts/tests/helpers/number_test.js.coffee
251
+ - test/javascripts/tests/helpers/record_tag_test.js.coffee
252
+ - test/javascripts/tests/helpers/tag_test.js.coffee
253
+ - test/javascripts/tests/helpers/url_test.js.coffee
254
+ - test/javascripts/tests/helpers_test.js.coffee
255
+ - test/javascripts/tests/underscore/underscore.outcasts.test.js.coffee
256
+ - test/javascripts/vendors/backbone.js
257
+ - test/javascripts/vendors/i18n-lite.js.coffee
258
+ - test/stylesheets/test_helper.css
259
+ - test/stylesheets/vendors/ultimate/mixins/_routines.scss
260
+ - test/stylesheets/vendors/ultimate/mixins/_vendors.scss
261
+ - test/stylesheets/vendors/ultimate/mixins/css3.scss
262
+ - test/stylesheets/vendors/ultimate/mixins/css3/_text-shadow.scss
263
+ - test/stylesheets/vendors/ultimate/mixins/fonts.scss
264
+ - test/stylesheets/vendors/ultimate/mixins/microstructures.scss
data/.rvmrc DELETED
@@ -1 +0,0 @@
1
- rvm 1.9.3@ultimate
@@ -1 +0,0 @@
1
- rvm 1.9.3@ultimate