sugar-rails 1.2.5.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/README.md +110 -28
  2. data/lib/generators/sugar/build/build_generator.rb +107 -0
  3. data/lib/generators/sugar/install/install_generator.rb +2 -2
  4. data/lib/sugar/rails/version.rb +2 -2
  5. data/sugar-rails.gemspec +1 -1
  6. data/vendor/assets/javascripts/precompiled/development/array.js +1212 -0
  7. data/vendor/assets/javascripts/precompiled/development/core.js +329 -0
  8. data/vendor/assets/javascripts/precompiled/development/date.js +2179 -0
  9. data/vendor/assets/javascripts/precompiled/development/date_locales.js +952 -0
  10. data/vendor/assets/javascripts/precompiled/development/date_ranges.js +183 -0
  11. data/vendor/assets/javascripts/precompiled/development/es5.js +443 -0
  12. data/vendor/assets/javascripts/precompiled/development/function.js +222 -0
  13. data/vendor/assets/javascripts/{sugar-inflections.js → precompiled/development/inflections.js} +51 -162
  14. data/vendor/assets/javascripts/precompiled/development/language.js +383 -0
  15. data/vendor/assets/javascripts/precompiled/development/number.js +422 -0
  16. data/vendor/assets/javascripts/precompiled/development/object.js +348 -0
  17. data/vendor/assets/javascripts/precompiled/development/regexp.js +92 -0
  18. data/vendor/assets/javascripts/precompiled/development/string.js +871 -0
  19. data/vendor/assets/javascripts/precompiled/minified/array.js +16 -0
  20. data/vendor/assets/javascripts/precompiled/minified/core.js +8 -0
  21. data/vendor/assets/javascripts/precompiled/minified/date.js +40 -0
  22. data/vendor/assets/javascripts/precompiled/minified/date_locales.js +38 -0
  23. data/vendor/assets/javascripts/precompiled/minified/date_ranges.js +3 -0
  24. data/vendor/assets/javascripts/precompiled/minified/es5.js +7 -0
  25. data/vendor/assets/javascripts/precompiled/minified/function.js +4 -0
  26. data/vendor/assets/javascripts/precompiled/minified/inflections.js +11 -0
  27. data/vendor/assets/javascripts/precompiled/minified/language.js +19 -0
  28. data/vendor/assets/javascripts/precompiled/minified/number.js +5 -0
  29. data/vendor/assets/javascripts/precompiled/minified/object.js +6 -0
  30. data/vendor/assets/javascripts/precompiled/minified/regexp.js +2 -0
  31. data/vendor/assets/javascripts/precompiled/minified/string.js +12 -0
  32. data/vendor/assets/javascripts/precompiled/readme.txt +3 -0
  33. data/vendor/assets/javascripts/sugar-development.js +8054 -0
  34. data/vendor/assets/javascripts/sugar-full.js +179 -0
  35. data/vendor/assets/javascripts/sugar.js +111 -6211
  36. metadata +35 -9
  37. data/vendor/assets/javascripts/sugar-core.js +0 -4001
  38. data/vendor/assets/javascripts/sugar-dates-only.js +0 -3121
  39. data/vendor/assets/javascripts/sugar-dates.js +0 -2210
