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.
Files changed (222) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.js +1 -0
  3. data/.github/workflows/build.yml +0 -3
  4. data/.rubocop.yml +5 -1
  5. data/UNRELEASED.md +66 -2
  6. data/benchmark-ips/bm_truthy.rb +30 -0
  7. data/bin/opal-mspec +1 -3
  8. data/bin/opal-repl +1 -2
  9. data/bin/remove-filters +1 -4
  10. data/docs/compiled_ruby.md +10 -6
  11. data/exe/opal-repl +1 -3
  12. data/lib/opal/ast/builder.rb +1 -1
  13. data/lib/opal/cli.rb +2 -2
  14. data/lib/opal/cli_runners/nodejs.rb +9 -2
  15. data/lib/opal/cli_runners/source-map-support-browser.js +80 -216
  16. data/lib/opal/cli_runners/source-map-support-node.js +80 -216
  17. data/lib/opal/cli_runners/source-map-support.js +5 -1
  18. data/lib/opal/cli_runners/system_runner.rb +10 -4
  19. data/lib/opal/compiler.rb +3 -5
  20. data/lib/opal/fragment.rb +5 -1
  21. data/lib/opal/nodes/args/extract_block_arg.rb +1 -8
  22. data/lib/opal/nodes/args/extract_kwoptarg.rb +1 -3
  23. data/lib/opal/nodes/args/extract_optarg.rb +1 -3
  24. data/lib/opal/nodes/args/extract_post_arg.rb +2 -5
  25. data/lib/opal/nodes/args/extract_post_optarg.rb +2 -7
  26. data/lib/opal/nodes/args/initialize_iterarg.rb +1 -3
  27. data/lib/opal/nodes/args/prepare_post_args.rb +5 -1
  28. data/lib/opal/nodes/base.rb +3 -2
  29. data/lib/opal/nodes/call.rb +20 -9
  30. data/lib/opal/nodes/call_special.rb +50 -0
  31. data/lib/opal/nodes/class.rb +24 -15
  32. data/lib/opal/nodes/constants.rb +23 -5
  33. data/lib/opal/nodes/def.rb +20 -23
  34. data/lib/opal/nodes/defined.rb +5 -5
  35. data/lib/opal/nodes/definitions.rb +2 -2
  36. data/lib/opal/nodes/defs.rb +2 -5
  37. data/lib/opal/nodes/helpers.rb +48 -18
  38. data/lib/opal/nodes/if.rb +109 -8
  39. data/lib/opal/nodes/iter.rb +23 -16
  40. data/lib/opal/nodes/literal.rb +18 -4
  41. data/lib/opal/nodes/logic.rb +2 -1
  42. data/lib/opal/nodes/masgn.rb +4 -9
  43. data/lib/opal/nodes/module.rb +29 -19
  44. data/lib/opal/nodes/node_with_args.rb +1 -7
  45. data/lib/opal/nodes/scope.rb +54 -15
  46. data/lib/opal/nodes/singleton_class.rb +5 -3
  47. data/lib/opal/nodes/super.rb +3 -3
  48. data/lib/opal/nodes/top.rb +34 -31
  49. data/lib/opal/nodes/variables.rb +2 -2
  50. data/lib/opal/nodes/x_string.rb +3 -0
  51. data/lib/opal/nodes.rb +0 -1
  52. data/lib/opal/parser/patch.rb +75 -0
  53. data/lib/opal/parser/with_ruby_lexer.rb +1 -1
  54. data/lib/opal/regexp_anchors.rb +7 -7
  55. data/lib/opal/requires.rb +19 -0
  56. data/lib/opal/rewriters/pattern_matching.rb +1 -1
  57. data/lib/opal/rewriters/returnable_logic.rb +102 -4
  58. data/lib/opal/util.rb +2 -2
  59. data/lib/opal/version.rb +1 -1
  60. data/lib/opal.rb +1 -17
  61. data/opal/corelib/array/pack.rb +11 -11
  62. data/opal/corelib/array.rb +193 -152
  63. data/opal/corelib/basic_object.rb +14 -14
  64. data/opal/corelib/binding.rb +7 -7
  65. data/opal/corelib/boolean.rb +12 -15
  66. data/opal/corelib/class.rb +23 -1
  67. data/opal/corelib/comparable.rb +8 -8
  68. data/opal/corelib/complex/base.rb +2 -2
  69. data/opal/corelib/complex.rb +79 -88
  70. data/opal/corelib/constants.rb +9 -9
  71. data/opal/corelib/dir.rb +4 -3
  72. data/opal/corelib/enumerable.rb +140 -127
  73. data/opal/corelib/enumerator/arithmetic_sequence.rb +177 -0
  74. data/opal/corelib/enumerator/chain.rb +42 -0
  75. data/opal/corelib/enumerator/generator.rb +35 -0
  76. data/opal/corelib/enumerator/lazy.rb +243 -0
  77. data/opal/corelib/enumerator/yielder.rb +36 -0
  78. data/opal/corelib/enumerator.rb +45 -300
  79. data/opal/corelib/error/errno.rb +47 -0
  80. data/opal/corelib/error.rb +62 -60
  81. data/opal/corelib/file.rb +26 -12
  82. data/opal/corelib/hash.rb +98 -107
  83. data/opal/corelib/helpers.rb +62 -13
  84. data/opal/corelib/io.rb +47 -34
  85. data/opal/corelib/kernel/format.rb +29 -29
  86. data/opal/corelib/kernel.rb +86 -83
  87. data/opal/corelib/main.rb +14 -12
  88. data/opal/corelib/marshal/read_buffer.rb +15 -15
  89. data/opal/corelib/marshal/write_buffer.rb +45 -44
  90. data/opal/corelib/marshal.rb +3 -3
  91. data/opal/corelib/math.rb +50 -50
  92. data/opal/corelib/method.rb +12 -8
  93. data/opal/corelib/module.rb +96 -79
  94. data/opal/corelib/nil.rb +9 -11
  95. data/opal/corelib/number.rb +113 -118
  96. data/opal/corelib/numeric.rb +37 -33
  97. data/opal/corelib/object_space.rb +11 -10
  98. data/opal/corelib/pack_unpack/format_string_parser.rb +3 -3
  99. data/opal/corelib/pattern_matching/base.rb +7 -7
  100. data/opal/corelib/pattern_matching.rb +1 -1
  101. data/opal/corelib/proc.rb +15 -16
  102. data/opal/corelib/process/base.rb +2 -2
  103. data/opal/corelib/process/status.rb +21 -0
  104. data/opal/corelib/process.rb +5 -5
  105. data/opal/corelib/random/formatter.rb +11 -11
  106. data/opal/corelib/random/math_random.js.rb +1 -1
  107. data/opal/corelib/random/mersenne_twister.rb +3 -3
  108. data/opal/corelib/random/seedrandom.js.rb +3 -3
  109. data/opal/corelib/random.rb +17 -17
  110. data/opal/corelib/range.rb +51 -35
  111. data/opal/corelib/rational/base.rb +4 -4
  112. data/opal/corelib/rational.rb +61 -62
  113. data/opal/corelib/regexp.rb +47 -38
  114. data/opal/corelib/runtime.js +245 -139
  115. data/opal/corelib/string/encoding.rb +21 -21
  116. data/opal/corelib/string/unpack.rb +19 -14
  117. data/opal/corelib/string.rb +135 -128
  118. data/opal/corelib/struct.rb +59 -46
  119. data/opal/corelib/time.rb +47 -57
  120. data/opal/corelib/trace_point.rb +2 -2
  121. data/opal/corelib/unsupported.rb +31 -120
  122. data/opal/corelib/variables.rb +3 -3
  123. data/opal/opal/base.rb +9 -8
  124. data/opal/opal/full.rb +8 -8
  125. data/opal/opal/mini.rb +17 -17
  126. data/opal/opal.rb +17 -18
  127. data/opal.gemspec +1 -1
  128. data/spec/filters/bugs/array.rb +4 -24
  129. data/spec/filters/bugs/bigdecimal.rb +0 -23
  130. data/spec/filters/bugs/binding.rb +0 -1
  131. data/spec/filters/bugs/boolean.rb +3 -0
  132. data/spec/filters/bugs/class.rb +2 -0
  133. data/spec/filters/bugs/date.rb +0 -5
  134. data/spec/filters/bugs/encoding.rb +8 -50
  135. data/spec/filters/bugs/enumerable.rb +4 -1
  136. data/spec/filters/bugs/enumerator.rb +3 -36
  137. data/spec/filters/bugs/exception.rb +0 -2
  138. data/spec/filters/bugs/file.rb +0 -2
  139. data/spec/filters/bugs/float.rb +0 -3
  140. data/spec/filters/bugs/hash.rb +5 -3
  141. data/spec/filters/bugs/integer.rb +2 -3
  142. data/spec/filters/bugs/kernel.rb +2 -31
  143. data/spec/filters/bugs/language.rb +29 -49
  144. data/spec/filters/bugs/main.rb +0 -2
  145. data/spec/filters/bugs/marshal.rb +2 -3
  146. data/spec/filters/bugs/matrix.rb +0 -36
  147. data/spec/filters/bugs/module.rb +7 -61
  148. data/spec/filters/bugs/numeric.rb +0 -7
  149. data/spec/filters/bugs/objectspace.rb +1 -1
  150. data/spec/filters/bugs/pack_unpack.rb +0 -4
  151. data/spec/filters/bugs/proc.rb +0 -9
  152. data/spec/filters/bugs/random.rb +0 -5
  153. data/spec/filters/bugs/range.rb +1 -6
  154. data/spec/filters/bugs/regexp.rb +0 -3
  155. data/spec/filters/bugs/set.rb +8 -1
  156. data/spec/filters/bugs/string.rb +9 -34
  157. data/spec/filters/bugs/stringscanner.rb +8 -7
  158. data/spec/filters/bugs/struct.rb +2 -3
  159. data/spec/filters/bugs/symbol.rb +0 -1
  160. data/spec/filters/bugs/time.rb +0 -8
  161. data/spec/filters/bugs/unboundmethod.rb +0 -8
  162. data/spec/filters/bugs/warnings.rb +1 -7
  163. data/spec/filters/unsupported/freeze.rb +24 -0
  164. data/spec/filters/unsupported/integer.rb +1 -0
  165. data/spec/filters/unsupported/kernel.rb +12 -0
  166. data/spec/filters/unsupported/privacy.rb +3 -0
  167. data/spec/filters/unsupported/string.rb +2 -0
  168. data/spec/lib/builder_spec.rb +2 -2
  169. data/spec/lib/cli_spec.rb +1 -1
  170. data/spec/lib/compiler_spec.rb +37 -37
  171. data/spec/lib/simple_server_spec.rb +2 -2
  172. data/spec/lib/source_map/file_spec.rb +1 -1
  173. data/spec/opal/compiler/irb_spec.rb +2 -2
  174. data/spec/opal/core/kernel/puts_spec.rb +90 -0
  175. data/spec/opal/core/language/super_spec.rb +24 -0
  176. data/spec/ruby_specs +4 -2
  177. data/spec/support/rewriters_helper.rb +1 -1
  178. data/stdlib/bigdecimal.rb +7 -11
  179. data/stdlib/buffer/view.rb +2 -2
  180. data/stdlib/buffer.rb +2 -2
  181. data/stdlib/date.rb +5 -6
  182. data/stdlib/erb.rb +1 -0
  183. data/stdlib/js.rb +2 -1
  184. data/stdlib/native.rb +7 -8
  185. data/stdlib/nodejs/argf.rb +4 -4
  186. data/stdlib/nodejs/base.rb +29 -0
  187. data/stdlib/nodejs/dir.rb +1 -1
  188. data/stdlib/nodejs/env.rb +6 -9
  189. data/stdlib/nodejs/file.rb +23 -17
  190. data/stdlib/nodejs/fileutils.rb +3 -3
  191. data/stdlib/nodejs/io.rb +2 -20
  192. data/stdlib/nodejs/irb.rb +0 -0
  193. data/stdlib/nodejs/kernel.rb +2 -37
  194. data/stdlib/nodejs.rb +1 -3
  195. data/stdlib/opal/miniracer.rb +2 -0
  196. data/stdlib/opal/platform.rb +6 -13
  197. data/stdlib/opal/replutils.rb +16 -5
  198. data/stdlib/opal-parser.rb +2 -2
  199. data/stdlib/optparse/ac.rb +54 -0
  200. data/stdlib/optparse/date.rb +14 -0
  201. data/stdlib/optparse/kwargs.rb +22 -0
  202. data/stdlib/optparse/shellwords.rb +7 -0
  203. data/stdlib/optparse/time.rb +15 -0
  204. data/stdlib/optparse/uri.rb +7 -0
  205. data/stdlib/optparse/version.rb +69 -0
  206. data/stdlib/optparse.rb +2279 -0
  207. data/stdlib/pathname.rb +5 -6
  208. data/stdlib/pp.rb +18 -2
  209. data/stdlib/promise/v2.rb +18 -22
  210. data/stdlib/promise.rb +15 -21
  211. data/stdlib/set.rb +32 -32
  212. data/stdlib/shellwords.rb +240 -0
  213. data/stdlib/stringio.rb +3 -6
  214. data/stdlib/strscan.rb +5 -8
  215. data/stdlib/template.rb +2 -2
  216. data/stdlib/thread.rb +7 -9
  217. data/tasks/performance.rake +5 -2
  218. data/tasks/testing/mspec_special_calls.rb +0 -12
  219. data/tasks/testing.rake +55 -37
  220. data/test/nodejs/test_file.rb +11 -0
  221. metadata +55 -10
  222. 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
