opal 0.4.3 → 0.4.4
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/.rspec +3 -0
- data/.travis.yml +0 -4
- data/README.md +6 -0
- data/Rakefile +30 -6
- data/bin/opal +6 -82
- data/corelib/{opal/array.rb → array.rb} +40 -56
- data/corelib/{opal/basic_object.rb → basic_object.rb} +2 -2
- data/corelib/{opal/boolean.rb → boolean.rb} +0 -8
- data/corelib/class.rb +47 -0
- data/corelib/{opal/comparable.rb → comparable.rb} +0 -0
- data/corelib/{opal/enumerable.rb → enumerable.rb} +208 -141
- data/corelib/{opal/enumerator.rb → enumerator.rb} +3 -3
- data/corelib/{opal/error.rb → error.rb} +1 -0
- data/corelib/{opal/hash.rb → hash.rb} +67 -56
- data/corelib/io.rb +39 -0
- data/corelib/{opal/kernel.rb → kernel.rb} +35 -31
- data/corelib/{opal/class.rb → module.rb} +29 -57
- data/corelib/native.rb +148 -0
- data/corelib/{opal/nil_class.rb → nil_class.rb} +2 -10
- data/corelib/{opal/numeric.rb → numeric.rb} +39 -14
- data/corelib/opal.rb +42 -25
- data/corelib/{opal/proc.rb → proc.rb} +3 -3
- data/corelib/{opal/range.rb → range.rb} +5 -1
- data/corelib/{opal/regexp.rb → regexp.rb} +0 -0
- data/corelib/{opal/runtime.js → runtime.js} +96 -188
- data/corelib/{opal/string.rb → string.rb} +20 -15
- data/corelib/struct.rb +139 -0
- data/corelib/{opal/time.rb → time.rb} +0 -0
- data/lib/opal.rb +4 -0
- data/lib/opal/cli.rb +79 -32
- data/lib/opal/cli_options.rb +91 -0
- data/lib/opal/erb.rb +41 -8
- data/lib/opal/grammar.rb +24 -10
- data/lib/opal/grammar.y +15 -4
- data/lib/opal/grammar_helpers.rb +4 -0
- data/lib/opal/lexer.rb +214 -143
- data/lib/opal/parser.rb +596 -562
- data/lib/opal/require_parser.rb +1 -1
- data/lib/opal/source_map.rb +15 -30
- data/lib/opal/target_scope.rb +24 -5
- data/lib/opal/version.rb +1 -1
- data/mri_spec/cli_spec.rb +18 -0
- data/mri_spec/fixtures/opal_file.rb +2 -0
- data/mri_spec/spec_helper.rb +17 -0
- data/opal.gemspec +5 -2
- data/spec/{rubyspec/filters → filters}/bugs/alias.rb +0 -0
- data/spec/{rubyspec/filters → filters}/bugs/ancestors.rb +0 -0
- data/spec/{rubyspec/filters → filters}/bugs/array.rb +0 -0
- data/spec/filters/bugs/array/combination.rb +11 -0
- data/spec/filters/bugs/array/count.rb +3 -0
- data/spec/filters/bugs/array/delete_if.rb +3 -0
- data/spec/filters/bugs/array/drop.rb +3 -0
- data/spec/filters/bugs/array/drop_while.rb +5 -0
- data/spec/filters/bugs/array/eql.rb +3 -0
- data/spec/filters/bugs/array/flatten.rb +9 -0
- data/spec/filters/bugs/array/minus.rb +5 -0
- data/spec/filters/bugs/array/multipliy.rb +9 -0
- data/spec/filters/bugs/array/new.rb +3 -0
- data/spec/filters/bugs/array/pop.rb +6 -0
- data/spec/filters/bugs/array/rassoc.rb +4 -0
- data/spec/filters/bugs/array/rindex.rb +6 -0
- data/spec/filters/bugs/array/select.rb +3 -0
- data/spec/filters/bugs/array/shift.rb +7 -0
- data/spec/filters/bugs/array/shuffle.rb +11 -0
- data/spec/filters/bugs/array/slice.rb +7 -0
- data/spec/filters/bugs/array/take.rb +3 -0
- data/spec/filters/bugs/array/to_a.rb +3 -0
- data/spec/filters/bugs/array/try_convert.rb +7 -0
- data/spec/filters/bugs/array/uniq.rb +10 -0
- data/spec/filters/bugs/array/zip.rb +4 -0
- data/spec/{rubyspec/filters → filters}/bugs/array_delete.rb +1 -0
- data/spec/{rubyspec/filters → filters}/bugs/array_fetch.rb +0 -0
- data/spec/{rubyspec/filters → filters}/bugs/array_first.rb +0 -0
- data/spec/{rubyspec/filters → filters}/bugs/array_flatten.rb +0 -0
- data/spec/{rubyspec/filters → filters}/bugs/array_intersection.rb +0 -0
- data/spec/{rubyspec/filters → filters}/bugs/array_join.rb +0 -0
- data/spec/{rubyspec/filters → filters}/bugs/break.rb +0 -0
- data/spec/filters/bugs/case.rb +4 -0
- data/spec/{rubyspec/filters → filters}/bugs/coerce_integer.rb +0 -0
- data/spec/filters/bugs/enumerable_sort_by.rb +3 -0
- data/spec/{rubyspec/filters → filters}/bugs/kernel/instance_variables.rb +0 -0
- data/spec/filters/bugs/kernel/rand.rb +4 -0
- data/spec/filters/bugs/language/array.rb +3 -0
- data/spec/filters/bugs/language/block.rb +6 -0
- data/spec/filters/bugs/language/break.rb +3 -0
- data/spec/{rubyspec/filters → filters}/bugs/language/class.rb +3 -0
- data/spec/{rubyspec/filters → filters}/bugs/language/class_variables.rb +0 -0
- data/spec/filters/bugs/language/def.rb +27 -0
- data/spec/filters/bugs/language/defined.rb +3 -0
- data/spec/filters/bugs/language/ensure.rb +4 -0
- data/spec/filters/bugs/language/execution.rb +4 -0
- data/spec/filters/bugs/language/for.rb +18 -0
- data/spec/filters/bugs/language/if.rb +13 -0
- data/spec/filters/bugs/language/loop.rb +4 -0
- data/spec/filters/bugs/language/metaclass.rb +14 -0
- data/spec/filters/bugs/language/module.rb +6 -0
- data/spec/filters/bugs/language/next.rb +3 -0
- data/spec/filters/bugs/language/or.rb +3 -0
- data/spec/filters/bugs/language/order.rb +4 -0
- data/spec/filters/bugs/language/precedence.rb +10 -0
- data/spec/filters/bugs/language/proc.rb +24 -0
- data/spec/filters/bugs/language/redo.rb +5 -0
- data/spec/filters/bugs/language/rescue.rb +9 -0
- data/spec/filters/bugs/language/retry.rb +5 -0
- data/spec/filters/bugs/language/send.rb +10 -0
- data/spec/filters/bugs/language/super.rb +9 -0
- data/spec/filters/bugs/language/until.rb +8 -0
- data/spec/filters/bugs/language/variables.rb +37 -0
- data/spec/filters/bugs/language/while.rb +6 -0
- data/spec/filters/bugs/language/yield.rb +5 -0
- data/spec/{rubyspec/filters → filters}/bugs/module/class_variables.rb +0 -0
- data/spec/filters/bugs/module/method_defined.rb +6 -0
- data/spec/filters/bugs/parser.rb +10 -0
- data/spec/{rubyspec/filters → filters}/bugs/public_methods.rb +1 -0
- data/spec/filters/bugs/return.rb +7 -0
- data/spec/filters/bugs/singleton/instance.rb +4 -0
- data/spec/filters/bugs/source_map.rb +3 -0
- data/spec/filters/bugs/string/center.rb +4 -0
- data/spec/filters/bugs/string/lines.rb +3 -0
- data/spec/{rubyspec/filters → filters}/mspec/mocks.rb +0 -0
- data/spec/{rubyspec/filters → filters}/mspec/ruby_exe.rb +0 -0
- data/spec/{rubyspec/filters → filters}/mspec/should_receive.rb +0 -0
- data/spec/{rubyspec/filters → filters}/parser/block_args.rb +0 -0
- data/spec/{rubyspec/filters → filters}/unsupported/array_subclasses.rb +1 -0
- data/spec/filters/unsupported/frozen.rb +32 -0
- data/spec/filters/unsupported/immutable_strings.rb +3 -0
- data/spec/filters/unsupported/tainted.rb +17 -0
- data/spec/filters/unsupported/trusted.rb +15 -0
- data/spec/opal/class/constants_spec.rb +7 -0
- data/spec/opal/erb/erb_spec.rb +7 -1
- data/spec/opal/erb/inline_block.opalerb +3 -0
- data/spec/opal/hash/allocate_spec.rb +16 -0
- data/spec/opal/hash/new_spec.rb +10 -0
- data/spec/opal/hash/to_s_spec.rb +9 -0
- data/spec/opal/kernel/instance_variable_defined_spec.rb +15 -0
- data/spec/opal/kernel/rand_spec.rb +5 -5
- data/spec/opal/kernel/respond_to_spec.rb +14 -1
- data/spec/opal/language/block_spec.rb +13 -0
- data/spec/opal/language/rescue_spec.rb +27 -0
- data/spec/opal/language/return_spec.rb +38 -0
- data/spec/opal/language/singleton_class_spec.rb +13 -0
- data/spec/opal/language/super_spec.rb +99 -0
- data/spec/opal/language/variables_spec.rb +20 -0
- data/spec/opal/module/attr_accessor_spec.rb +8 -0
- data/spec/opal/module/constants_spec.rb +2 -2
- data/spec/opal/native/alias_native_spec.rb +18 -0
- data/spec/opal/native/each_spec.rb +14 -0
- data/spec/opal/native/element_reference_spec.rb +14 -0
- data/spec/opal/native/method_missing_spec.rb +39 -0
- data/spec/opal/native/new_spec.rb +19 -0
- data/spec/opal/native/nil_spec.rb +14 -0
- data/spec/opal/runtime2/class_hierarchy_spec.rb +2 -2
- data/spec/opal/source_map_spec.rb +3 -7
- data/spec/ospec/main.rb.erb +2 -5
- data/spec/parser/alias_spec.rb +4 -4
- data/spec/parser/and_spec.rb +2 -2
- data/spec/parser/array_spec.rb +6 -6
- data/spec/parser/attrasgn_spec.rb +8 -8
- data/spec/parser/begin_spec.rb +11 -11
- data/spec/parser/block_spec.rb +3 -3
- data/spec/parser/break_spec.rb +4 -4
- data/spec/parser/call_spec.rb +50 -48
- data/spec/parser/class_spec.rb +2 -2
- data/spec/parser/const_spec.rb +1 -1
- data/spec/parser/cvar_spec.rb +1 -1
- data/spec/parser/def_spec.rb +5 -5
- data/spec/parser/gvar_spec.rb +2 -2
- data/spec/parser/hash_spec.rb +4 -4
- data/spec/parser/iasgn_spec.rb +3 -3
- data/spec/parser/if_spec.rb +6 -6
- data/spec/parser/iter_spec.rb +6 -6
- data/spec/parser/lambda_spec.rb +5 -5
- data/spec/parser/lasgn_spec.rb +2 -2
- data/spec/parser/line_spec.rb +2 -2
- data/spec/parser/lvar_spec.rb +5 -5
- data/spec/parser/masgn_spec.rb +1 -1
- data/spec/parser/module_spec.rb +2 -2
- data/spec/parser/not_spec.rb +4 -4
- data/spec/parser/op_asgn1_spec.rb +2 -2
- data/spec/parser/op_asgn2_spec.rb +2 -2
- data/spec/parser/or_spec.rb +2 -2
- data/spec/parser/parse_spec.rb +66 -0
- data/spec/parser/parser_spec.rb +32 -38
- data/spec/parser/regexp_spec.rb +4 -4
- data/spec/parser/return_spec.rb +4 -4
- data/spec/parser/sclass_spec.rb +4 -4
- data/spec/parser/str_spec.rb +3 -3
- data/spec/parser/super_spec.rb +6 -6
- data/spec/parser/undef_spec.rb +3 -3
- data/spec/parser/unless_spec.rb +4 -4
- data/spec/parser/while_spec.rb +3 -3
- data/spec/parser/xstr_spec.rb +3 -3
- data/spec/parser/yield_spec.rb +6 -6
- data/spec/rubyspec/core/array/drop_spec.rb +1 -1
- data/spec/rubyspec/core/array/keep_if_spec.rb +1 -3
- data/spec/rubyspec/core/array/length_spec.rb +1 -3
- data/spec/rubyspec/core/array/map_spec.rb +2 -6
- data/spec/rubyspec/core/array/minus_spec.rb +3 -3
- data/spec/rubyspec/core/array/multiply_spec.rb +14 -16
- data/spec/rubyspec/core/array/new_spec.rb +3 -5
- data/spec/rubyspec/core/array/plus_spec.rb +2 -2
- data/spec/rubyspec/core/array/pop_spec.rb +4 -4
- data/spec/rubyspec/core/array/rassoc_spec.rb +2 -2
- data/spec/rubyspec/core/array/reject_spec.rb +2 -6
- data/spec/rubyspec/core/array/replace_spec.rb +1 -3
- data/spec/rubyspec/core/array/reverse_each_spec.rb +1 -3
- data/spec/rubyspec/core/array/reverse_spec.rb +4 -4
- data/spec/rubyspec/core/array/rindex_spec.rb +1 -1
- data/spec/rubyspec/core/array/select_spec.rb +3 -7
- data/spec/rubyspec/core/array/shared/collect.rb +7 -0
- data/spec/rubyspec/core/array/shared/index.rb +1 -1
- data/spec/rubyspec/core/array/shared/keep_if.rb +3 -0
- data/spec/rubyspec/core/array/shared/length.rb +3 -0
- data/spec/rubyspec/core/array/shared/replace.rb +3 -0
- data/spec/rubyspec/core/array/shared/slice.rb +3 -0
- data/spec/rubyspec/core/array/shuffle_spec.rb +1 -1
- data/spec/rubyspec/core/array/size_spec.rb +1 -3
- data/spec/rubyspec/core/array/slice_spec.rb +4 -6
- data/spec/rubyspec/core/array/sort_spec.rb +2 -2
- data/spec/rubyspec/core/array/to_a_spec.rb +1 -1
- data/spec/rubyspec/core/array/try_convert_spec.rb +7 -7
- data/spec/rubyspec/core/array/uniq_spec.rb +7 -7
- data/spec/rubyspec/core/array/zip_spec.rb +1 -1
- data/spec/rubyspec/core/enumerable/collect_spec.rb +24 -0
- data/spec/rubyspec/core/enumerable/count_spec.rb +35 -19
- data/spec/rubyspec/core/enumerable/find_spec.rb +5 -0
- data/spec/rubyspec/core/hash/each_pair_spec.rb +7 -7
- data/spec/rubyspec/core/hash/each_spec.rb +13 -7
- data/spec/rubyspec/core/module/method_defined_spec.rb +4 -4
- data/spec/rubyspec/core/module/public_method_defined_spec.rb +19 -0
- data/spec/rubyspec/core/module/remove_const_spec.rb +23 -0
- data/spec/rubyspec/core/numeric/step_spec.rb +14 -0
- data/spec/rubyspec/core/string/center_spec.rb +43 -65
- data/spec/rubyspec/core/string/lines_spec.rb +1 -1
- data/spec/rubyspec/core/string/ljust_spec.rb +25 -9
- data/spec/rubyspec/core/string/rjust_spec.rb +26 -10
- data/spec/rubyspec/core/struct/fixtures/classes.rb +26 -0
- data/spec/rubyspec/core/struct/initialize_spec.rb +11 -0
- data/spec/rubyspec/core/struct/new_spec.rb +24 -0
- data/spec/rubyspec/fixtures/constants.rb +7 -0
- data/spec/rubyspec/language/break_spec.rb +1 -1
- data/spec/rubyspec/language/case_spec.rb +30 -30
- data/spec/rubyspec/language/def_spec.rb +34 -34
- data/spec/rubyspec/language/defined_spec.rb +2 -2
- data/spec/rubyspec/language/ensure_spec.rb +2 -2
- data/spec/rubyspec/language/execution_spec.rb +2 -2
- data/spec/rubyspec/language/for_spec.rb +17 -17
- data/spec/rubyspec/language/hash_spec.rb +3 -3
- data/spec/rubyspec/language/if_spec.rb +11 -11
- data/spec/rubyspec/language/loop_spec.rb +3 -3
- data/spec/rubyspec/language/metaclass_spec.rb +14 -14
- data/spec/rubyspec/language/module_spec.rb +6 -6
- data/spec/rubyspec/language/next_spec.rb +5 -5
- data/spec/rubyspec/language/not_spec.rb +1 -1
- data/spec/rubyspec/language/or_spec.rb +1 -1
- data/spec/rubyspec/language/order_spec.rb +3 -5
- data/spec/rubyspec/language/precedence_spec.rb +19 -19
- data/spec/rubyspec/language/proc_spec.rb +29 -29
- data/spec/rubyspec/language/redo_spec.rb +3 -5
- data/spec/rubyspec/language/rescue_spec.rb +7 -7
- data/spec/rubyspec/language/retry_spec.rb +2 -2
- data/spec/rubyspec/language/return_spec.rb +12 -12
- data/spec/rubyspec/language/send_spec.rb +9 -9
- data/spec/rubyspec/language/singleton_class_spec.rb +3 -4
- data/spec/rubyspec/language/super_spec.rb +7 -11
- data/spec/rubyspec/language/until_spec.rb +10 -10
- data/spec/rubyspec/language/variables_spec.rb +59 -67
- data/spec/rubyspec/language/versions/array_1.9.rb +1 -1
- data/spec/rubyspec/language/versions/block_1.9.rb +0 -0
- data/spec/rubyspec/language/versions/break_1.9.rb +0 -0
- data/spec/rubyspec/language/versions/literal_lambda_1.9.rb +12 -12
- data/spec/rubyspec/language/versions/send_1.9.rb +23 -23
- data/spec/rubyspec/language/versions/symbol_1.9.rb +2 -2
- data/spec/rubyspec/language/versions/variables_1.9.rb +1 -1
- data/spec/rubyspec/language/while_spec.rb +4 -4
- data/spec/rubyspec/language/yield_spec.rb +3 -3
- data/spec/rubyspec/library/erb/util/html_escape_spec.rb +10 -0
- data/spec/rubyspec/library/singleton/clone_spec.rb +8 -0
- data/spec/rubyspec/library/singleton/dup_spec.rb +8 -0
- data/spec/rubyspec/library/singleton/fixtures/classes.rb +18 -0
- data/spec/rubyspec/library/singleton/instance_spec.rb +30 -0
- data/spec/spec_helper.rb +214 -0
- data/stdlib/buffer.rb +40 -0
- data/stdlib/buffer/array.rb +66 -0
- data/stdlib/buffer/view.rb +70 -0
- data/stdlib/erb.rb +11 -20
- data/stdlib/forwardable.rb +71 -0
- data/stdlib/json.rb +78 -0
- data/stdlib/ostruct.rb +69 -0
- data/stdlib/rbconfig.rb +1 -0
- data/stdlib/singleton.rb +40 -0
- data/stdlib/stringio.rb +173 -0
- data/stdlib/template.rb +44 -0
- metadata +285 -79
- data/corelib/opal/native.rb +0 -31
- data/spec/opal/class/bridge_class_spec.rb +0 -39
- data/spec/opal/native_spec.rb +0 -209
- data/spec/ospec/runner.rb +0 -223
- data/spec/rubyspec/filters/bugs/block_args.rb +0 -3
- data/spec/rubyspec/filters/bugs/case.rb +0 -8
- data/spec/rubyspec/filters/bugs/language/module.rb +0 -3
- data/spec/rubyspec/filters/unsupported/frozen.rb +0 -4
- data/spec/rubyspec/filters/unsupported/tainted.rb +0 -7
@@ -145,10 +145,6 @@ class String
|
|
145
145
|
}
|
146
146
|
end
|
147
147
|
|
148
|
-
def as_json
|
149
|
-
self
|
150
|
-
end
|
151
|
-
|
152
148
|
def capitalize
|
153
149
|
`#{self}.charAt(0).toUpperCase() + #{self}.substr(1).toLowerCase()`
|
154
150
|
end
|
@@ -402,15 +398,19 @@ class String
|
|
402
398
|
|
403
399
|
def ljust(width, padstr = ' ')
|
404
400
|
%x{
|
405
|
-
|
406
|
-
|
401
|
+
var length = #{self}.length;
|
402
|
+
|
403
|
+
if (width <= length) {
|
404
|
+
return #{self};
|
407
405
|
}
|
408
406
|
else {
|
409
|
-
var
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
407
|
+
var index = -1, result = "";
|
408
|
+
|
409
|
+
while (++index < (width - length)) {
|
410
|
+
result += padstr;
|
411
|
+
}
|
412
|
+
|
413
|
+
return #{self} + result.slice(0, width - length);
|
414
414
|
}
|
415
415
|
}
|
416
416
|
end
|
@@ -504,8 +504,11 @@ class String
|
|
504
504
|
return #{self};
|
505
505
|
}
|
506
506
|
else {
|
507
|
-
|
508
|
-
|
507
|
+
var n_chars = Math.floor(width - #{self}.length)
|
508
|
+
var n_patterns = Math.floor(n_chars/padstr.length);
|
509
|
+
var result = Array(n_patterns + 1).join(padstr);
|
510
|
+
var remaining = n_chars - result.length;
|
511
|
+
return result + padstr.slice(0, remaining) + #{self};
|
509
512
|
}
|
510
513
|
}
|
511
514
|
end
|
@@ -684,8 +687,6 @@ class String
|
|
684
687
|
}
|
685
688
|
end
|
686
689
|
|
687
|
-
alias to_json inspect
|
688
|
-
|
689
690
|
def to_proc
|
690
691
|
%x{
|
691
692
|
var name = '$' + #{self};
|
@@ -705,6 +706,10 @@ class String
|
|
705
706
|
|
706
707
|
alias to_sym intern
|
707
708
|
|
709
|
+
def to_n
|
710
|
+
`#{self}.valueOf()`
|
711
|
+
end
|
712
|
+
|
708
713
|
def tr(from, to)
|
709
714
|
%x{
|
710
715
|
if (from.length == 0 || from === to) {
|
data/corelib/struct.rb
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
class Struct
|
2
|
+
def self.new(name = undefined, *args)
|
3
|
+
return super unless self == Struct
|
4
|
+
|
5
|
+
if name[0] == name[0].upcase
|
6
|
+
Struct.const_set(name, new(*args))
|
7
|
+
else
|
8
|
+
args.unshift name
|
9
|
+
|
10
|
+
Class.new(self) {
|
11
|
+
args.each { |arg| define_struct_attribute arg }
|
12
|
+
}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.define_struct_attribute(name)
|
17
|
+
if self == Struct
|
18
|
+
raise ArgumentError, 'you cannot define attributes to the Struct class'
|
19
|
+
end
|
20
|
+
|
21
|
+
members << name
|
22
|
+
|
23
|
+
define_method name do
|
24
|
+
instance_variable_get "@#{name}"
|
25
|
+
end
|
26
|
+
|
27
|
+
define_method "#{name}=" do |value|
|
28
|
+
instance_variable_set "@#{name}", value
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.members
|
33
|
+
if self == Struct
|
34
|
+
raise ArgumentError, 'the Struct class has no members'
|
35
|
+
end
|
36
|
+
|
37
|
+
@members ||= []
|
38
|
+
end
|
39
|
+
|
40
|
+
include Enumerable
|
41
|
+
|
42
|
+
def initialize(*args)
|
43
|
+
if args.length == 1 && native?(args[0])
|
44
|
+
object = args[0]
|
45
|
+
|
46
|
+
members.each {|name|
|
47
|
+
instance_variable_set "@#{name}", Native(`#{object}[#{name}]`)
|
48
|
+
}
|
49
|
+
else
|
50
|
+
members.each_with_index {|name, index|
|
51
|
+
instance_variable_set "@#{name}", args[index]
|
52
|
+
}
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def members
|
57
|
+
self.class.members
|
58
|
+
end
|
59
|
+
|
60
|
+
def [](name)
|
61
|
+
if Integer === name
|
62
|
+
raise IndexError, "offset #{name} too large for struct(size:#{members.size})" if name >= members.size
|
63
|
+
|
64
|
+
name = members[name]
|
65
|
+
else
|
66
|
+
raise NameError, "no member '#{name}' in struct" unless members.include?(name.to_sym)
|
67
|
+
end
|
68
|
+
|
69
|
+
instance_variable_get "@#{name}"
|
70
|
+
end
|
71
|
+
|
72
|
+
def []=(name, value)
|
73
|
+
if Integer === name
|
74
|
+
raise IndexError, "offset #{name} too large for struct(size:#{members.size})" if name >= members.size
|
75
|
+
|
76
|
+
name = members[name]
|
77
|
+
else
|
78
|
+
raise NameError, "no member '#{name}' in struct" unless members.include?(name.to_sym)
|
79
|
+
end
|
80
|
+
|
81
|
+
instance_variable_set "@#{name}", value
|
82
|
+
end
|
83
|
+
|
84
|
+
def each
|
85
|
+
return enum_for :each unless block_given?
|
86
|
+
|
87
|
+
members.each { |name| yield self[name] }
|
88
|
+
end
|
89
|
+
|
90
|
+
def each_pair
|
91
|
+
return enum_for :each_pair unless block_given?
|
92
|
+
|
93
|
+
members.each { |name| yield name, self[name] }
|
94
|
+
end
|
95
|
+
|
96
|
+
def eql?(other)
|
97
|
+
hash == other.hash || other.each_with_index.all? {|object, index|
|
98
|
+
self[members[index]] == object
|
99
|
+
}
|
100
|
+
end
|
101
|
+
|
102
|
+
def length
|
103
|
+
members.length
|
104
|
+
end
|
105
|
+
|
106
|
+
alias size length
|
107
|
+
|
108
|
+
def to_a
|
109
|
+
members.map { |name| self[name] }
|
110
|
+
end
|
111
|
+
|
112
|
+
alias values to_a
|
113
|
+
|
114
|
+
def to_n
|
115
|
+
result = `{}`
|
116
|
+
|
117
|
+
each_pair {|name, value|
|
118
|
+
`#{result}[#{name}] = #{value.to_n}`
|
119
|
+
}
|
120
|
+
|
121
|
+
result
|
122
|
+
end
|
123
|
+
|
124
|
+
def inspect
|
125
|
+
result = "#<struct "
|
126
|
+
|
127
|
+
if self.class == Struct
|
128
|
+
result += "#{self.class.name} "
|
129
|
+
end
|
130
|
+
|
131
|
+
result += each_pair.map {|name, value|
|
132
|
+
"#{name}=#{value.inspect}"
|
133
|
+
}.join ", "
|
134
|
+
|
135
|
+
result += ">"
|
136
|
+
|
137
|
+
result
|
138
|
+
end
|
139
|
+
end
|
File without changes
|
data/lib/opal.rb
CHANGED
@@ -34,6 +34,10 @@ module Opal
|
|
34
34
|
paths << path
|
35
35
|
end
|
36
36
|
|
37
|
+
def self.use_gem(gem_name)
|
38
|
+
Opal.append_path File.join(Gem::Specification.find_by_name(gem_name).gem_dir, 'lib')
|
39
|
+
end
|
40
|
+
|
37
41
|
# Private, don't add to these directly (use .append_path instead).
|
38
42
|
def self.paths
|
39
43
|
@paths ||= [core_dir, std_dir]
|
data/lib/opal/cli.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'opal'
|
2
|
-
|
3
1
|
begin
|
4
2
|
require 'opal-sprockets'
|
5
3
|
rescue LoadError
|
@@ -10,25 +8,63 @@ rescue LoadError
|
|
10
8
|
exit -1
|
11
9
|
end
|
12
10
|
|
11
|
+
require 'opal'
|
12
|
+
require 'rack'
|
13
|
+
|
13
14
|
module Opal
|
14
15
|
class CLI
|
15
16
|
attr_reader :options, :filename
|
16
17
|
|
17
|
-
def initialize
|
18
|
-
|
18
|
+
def initialize filename, options
|
19
|
+
@options = options || {}
|
20
|
+
@filename = filename
|
21
|
+
end
|
22
|
+
|
23
|
+
def puts *args
|
24
|
+
output.puts *args
|
25
|
+
end
|
26
|
+
|
27
|
+
def output
|
28
|
+
@output ||= options[:output] || $stdout
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
def run
|
33
|
+
set_processor_options
|
34
|
+
prepare_eval_code
|
35
|
+
|
36
|
+
case
|
37
|
+
when options[:sexp]; show_sexp
|
38
|
+
when options[:compile]; show_compiled_source
|
39
|
+
when options[:server]; start_server
|
40
|
+
else run_code
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def show_compiled_source
|
45
|
+
if sprockets[filename]
|
46
|
+
puts sprockets[filename].to_a.last
|
47
|
+
else
|
48
|
+
puts Opal.parse(filename, options)
|
49
|
+
end
|
50
|
+
end
|
19
51
|
|
20
|
-
|
21
|
-
|
52
|
+
def show_sexp
|
53
|
+
puts sexp.inspect
|
54
|
+
end
|
22
55
|
|
56
|
+
def set_processor_options
|
23
57
|
processor_options.each do |option|
|
24
58
|
key = option.to_sym
|
25
59
|
next unless options.has_key? key
|
26
60
|
Opal::Processor.send("#{option}=", options[key])
|
27
61
|
end
|
62
|
+
end
|
28
63
|
|
64
|
+
def prepare_eval_code
|
29
65
|
if options[:evals] and options[:evals].any?
|
30
|
-
require '
|
31
|
-
path = File.join(Dir.
|
66
|
+
require 'tmpdir'
|
67
|
+
path = File.join(Dir.mktmpdir,"opal-#{$$}.js.rb")
|
32
68
|
File.open(path, 'w') do |tempfile|
|
33
69
|
options[:load_paths] ||= []
|
34
70
|
options[:load_paths] << File.dirname(path)
|
@@ -40,39 +76,46 @@ module Opal
|
|
40
76
|
end
|
41
77
|
@filename = File.basename(path)
|
42
78
|
end
|
43
|
-
|
44
|
-
case
|
45
|
-
when options[:sexp]
|
46
|
-
puts sexp.inspect
|
47
|
-
when options[:compile]
|
48
|
-
if File.exist?(filename)
|
49
|
-
puts sprockets[filename].to_a.last
|
50
|
-
else
|
51
|
-
puts Opal.parse(filename, options)
|
52
|
-
end
|
53
|
-
when options[:server]
|
54
|
-
server_start
|
55
|
-
else
|
56
|
-
run
|
57
|
-
end
|
58
79
|
end
|
59
80
|
|
60
|
-
def
|
81
|
+
def run_code
|
61
82
|
begin
|
62
83
|
full_source = sprockets[filename]
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
84
|
+
rescue Sprockets::FileOutsidePaths => e
|
85
|
+
@server = nil
|
86
|
+
full_path = File.expand_path(filename)
|
87
|
+
load_paths << File.dirname(full_path)
|
88
|
+
_filename = File.basename(full_path)
|
89
|
+
full_source = sprockets[_filename]
|
69
90
|
end
|
91
|
+
|
92
|
+
require 'open3'
|
93
|
+
|
94
|
+
# out, err, status = Open3.capture3('node', :stdin_data => full_source)
|
95
|
+
i, o, e = Open3.popen3('node')
|
96
|
+
i.write full_source
|
97
|
+
i.close
|
98
|
+
output_text = o.read
|
99
|
+
status = $?
|
100
|
+
|
101
|
+
raise "Errored: #{e}" if status != 0
|
102
|
+
puts output_text
|
103
|
+
|
104
|
+
rescue Errno::ENOENT
|
105
|
+
$stderr.puts 'Please install Node.js to be able to run Opal scripts.'
|
106
|
+
exit 127
|
70
107
|
end
|
71
108
|
|
72
109
|
def sexp
|
73
110
|
Opal::Grammar.new.parse(source)
|
74
111
|
end
|
75
112
|
|
113
|
+
def map
|
114
|
+
parser = Opal::Parser.new
|
115
|
+
parser.parse(filename, options)
|
116
|
+
parser.source_map
|
117
|
+
end
|
118
|
+
|
76
119
|
def source
|
77
120
|
File.exist?(filename) ? File.read(filename) : filename
|
78
121
|
end
|
@@ -95,14 +138,18 @@ module Opal
|
|
95
138
|
|
96
139
|
def server
|
97
140
|
@server ||= Opal::Server.new do |s|
|
98
|
-
|
141
|
+
load_paths.each do |path|
|
99
142
|
s.append_path path
|
100
143
|
end
|
101
144
|
s.main = File.basename(filename, '.rb')
|
102
145
|
end
|
103
146
|
end
|
104
147
|
|
105
|
-
def
|
148
|
+
def load_paths
|
149
|
+
@load_paths ||= options[:load_paths] || []
|
150
|
+
end
|
151
|
+
|
152
|
+
def start_server
|
106
153
|
require 'rack'
|
107
154
|
require 'webrick'
|
108
155
|
require 'logger'
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
3
|
+
module Opal
|
4
|
+
class CLIOptions < OptionParser
|
5
|
+
def initialize
|
6
|
+
@options = {}
|
7
|
+
|
8
|
+
super do |opts|
|
9
|
+
opts.banner = 'Usage: opal [options] -- [programfile]'
|
10
|
+
|
11
|
+
opts.on('-v', '--version', 'Display Opal Version') do |v|
|
12
|
+
require 'opal/version'
|
13
|
+
puts "Opal v#{Opal::VERSION}"
|
14
|
+
exit
|
15
|
+
end
|
16
|
+
|
17
|
+
opts.on("-h", "--help", "Show this message") do
|
18
|
+
puts opts
|
19
|
+
exit
|
20
|
+
end
|
21
|
+
|
22
|
+
opts.separator ''
|
23
|
+
opts.separator 'Basic Options:'
|
24
|
+
|
25
|
+
opts.on('-I', '--include DIR',
|
26
|
+
'Append a load path (may be used more than once)') do |i|
|
27
|
+
options[:load_paths] ||= []
|
28
|
+
options[:load_paths] << i
|
29
|
+
end
|
30
|
+
|
31
|
+
opts.on('-e', '--eval SOURCE', String,
|
32
|
+
'One line of script. Several -e\'s allowed. Omit [programfile]') do |source|
|
33
|
+
options[:evals] ||= []
|
34
|
+
options[:evals] << source
|
35
|
+
end
|
36
|
+
|
37
|
+
opts.on('-s', '--sexp', 'Show Sexps') do
|
38
|
+
options[:sexp] = true
|
39
|
+
end
|
40
|
+
|
41
|
+
opts.on('-m', '--map', 'Show sourcemap') do
|
42
|
+
options[:map] = true
|
43
|
+
end
|
44
|
+
|
45
|
+
opts.on('-c', '--compile', 'Compile to JavaScript') do
|
46
|
+
options[:compile] = true
|
47
|
+
end
|
48
|
+
|
49
|
+
opts.on('-s', '--server [PORT]', 'Start a server (default port: 3000)') do |port|
|
50
|
+
options[:server] = port.to_i
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
opts.separator ''
|
55
|
+
opts.separator 'Compilation Options:'
|
56
|
+
|
57
|
+
opts.on('-M', '--no-method-missing', 'Disable method missing') do |value|
|
58
|
+
options[:method_missing] = false
|
59
|
+
end
|
60
|
+
|
61
|
+
opts.on('-O', '--no-optimized-operators', 'Disable optimized operators') do |value|
|
62
|
+
options[:optimized_operators_enabled] = false
|
63
|
+
end
|
64
|
+
|
65
|
+
opts.on('-A', '--arity-check', 'Enable arity check') do |value|
|
66
|
+
options[:arity_check] = true
|
67
|
+
end
|
68
|
+
|
69
|
+
opts.on('-C', '--no-const-missing', 'Disable const missing') do |value|
|
70
|
+
options[:const_missing] = false
|
71
|
+
end
|
72
|
+
|
73
|
+
dynamic_require_levels = %w[error warning ignore]
|
74
|
+
opts.on('-D', '--dynamic-require LEVEL', dynamic_require_levels,
|
75
|
+
'Set levelDynamic require severity') do |level|
|
76
|
+
options[:dynamic_require_severity] = level
|
77
|
+
end
|
78
|
+
|
79
|
+
opts.on('-P', '--no-source-map', 'Disable source map') do |value|
|
80
|
+
options[:source_map_enabled] = false
|
81
|
+
end
|
82
|
+
|
83
|
+
opts.on("--irb", "IRB var mode") do |i|
|
84
|
+
options[:irb] = true
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
attr_reader :options
|
90
|
+
end
|
91
|
+
end
|