@@ -0,0 +1,183 @@
1
+
2
+ /***
3
+ * @package DateRange
4
+ * @dependency date
5
+ * @description Date Ranges define a range of time. They can enumerate over specific points within that range, and be manipulated and compared.
6
+ *
7
+ ***/
8
+
9
+ var DateRange = function(start, end) {
10
+ this.start = date.create(start);
11
+ this.end = date.create(end);
12
+ };
13
+
14
+ // 'toString' doesn't appear in a for..in loop in IE even though
15
+ // hasOwnProperty reports true, so extend() can't be used here.
16
+ // Also tried simply setting the prototype = {} up front for all
17
+ // methods but GCC very oddly started dropping properties in the
18
+ // object randomly (maybe because of the global scope?) hence
19
+ // the need for the split logic here.
20
+ DateRange.prototype.toString = function() {
21
+ /***
22
+ * @method toString()
23
+ * @returns String
24
+ * @short Returns a string representation of the DateRange.
25
+ * @example
26
+ *
27
+ * Date.range('2003', '2005').toString() -> January 1, 2003..January 1, 2005
28
+ *
29
+ ***/
30
+ return this.isValid() ? this.start.full() + '..' + this.end.full() : 'Invalid DateRange';
31
+ };
32
+
33
+ extend(DateRange, true, false, {
34
+
35
+ /***
36
+ * @method isValid()
37
+ * @returns Boolean
38
+ * @short Returns true if the DateRange is valid, false otherwise.
39
+ * @example
40
+ *
41
+ * Date.range('2003', '2005').isValid() -> true
42
+ * Date.range('2005', '2003').isValid() -> false
43
+ *
44
+ ***/
45
+ 'isValid': function() {
46
+ return this.start < this.end;
47
+ },
48
+
49
+ /***
50
+ * @method duration()
51
+ * @returns Number
52
+ * @short Return the duration of the DateRange in milliseconds.
53
+ * @example
54
+ *
55
+ * Date.range('2003', '2005').duration() -> 94694400000
56
+ *
57
+ ***/
58
+ 'duration': function() {
59
+ return this.isValid() ? this.end.getTime() - this.start.getTime() : NaN;
60
+ },
61
+
62
+ /***
63
+ * @method contains(<d>)
64
+ * @returns Boolean
65
+ * @short Returns true if <d> is contained inside the DateRange. <d> may be a date or another DateRange.
66
+ * @example
67
+ *
68
+ * Date.range('2003', '2005').contains(Date.create('2004')) -> true
69
+ *
70
+ ***/
71
+ 'contains': function(obj) {
72
+ var self = this, arr = obj.start && obj.end ? [obj.start, obj.end] : [obj];
73
+ return arr.every(function(d) {
74
+ return d >= self.start && d <= self.end;
75
+ });
76
+ },
77
+
78
+ /***
79
+ * @method every(<increment>, [fn])
80
+ * @returns Array
81
+ * @short Iterates through the DateRange for every <increment>, calling [fn] if it is passed. Returns an array of each increment visited.
82
+ * @extra When <increment> is a number, increments will be to the exact millisecond. <increment> can also be a string in the format %{number} {unit}s%, in which case it will increment in the unit specified. Note that a discrepancy exists in the case of months, as %(2).months()% is an approximation. Stepping through the actual months by passing %"2 months"% is usually preferable in this case.
83
+ * @example
84
+ *
85
+ * Date.range('2003-01', '2003-03').every("2 months") -> [...]
86
+ *
87
+ ***/
88
+ 'every': function(increment, fn) {
89
+ var current = this.start.clone(), result = [], index = 0, params;
90
+ if(isString(increment)) {
91
+ current.advance(getDateParamsFromString(increment, 0), true);
92
+ params = getDateParamsFromString(increment);
93
+ } else {
94
+ params = { 'milliseconds': increment };
95
+ }
96
+ while(current <= this.end) {
97
+ result.push(current);
98
+ if(fn) fn(current, index);
99
+ current = current.clone().advance(params, true);
100
+ index++;
101
+ }
102
+ return result;
103
+ },
104
+
105
+ /***
106
+ * @method union(<range>)
107
+ * @returns DateRange
108
+ * @short Returns a new DateRange with the earliest starting point as its start, and the latest ending point as its end. If the two ranges do not intersect this will effectively remove the "gap" between them.
109
+ * @example
110
+ *
111
+ * Date.range('2003=01', '2005-01').union(Date.range('2004-01', '2006-01')) -> Jan 1, 2003..Jan 1, 2006
112
+ *
113
+ ***/
114
+ 'union': function(range) {
115
+ return new DateRange(
116
+ this.start < range.start ? this.start : range.start,
117
+ this.end > range.end ? this.end : range.end
118
+ );
119
+ },
120
+
121
+ /***
122
+ * @method intersect(<range>)
123
+ * @returns DateRange
124
+ * @short Returns a new DateRange with the latest starting point as its start, and the earliest ending point as its end. If the two ranges do not intersect this will effectively produce an invalid range.
125
+ * @example
126
+ *
127
+ * Date.range('2003-01', '2005-01').intersect(Date.range('2004-01', '2006-01')) -> Jan 1, 2004..Jan 1, 2005
128
+ *
129
+ ***/
130
+ 'intersect': function(range) {
131
+ return new DateRange(
132
+ this.start > range.start ? this.start : range.start,
133
+ this.end < range.end ? this.end : range.end
134
+ );
135
+ }
136
+
137
+ });
138
+
139
+ /***
140
+ * @method each[Unit]([fn])
141
+ * @returns Date
142
+ * @short Increments through the date range for each [unit], calling [fn] if it is passed. Returns an array of each increment visited.
143
+ *
144
+ * @set
145
+ * eachMillisecond()
146
+ * eachSecond()
147
+ * eachMinute()
148
+ * eachHour()
149
+ * eachDay()
150
+ * eachWeek()
151
+ * eachMonth()
152
+ * eachYear()
153
+ *
154
+ * @example
155
+ *
156
+ * Date.range('2003-01', '2003-02').eachMonth() -> [...]
157
+ * Date.range('2003-01-15', '2003-01-16').eachDay() -> [...]
158
+ *
159
+ ***/
160
+ extendSimilar(DateRange, true, false, 'Millisecond,Second,Minute,Hour,Day,Week,Month,Year', function(methods, name) {
161
+ methods['each' + name] = function(fn) { return this.every(name, fn); }
162
+ });
163
+
164
+
165
+ /***
166
+ * Date module
167
+ ***/
168
+
169
+ extend(date, false, false, {
170
+
171
+ /***
172
+ * @method Date.range([start], [end])
173
+ * @returns DateRange
174
+ * @short Creates a new date range.
175
+ * @extra If either [start] or [end] are null, they will default to the current date.
176
+ *
177
+ ***/
178
+ 'range': function(start, end) {
179
+ return new DateRange(start, end);
180
+ }
181
+
182
+ });
183
+
@@ -0,0 +1,443 @@
1
+
2
+
3
+ /***
4
+ * @package ES5
5
+ * @description Shim methods that provide ES5 compatible functionality. This package can be excluded if you do not require legacy browser support (IE8 and below).
6
+ *
7
+ ***/
8
+
9
+
10
+ /***
11
+ * Object module
12
+ *
13
+ ***/
14
+
15
+ extend(object, false, false, {
16
+
17
+ 'keys': function(obj) {
18
+ var keys = [];
19
+ if(!isObjectPrimitive(obj) && !isRegExp(obj) && !isFunction(obj)) {
20
+ throw new TypeError('Object required');
21
+ }
22
+ iterateOverObject(obj, function(key, value) {
23
+ keys.push(key);
24
+ });
25
+ return keys;
26
+ }
27
+
28
+ });
29
+
30
+
31
+ /***
32
+ * Array module
33
+ *
34
+ ***/
35
+
36
+ // ECMA5 methods
37
+
38
+ function arrayIndexOf(arr, search, fromIndex, increment) {
39
+ var length = arr.length,
40
+ fromRight = increment == -1,
41
+ start = fromRight ? length - 1 : 0,
42
+ index = toIntegerWithDefault(fromIndex, start);
43
+ if(index < 0) {
44
+ index = length + index;
45
+ }
46
+ if((!fromRight && index < 0) || (fromRight && index >= length)) {
47
+ index = start;
48
+ }
49
+ while((fromRight && index >= 0) || (!fromRight && index < length)) {
50
+ if(arr[index] === search) {
51
+ return index;
52
+ }
53
+ index += increment;
54
+ }
55
+ return -1;
56
+ }
57
+
58
+ function arrayReduce(arr, fn, initialValue, fromRight) {
59
+ var length = arr.length, count = 0, defined = isDefined(initialValue), result, index;
60
+ checkCallback(fn);
61
+ if(length == 0 && !defined) {
62
+ throw new TypeError('Reduce called on empty array with no initial value');
63
+ } else if(defined) {
64
+ result = initialValue;
65
+ } else {
66
+ result = arr[fromRight ? length - 1 : count];
67
+ count++;
68
+ }
69
+ while(count < length) {
70
+ index = fromRight ? length - count - 1 : count;
71
+ if(index in arr) {
72
+ result = fn(result, arr[index], index, arr);
73
+ }
74
+ count++;
75
+ }
76
+ return result;
77
+ }
78
+
79
+ function toIntegerWithDefault(i, d) {
80
+ if(isNaN(i)) {
81
+ return d;
82
+ } else {
83
+ return parseInt(i >> 0);
84
+ }
85
+ }
86
+
87
+ function checkCallback(fn) {
88
+ if(!fn || !fn.call) {
89
+ throw new TypeError('Callback is not callable');
90
+ }
91
+ }
92
+
93
+ function checkFirstArgumentExists(args) {
94
+ if(args.length === 0) {
95
+ throw new TypeError('First argument must be defined');
96
+ }
97
+ }
98
+
99
+
100
+
101
+
102
+
103
+ extend(array, false, false, {
104
+
105
+ /***
106
+ *
107
+ * @method Array.isArray(<obj>)
108
+ * @returns Boolean
109
+ * @short Returns true if <obj> is an Array.
110
+ * @extra This method is provided for browsers that don't support it internally.
111
+ * @example
112
+ *
113
+ * Array.isArray(3) -> false
114
+ * Array.isArray(true) -> false
115
+ * Array.isArray('wasabi') -> false
116
+ * Array.isArray([1,2,3]) -> true
117
+ *
118
+ ***/
119
+ 'isArray': function(obj) {
120
+ return isClass(obj, 'Array');
121
+ }
122
+
123
+ });
124
+
125
+
126
+ extend(array, true, false, {
127
+
128
+ // Documented in Array package
129
+
130
+ 'every': function(fn, scope) {
131
+ var length = this.length, index = 0;
132
+ checkFirstArgumentExists(arguments);
133
+ while(index < length) {
134
+ if(index in this && !fn.call(scope, this[index], index, this)) {
135
+ return false;
136
+ }
137
+ index++;
138
+ }
139
+ return true;
140
+ },
141
+
142
+ // Documented in Array package
143
+
144
+ 'some': function(fn, scope) {
145
+ var length = this.length, index = 0;
146
+ checkFirstArgumentExists(arguments);
147
+ while(index < length) {
148
+ if(index in this && fn.call(scope, this[index], index, this)) {
149
+ return true;
150
+ }
151
+ index++;
152
+ }
153
+ return false;
154
+ },
155
+
156
+ // Documented in Array package
157
+
158
+ 'map': function(fn, scope) {
159
+ var length = this.length, index = 0, result = new Array(length);
160
+ checkFirstArgumentExists(arguments);
161
+ while(index < length) {
162
+ if(index in this) {
163
+ result[index] = fn.call(scope, this[index], index, this);
164
+ }
165
+ index++;
166
+ }
167
+ return result;
168
+ },
169
+
170
+ // Documented in Array package
171
+
172
+ 'filter': function(fn, scope) {
173
+ var length = this.length, index = 0, result = [];
174
+ checkFirstArgumentExists(arguments);
175
+ while(index < length) {
176
+ if(index in this && fn.call(scope, this[index], index, this)) {
177
+ result.push(this[index]);
178
+ }
179
+ index++;
180
+ }
181
+ return result;
182
+ },
183
+
184
+ /***
185
+ * @method indexOf(<search>, [fromIndex])
186
+ * @returns Number
187
+ * @short Searches the array and returns the first index where <search> occurs, or -1 if the element is not found.
188
+ * @extra [fromIndex] is the index from which to begin the search. This method performs a simple strict equality comparison on <search>. It does not support enhanced functionality such as searching the contents against a regex, callback, or deep comparison of objects. For such functionality, use the %findIndex% method instead.
189
+ * @example
190
+ *
191
+ * [1,2,3].indexOf(3) -> 1
192
+ * [1,2,3].indexOf(7) -> -1
193
+ *
194
+ ***/
195
+ 'indexOf': function(search, fromIndex) {
196
+ if(isString(this)) return this.indexOf(search, fromIndex);
197
+ return arrayIndexOf(this, search, fromIndex, 1);
198
+ },
199
+
200
+ /***
201
+ * @method lastIndexOf(<search>, [fromIndex])
202
+ * @returns Number
203
+ * @short Searches the array and returns the last index where <search> occurs, or -1 if the element is not found.
204
+ * @extra [fromIndex] is the index from which to begin the search. This method performs a simple strict equality comparison on <search>.
205
+ * @example
206
+ *
207
+ * [1,2,1].lastIndexOf(1) -> 2
208
+ * [1,2,1].lastIndexOf(7) -> -1
209
+ *
210
+ ***/
211
+ 'lastIndexOf': function(search, fromIndex) {
212
+ if(isString(this)) return this.lastIndexOf(search, fromIndex);
213
+ return arrayIndexOf(this, search, fromIndex, -1);
214
+ },
215
+
216
+ /***
217
+ * @method forEach([fn], [scope])
218
+ * @returns Nothing
219
+ * @short Iterates over the array, calling [fn] on each loop.
220
+ * @extra This method is only provided for those browsers that do not support it natively. [scope] becomes the %this% object.
221
+ * @example
222
+ *
223
+ * ['a','b','c'].forEach(function(a) {
224
+ * // Called 3 times: 'a','b','c'
225
+ * });
226
+ *
227
+ ***/
228
+ 'forEach': function(fn, scope) {
229
+ var length = this.length, index = 0;
230
+ checkCallback(fn);
231
+ while(index < length) {
232
+ if(index in this) {
233
+ fn.call(scope, this[index], index, this);
234
+ }
235
+ index++;
236
+ }
237
+ },
238
+
239
+ /***
240
+ * @method reduce(<fn>, [init])
241
+ * @returns Mixed
242
+ * @short Reduces the array to a single result.
243
+ * @extra If [init] is passed as a starting value, that value will be passed as the first argument to the callback. The second argument will be the first element in the array. From that point, the result of the callback will then be used as the first argument of the next iteration. This is often refered to as "accumulation", and [init] is often called an "accumulator". If [init] is not passed, then <fn> will be called n - 1 times, where n is the length of the array. In this case, on the first iteration only, the first argument will be the first element of the array, and the second argument will be the second. After that callbacks work as normal, using the result of the previous callback as the first argument of the next. This method is only provided for those browsers that do not support it natively.
244
+ *
245
+ * @example
246
+ *
247
+ + [1,2,3,4].reduce(function(a, b) {
248
+ * return a - b;
249
+ * });
250
+ + [1,2,3,4].reduce(function(a, b) {
251
+ * return a - b;
252
+ * }, 100);
253
+ *
254
+ ***/
255
+ 'reduce': function(fn, init) {
256
+ return arrayReduce(this, fn, init);
257
+ },
258
+
259
+ /***
260
+ * @method reduceRight([fn], [init])
261
+ * @returns Mixed
262
+ * @short Identical to %Array#reduce%, but operates on the elements in reverse order.
263
+ * @extra This method is only provided for those browsers that do not support it natively.
264
+ *
265
+ *
266
+ *
267
+ *
268
+ * @example
269
+ *
270
+ + [1,2,3,4].reduceRight(function(a, b) {
271
+ * return a - b;
272
+ * });
273
+ *
274
+ ***/
275
+ 'reduceRight': function(fn, init) {
276
+ return arrayReduce(this, fn, init, true);
277
+ }
278
+
279
+
280
+ });
281
+
282
+
283
+
284
+
285
+ /***
286
+ * String module
287
+ *
288
+ ***/
289
+
290
+
291
+ function buildTrim() {
292
+ var support = getTrimmableCharacters().match(/^\s+$/);
293
+ try { string.prototype.trim.call([1]); } catch(e) { support = false; }
294
+ extend(string, true, !support, {
295
+
296
+ /***
297
+ * @method trim[Side]()
298
+ * @returns String
299
+ * @short Removes leading and/or trailing whitespace from the string.
300
+ * @extra Whitespace is defined as line breaks, tabs, and any character in the "Space, Separator" Unicode category, conforming to the the ES5 spec. The standard %trim% method is only added when not fully supported natively.
301
+ *
302
+ * @set
303
+ * trim
304
+ * trimLeft
305
+ * trimRight
306
+ *
307
+ * @example
308
+ *
309
+ * ' wasabi '.trim() -> 'wasabi'
310
+ * ' wasabi '.trimLeft() -> 'wasabi '
311
+ * ' wasabi '.trimRight() -> ' wasabi'
312
+ *
313
+ ***/
314
+ 'trim': function() {
315
+ return this.toString().trimLeft().trimRight();
316
+ },
317
+
318
+ 'trimLeft': function() {
319
+ return this.replace(regexp('^['+getTrimmableCharacters()+']+'), '');
320
+ },
321
+
322
+ 'trimRight': function() {
323
+ return this.replace(regexp('['+getTrimmableCharacters()+']+$'), '');
324
+ }
325
+ });
326
+ }
327
+
328
+
329
+
330
+ /***
331
+ * Function module
332
+ *
333
+ ***/
334
+
335
+
336
+ function buildBind() {
337
+ var support = false;
338
+ if(Function.prototype.bind) {
339
+ function F() {};
340
+ var B = F.bind();
341
+ support = (new B instanceof B) && !(new F instanceof B);
342
+ }
343
+ extend(Function, true, !support, {
344
+
345
+ /***
346
+ * @method bind(<scope>, [arg1], ...)
347
+ * @returns Function
348
+ * @short Binds <scope> as the %this% object for the function when it is called. Also allows currying an unlimited number of parameters.
349
+ * @extra "currying" means setting parameters ([arg1], [arg2], etc.) ahead of time so that they are passed when the function is called later. If you pass additional parameters when the function is actually called, they will be added will be added to the end of the curried parameters. This method is provided for browsers that don't support it internally.
350
+ * @example
351
+ *
352
+ + (function() {
353
+ * return this;
354
+ * }).bind('woof')(); -> returns 'woof'; function is bound with 'woof' as the this object.
355
+ * (function(a) {
356
+ * return a;
357
+ * }).bind(1, 2)(); -> returns 2; function is bound with 1 as the this object and 2 curried as the first parameter
358
+ * (function(a, b) {
359
+ * return a + b;
360
+ * }).bind(1, 2)(3); -> returns 5; function is bound with 1 as the this object, 2 curied as the first parameter and 3 passed as the second when calling the function
361
+ *
362
+ ***/
363
+ 'bind': function(scope) {
364
+ var fn = this, args = multiArgs(arguments).slice(1), nop, bound;
365
+ if(!isFunction(this)) {
366
+ throw new TypeError('Function.prototype.bind called on a non-function');
367
+ }
368
+ bound = function() {
369
+ return fn.apply(fn.prototype && this instanceof fn ? this : scope, args.concat(multiArgs(arguments)));
370
+ }
371
+ nop = function() {};
372
+ nop.prototype = this.prototype;
373
+ bound.prototype = new nop();
374
+ return bound;
375
+ }
376
+
377
+ });
378
+ }
379
+
380
+ /***
381
+ * Date module
382
+ *
383
+ ***/
384
+
385
+ /***
386
+ * @method toISOString()
387
+ * @returns String
388
+ * @short Formats the string to ISO8601 format.
389
+ * @extra This will always format as UTC time. Provided for browsers that do not support this method.
390
+ * @example
391
+ *
392
+ * Date.create().toISOString() -> ex. 2011-07-05 12:24:55.528Z
393
+ *
394
+ ***
395
+ * @method toJSON()
396
+ * @returns String
397
+ * @short Returns a JSON representation of the date.
398
+ * @extra This is effectively an alias for %toISOString%. Will always return the date in UTC time. Provided for browsers that do not support this method.
399
+ * @example
400
+ *
401
+ * Date.create().toJSON() -> ex. 2011-07-05 12:24:55.528Z
402
+ *
403
+ ***/
404
+
405
+ extend(date, false, false, {
406
+
407
+ /***
408
+ * @method Date.now()
409
+ * @returns String
410
+ * @short Returns the number of milliseconds since January 1st, 1970 00:00:00 (UTC time).
411
+ * @extra Provided for browsers that do not support this method.
412
+ * @example
413
+ *
414
+ * Date.now() -> ex. 1311938296231
415
+ *
416
+ ***/
417
+ 'now': function() {
418
+ return new date().getTime();
419
+ }
420
+
421
+ });
422
+
423
+ function buildISOString() {
424
+ var d = new date(date.UTC(1999, 11, 31)), target = '1999-12-31T00:00:00.000Z';
425
+ var support = d.toISOString && d.toISOString() === target;
426
+ extendSimilar(date, true, !support, 'toISOString,toJSON', function(methods, name) {
427
+ methods[name] = function() {
428
+ return padNumber(this.getUTCFullYear(), 4) + '-' +
429
+ padNumber(this.getUTCMonth() + 1, 2) + '-' +
430
+ padNumber(this.getUTCDate(), 2) + 'T' +
431
+ padNumber(this.getUTCHours(), 2) + ':' +
432
+ padNumber(this.getUTCMinutes(), 2) + ':' +
433
+ padNumber(this.getUTCSeconds(), 2) + '.' +
434
+ padNumber(this.getUTCMilliseconds(), 3) + 'Z';
435
+ }
436
+ });
437
+ }
438
+
439
+ // Initialize
440
+ buildTrim();
441
+ buildBind();
442
+ buildISOString();
443
+