opal 1.3.0.alpha1 → 1.3.0.rc1

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.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build.yml +3 -1
  3. data/UNRELEASED.md +29 -6
  4. data/examples/rack/Gemfile +1 -0
  5. data/examples/rack/Gemfile.lock +11 -7
  6. data/examples/rack-esm/.gitignore +1 -0
  7. data/examples/rack-esm/Gemfile +5 -0
  8. data/examples/rack-esm/app/application.rb +27 -0
  9. data/examples/rack-esm/app/user.rb +24 -0
  10. data/examples/rack-esm/config.ru +25 -0
  11. data/examples/rack-esm/index.html.erb +11 -0
  12. data/examples/sinatra/Gemfile.lock +21 -19
  13. data/lib/opal/builder.rb +39 -23
  14. data/lib/opal/builder_processors.rb +6 -1
  15. data/lib/opal/cache/file_cache.rb +7 -6
  16. data/lib/opal/cli_runners/chrome.rb +20 -15
  17. data/lib/opal/cli_runners/chrome_cdp_interface.rb +1 -1
  18. data/lib/opal/cli_runners/nodejs.rb +3 -2
  19. data/lib/opal/cli_runners/quickjs.rb +28 -0
  20. data/lib/opal/cli_runners.rb +1 -0
  21. data/lib/opal/compiler.rb +8 -2
  22. data/lib/opal/config.rb +5 -0
  23. data/lib/opal/nodes/call.rb +45 -26
  24. data/lib/opal/nodes/helpers.rb +1 -1
  25. data/lib/opal/nodes/top.rb +5 -8
  26. data/lib/opal/rewriters/rubyspec/filters_rewriter.rb +16 -0
  27. data/lib/opal/simple_server.rb +7 -2
  28. data/lib/opal/util.rb +1 -1
  29. data/lib/opal/version.rb +1 -1
  30. data/opal/corelib/complex/base.rb +15 -0
  31. data/opal/corelib/complex.rb +3 -15
  32. data/opal/corelib/constants.rb +2 -2
  33. data/opal/corelib/error.rb +1 -1
  34. data/opal/corelib/helpers.rb +10 -0
  35. data/opal/corelib/io.rb +4 -0
  36. data/opal/corelib/kernel.rb +21 -5
  37. data/opal/corelib/main.rb +4 -0
  38. data/opal/corelib/method.rb +4 -0
  39. data/opal/corelib/module.rb +39 -16
  40. data/opal/corelib/pattern_matching/base.rb +35 -0
  41. data/opal/corelib/pattern_matching.rb +2 -36
  42. data/opal/corelib/process/base.rb +9 -0
  43. data/opal/corelib/process.rb +1 -11
  44. data/opal/corelib/random.rb +4 -0
  45. data/opal/corelib/rational/base.rb +11 -0
  46. data/opal/corelib/rational.rb +3 -10
  47. data/opal/corelib/regexp.rb +1 -1
  48. data/opal/corelib/runtime.js +38 -3
  49. data/opal/opal/full.rb +5 -4
  50. data/opal/opal.rb +12 -11
  51. data/package.json +1 -1
  52. data/spec/filters/bugs/bigdecimal.rb +0 -1
  53. data/spec/filters/bugs/enumerator.rb +5 -0
  54. data/spec/filters/bugs/float.rb +3 -0
  55. data/spec/filters/bugs/kernel.rb +2 -9
  56. data/spec/filters/bugs/language.rb +0 -1
  57. data/spec/filters/bugs/marshal.rb +3 -0
  58. data/spec/filters/bugs/method.rb +1 -2
  59. data/spec/filters/bugs/module.rb +0 -6
  60. data/spec/filters/bugs/rational.rb +1 -0
  61. data/spec/filters/bugs/regexp.rb +0 -1
  62. data/spec/lib/compiler_spec.rb +2 -2
  63. data/spec/mspec-opal/runner.rb +1 -0
  64. data/stdlib/benchmark.rb +14 -0
  65. data/stdlib/buffer.rb +4 -0
  66. data/stdlib/nashorn/file.rb +2 -0
  67. data/stdlib/native.rb +63 -58
  68. data/stdlib/nodejs/argf.rb +110 -0
  69. data/stdlib/nodejs/env.rb +12 -0
  70. data/stdlib/nodejs/file.rb +10 -0
  71. data/stdlib/nodejs/kernel.rb +56 -0
  72. data/stdlib/nodejs.rb +1 -0
  73. data/stdlib/opal/platform.rb +2 -0
  74. data/stdlib/opal-platform.rb +5 -2
  75. data/stdlib/pathname.rb +4 -0
  76. data/stdlib/quickjs/io.rb +22 -0
  77. data/stdlib/quickjs/kernel.rb +5 -0
  78. data/stdlib/quickjs.rb +2 -0
  79. data/stdlib/securerandom.rb +2 -0
  80. data/tasks/performance.rake +2 -1
  81. data/tasks/testing.rake +1 -1
  82. metadata +36 -8
  83. data/lib/opal/cli_runners/chrome_cdp_interface.js +0 -30285
