opal 1.3.2 → 1.4.0.alpha1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.eslintrc.js +1 -0
- data/.github/workflows/build.yml +0 -3
- data/.rubocop.yml +5 -1
- data/UNRELEASED.md +66 -2
- data/benchmark-ips/bm_truthy.rb +30 -0
- data/bin/opal-mspec +1 -3
- data/bin/opal-repl +1 -2
- data/bin/remove-filters +1 -4
- data/docs/compiled_ruby.md +10 -6
- data/exe/opal-repl +1 -3
- data/lib/opal/ast/builder.rb +1 -1
- data/lib/opal/cli.rb +2 -2
- data/lib/opal/cli_runners/nodejs.rb +9 -2
- data/lib/opal/cli_runners/source-map-support-browser.js +80 -216
- data/lib/opal/cli_runners/source-map-support-node.js +80 -216
- data/lib/opal/cli_runners/source-map-support.js +5 -1
- data/lib/opal/cli_runners/system_runner.rb +10 -4
- data/lib/opal/compiler.rb +3 -5
- data/lib/opal/fragment.rb +5 -1
- data/lib/opal/nodes/args/extract_block_arg.rb +1 -8
- data/lib/opal/nodes/args/extract_kwoptarg.rb +1 -3
- data/lib/opal/nodes/args/extract_optarg.rb +1 -3
- data/lib/opal/nodes/args/extract_post_arg.rb +2 -5
- data/lib/opal/nodes/args/extract_post_optarg.rb +2 -7
- data/lib/opal/nodes/args/initialize_iterarg.rb +1 -3
- data/lib/opal/nodes/args/prepare_post_args.rb +5 -1
- data/lib/opal/nodes/base.rb +3 -2
- data/lib/opal/nodes/call.rb +20 -9
- data/lib/opal/nodes/call_special.rb +50 -0
- data/lib/opal/nodes/class.rb +24 -15
- data/lib/opal/nodes/constants.rb +23 -5
- data/lib/opal/nodes/def.rb +20 -23
- data/lib/opal/nodes/defined.rb +5 -5
- data/lib/opal/nodes/definitions.rb +2 -2
- data/lib/opal/nodes/defs.rb +2 -5
- data/lib/opal/nodes/helpers.rb +48 -18
- data/lib/opal/nodes/if.rb +109 -8
- data/lib/opal/nodes/iter.rb +23 -16
- data/lib/opal/nodes/literal.rb +18 -4
- data/lib/opal/nodes/logic.rb +2 -1
- data/lib/opal/nodes/masgn.rb +4 -9
- data/lib/opal/nodes/module.rb +29 -19
- data/lib/opal/nodes/node_with_args.rb +1 -7
- data/lib/opal/nodes/scope.rb +54 -15
- data/lib/opal/nodes/singleton_class.rb +5 -3
- data/lib/opal/nodes/super.rb +3 -3
- data/lib/opal/nodes/top.rb +34 -31
- data/lib/opal/nodes/variables.rb +2 -2
- data/lib/opal/nodes/x_string.rb +3 -0
- data/lib/opal/nodes.rb +0 -1
- data/lib/opal/parser/patch.rb +75 -0
- data/lib/opal/parser/with_ruby_lexer.rb +1 -1
- data/lib/opal/regexp_anchors.rb +7 -7
- data/lib/opal/requires.rb +19 -0
- data/lib/opal/rewriters/pattern_matching.rb +1 -1
- data/lib/opal/rewriters/returnable_logic.rb +102 -4
- data/lib/opal/util.rb +2 -2
- data/lib/opal/version.rb +1 -1
- data/lib/opal.rb +1 -17
- data/opal/corelib/array/pack.rb +11 -11
- data/opal/corelib/array.rb +193 -152
- data/opal/corelib/basic_object.rb +14 -14
- data/opal/corelib/binding.rb +7 -7
- data/opal/corelib/boolean.rb +12 -15
- data/opal/corelib/class.rb +23 -1
- data/opal/corelib/comparable.rb +8 -8
- data/opal/corelib/complex/base.rb +2 -2
- data/opal/corelib/complex.rb +79 -88
- data/opal/corelib/constants.rb +9 -9
- data/opal/corelib/dir.rb +4 -3
- data/opal/corelib/enumerable.rb +140 -127
- data/opal/corelib/enumerator/arithmetic_sequence.rb +177 -0
- data/opal/corelib/enumerator/chain.rb +42 -0
- data/opal/corelib/enumerator/generator.rb +35 -0
- data/opal/corelib/enumerator/lazy.rb +243 -0
- data/opal/corelib/enumerator/yielder.rb +36 -0
- data/opal/corelib/enumerator.rb +45 -300
- data/opal/corelib/error/errno.rb +47 -0
- data/opal/corelib/error.rb +62 -60
- data/opal/corelib/file.rb +26 -12
- data/opal/corelib/hash.rb +98 -107
- data/opal/corelib/helpers.rb +62 -13
- data/opal/corelib/io.rb +47 -34
- data/opal/corelib/kernel/format.rb +29 -29
- data/opal/corelib/kernel.rb +86 -83
- data/opal/corelib/main.rb +14 -12
- data/opal/corelib/marshal/read_buffer.rb +15 -15
- data/opal/corelib/marshal/write_buffer.rb +45 -44
- data/opal/corelib/marshal.rb +3 -3
- data/opal/corelib/math.rb +50 -50
- data/opal/corelib/method.rb +12 -8
- data/opal/corelib/module.rb +96 -79
- data/opal/corelib/nil.rb +9 -11
- data/opal/corelib/number.rb +113 -118
- data/opal/corelib/numeric.rb +37 -33
- data/opal/corelib/object_space.rb +11 -10
- data/opal/corelib/pack_unpack/format_string_parser.rb +3 -3
- data/opal/corelib/pattern_matching/base.rb +7 -7
- data/opal/corelib/pattern_matching.rb +1 -1
- data/opal/corelib/proc.rb +15 -16
- data/opal/corelib/process/base.rb +2 -2
- data/opal/corelib/process/status.rb +21 -0
- data/opal/corelib/process.rb +5 -5
- data/opal/corelib/random/formatter.rb +11 -11
- data/opal/corelib/random/math_random.js.rb +1 -1
- data/opal/corelib/random/mersenne_twister.rb +3 -3
- data/opal/corelib/random/seedrandom.js.rb +3 -3
- data/opal/corelib/random.rb +17 -17
- data/opal/corelib/range.rb +51 -35
- data/opal/corelib/rational/base.rb +4 -4
- data/opal/corelib/rational.rb +61 -62
- data/opal/corelib/regexp.rb +47 -38
- data/opal/corelib/runtime.js +245 -139
- data/opal/corelib/string/encoding.rb +21 -21
- data/opal/corelib/string/unpack.rb +19 -14
- data/opal/corelib/string.rb +135 -128
- data/opal/corelib/struct.rb +59 -46
- data/opal/corelib/time.rb +47 -57
- data/opal/corelib/trace_point.rb +2 -2
- data/opal/corelib/unsupported.rb +31 -120
- data/opal/corelib/variables.rb +3 -3
- data/opal/opal/base.rb +9 -8
- data/opal/opal/full.rb +8 -8
- data/opal/opal/mini.rb +17 -17
- data/opal/opal.rb +17 -18
- data/opal.gemspec +1 -1
- data/spec/filters/bugs/array.rb +4 -24
- data/spec/filters/bugs/bigdecimal.rb +0 -23
- data/spec/filters/bugs/binding.rb +0 -1
- data/spec/filters/bugs/boolean.rb +3 -0
- data/spec/filters/bugs/class.rb +2 -0
- data/spec/filters/bugs/date.rb +0 -5
- data/spec/filters/bugs/encoding.rb +8 -50
- data/spec/filters/bugs/enumerable.rb +4 -1
- data/spec/filters/bugs/enumerator.rb +3 -36
- data/spec/filters/bugs/exception.rb +0 -2
- data/spec/filters/bugs/file.rb +0 -2
- data/spec/filters/bugs/float.rb +0 -3
- data/spec/filters/bugs/hash.rb +5 -3
- data/spec/filters/bugs/integer.rb +2 -3
- data/spec/filters/bugs/kernel.rb +2 -31
- data/spec/filters/bugs/language.rb +29 -49
- data/spec/filters/bugs/main.rb +0 -2
- data/spec/filters/bugs/marshal.rb +2 -3
- data/spec/filters/bugs/matrix.rb +0 -36
- data/spec/filters/bugs/module.rb +7 -61
- data/spec/filters/bugs/numeric.rb +0 -7
- data/spec/filters/bugs/objectspace.rb +1 -1
- data/spec/filters/bugs/pack_unpack.rb +0 -4
- data/spec/filters/bugs/proc.rb +0 -9
- data/spec/filters/bugs/random.rb +0 -5
- data/spec/filters/bugs/range.rb +1 -6
- data/spec/filters/bugs/regexp.rb +0 -3
- data/spec/filters/bugs/set.rb +8 -1
- data/spec/filters/bugs/string.rb +9 -34
- data/spec/filters/bugs/stringscanner.rb +8 -7
- data/spec/filters/bugs/struct.rb +2 -3
- data/spec/filters/bugs/symbol.rb +0 -1
- data/spec/filters/bugs/time.rb +0 -8
- data/spec/filters/bugs/unboundmethod.rb +0 -8
- data/spec/filters/bugs/warnings.rb +1 -7
- data/spec/filters/unsupported/freeze.rb +24 -0
- data/spec/filters/unsupported/integer.rb +1 -0
- data/spec/filters/unsupported/kernel.rb +12 -0
- data/spec/filters/unsupported/privacy.rb +3 -0
- data/spec/filters/unsupported/string.rb +2 -0
- data/spec/lib/builder_spec.rb +2 -2
- data/spec/lib/cli_spec.rb +1 -1
- data/spec/lib/compiler_spec.rb +37 -37
- data/spec/lib/simple_server_spec.rb +2 -2
- data/spec/lib/source_map/file_spec.rb +1 -1
- data/spec/opal/compiler/irb_spec.rb +2 -2
- data/spec/opal/core/kernel/puts_spec.rb +90 -0
- data/spec/opal/core/language/super_spec.rb +24 -0
- data/spec/ruby_specs +4 -2
- data/spec/support/rewriters_helper.rb +1 -1
- data/stdlib/bigdecimal.rb +7 -11
- data/stdlib/buffer/view.rb +2 -2
- data/stdlib/buffer.rb +2 -2
- data/stdlib/date.rb +5 -6
- data/stdlib/erb.rb +1 -0
- data/stdlib/js.rb +2 -1
- data/stdlib/native.rb +7 -8
- data/stdlib/nodejs/argf.rb +4 -4
- data/stdlib/nodejs/base.rb +29 -0
- data/stdlib/nodejs/dir.rb +1 -1
- data/stdlib/nodejs/env.rb +6 -9
- data/stdlib/nodejs/file.rb +23 -17
- data/stdlib/nodejs/fileutils.rb +3 -3
- data/stdlib/nodejs/io.rb +2 -20
- data/stdlib/nodejs/irb.rb +0 -0
- data/stdlib/nodejs/kernel.rb +2 -37
- data/stdlib/nodejs.rb +1 -3
- data/stdlib/opal/miniracer.rb +2 -0
- data/stdlib/opal/platform.rb +6 -13
- data/stdlib/opal/replutils.rb +16 -5
- data/stdlib/opal-parser.rb +2 -2
- data/stdlib/optparse/ac.rb +54 -0
- data/stdlib/optparse/date.rb +14 -0
- data/stdlib/optparse/kwargs.rb +22 -0
- data/stdlib/optparse/shellwords.rb +7 -0
- data/stdlib/optparse/time.rb +15 -0
- data/stdlib/optparse/uri.rb +7 -0
- data/stdlib/optparse/version.rb +69 -0
- data/stdlib/optparse.rb +2279 -0
- data/stdlib/pathname.rb +5 -6
- data/stdlib/pp.rb +18 -2
- data/stdlib/promise/v2.rb +18 -22
- data/stdlib/promise.rb +15 -21
- data/stdlib/set.rb +32 -32
- data/stdlib/shellwords.rb +240 -0
- data/stdlib/stringio.rb +3 -6
- data/stdlib/strscan.rb +5 -8
- data/stdlib/template.rb +2 -2
- data/stdlib/thread.rb +7 -9
- data/tasks/performance.rake +5 -2
- data/tasks/testing/mspec_special_calls.rb +0 -12
- data/tasks/testing.rake +55 -37
- data/test/nodejs/test_file.rb +11 -0
- metadata +55 -10
- data/lib/opal/nodes/case.rb +0 -114
@@ -0,0 +1,29 @@
|
|
1
|
+
module NodeJS
|
2
|
+
VERSION = `process.version`
|
3
|
+
end
|
4
|
+
|
5
|
+
`Opal.exit = process.exit`
|
6
|
+
|
7
|
+
ARGV = `process.argv.slice(2)`
|
8
|
+
ARGV.shift if ARGV.first == '--'
|
9
|
+
|
10
|
+
STDOUT.write_proc = ->(string) { `process.stdout.write(string)` }
|
11
|
+
STDERR.write_proc = ->(string) { `process.stderr.write(string)` }
|
12
|
+
|
13
|
+
`var __fs__ = require('fs')`
|
14
|
+
STDIN.read_proc = %x{function(_count) {
|
15
|
+
// Ignore count, return as much as we can get
|
16
|
+
var buf = Buffer.alloc(65536), count;
|
17
|
+
try {
|
18
|
+
count = __fs__.readSync(this.fd, buf, 0, 65536, null);
|
19
|
+
}
|
20
|
+
catch (e) { // Windows systems may raise EOF
|
21
|
+
return nil;
|
22
|
+
}
|
23
|
+
if (count == 0) return nil;
|
24
|
+
return buf.toString('utf8', 0, count);
|
25
|
+
}}
|
26
|
+
|
27
|
+
STDIN.tty = true
|
28
|
+
STDOUT.tty = true
|
29
|
+
STDERR.tty = true
|
data/stdlib/nodejs/dir.rb
CHANGED
@@ -44,7 +44,7 @@ class Dir
|
|
44
44
|
pattern = [pattern] unless pattern.respond_to? :each
|
45
45
|
pattern.flat_map do |subpattern|
|
46
46
|
subpattern = subpattern.to_path if subpattern.respond_to? :to_path
|
47
|
-
subpattern = Opal.coerce_to!(subpattern, String, :to_str)
|
47
|
+
subpattern = ::Opal.coerce_to!(subpattern, String, :to_str)
|
48
48
|
`__glob__.sync(subpattern)`
|
49
49
|
end
|
50
50
|
end
|
data/stdlib/nodejs/env.rb
CHANGED
@@ -13,11 +13,6 @@ class << ENV
|
|
13
13
|
`process.env.hasOwnProperty(#{name})`
|
14
14
|
end
|
15
15
|
|
16
|
-
# alias
|
17
|
-
alias has_key? key?
|
18
|
-
alias include? key?
|
19
|
-
alias member? key?
|
20
|
-
|
21
16
|
def empty?
|
22
17
|
`Object.keys(process.env).length === 0`
|
23
18
|
end
|
@@ -45,15 +40,17 @@ class << ENV
|
|
45
40
|
'ENV'
|
46
41
|
end
|
47
42
|
|
48
|
-
alias inspect to_s
|
49
|
-
|
50
43
|
def to_h
|
51
44
|
keys.to_h { |k| [k, self[k]] }
|
52
45
|
end
|
53
46
|
|
54
|
-
alias to_hash to_h
|
55
|
-
|
56
47
|
def merge(keys)
|
57
48
|
to_h.merge(keys)
|
58
49
|
end
|
50
|
+
|
51
|
+
alias has_key? key?
|
52
|
+
alias include? key?
|
53
|
+
alias inspect to_s
|
54
|
+
alias member? key?
|
55
|
+
alias to_hash to_h
|
59
56
|
end
|
data/stdlib/nodejs/file.rb
CHANGED
@@ -1,13 +1,7 @@
|
|
1
1
|
require 'corelib/file'
|
2
2
|
|
3
3
|
%x{
|
4
|
-
var warnings = {},
|
5
|
-
'EACCES',
|
6
|
-
'EISDIR',
|
7
|
-
'EMFILE',
|
8
|
-
'ENOENT',
|
9
|
-
'EPERM'
|
10
|
-
];
|
4
|
+
var warnings = {}, errno_codes = #{Errno.constants};
|
11
5
|
|
12
6
|
function handle_unsupported_feature(message) {
|
13
7
|
switch (Opal.config.unsupported_features_severity) {
|
@@ -107,16 +101,9 @@ require 'corelib/file'
|
|
107
101
|
} catch (error) {
|
108
102
|
if (errno_codes.indexOf(error.code) >= 0) {
|
109
103
|
var error_class = #{Errno.const_get(`error.code`)}
|
110
|
-
|
104
|
+
#{Kernel.raise `error_class`.new(`error.message`)}
|
111
105
|
}
|
112
|
-
|
113
|
-
}
|
114
|
-
}
|
115
|
-
|
116
|
-
for(var i = 0, ii = errno_codes.length; i < ii; i++) {
|
117
|
-
errno_code = errno_codes[i];
|
118
|
-
if (!#{Errno.const_defined?(`errno_code`)}) {
|
119
|
-
#{Errno.const_set(`errno_code`, Class.new(SystemCallError))}
|
106
|
+
#{Kernel.raise error}
|
120
107
|
}
|
121
108
|
}
|
122
109
|
}
|
@@ -176,7 +163,10 @@ class File < IO
|
|
176
163
|
end
|
177
164
|
|
178
165
|
def self.join(*paths)
|
179
|
-
`
|
166
|
+
# by itself, `path.posix.join` normalizes leading // to /.
|
167
|
+
# restore the leading / on UNC paths (i.e., paths starting with //).
|
168
|
+
prefix = paths.first&.start_with?('//') ? '/' : ''
|
169
|
+
`#{prefix} + __path__.posix.join.apply(__path__, #{paths})`
|
180
170
|
end
|
181
171
|
|
182
172
|
def self.directory?(path)
|
@@ -326,7 +316,23 @@ class File::Stat
|
|
326
316
|
`return executeIOAction(function(){return __fs__.statSync(#{@path}).isFile()})`
|
327
317
|
end
|
328
318
|
|
319
|
+
def directory?
|
320
|
+
`return executeIOAction(function(){return __fs__.statSync(#{@path}).isDirectory()})`
|
321
|
+
end
|
322
|
+
|
329
323
|
def mtime
|
330
324
|
`return executeIOAction(function(){return __fs__.statSync(#{@path}).mtime})`
|
331
325
|
end
|
326
|
+
|
327
|
+
def readable?
|
328
|
+
`return executeIOAction(function(){return __fs__.accessSync(#{@path}, __fs__.constants.R_OK)})`
|
329
|
+
end
|
330
|
+
|
331
|
+
def writable?
|
332
|
+
`return executeIOAction(function(){return __fs__.accessSync(#{@path}, __fs__.constants.W_OK)})`
|
333
|
+
end
|
334
|
+
|
335
|
+
def executable?
|
336
|
+
`return executeIOAction(function(){return __fs__.accessSync(#{@path}, __fs__.constants.X_OK)})`
|
337
|
+
end
|
332
338
|
end
|
data/stdlib/nodejs/fileutils.rb
CHANGED
@@ -23,11 +23,11 @@ module FileUtils
|
|
23
23
|
`__fs__.mkdirSync(#{path})`
|
24
24
|
end
|
25
25
|
|
26
|
-
alias mkpath mkdir_p
|
27
|
-
alias makedirs mkdir_p
|
28
|
-
|
29
26
|
def mv(source, target)
|
30
27
|
target = File.join(target, File.basename(source)) if File.directory? target
|
31
28
|
`__fs__.renameSync(source, target)`
|
32
29
|
end
|
30
|
+
|
31
|
+
alias mkpath mkdir_p
|
32
|
+
alias makedirs mkdir_p
|
33
33
|
end
|
data/stdlib/nodejs/io.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'nodejs/file'
|
2
|
+
|
1
3
|
%x{
|
2
4
|
function executeIOAction(action) {
|
3
5
|
try {
|
@@ -41,23 +43,3 @@ class IO
|
|
41
43
|
`return executeIOAction(function(){return __fs__.readFileSync(#{path}).toString('binary')})`
|
42
44
|
end
|
43
45
|
end
|
44
|
-
|
45
|
-
STDOUT.write_proc = ->(string) { `process.stdout.write(string)` }
|
46
|
-
STDERR.write_proc = ->(string) { `process.stderr.write(string)` }
|
47
|
-
|
48
|
-
STDIN.read_proc = %x{function(_count) {
|
49
|
-
// Ignore count, return as much as we can get
|
50
|
-
var buf = Buffer.alloc(65536), count;
|
51
|
-
try {
|
52
|
-
count = __fs__.readSync(this.fd, buf, 0, 65536, null);
|
53
|
-
}
|
54
|
-
catch (e) { // Windows systems may raise EOF
|
55
|
-
return nil;
|
56
|
-
}
|
57
|
-
if (count == 0) return nil;
|
58
|
-
return buf.toString('utf8', 0, count);
|
59
|
-
}}
|
60
|
-
|
61
|
-
STDIN.tty = true
|
62
|
-
STDOUT.tty = true
|
63
|
-
STDERR.tty = true
|
data/stdlib/nodejs/irb.rb
CHANGED
File without changes
|
data/stdlib/nodejs/kernel.rb
CHANGED
@@ -1,19 +1,10 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
`Opal.exit = process.exit`
|
1
|
+
require 'buffer'
|
2
|
+
require 'corelib/process/status'
|
4
3
|
|
5
4
|
module Kernel
|
6
|
-
NODE_REQUIRE = `require`
|
7
|
-
|
8
5
|
@__child_process__ = `require('child_process')`
|
9
6
|
`var __child_process__ = #{@__child_process__}`
|
10
7
|
|
11
|
-
# @deprecated Please use `require('module')` instead
|
12
|
-
def node_require(path)
|
13
|
-
warn '[DEPRECATION] node_require is deprecated. Please use `require(\'module\')` instead.'
|
14
|
-
`#{NODE_REQUIRE}(#{path.to_str})`
|
15
|
-
end
|
16
|
-
|
17
8
|
def system(*argv, exception: false)
|
18
9
|
env = {}
|
19
10
|
env = argv.shift if argv.first.is_a? Hash
|
@@ -41,29 +32,3 @@ module Kernel
|
|
41
32
|
Buffer.new(`__child_process__.execSync(#{cmdline})`).to_s.encode('UTF-8')
|
42
33
|
end
|
43
34
|
end
|
44
|
-
|
45
|
-
module Process
|
46
|
-
class Status
|
47
|
-
def initialize(status, pid)
|
48
|
-
@status, @pid = status, pid
|
49
|
-
end
|
50
|
-
|
51
|
-
def exitstatus
|
52
|
-
@status
|
53
|
-
end
|
54
|
-
|
55
|
-
attr_reader :pid
|
56
|
-
|
57
|
-
def success?
|
58
|
-
@status == 0
|
59
|
-
end
|
60
|
-
|
61
|
-
def inspect
|
62
|
-
"#<Process::Status: pid #{@pid} exit #{@status}>"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
ARGV = `process.argv.slice(2)`
|
68
|
-
|
69
|
-
ARGV.shift if ARGV.first == '--'
|
data/stdlib/nodejs.rb
CHANGED
data/stdlib/opal/miniracer.rb
CHANGED
data/stdlib/opal/platform.rb
CHANGED
@@ -1,17 +1,10 @@
|
|
1
1
|
require 'opal-platform'
|
2
2
|
|
3
3
|
case OPAL_PLATFORM
|
4
|
-
when 'nashorn'
|
5
|
-
|
6
|
-
when '
|
7
|
-
|
8
|
-
when '
|
9
|
-
require '
|
10
|
-
when 'nodejs'
|
11
|
-
require 'nodejs/kernel'
|
12
|
-
require 'nodejs/io'
|
13
|
-
when 'headless-chrome'
|
14
|
-
require 'headless_chrome'
|
15
|
-
when 'opal-miniracer'
|
16
|
-
require 'opal/miniracer'
|
4
|
+
when 'nashorn' then require 'nashorn'
|
5
|
+
when 'gjs' then require 'gjs'
|
6
|
+
when 'quickjs' then require 'quickjs'
|
7
|
+
when 'nodejs' then require 'nodejs/base'
|
8
|
+
when 'headless-chrome' then require 'headless_chrome'
|
9
|
+
when 'opal-miniracer' then require 'opal/miniracer'
|
17
10
|
end
|
data/stdlib/opal/replutils.rb
CHANGED
@@ -45,9 +45,19 @@ module REPLUtils
|
|
45
45
|
|
46
46
|
def eval_and_print(func, mode, colorize)
|
47
47
|
printer = if colorize
|
48
|
-
->(i)
|
48
|
+
->(i) do
|
49
|
+
ColorPrinter.default(i)
|
50
|
+
rescue => e
|
51
|
+
ColorPrinter.colorize(Opal.inspect(i))
|
52
|
+
end
|
49
53
|
else
|
50
|
-
->(i)
|
54
|
+
->(i) do
|
55
|
+
out = []
|
56
|
+
PP.pp(i, out)
|
57
|
+
out.join
|
58
|
+
rescue
|
59
|
+
Opal.inspect(i)
|
60
|
+
end
|
51
61
|
end
|
52
62
|
|
53
63
|
%x{
|
@@ -231,9 +241,10 @@ module REPLUtils
|
|
231
241
|
TOKEN_COLORS.dig(*name) + string + "\e[0m"
|
232
242
|
end
|
233
243
|
|
234
|
-
NUMBER = '[+-]?[0-9.]+(?:e[+-][0-9]+|i)?'
|
244
|
+
NUMBER = '[+-]?(?:0x[0-9a-fA-F]+|[0-9.]+(?:e[+-][0-9]+|i)?)'
|
235
245
|
REGEXP = '/.*?/[iesu]*'
|
236
|
-
|
246
|
+
STRING = '".*?"'
|
247
|
+
TOKEN_REGEXP = /(\s+|=>|[@$:]?[a-z]\w+|[A-Z]\w+|#{NUMBER}|#{REGEXP}|#{STRING}|#<.*?[> ]|.)/
|
237
248
|
|
238
249
|
def self.tokenize(str)
|
239
250
|
str.scan(TOKEN_REGEXP).map(&:first)
|
@@ -256,7 +267,7 @@ module REPLUtils
|
|
256
267
|
token(tok, :symbol, :self)
|
257
268
|
when /^[A-Z]/
|
258
269
|
token(tok, :constant)
|
259
|
-
when /^#</, '=', '>'
|
270
|
+
when '<', '#', /^#</, '=', '>'
|
260
271
|
token(tok, :keyword)
|
261
272
|
when /^\/./
|
262
273
|
token(tok, :regexp, :self)
|
data/stdlib/opal-parser.rb
CHANGED
@@ -7,7 +7,7 @@ require 'opal/version'
|
|
7
7
|
|
8
8
|
module Kernel
|
9
9
|
def eval(str, binding = nil, file = nil, line = nil)
|
10
|
-
str = Opal.coerce_to!(str, String, :to_str)
|
10
|
+
str = ::Opal.coerce_to!(str, String, :to_str)
|
11
11
|
default_eval_options = { file: file || '(eval)', eval: true }
|
12
12
|
compiling_options = __OPAL_COMPILER_CONFIG__.merge(default_eval_options)
|
13
13
|
code = `Opal.compile(str, compiling_options)`
|
@@ -35,7 +35,7 @@ end
|
|
35
35
|
%x{
|
36
36
|
Opal.compile = function(str, options) {
|
37
37
|
try {
|
38
|
-
str = #{Opal.coerce_to!(`str`, String, :to_str)}
|
38
|
+
str = #{::Opal.coerce_to!(`str`, String, :to_str)}
|
39
39
|
if (options) options = Opal.hash(options);
|
40
40
|
return Opal.Opal.$compile(str, options);
|
41
41
|
}
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
require 'optparse'
|
3
|
+
|
4
|
+
class OptionParser::AC < OptionParser
|
5
|
+
private
|
6
|
+
|
7
|
+
def _check_ac_args(name, block)
|
8
|
+
unless /\A\w[-\w]*\z/ =~ name
|
9
|
+
raise ArgumentError, name
|
10
|
+
end
|
11
|
+
unless block
|
12
|
+
raise ArgumentError, 'no block given', ParseError.filter_backtrace(caller)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
ARG_CONV = proc { |val| val.nil? ? true : val }
|
17
|
+
|
18
|
+
def _ac_arg_enable(prefix, name, help_string, block)
|
19
|
+
_check_ac_args(name, block)
|
20
|
+
|
21
|
+
sdesc = []
|
22
|
+
ldesc = ["--#{prefix}-#{name}"]
|
23
|
+
desc = [help_string]
|
24
|
+
q = name.downcase
|
25
|
+
ac_block = proc { |val| block.call(ARG_CONV.call(val)) }
|
26
|
+
enable = Switch::PlacedArgument.new(nil, ARG_CONV, sdesc, ldesc, nil, desc, ac_block)
|
27
|
+
disable = Switch::NoArgument.new(nil, proc { false }, sdesc, ldesc, nil, desc, ac_block)
|
28
|
+
top.append(enable, [], ['enable-' + q], disable, ['disable-' + q])
|
29
|
+
enable
|
30
|
+
end
|
31
|
+
|
32
|
+
public
|
33
|
+
|
34
|
+
def ac_arg_enable(name, help_string, &block)
|
35
|
+
_ac_arg_enable('enable', name, help_string, block)
|
36
|
+
end
|
37
|
+
|
38
|
+
def ac_arg_disable(name, help_string, &block)
|
39
|
+
_ac_arg_enable('disable', name, help_string, block)
|
40
|
+
end
|
41
|
+
|
42
|
+
def ac_arg_with(name, help_string, &block)
|
43
|
+
_check_ac_args(name, block)
|
44
|
+
|
45
|
+
sdesc = []
|
46
|
+
ldesc = ["--with-#{name}"]
|
47
|
+
desc = [help_string]
|
48
|
+
q = name.downcase
|
49
|
+
with = Switch::PlacedArgument.new(*search(:atype, String), sdesc, ldesc, nil, desc, block)
|
50
|
+
without = Switch::NoArgument.new(nil, proc {}, sdesc, ldesc, nil, desc, block)
|
51
|
+
top.append(with, [], ['with-' + q], without, ['without-' + q])
|
52
|
+
with
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
require 'optparse'
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
OptionParser.accept(DateTime) do |s,|
|
6
|
+
DateTime.parse(s) if s
|
7
|
+
rescue ArgumentError
|
8
|
+
raise OptionParser::InvalidArgument, s
|
9
|
+
end
|
10
|
+
OptionParser.accept(Date) do |s,|
|
11
|
+
Date.parse(s) if s
|
12
|
+
rescue ArgumentError
|
13
|
+
raise OptionParser::InvalidArgument, s
|
14
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'optparse'
|
3
|
+
|
4
|
+
class OptionParser
|
5
|
+
# :call-seq:
|
6
|
+
# define_by_keywords(options, method, **params)
|
7
|
+
#
|
8
|
+
# :include: ../../doc/optparse/creates_option.rdoc
|
9
|
+
#
|
10
|
+
def define_by_keywords(options, meth, **opts)
|
11
|
+
meth.parameters.each do |type, name|
|
12
|
+
case type
|
13
|
+
when :key, :keyreq
|
14
|
+
op, cl = *(type == :key ? %w"[ ]" : ['', ''])
|
15
|
+
define("--#{name}=#{op}#{name.upcase}#{cl}", *opts[name]) do |o|
|
16
|
+
options[name] = o
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
options
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
# OptionParser internal utility
|
3
|
+
|
4
|
+
class << OptionParser
|
5
|
+
def show_version(*pkgs)
|
6
|
+
progname = ARGV.options.program_name
|
7
|
+
result = false
|
8
|
+
show = proc do |klass, cname, version|
|
9
|
+
str = progname.to_s
|
10
|
+
unless (klass == ::Object) && (cname == :VERSION)
|
11
|
+
version = version.join('.') if Array === version
|
12
|
+
str << ": #{klass}" unless klass == Object
|
13
|
+
str << " version #{version}"
|
14
|
+
end
|
15
|
+
%i[Release RELEASE].find do |rel|
|
16
|
+
if klass.const_defined?(rel)
|
17
|
+
str << " (#{klass.const_get(rel)})"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
puts str
|
21
|
+
result = true
|
22
|
+
end
|
23
|
+
if (pkgs.size == 1) && (pkgs[0] == 'all')
|
24
|
+
search_const(::Object, /\AV(?:ERSION|ersion)\z/) do |klass, cname, version|
|
25
|
+
unless (cname[1] == 'e') && klass.const_defined?(:Version)
|
26
|
+
show.call(klass, cname.intern, version)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
else
|
30
|
+
pkgs.each do |pkg|
|
31
|
+
pkg = pkg.split(/::|\//).inject(::Object) { |m, c| m.const_get(c) }
|
32
|
+
v = case
|
33
|
+
when pkg.const_defined?(:Version)
|
34
|
+
pkg.const_get(n = :Version)
|
35
|
+
when pkg.const_defined?(:VERSION)
|
36
|
+
pkg.const_get(n = :VERSION)
|
37
|
+
else
|
38
|
+
n = nil
|
39
|
+
'unknown'
|
40
|
+
end
|
41
|
+
show.call(pkg, n, v)
|
42
|
+
rescue NameError
|
43
|
+
end
|
44
|
+
end
|
45
|
+
result
|
46
|
+
end
|
47
|
+
|
48
|
+
def each_const(path, base = ::Object)
|
49
|
+
path.split(/::|\//).inject(base) do |klass, name|
|
50
|
+
raise NameError, path unless Module === klass
|
51
|
+
klass.constants.grep(/#{name}/i) do |c|
|
52
|
+
klass.const_defined?(c) || next
|
53
|
+
klass.const_get(c)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def search_const(klass, name)
|
59
|
+
klasses = [klass]
|
60
|
+
while klass = klasses.shift
|
61
|
+
klass.constants.each do |cname|
|
62
|
+
klass.const_defined?(cname) || next
|
63
|
+
const = klass.const_get(cname)
|
64
|
+
yield klass, cname, const if name === cname
|
65
|
+
klasses << const if (Module === const) && (const != ::Object)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|