opal 0.3.41 → 0.3.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +2 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.md +14 -1
- data/Gemfile +2 -5
- data/Rakefile +41 -3
- data/bin/opal +33 -0
- data/lib/opal.rb +2 -12
- data/lib/opal/core_ext.rb +5 -0
- data/lib/opal/grammar.rb +2207 -2138
- data/lib/opal/grammar.y +21 -0
- data/lib/opal/grammar_helpers.rb +360 -0
- data/lib/opal/lexer.rb +55 -401
- data/lib/opal/lexer_scope.rb +28 -0
- data/lib/opal/parser.rb +155 -171
- data/lib/opal/target_scope.rb +257 -0
- data/lib/opal/version.rb +1 -1
- data/opal.gemspec +6 -2
- data/opal/opal-parser.js.erb +3 -2
- data/opal/opal.rb +20 -18
- data/opal/opal/array.rb +21 -12
- data/opal/opal/basic_object.rb +2 -1
- data/opal/opal/boolean.rb +3 -0
- data/opal/opal/browser_loader.js +57 -0
- data/opal/opal/class.rb +51 -13
- data/opal/opal/date.rb +1 -20
- data/opal/opal/enumerable.rb +66 -33
- data/opal/opal/error.rb +2 -0
- data/opal/opal/hash.rb +1 -1
- data/opal/opal/kernel.rb +14 -3
- data/opal/opal/nil_class.rb +4 -0
- data/opal/opal/proc.rb +9 -1
- data/opal/opal/racc.rb +2 -2
- data/opal/opal/regexp.rb +1 -1
- data/opal/opal/runtime.js +14 -4
- data/opal/opal/string.rb +21 -4
- data/opal/opal/time.rb +27 -0
- data/spec/core/array/allocate_spec.rb +7 -1
- data/spec/core/array/append_spec.rb +18 -3
- data/spec/core/array/array_spec.rb +7 -0
- data/spec/core/array/assoc_spec.rb +23 -8
- data/spec/core/array/at_spec.rb +23 -3
- data/spec/core/array/choice_spec.rb +20 -0
- data/spec/core/array/clear_spec.rb +45 -4
- data/spec/core/array/combination_spec.rb +55 -0
- data/spec/core/array/compact_spec.rb +72 -1
- data/spec/core/array/constructor_spec.rb +13 -2
- data/spec/core/array/count_spec.rb +15 -7
- data/spec/core/array/delete_at_spec.rb +44 -1
- data/spec/core/array/delete_if_spec.rb +52 -2
- data/spec/core/array/delete_spec.rb +83 -2
- data/spec/core/array/drop_spec.rb +24 -16
- data/spec/core/array/drop_while_spec.rb +17 -0
- data/spec/core/array/each_index_spec.rb +11 -1
- data/spec/core/array/each_spec.rb +20 -2
- data/spec/core/array/empty_spec.rb +4 -1
- data/spec/core/array/eql_spec.rb +14 -0
- data/spec/core/array/fetch_spec.rb +31 -2
- data/spec/core/array/find_index_spec.rb +8 -0
- data/spec/core/array/first_spec.rb +45 -8
- data/spec/core/array/fixtures/classes.rb +538 -0
- data/spec/core/array/flatten_spec.rb +200 -7
- data/spec/core/array/frozen_spec.rb +32 -0
- data/spec/core/array/include_spec.rb +16 -1
- data/spec/core/array/index_spec.rb +5 -25
- data/spec/core/array/insert_spec.rb +37 -3
- data/spec/core/array/inspect_spec.rb +6 -12
- data/spec/core/array/intersection_spec.rb +55 -4
- data/spec/core/array/join_spec.rb +29 -4
- data/spec/core/array/keep_if_spec.rb +13 -6
- data/spec/core/array/last_spec.rb +35 -1
- data/spec/core/array/length_spec.rb +7 -4
- data/spec/core/array/map_spec.rb +9 -47
- data/spec/core/array/minus_spec.rb +68 -4
- data/spec/core/array/multiply_spec.rb +138 -6
- data/spec/core/array/new_spec.rb +92 -3
- data/spec/core/array/ntimes_spec.rb +26 -0
- data/spec/core/array/plus_spec.rb +48 -2
- data/spec/core/array/pop_spec.rb +159 -39
- data/spec/core/array/push_spec.rb +29 -1
- data/spec/core/array/rassoc_spec.rb +31 -2
- data/spec/core/array/reject_spec.rb +89 -2
- data/spec/core/array/replace_spec.rb +7 -29
- data/spec/core/array/reverse_each_spec.rb +25 -1
- data/spec/core/array/reverse_spec.rb +53 -1
- data/spec/core/array/rindex_spec.rb +55 -5
- data/spec/core/array/select_spec.rb +35 -8
- data/spec/core/array/shared/collect.rb +0 -0
- data/spec/core/array/shared/enumeratorize.rb +12 -0
- data/spec/core/array/shared/eql.rb +95 -0
- data/spec/core/array/shared/index.rb +37 -0
- data/spec/core/array/shared/inspect.rb +3 -0
- data/spec/core/array/shared/join.rb +7 -0
- data/spec/core/array/shared/keep_if.rb +0 -0
- data/spec/core/array/shared/length.rb +0 -0
- data/spec/core/array/shared/replace.rb +0 -0
- data/spec/core/array/shared/slice.rb +0 -0
- data/spec/core/array/shift_spec.rb +132 -23
- data/spec/core/array/shuffle_spec.rb +82 -6
- data/spec/core/array/size_spec.rb +7 -4
- data/spec/core/array/slice_spec.rb +132 -1
- data/spec/core/array/sort_spec.rb +263 -14
- data/spec/core/array/take_spec.rb +24 -16
- data/spec/core/array/take_while_spec.rb +14 -10
- data/spec/core/array/to_a_spec.rb +18 -1
- data/spec/core/array/to_ary_spec.rb +15 -1
- data/spec/core/array/try_convert_spec.rb +39 -2
- data/spec/core/array/uniq_spec.rb +148 -3
- data/spec/core/array/unshift_spec.rb +36 -1
- data/spec/core/array/zip_spec.rb +36 -1
- data/spec/core/class/new_spec.rb +8 -6
- data/spec/core/enumerable/all_spec.rb +37 -9
- data/spec/core/enumerable/any_spec.rb +45 -7
- data/spec/core/enumerable/collect_spec.rb +4 -1
- data/spec/core/enumerable/count_spec.rb +4 -1
- data/spec/core/enumerable/detect_spec.rb +2 -2
- data/spec/core/enumerable/drop_spec.rb +4 -1
- data/spec/core/enumerable/drop_while_spec.rb +4 -1
- data/spec/core/enumerable/each_slice_spec.rb +2 -1
- data/spec/core/enumerable/each_with_index_spec.rb +4 -1
- data/spec/core/enumerable/each_with_object_spec.rb +4 -1
- data/spec/core/enumerable/entries_spec.rb +4 -1
- data/spec/core/enumerable/find_all_spec.rb +4 -1
- data/spec/core/enumerable/find_index_spec.rb +4 -1
- data/spec/core/enumerable/find_spec.rb +5 -2
- data/spec/core/enumerable/first_spec.rb +4 -1
- data/spec/core/enumerable/fixtures/classes.rb +198 -2
- data/spec/core/enumerable/grep_spec.rb +4 -1
- data/spec/core/enumerable/take_spec.rb +4 -1
- data/spec/core/enumerable/to_a_spec.rb +4 -1
- data/spec/core/false/and_spec.rb +11 -0
- data/spec/core/false/inspect_spec.rb +7 -0
- data/spec/core/false/or_spec.rb +11 -0
- data/spec/core/false/to_s_spec.rb +7 -0
- data/spec/core/false/xor_spec.rb +11 -0
- data/spec/core/kernel/rand_spec.rb +5 -5
- data/spec/core/module/const_get_spec.rb +4 -4
- data/spec/core/module/fixtures/classes.rb +434 -0
- data/spec/core/module/method_defined_spec.rb +49 -0
- data/spec/core/module/module_function_spec.rb +28 -0
- data/spec/core/nil/and_spec.rb +3 -1
- data/spec/core/nil/dup_spec.rb +7 -0
- data/spec/core/nil/inspect_spec.rb +3 -1
- data/spec/core/nil/nil_spec.rb +3 -1
- data/spec/core/nil/or_spec.rb +4 -2
- data/spec/core/nil/to_a_spec.rb +3 -1
- data/spec/core/nil/to_f_spec.rb +3 -1
- data/spec/core/nil/to_i_spec.rb +3 -1
- data/spec/core/nil/to_s_spec.rb +3 -1
- data/spec/core/nil/xor_spec.rb +4 -2
- data/spec/core/string/element_reference_spec.rb +14 -1
- data/spec/core/string/fixtures/classes.rb +0 -0
- data/spec/core/true/and_spec.rb +11 -0
- data/spec/core/true/inspect_spec.rb +7 -0
- data/spec/core/true/or_spec.rb +11 -0
- data/spec/core/true/to_s_spec.rb +7 -0
- data/spec/core/true/xor_spec.rb +11 -0
- data/spec/{core → core_ext}/array/element_reference_spec.rb +0 -0
- data/spec/{core → core_ext}/array/equal_value_spec.rb +0 -0
- data/spec/{core → core_ext}/array/fill_spec.rb +0 -0
- data/spec/{core → core_ext}/array/reduce_spec.rb +0 -0
- data/spec/core_ext/basic_object/send_spec.rb +3 -3
- data/spec/{core → core_ext}/boolean/singleton_class_spec.rb +0 -0
- data/spec/{core → core_ext}/boolean/to_json_spec.rb +0 -0
- data/spec/core_ext/class/_inherited_spec.rb +3 -3
- data/spec/core_ext/class/proc_methods_spec.rb +2 -2
- data/spec/core_ext/class/singleton_methods_spec.rb +8 -8
- data/spec/core_ext/method_missing_spec.rb +3 -3
- data/spec/core_ext/native/method_missing_spec.rb +3 -2
- data/spec/core_ext/native/to_native_spec.rb +3 -2
- data/spec/{core → core_ext}/nil/to_json_spec.rb +0 -0
- data/spec/date.rb +0 -0
- data/spec/fileutils.rb +0 -0
- data/spec/filters/ancestors.rb +4 -0
- data/spec/filters/array_delete.rb +3 -0
- data/spec/filters/array_fetch.rb +3 -0
- data/spec/filters/array_first.rb +3 -0
- data/spec/filters/array_flatten.rb +14 -0
- data/spec/filters/array_intersection.rb +5 -0
- data/spec/filters/array_join.rb +6 -0
- data/spec/filters/array_subclasses.rb +4 -0
- data/spec/filters/block_args.rb +3 -0
- data/spec/filters/coerce_integer.rb +9 -0
- data/spec/filters/frozen.rb +4 -0
- data/spec/filters/mocks.rb +3 -0
- data/spec/filters/should_receive.rb +4 -0
- data/spec/filters/tainted.rb +7 -0
- data/spec/fixtures/class.rb +124 -0
- data/spec/fixtures/class_variables.rb +0 -0
- data/spec/fixtures/constants.rb +0 -0
- data/spec/grammar/alias_spec.rb +1 -1
- data/spec/grammar/def_spec.rb +1 -0
- data/spec/grammar/lvar_spec.rb +1 -2
- data/spec/grammar/nth_ref_spec.rb +13 -0
- data/spec/grammar/sclass_spec.rb +6 -7
- data/spec/grammar/str_spec.rb +4 -4
- data/spec/grammar/string_spec.rb +8 -0
- data/spec/grammar/xstr_spec.rb +4 -4
- data/spec/iconv.rb +0 -0
- data/spec/language/alias_spec.rb +140 -3
- data/spec/language/and_spec.rb +14 -7
- data/spec/language/array_spec.rb +57 -5
- data/spec/language/block_spec.rb +466 -49
- data/spec/language/break_spec.rb +294 -44
- data/spec/language/case_spec.rb +151 -3
- data/spec/language/class_spec.rb +196 -0
- data/spec/language/class_variable_spec.rb +56 -0
- data/spec/language/def_spec.rb +507 -4
- data/spec/language/defined_spec.rb +19 -7
- data/spec/language/ensure_spec.rb +26 -39
- data/spec/language/execution_spec.rb +15 -0
- data/spec/language/fixtures/array.rb +11 -0
- data/spec/language/fixtures/block.rb +57 -0
- data/spec/language/fixtures/break.rb +240 -0
- data/spec/language/fixtures/ensure.rb +72 -0
- data/spec/language/fixtures/literal_lambda.rb +7 -0
- data/spec/language/fixtures/metaclass.rb +33 -0
- data/spec/language/fixtures/module.rb +24 -0
- data/spec/language/fixtures/next.rb +78 -12
- data/spec/language/fixtures/return.rb +118 -0
- data/spec/language/fixtures/send.rb +110 -0
- data/spec/language/fixtures/send_1.9.rb +22 -0
- data/spec/language/fixtures/super.rb +308 -0
- data/spec/language/fixtures/variables.rb +58 -0
- data/spec/language/fixtures/yield.rb +5 -0
- data/spec/language/for_spec.rb +192 -0
- data/spec/language/hash_spec.rb +29 -5
- data/spec/language/if_spec.rb +90 -9
- data/spec/language/literal_lambda_spec.rb +1 -47
- data/spec/language/loop_spec.rb +39 -2
- data/spec/language/metaclass_spec.rb +151 -5
- data/spec/language/module_spec.rb +56 -0
- data/spec/language/next_spec.rb +370 -12
- data/spec/language/not_spec.rb +55 -0
- data/spec/language/numbers_spec.rb +56 -0
- data/spec/language/or_spec.rb +31 -3
- data/spec/language/order_spec.rb +79 -0
- data/spec/language/precedence_spec.rb +483 -0
- data/spec/language/proc_spec.rb +249 -21
- data/spec/language/redo_spec.rb +67 -0
- data/spec/language/rescue_spec.rb +121 -0
- data/spec/language/retry_spec.rb +56 -0
- data/spec/language/return_spec.rb +281 -0
- data/spec/language/send_spec.rb +141 -48
- data/spec/language/singleton_class_spec.rb +1 -1
- data/spec/language/string_spec.rb +11 -0
- data/spec/language/super_spec.rb +213 -133
- data/spec/language/symbol_spec.rb +2 -1
- data/spec/language/undef_spec.rb +3 -1
- data/spec/language/unless_spec.rb +6 -2
- data/spec/language/until_spec.rb +102 -3
- data/spec/language/variables_spec.rb +1212 -16
- data/spec/language/versions/array_1.9.rb +39 -0
- data/spec/language/versions/case_1.9.rb +20 -0
- data/spec/language/versions/hash_1.9.rb +18 -0
- data/spec/language/versions/literal_lambda_1.9.rb +143 -0
- data/spec/language/versions/not_1.9.rb +22 -0
- data/spec/language/versions/send_1.9.rb +241 -0
- data/spec/language/versions/symbol_1.9.rb +15 -0
- data/spec/language/versions/variables_1.9.rb +8 -0
- data/spec/language/while_spec.rb +70 -5
- data/spec/language/yield_spec.rb +32 -6
- data/spec/mspec/guards/block_device.rb +0 -0
- data/spec/mspec/guards/endian.rb +0 -0
- data/spec/mspec/helpers/environment.rb +0 -0
- data/spec/mspec/helpers/language_version.rb +0 -0
- data/spec/mspec/helpers/tmp.rb +0 -0
- data/spec/ospec/filter.rb +32 -0
- data/spec/ospec/main.rb.erb +18 -0
- data/spec/ospec/phantom.rb +97 -0
- data/spec/ospec/runner.rb +95 -0
- data/spec/ospec/sprockets.js +40 -0
- data/spec/pp.rb +3 -0
- data/spec/rbconfig.rb +5 -0
- data/spec/spec_helper.rb +53 -26
- data/spec/yaml.rb +0 -0
- metadata +275 -31
- data/config.ru +0 -8
- data/lib/opal/processor.rb +0 -47
- data/lib/opal/scope.rb +0 -236
- data/lib/opal/server.rb +0 -94
- data/spec/core/boolean/and_spec.rb +0 -17
- data/spec/core/boolean/inspect_spec.rb +0 -9
- data/spec/core/boolean/or_spec.rb +0 -17
- data/spec/core/boolean/to_s_spec.rb +0 -9
- data/spec/core/boolean/xor_spec.rb +0 -17
data/opal/opal/kernel.rb
CHANGED
@@ -92,6 +92,10 @@ module Kernel
|
|
92
92
|
}
|
93
93
|
end
|
94
94
|
|
95
|
+
def dup
|
96
|
+
self.class.allocate
|
97
|
+
end
|
98
|
+
|
95
99
|
def enum_for(method = :each, *args)
|
96
100
|
Enumerator.new self, method, *args
|
97
101
|
end
|
@@ -272,7 +276,9 @@ module Kernel
|
|
272
276
|
var result = [];
|
273
277
|
|
274
278
|
for (var name in #{self}) {
|
275
|
-
|
279
|
+
if (name.charAt(0) !== '$') {
|
280
|
+
result.push(name);
|
281
|
+
}
|
276
282
|
}
|
277
283
|
|
278
284
|
return result;
|
@@ -328,7 +334,7 @@ module Kernel
|
|
328
334
|
def proc(&block)
|
329
335
|
%x{
|
330
336
|
if (block === nil) {
|
331
|
-
|
337
|
+
#{ raise ArgumentError, 'no block given' };
|
332
338
|
}
|
333
339
|
block.is_lambda = false;
|
334
340
|
return block;
|
@@ -355,7 +361,7 @@ module Kernel
|
|
355
361
|
|
356
362
|
alias print puts
|
357
363
|
|
358
|
-
def raise(exception, string)
|
364
|
+
def raise(exception = "", string = undefined)
|
359
365
|
%x{
|
360
366
|
if (typeof(exception) === 'string') {
|
361
367
|
exception = #{RuntimeError.new exception};
|
@@ -389,6 +395,7 @@ module Kernel
|
|
389
395
|
meta._klass = __opal.Class;
|
390
396
|
#{self}._singleton = meta;
|
391
397
|
meta.prototype = #{self};
|
398
|
+
meta._isSingleton = true;
|
392
399
|
|
393
400
|
return meta;
|
394
401
|
}
|
@@ -420,6 +427,10 @@ module Kernel
|
|
420
427
|
|
421
428
|
alias sprintf format
|
422
429
|
|
430
|
+
def String(str)
|
431
|
+
`String(str)`
|
432
|
+
end
|
433
|
+
|
423
434
|
def tap(&block)
|
424
435
|
yield self
|
425
436
|
self
|
data/opal/opal/nil_class.rb
CHANGED
data/opal/opal/proc.rb
CHANGED
@@ -9,7 +9,15 @@ class Proc < `Function`
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def call(*args)
|
12
|
-
|
12
|
+
%x{
|
13
|
+
var result = #{self}.apply(null, #{args});
|
14
|
+
|
15
|
+
if (result === __breaker) {
|
16
|
+
return __breaker.$v;
|
17
|
+
}
|
18
|
+
|
19
|
+
return result;
|
20
|
+
}
|
13
21
|
end
|
14
22
|
|
15
23
|
alias [] call
|
data/opal/opal/racc.rb
CHANGED
@@ -157,7 +157,7 @@ module Racc
|
|
157
157
|
|
158
158
|
elsif act == -reduce_n
|
159
159
|
# reduce
|
160
|
-
raise "
|
160
|
+
raise SyntaxError, "unexpected '#{racc_tok.inspect}'"
|
161
161
|
|
162
162
|
else
|
163
163
|
raise "Rac: unknown action: #{act}"
|
@@ -212,4 +212,4 @@ module Racc
|
|
212
212
|
puts ' ]'
|
213
213
|
end
|
214
214
|
end
|
215
|
-
end
|
215
|
+
end
|
data/opal/opal/regexp.rb
CHANGED
data/opal/opal/runtime.js
CHANGED
@@ -235,12 +235,15 @@
|
|
235
235
|
};
|
236
236
|
|
237
237
|
Opal.puts = function(a) { console.log(a); };
|
238
|
-
|
238
|
+
|
239
239
|
// Method missing dispatcher
|
240
240
|
Opal.mm = function(mid) {
|
241
|
-
|
241
|
+
var dispatcher = function() {
|
242
|
+
this.$method_missing._p = dispatcher._p;
|
242
243
|
return this.$method_missing.apply(this, [mid].concat(__slice.call(arguments)));
|
243
|
-
}
|
244
|
+
};
|
245
|
+
|
246
|
+
return dispatcher;
|
244
247
|
};
|
245
248
|
|
246
249
|
// Const missing dispatcher
|
@@ -332,6 +335,12 @@
|
|
332
335
|
}
|
333
336
|
}
|
334
337
|
|
338
|
+
// Defines methods onto Object (which are then donated to bridged classes)
|
339
|
+
Object._defn = function (mid, body) {
|
340
|
+
this.prototype[mid] = body;
|
341
|
+
this._donate([mid]);
|
342
|
+
};
|
343
|
+
|
335
344
|
var bridged_classes = Object.$included_in = [];
|
336
345
|
|
337
346
|
BasicObject._scope = Object._scope = Opal;
|
@@ -350,7 +359,8 @@
|
|
350
359
|
Opal.top = new Object;
|
351
360
|
|
352
361
|
Opal.klass(Object, Object, 'NilClass', NilClass)
|
353
|
-
Opal.nil = new NilClass;
|
362
|
+
var nil = Opal.nil = new NilClass;
|
363
|
+
nil.call = nil.apply = function() { throw Opal.LocalJumpError.$new('no block given'); };
|
354
364
|
|
355
365
|
Opal.breaker = new Error('unexpected break');
|
356
366
|
}).call(this);
|
data/opal/opal/string.rb
CHANGED
@@ -99,15 +99,28 @@ class String < `String`
|
|
99
99
|
length = index.end,
|
100
100
|
index = index.begin;
|
101
101
|
|
102
|
+
if (index < 0) {
|
103
|
+
index += size;
|
104
|
+
}
|
105
|
+
|
106
|
+
if (length < 0) {
|
107
|
+
length += size;
|
108
|
+
}
|
109
|
+
|
110
|
+
if (!exclude) {
|
111
|
+
length += 1;
|
112
|
+
}
|
113
|
+
|
102
114
|
if (index > size) {
|
103
115
|
return nil;
|
104
116
|
}
|
105
117
|
|
118
|
+
length = length - index;
|
119
|
+
|
106
120
|
if (length < 0) {
|
107
|
-
length
|
121
|
+
length = 0;
|
108
122
|
}
|
109
123
|
|
110
|
-
if (exclude) length -= 1;
|
111
124
|
return #{self}.substr(index, length);
|
112
125
|
}
|
113
126
|
|
@@ -243,7 +256,7 @@ class String < `String`
|
|
243
256
|
|
244
257
|
alias_native :getbyte, :charCodeAt
|
245
258
|
|
246
|
-
def gsub(pattern, replace = undefined)
|
259
|
+
def gsub(pattern, replace = undefined, &block)
|
247
260
|
if pattern.is_a?(String)
|
248
261
|
pattern = /#{Regexp.escape(pattern)}/
|
249
262
|
end
|
@@ -253,6 +266,7 @@ class String < `String`
|
|
253
266
|
options = pattern.substr(pattern.lastIndexOf('/') + 1) + 'g',
|
254
267
|
regexp = pattern.substr(1, pattern.lastIndexOf('/') - 1);
|
255
268
|
|
269
|
+
#{self}.$sub._p = block;
|
256
270
|
return #{self}.$sub(new RegExp(regexp, options), replace);
|
257
271
|
}
|
258
272
|
end
|
@@ -507,7 +521,10 @@ class String < `String`
|
|
507
521
|
%x{
|
508
522
|
var name = '$' + #{self};
|
509
523
|
|
510
|
-
return function(arg) {
|
524
|
+
return function(arg) {
|
525
|
+
var meth = arg[name];
|
526
|
+
return meth ? meth.call(arg) : arg.$method_missing(name);
|
527
|
+
};
|
511
528
|
}
|
512
529
|
end
|
513
530
|
|
data/opal/opal/time.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
days_of_week = %w[Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday]
|
2
|
+
short_days = %w[Sun Mon Tue Wed Thu Fri Sat]
|
3
|
+
short_months = %w[Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec]
|
4
|
+
long_months = %w[January Febuary March April May June July August September October November December]
|
5
|
+
|
1
6
|
class Time < `Date`
|
2
7
|
include Comparable
|
3
8
|
|
@@ -32,6 +37,10 @@ class Time < `Date`
|
|
32
37
|
`new Date()`
|
33
38
|
end
|
34
39
|
|
40
|
+
def self.parse(str)
|
41
|
+
`Date.parse(str)`
|
42
|
+
end
|
43
|
+
|
35
44
|
def +(other)
|
36
45
|
Time.allocate(self.to_f + other.to_f)
|
37
46
|
end
|
@@ -78,6 +87,24 @@ class Time < `Date`
|
|
78
87
|
|
79
88
|
alias_native :sec, :getSeconds
|
80
89
|
|
90
|
+
def strftime(format = '')
|
91
|
+
%x{
|
92
|
+
var d = #{self};
|
93
|
+
|
94
|
+
return format.replace(/%(-?.)/g, function(full, m) {
|
95
|
+
switch (m) {
|
96
|
+
case 'a': return short_days[d.getDay()];
|
97
|
+
case 'A': return days_of_week[d.getDay()];
|
98
|
+
case 'b': return short_months[d.getMonth()];
|
99
|
+
case 'B': return long_months[d.getMonth()];
|
100
|
+
case '-d': return d.getDate();
|
101
|
+
case 'Y': return d.getFullYear();
|
102
|
+
default: return m ;
|
103
|
+
}
|
104
|
+
});
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
81
108
|
def sunday?
|
82
109
|
`#{self}.getDay() === 0`
|
83
110
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
|
1
3
|
describe "Array.allocate" do
|
2
4
|
it "returns an instance of Array" do
|
3
5
|
ary = Array.allocate
|
@@ -10,4 +12,8 @@ describe "Array.allocate" do
|
|
10
12
|
ary << 1
|
11
13
|
ary.should == [1]
|
12
14
|
end
|
13
|
-
|
15
|
+
|
16
|
+
it "does not accept any arguments" do
|
17
|
+
lambda { Array.allocate(1) }.should raise_error(ArgumentError)
|
18
|
+
end
|
19
|
+
end
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
|
1
4
|
describe "Array#<<" do
|
2
5
|
it "pushes the object onto the end of the array" do
|
3
6
|
([ 1, 2 ] << "c" << "d" << [ 3, 4 ]).should == [1, 2, "c", "d", [3, 4]]
|
@@ -6,8 +9,8 @@ describe "Array#<<" do
|
|
6
9
|
it "returns self to allow chaining" do
|
7
10
|
a = []
|
8
11
|
b = a
|
9
|
-
(a << 1).should
|
10
|
-
(a << 2 << 3).should
|
12
|
+
(a << 1).should equal(b)
|
13
|
+
(a << 2 << 3).should equal(b)
|
11
14
|
end
|
12
15
|
|
13
16
|
it "correctly resizes the Array" do
|
@@ -25,4 +28,16 @@ describe "Array#<<" do
|
|
25
28
|
a << :foo
|
26
29
|
a.should == [:foo]
|
27
30
|
end
|
28
|
-
|
31
|
+
|
32
|
+
ruby_version_is '' ... '1.9' do
|
33
|
+
it "raises a TypeError on a frozen array" do
|
34
|
+
lambda { ArraySpecs.frozen_array << 5 }.should raise_error(TypeError)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
ruby_version_is '1.9' do
|
39
|
+
it "raises a RuntimeError on a frozen array" do
|
40
|
+
lambda { ArraySpecs.frozen_array << 5 }.should raise_error(RuntimeError)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
|
1
4
|
describe "Array#assoc" do
|
2
5
|
it "returns the first array whose 1st item is == obj or nil" do
|
3
6
|
s1 = ["colors", "red", "blue", "green"]
|
@@ -7,11 +10,23 @@ describe "Array#assoc" do
|
|
7
10
|
s5 = [:letters, "a", "i", "u"]
|
8
11
|
s_nil = [nil, nil]
|
9
12
|
a = [s1, s2, s3, s4, s5, s_nil]
|
10
|
-
a.assoc(s1.first).should
|
11
|
-
a.assoc(s2.first).should
|
12
|
-
a.assoc(s3.first).should
|
13
|
-
a.assoc(s4.first).should
|
14
|
-
a.assoc(s5.first).should
|
13
|
+
a.assoc(s1.first).should equal(s1)
|
14
|
+
a.assoc(s2.first).should equal(s2)
|
15
|
+
a.assoc(s3.first).should equal(s3)
|
16
|
+
a.assoc(s4.first).should equal(s1)
|
17
|
+
a.assoc(s5.first).should equal(s2)
|
18
|
+
a.assoc(s_nil.first).should equal(s_nil)
|
19
|
+
a.assoc(4).should equal(s3)
|
20
|
+
a.assoc("key not in array").should be_nil
|
21
|
+
end
|
22
|
+
|
23
|
+
it "calls == on first element of each array" do
|
24
|
+
key1 = 'it'
|
25
|
+
key2 = mock('key2')
|
26
|
+
items = [['not it', 1], [ArraySpecs::AssocKey.new, 2], ['na', 3]]
|
27
|
+
|
28
|
+
items.assoc(key1).should equal(items[1])
|
29
|
+
items.assoc(key2).should be_nil
|
15
30
|
end
|
16
31
|
|
17
32
|
it "ignores any non-Array elements" do
|
@@ -19,7 +34,7 @@ describe "Array#assoc" do
|
|
19
34
|
s1 = [4]
|
20
35
|
s2 = [5, 4, 3]
|
21
36
|
a = ["foo", [], s1, s2, nil, []]
|
22
|
-
a.assoc(s1.first).should
|
23
|
-
a.assoc(s2.first).should
|
37
|
+
a.assoc(s1.first).should equal(s1)
|
38
|
+
a.assoc(s2.first).should equal(s2)
|
24
39
|
end
|
25
|
-
end
|
40
|
+
end
|
data/spec/core/array/at_spec.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
|
1
4
|
describe "Array#at" do
|
2
5
|
it "returns the (n+1)'th element for the passed index n" do
|
3
6
|
a = [1, 2, 3, 4, 5, 6]
|
@@ -12,14 +15,14 @@ describe "Array#at" do
|
|
12
15
|
a.at(7).should == nil
|
13
16
|
end
|
14
17
|
|
15
|
-
it "returns the (-n)'th
|
18
|
+
it "returns the (-n)'th elemet from the last, for the given negative index n" do
|
16
19
|
a = [1, 2, 3, 4, 5, 6]
|
17
20
|
a.at(-1).should == 6
|
18
21
|
a.at(-2).should == 5
|
19
22
|
a.at(-6).should == 1
|
20
23
|
end
|
21
24
|
|
22
|
-
it "returns nil if the given index is less than -len, where len is length of the array"
|
25
|
+
it "returns nil if the given index is less than -len, where len is length of the array" do
|
23
26
|
a = [1, 2, 3, 4, 5, 6]
|
24
27
|
a.at(-7).should == nil
|
25
28
|
a.at(-8).should == nil
|
@@ -33,4 +36,21 @@ describe "Array#at" do
|
|
33
36
|
a.at(-100)
|
34
37
|
a.length.should == 6
|
35
38
|
end
|
36
|
-
|
39
|
+
|
40
|
+
it "tries to convert the passed argument to an Integer using #to_int" do
|
41
|
+
a = ["a", "b", "c"]
|
42
|
+
a.at(0.5).should == "a"
|
43
|
+
|
44
|
+
obj = mock('to_int')
|
45
|
+
obj.should_receive(:to_int).and_return(2)
|
46
|
+
a.at(obj).should == "c"
|
47
|
+
end
|
48
|
+
|
49
|
+
it "raises a TypeError when the passed argument can't be coerced to Integer" do
|
50
|
+
lambda { [].at("cat") }.should raise_error(TypeError)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "raises an ArgumentError when 2 or more arguments is passed" do
|
54
|
+
lambda { [:a, :b].at(0,1) }.should raise_error(ArgumentError)
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
|
4
|
+
describe "Array#choice" do
|
5
|
+
ruby_version_is "1.8.7"..."1.9" do
|
6
|
+
it "returns a value from the array" do
|
7
|
+
[4].choice.should eql(4)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns a distribution of results" do
|
11
|
+
source = [0,1,2,3,4]
|
12
|
+
choices = ArraySpecs::SampleRange.collect { |el| source.choice }
|
13
|
+
choices.uniq.sort.should == source
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns nil for empty arrays" do
|
17
|
+
[].choice.should be_nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,14 +1,17 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
3
|
+
|
1
4
|
describe "Array#clear" do
|
2
5
|
it "removes all elements" do
|
3
6
|
a = [1, 2, 3, 4]
|
4
|
-
a.clear
|
7
|
+
a.clear.should equal(a)
|
5
8
|
a.should == []
|
6
9
|
end
|
7
10
|
|
8
11
|
it "returns self" do
|
9
12
|
a = [1]
|
10
|
-
|
11
|
-
a.clear.object_id.should ==
|
13
|
+
oid = a.object_id
|
14
|
+
a.clear.object_id.should == oid
|
12
15
|
end
|
13
16
|
|
14
17
|
it "leaves the Array empty" do
|
@@ -17,4 +20,42 @@ describe "Array#clear" do
|
|
17
20
|
a.empty?.should == true
|
18
21
|
a.size.should == 0
|
19
22
|
end
|
20
|
-
|
23
|
+
|
24
|
+
it "keeps tainted status" do
|
25
|
+
a = [1]
|
26
|
+
a.taint
|
27
|
+
a.tainted?.should be_true
|
28
|
+
a.clear
|
29
|
+
a.tainted?.should be_true
|
30
|
+
end
|
31
|
+
|
32
|
+
it "does not accept any arguments" do
|
33
|
+
lambda { [1].clear(true) }.should raise_error(ArgumentError)
|
34
|
+
end
|
35
|
+
|
36
|
+
ruby_version_is '1.9' do
|
37
|
+
it "keeps untrusted status" do
|
38
|
+
a = [1]
|
39
|
+
a.untrust
|
40
|
+
a.untrusted?.should be_true
|
41
|
+
a.clear
|
42
|
+
a.untrusted?.should be_true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
ruby_version_is '' ... '1.9' do
|
47
|
+
it "raises a TypeError on a frozen array" do
|
48
|
+
a = [1]
|
49
|
+
a.freeze
|
50
|
+
lambda { a.clear }.should raise_error(TypeError)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
ruby_version_is '1.9' do
|
55
|
+
it "raises a RuntimeError on a frozen array" do
|
56
|
+
a = [1]
|
57
|
+
a.freeze
|
58
|
+
lambda { a.clear }.should raise_error(RuntimeError)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|