data/stdlib/nodejs/env.rb CHANGED
@@ -44,4 +44,16 @@ class << ENV
44
44
  def to_s
45
45
  'ENV'
46
46
  end
47
+
48
+ alias inspect to_s
49
+
50
+ def to_h
51
+ keys.to_h { |k| [k, self[k]] }
52
+ end
53
+
54
+ alias to_hash to_h
55
+
56
+ def merge(keys)
57
+ to_h.merge(keys)
58
+ end
47
59
  end
@@ -1,3 +1,5 @@
1
+ require 'corelib/file'
2
+
1
3
  %x{
2
4
  var warnings = {}, errno_code, errno_codes = [
3
5
  'EACCES',
@@ -146,6 +148,14 @@ class File < IO
146
148
  data.size
147
149
  end
148
150
 
151
+ def self.delete(path)
152
+ `executeIOAction(function(){return __fs__.unlinkSync(#{path})})`
153
+ end
154
+
155
+ class << self
156
+ alias unlink delete
157
+ end
158
+
149
159
  def self.exist?(path)
150
160
  path = path.path if path.respond_to? :path
151
161
  `return executeIOAction(function(){return __fs__.existsSync(#{path})})`
@@ -1,13 +1,69 @@
1
+ require 'native'
2
+
1
3
  `Opal.exit = process.exit`
2
4
 
3
5
  module Kernel
4
6
  NODE_REQUIRE = `require`
5
7
 
8
+ @__child_process__ = `require('child_process')`
9
+ `var __child_process__ = #{@__child_process__}`
10
+
6
11
  # @deprecated Please use `require('module')` instead
7
12
  def node_require(path)
8
13
  warn '[DEPRECATION] node_require is deprecated. Please use `require(\'module\')` instead.'
9
14
  `#{NODE_REQUIRE}(#{path.to_str})`
10
15
  end
16
+
17
+ def system(*argv, exception: false)
18
+ env = {}
19
+ env = argv.shift if argv.first.is_a? Hash
20
+ env = ENV.merge(env).to_n
21
+ cmdname = argv.shift
22
+
23
+ out = if argv.empty?
24
+ `__child_process__.spawnSync(#{cmdname}, { shell: true, stdio: 'inherit', env: #{env} })`
25
+ elsif Array === cmdname
26
+ `__child_process__.spawnSync(#{cmdname[0]}, #{argv}, { argv0: #{cmdname[1]}, stdio: 'inherit', env: #{env} })`
27
+ else
28
+ `__child_process__.spawnSync(#{cmdname}, #{argv}, { stdio: 'inherit', env: #{env} })`
29
+ end
30
+
31
+ status = out.JS[:status]
32
+ status = 127 if `status === null`
33
+ pid = out.JS[:pid]
34
+
35
+ $? = Process::Status.new(status, pid)
36
+ raise "Command failed with exit #{status}: #{cmdname}" if exception && status != 0
37
+ status == 0
38
+ end
39
+
40
+ def `(cmdline)
41
+ Buffer.new(`__child_process__.execSync(#{cmdline})`).to_s.encode('UTF-8')
42
+ end
43
+ 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
11
65
  end
12
66
 
13
67
  ARGV = `process.argv.slice(2)`
68
+
69
+ ARGV.shift if ARGV.first == '--'
data/stdlib/nodejs.rb CHANGED
@@ -5,6 +5,7 @@ require 'nodejs/kernel'
5
5
  require 'nodejs/file'
6
6
  require 'nodejs/dir'
7
7
  require 'nodejs/io'
8
+ require 'nodejs/argf'
8
9
  require 'nodejs/open-uri'
9
10
  require 'nodejs/pathname'
10
11
  require 'nodejs/env'
@@ -5,6 +5,8 @@ when 'nashorn'
5
5
  require 'nashorn'
6
6
  when 'gjs'
7
7
  require 'gjs'
8
+ when 'quickjs'
9
+ require 'quickjs'
8
10
  when 'nodejs'
9
11
  require 'nodejs/kernel'
10
12
  require 'nodejs/io'
@@ -5,7 +5,8 @@ node = `typeof(process) !== "undefined" && process.versions && proces
5
5
  nashorn = `typeof(Java) !== "undefined" && Java.type`
6
6
  headless_chrome = `typeof(navigator) !== "undefined" && /\bHeadlessChrome\//.test(navigator.userAgent)`
7
7
  gjs = `typeof(window) !== "undefined" && typeof(GjsFileImporter) !== 'undefined'`
8
- opalminiracer = `typeof(opalminiracer) !== 'undefined'`
8
+ quickjs = `typeof(window) === "undefined" && typeof(__loadScript) !== 'undefined'`
9
+ opal_miniracer = `typeof(opalminiracer) !== 'undefined'`
9
10
 
10
11
  OPAL_PLATFORM = if nashorn
11
12
  'nashorn'
@@ -15,7 +16,9 @@ OPAL_PLATFORM = if nashorn
15
16
  'headless-chrome'
16
17
  elsif gjs
17
18
  'gjs'
18
- elsif opalminiracer
19
+ elsif quickjs
20
+ 'quickjs'
21
+ elsif opal_miniracer
19
22
  'opal-miniracer'
20
23
  else # possibly browser, which is the primary target
21
24
  end
data/stdlib/pathname.rb CHANGED
@@ -20,6 +20,10 @@ class Pathname
20
20
  raise ArgumentError if @path == "\0"
21
21
  end
22
22
 
23
+ def self.pwd
24
+ new(Dir.pwd)
25
+ end
26
+
23
27
  attr_reader :path
24
28
 
25
29
  def ==(other)
@@ -0,0 +1,22 @@
1
+ `/* global std */`
2
+
3
+ %x{
4
+ Opal.gvars.stdout.write_proc = function(s) {
5
+ std.out.printf("%s", s);
6
+ std.out.flush();
7
+ }
8
+
9
+ Opal.gvars.stderr.write_proc = function(s) {
10
+ std.err.printf("%s", s);
11
+ std.err.flush();
12
+ }
13
+
14
+ Opal.gvars.stdin.read_proc = function(s) {
15
+ if (std.in.eof()) {
16
+ return nil;
17
+ }
18
+ else {
19
+ return std.in.readAsString(s);
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,5 @@
1
+ `/* global std, scriptArgs */`
2
+
3
+ ARGV = `scriptArgs`
4
+
5
+ `Opal.exit = std.exit`
data/stdlib/quickjs.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'quickjs/io'
2
+ require 'quickjs/kernel'
@@ -1,3 +1,5 @@
1
+ require 'corelib/random/formatter'
2
+
1
3
  module SecureRandom
2
4
  extend Random::Formatter
3
5
 
@@ -55,6 +55,7 @@ ASCIIDOCTOR_PREPARE = [
55
55
  ASCIIDOCTOR_BUILD_OPAL = "bin/opal --no-cache -c " \
56
56
  "-Itmp/performance/asciidoctor/lib " \
57
57
  "-Itmp/performance/asciidoctor.js/packages/core/lib " \
58
+ "-sconcurrent/map -sslim/include " \
58
59
  "tmp/performance/asciidoctor_test.rb > tmp/performance/asciidoctor_test.js"
59
60
  ASCIIDOCTOR_RUN_RUBY = "bundle exec ruby -Itmp/performance/asciidoctor/lib tmp/performance/asciidoctor_test.rb"
60
61
  ASCIIDOCTOR_RUN_OPAL = "node tmp/performance/asciidoctor_test.js"
@@ -70,7 +71,7 @@ performance_stat = ->(name) {
70
71
  sh("#{NODE_OPTSTATUS} > tmp/performance/optstatus_#{name}")
71
72
 
72
73
  puts "\n* Building AsciiDoctor with #{name}..."
73
- stat[:compiler_time] = mean_time.(tries: 3) { sh(ASCIIDOCTOR_BUILD_OPAL) }
74
+ stat[:compiler_time] = mean_time.(tries: 7) { sh(ASCIIDOCTOR_BUILD_OPAL) }
74
75
 
75
76
  puts "\n* Running AsciiDoctor with #{name}..."
76
77
  stat[:run_time] = mean_time.(tries: 31) { sh("#{ASCIIDOCTOR_RUN_OPAL} > tmp/performance/opal_result_#{name}.html") }
data/tasks/testing.rake CHANGED
@@ -284,7 +284,7 @@ Use PATTERN environment variable to manually set the glob for specs:
284
284
  bundle exec rake mspec_nodejs PATTERN=spec/ruby/core/numeric/**_spec.rb
285
285
  DESC
286
286
 
287
- platforms = %w[nodejs server chrome gjs]
287
+ platforms = %w[nodejs server chrome gjs quickjs]
288
288
  mspec_suites = %w[ruby opal]
289
289
  minitest_suites = %w[cruby]
290
290
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opal
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0.alpha1
4
+ version: 1.3.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elia Schito
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2021-09-29 00:00:00.000000000 Z
13
+ date: 2021-10-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: ast
@@ -406,6 +406,12 @@ files:
406
406
  - docs/unsupported_features.md
407
407
  - docs/upgrading.md
408
408
  - docs/using_sprockets.md
409
+ - examples/rack-esm/.gitignore
410
+ - examples/rack-esm/Gemfile
411
+ - examples/rack-esm/app/application.rb
412
+ - examples/rack-esm/app/user.rb
413
+ - examples/rack-esm/config.ru
414
+ - examples/rack-esm/index.html.erb
409
415
  - examples/rack/.gitignore
410
416
  - examples/rack/Gemfile
411
417
  - examples/rack/Gemfile.lock
@@ -432,7 +438,6 @@ files:
432
438
  - lib/opal/cli_runners.rb
433
439
  - lib/opal/cli_runners/applescript.rb
434
440
  - lib/opal/cli_runners/chrome.rb
435
- - lib/opal/cli_runners/chrome_cdp_interface.js
436
441
  - lib/opal/cli_runners/chrome_cdp_interface.rb
437
442
  - lib/opal/cli_runners/compiler.rb
438
443
  - lib/opal/cli_runners/gjs.rb
@@ -477,6 +482,7 @@ files:
477
482
  - lib/opal/cli_runners/node_modules/ws/package.json
478
483
  - lib/opal/cli_runners/nodejs.rb
479
484
  - lib/opal/cli_runners/package.json
485
+ - lib/opal/cli_runners/quickjs.rb
480
486
  - lib/opal/cli_runners/server.rb
481
487
  - lib/opal/cli_runners/source-map-support-browser.js
482
488
  - lib/opal/cli_runners/source-map-support-node.js
@@ -592,6 +598,7 @@ files:
592
598
  - opal/corelib/class.rb
593
599
  - opal/corelib/comparable.rb
594
600
  - opal/corelib/complex.rb
601
+ - opal/corelib/complex/base.rb
595
602
  - opal/corelib/constants.rb
596
603
  - opal/corelib/dir.rb
597
604
  - opal/corelib/enumerable.rb
@@ -616,8 +623,10 @@ files:
616
623
  - opal/corelib/object_space.rb
617
624
  - opal/corelib/pack_unpack/format_string_parser.rb
618
625
  - opal/corelib/pattern_matching.rb
626
+ - opal/corelib/pattern_matching/base.rb
619
627
  - opal/corelib/proc.rb
620
628
  - opal/corelib/process.rb
629
+ - opal/corelib/process/base.rb
621
630
  - opal/corelib/random.rb
622
631
  - opal/corelib/random/formatter.rb
623
632
  - opal/corelib/random/math_random.js.rb
@@ -625,6 +634,7 @@ files:
625
634
  - opal/corelib/random/seedrandom.js.rb
626
635
  - opal/corelib/range.rb
627
636
  - opal/corelib/rational.rb
637
+ - opal/corelib/rational/base.rb
628
638
  - opal/corelib/regexp.rb
629
639
  - opal/corelib/runtime.js
630
640
  - opal/corelib/string.rb
@@ -947,6 +957,7 @@ files:
947
957
  - stdlib/nashorn/io.rb
948
958
  - stdlib/native.rb
949
959
  - stdlib/nodejs.rb
960
+ - stdlib/nodejs/argf.rb
950
961
  - stdlib/nodejs/dir.rb
951
962
  - stdlib/nodejs/env.rb
952
963
  - stdlib/nodejs/file.rb
@@ -1038,6 +1049,9 @@ files:
1038
1049
  - stdlib/promise.rb
1039
1050
  - stdlib/promise/v1.rb
1040
1051
  - stdlib/promise/v2.rb
1052
+ - stdlib/quickjs.rb
1053
+ - stdlib/quickjs/io.rb
1054
+ - stdlib/quickjs/kernel.rb
1041
1055
  - stdlib/racc/parser.rb
1042
1056
  - stdlib/rbconfig.rb
1043
1057
  - stdlib/rbconfig/sizeof.rb
@@ -1107,10 +1121,10 @@ licenses:
1107
1121
  metadata:
1108
1122
  homepage_uri: https://opalrb.com/
1109
1123
  bug_tracker_uri: https://github.com/opal/opal/issues
1110
- changelog_uri: https://github.com/opal/opal/blob/v1.3.0.alpha1/CHANGELOG.md
1111
- readme_uri: https://github.com/opal/opal/blob/v1.3.0.alpha1/README.md
1112
- api_documentation_uri: http://opalrb.com/docs/api/v1.3.0.alpha1/index.html
1113
- guides_uri: http://opalrb.com/docs/guides/v1.3.0.alpha1/index.html
1124
+ changelog_uri: https://github.com/opal/opal/blob/v1.3.0.rc1/CHANGELOG.md
1125
+ readme_uri: https://github.com/opal/opal/blob/v1.3.0.rc1/README.md
1126
+ api_documentation_uri: http://opalrb.com/docs/api/v1.3.0.rc1/index.html
1127
+ guides_uri: http://opalrb.com/docs/guides/v1.3.0.rc1/index.html
1114
1128
  chat_uri: https://gitter.im/opal/opal
1115
1129
  source_code_uri: https://github.com/opal/opal
1116
1130
  post_install_message:
@@ -1304,6 +1318,12 @@ test_files:
1304
1318
  - docs/unsupported_features.md
1305
1319
  - docs/upgrading.md
1306
1320
  - docs/using_sprockets.md
1321
+ - examples/rack-esm/.gitignore
1322
+ - examples/rack-esm/Gemfile
1323
+ - examples/rack-esm/app/application.rb
1324
+ - examples/rack-esm/app/user.rb
1325
+ - examples/rack-esm/config.ru
1326
+ - examples/rack-esm/index.html.erb
1307
1327
  - examples/rack/.gitignore
1308
1328
  - examples/rack/Gemfile
1309
1329
  - examples/rack/Gemfile.lock
@@ -1330,7 +1350,6 @@ test_files:
1330
1350
  - lib/opal/cli_runners.rb
1331
1351
  - lib/opal/cli_runners/applescript.rb
1332
1352
  - lib/opal/cli_runners/chrome.rb
1333
- - lib/opal/cli_runners/chrome_cdp_interface.js
1334
1353
  - lib/opal/cli_runners/chrome_cdp_interface.rb
1335
1354
  - lib/opal/cli_runners/compiler.rb
1336
1355
  - lib/opal/cli_runners/gjs.rb
@@ -1375,6 +1394,7 @@ test_files:
1375
1394
  - lib/opal/cli_runners/node_modules/ws/package.json
1376
1395
  - lib/opal/cli_runners/nodejs.rb
1377
1396
  - lib/opal/cli_runners/package.json
1397
+ - lib/opal/cli_runners/quickjs.rb
1378
1398
  - lib/opal/cli_runners/server.rb
1379
1399
  - lib/opal/cli_runners/source-map-support-browser.js
1380
1400
  - lib/opal/cli_runners/source-map-support-node.js
@@ -1490,6 +1510,7 @@ test_files:
1490
1510
  - opal/corelib/class.rb
1491
1511
  - opal/corelib/comparable.rb
1492
1512
  - opal/corelib/complex.rb
1513
+ - opal/corelib/complex/base.rb
1493
1514
  - opal/corelib/constants.rb
1494
1515
  - opal/corelib/dir.rb
1495
1516
  - opal/corelib/enumerable.rb
@@ -1514,8 +1535,10 @@ test_files:
1514
1535
  - opal/corelib/object_space.rb
1515
1536
  - opal/corelib/pack_unpack/format_string_parser.rb
1516
1537
  - opal/corelib/pattern_matching.rb
1538
+ - opal/corelib/pattern_matching/base.rb
1517
1539
  - opal/corelib/proc.rb
1518
1540
  - opal/corelib/process.rb
1541
+ - opal/corelib/process/base.rb
1519
1542
  - opal/corelib/random.rb
1520
1543
  - opal/corelib/random/formatter.rb
1521
1544
  - opal/corelib/random/math_random.js.rb
@@ -1523,6 +1546,7 @@ test_files:
1523
1546
  - opal/corelib/random/seedrandom.js.rb
1524
1547
  - opal/corelib/range.rb
1525
1548
  - opal/corelib/rational.rb
1549
+ - opal/corelib/rational/base.rb
1526
1550
  - opal/corelib/regexp.rb
1527
1551
  - opal/corelib/runtime.js
1528
1552
  - opal/corelib/string.rb
@@ -1576,6 +1600,7 @@ test_files:
1576
1600
  - stdlib/nashorn/io.rb
1577
1601
  - stdlib/native.rb
1578
1602
  - stdlib/nodejs.rb
1603
+ - stdlib/nodejs/argf.rb
1579
1604
  - stdlib/nodejs/dir.rb
1580
1605
  - stdlib/nodejs/env.rb
1581
1606
  - stdlib/nodejs/file.rb
@@ -1667,6 +1692,9 @@ test_files:
1667
1692
  - stdlib/promise.rb
1668
1693
  - stdlib/promise/v1.rb
1669
1694
  - stdlib/promise/v2.rb
1695
+ - stdlib/quickjs.rb
1696
+ - stdlib/quickjs/io.rb
1697
+ - stdlib/quickjs/kernel.rb
1670
1698
  - stdlib/racc/parser.rb
1671
1699
  - stdlib/rbconfig.rb
1672
1700
  - stdlib/rbconfig/sizeof.rb