opal 1.3.0.alpha1 → 1.3.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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