@@ -1,13 +1,7 @@
1
1
  require 'corelib/file'
2
2
 
3
3
  %x{
4
- var warnings = {}, errno_code, errno_codes = [
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
- throw #{`error_class`.new(`error.message`)};
104
+ #{Kernel.raise `error_class`.new(`error.message`)}
111
105
  }
112
- throw error;
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
- `__path__.posix.join.apply(__path__, #{paths})`
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
@@ -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
@@ -1,19 +1,10 @@
1
- require 'native'
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
@@ -1,6 +1,4 @@
1
- module NodeJS
2
- end
3
-
1
+ require 'nodejs/base'
4
2
  require 'nodejs/kernel'
5
3
  require 'nodejs/file'
6
4
  require 'nodejs/dir'
@@ -1,3 +1,5 @@
1
+ `/* global opalminiracer */`
2
+
1
3
  # Compatibility utilities for the API we provide in
2
4
  # lib/opal/cli_runners/mini_racer
3
5
 
@@ -1,17 +1,10 @@
1
1
  require 'opal-platform'
2
2
 
3
3
  case OPAL_PLATFORM
4
- when 'nashorn'
5
- require 'nashorn'
6
- when 'gjs'
7
- require 'gjs'
8
- when 'quickjs'
9
- require 'quickjs'
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
@@ -45,9 +45,19 @@ module REPLUtils
45
45
 
46
46
  def eval_and_print(func, mode, colorize)
47
47
  printer = if colorize
48
- ->(i) { ColorPrinter.default(i) }
48
+ ->(i) do
49
+ ColorPrinter.default(i)
50
+ rescue => e
51
+ ColorPrinter.colorize(Opal.inspect(i))
52
+ end
49
53
  else
50
- ->(i) { out = []; PP.pp(i, out); out.join }
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
- TOKEN_REGEXP = /(\s+|=>|[@$:]?[a-z]\w+|[A-Z]\w+|#{NUMBER}|#{REGEXP}|".*?"|#<.*?[> ]|.)/
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)
@@ -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,7 @@
1
+ # frozen_string_literal: false
2
+ # -*- ruby -*-
3
+
4
+ require 'shellwords'
5
+ require 'optparse'
6
+
7
+ OptionParser.accept(Shellwords) { |s,| Shellwords.shellwords(s) }
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: false
2
+ require 'optparse'
3
+ require 'time'
4
+
5
+ OptionParser.accept(Time) do |s,|
6
+ if s
7
+ (begin
8
+ Time.httpdate(s)
9
+ rescue
10
+ Time.parse(s)
11
+ end)
12
+ end
13
+ rescue
14
+ raise OptionParser::InvalidArgument, s
15
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: false
2
+ # -*- ruby -*-
3
+
4
+ require 'optparse'
5
+ require 'uri'
6
+
7
+ OptionParser.accept(URI) { |s,| URI.parse(s) if s }
@@ -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