opal 1.6.1 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (212) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build.yml +17 -0
  3. data/CHANGELOG.md +35 -1
  4. data/Gemfile +1 -0
  5. data/HACKING.md +47 -26
  6. data/benchmark/benchmarks +415 -103
  7. data/benchmark/bm_call_overhead.yml +28 -0
  8. data/benchmark/run.rb +61 -40
  9. data/docs/cdp_common.json +3364 -0
  10. data/docs/cdp_common.md +18 -0
  11. data/docs/{headless_chrome.md → headless_browsers.md} +31 -12
  12. data/lib/opal/ast/builder.rb +1 -1
  13. data/lib/opal/builder.rb +6 -1
  14. data/lib/opal/builder_processors.rb +5 -3
  15. data/lib/opal/cache.rb +1 -7
  16. data/lib/opal/cli_options.rb +72 -58
  17. data/lib/opal/cli_runners/chrome.rb +47 -9
  18. data/lib/opal/cli_runners/chrome_cdp_interface.rb +238 -112
  19. data/lib/opal/cli_runners/compiler.rb +146 -13
  20. data/lib/opal/cli_runners/deno.rb +32 -0
  21. data/lib/opal/cli_runners/firefox.rb +350 -0
  22. data/lib/opal/cli_runners/firefox_cdp_interface.rb +212 -0
  23. data/lib/opal/cli_runners/node_modules/.bin/chrome-remote-interface.cmd +17 -0
  24. data/lib/opal/cli_runners/node_modules/.bin/chrome-remote-interface.ps1 +28 -0
  25. data/lib/opal/cli_runners/node_modules/.package-lock.json +41 -0
  26. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/LICENSE +1 -1
  27. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/README.md +322 -182
  28. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/bin/client.js +99 -114
  29. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/chrome-remote-interface.js +1 -11
  30. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/index.js +16 -11
  31. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/api.js +41 -33
  32. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/chrome.js +224 -214
  33. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/devtools.js +71 -191
  34. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/external-request.js +26 -6
  35. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/protocol.json +20788 -9049
  36. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/websocket-wrapper.js +10 -3
  37. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/package.json +59 -123
  38. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/webpack.config.js +25 -32
  39. data/lib/opal/cli_runners/node_modules/commander/History.md +298 -0
  40. data/lib/opal/cli_runners/node_modules/commander/LICENSE +22 -0
  41. data/lib/opal/cli_runners/node_modules/commander/Readme.md +217 -61
  42. data/lib/opal/cli_runners/node_modules/commander/index.js +431 -145
  43. data/lib/opal/cli_runners/node_modules/commander/package.json +16 -79
  44. data/lib/opal/cli_runners/node_modules/ws/README.md +334 -98
  45. data/lib/opal/cli_runners/node_modules/ws/browser.js +8 -0
  46. data/lib/opal/cli_runners/node_modules/ws/index.js +5 -10
  47. data/lib/opal/cli_runners/node_modules/ws/lib/buffer-util.js +129 -0
  48. data/lib/opal/cli_runners/node_modules/ws/lib/constants.js +10 -0
  49. data/lib/opal/cli_runners/node_modules/ws/lib/event-target.js +184 -0
  50. data/lib/opal/cli_runners/node_modules/ws/lib/extension.js +223 -0
  51. data/lib/opal/cli_runners/node_modules/ws/lib/limiter.js +55 -0
  52. data/lib/opal/cli_runners/node_modules/ws/lib/permessage-deflate.js +518 -0
  53. data/lib/opal/cli_runners/node_modules/ws/lib/receiver.js +607 -0
  54. data/lib/opal/cli_runners/node_modules/ws/lib/sender.js +409 -0
  55. data/lib/opal/cli_runners/node_modules/ws/lib/stream.js +180 -0
  56. data/lib/opal/cli_runners/node_modules/ws/lib/validation.js +104 -0
  57. data/lib/opal/cli_runners/node_modules/ws/lib/websocket-server.js +447 -0
  58. data/lib/opal/cli_runners/node_modules/ws/lib/websocket.js +1195 -0
  59. data/lib/opal/cli_runners/node_modules/ws/package.json +40 -106
  60. data/lib/opal/cli_runners/package-lock.json +62 -0
  61. data/lib/opal/cli_runners/package.json +1 -1
  62. data/lib/opal/cli_runners.rb +26 -4
  63. data/lib/opal/nodes/args/prepare_post_args.rb +2 -2
  64. data/lib/opal/nodes/def.rb +8 -8
  65. data/lib/opal/nodes/iter.rb +12 -12
  66. data/lib/opal/nodes/logic.rb +1 -1
  67. data/lib/opal/nodes/masgn.rb +2 -2
  68. data/lib/opal/parser/with_ruby_lexer.rb +1 -1
  69. data/lib/opal/paths.rb +14 -0
  70. data/lib/opal/rewriter.rb +2 -0
  71. data/lib/opal/rewriters/forward_args.rb +52 -4
  72. data/lib/opal/rewriters/targeted_patches.rb +94 -0
  73. data/lib/opal/version.rb +1 -1
  74. data/opal/corelib/basic_object.rb +1 -1
  75. data/opal/corelib/boolean.rb +2 -2
  76. data/opal/corelib/class.rb +11 -0
  77. data/opal/corelib/constants.rb +3 -3
  78. data/opal/corelib/enumerable.rb +4 -0
  79. data/opal/corelib/enumerator.rb +1 -1
  80. data/opal/corelib/hash.rb +2 -2
  81. data/opal/corelib/helpers.rb +1 -1
  82. data/opal/corelib/kernel.rb +3 -3
  83. data/opal/corelib/method.rb +1 -1
  84. data/opal/corelib/module.rb +29 -8
  85. data/opal/corelib/proc.rb +7 -5
  86. data/opal/corelib/runtime.js +141 -78
  87. data/opal/corelib/set.rb +252 -0
  88. data/opal/corelib/string.rb +2 -1
  89. data/opal/corelib/time.rb +2 -2
  90. data/opal/opal.rb +1 -0
  91. data/opal.gemspec +1 -0
  92. data/spec/filters/bugs/array.rb +22 -13
  93. data/spec/filters/bugs/base64.rb +5 -5
  94. data/spec/filters/bugs/basicobject.rb +16 -8
  95. data/spec/filters/bugs/bigdecimal.rb +161 -160
  96. data/spec/filters/bugs/binding.rb +10 -10
  97. data/spec/filters/bugs/class.rb +8 -8
  98. data/spec/filters/bugs/complex.rb +2 -1
  99. data/spec/filters/bugs/date.rb +79 -81
  100. data/spec/filters/bugs/datetime.rb +29 -29
  101. data/spec/filters/bugs/delegate.rb +1 -3
  102. data/spec/filters/bugs/encoding.rb +69 -69
  103. data/spec/filters/bugs/enumerable.rb +22 -20
  104. data/spec/filters/bugs/enumerator.rb +88 -85
  105. data/spec/filters/bugs/exception.rb +46 -40
  106. data/spec/filters/bugs/file.rb +32 -32
  107. data/spec/filters/bugs/float.rb +26 -21
  108. data/spec/filters/bugs/freeze.rb +88 -0
  109. data/spec/filters/bugs/hash.rb +39 -38
  110. data/spec/filters/bugs/integer.rb +57 -44
  111. data/spec/filters/bugs/io.rb +1 -1
  112. data/spec/filters/bugs/kernel.rb +349 -269
  113. data/spec/filters/bugs/language.rb +220 -188
  114. data/spec/filters/bugs/main.rb +5 -3
  115. data/spec/filters/bugs/marshal.rb +38 -38
  116. data/spec/filters/bugs/math.rb +2 -1
  117. data/spec/filters/bugs/method.rb +73 -62
  118. data/spec/filters/bugs/module.rb +163 -143
  119. data/spec/filters/bugs/numeric.rb +6 -6
  120. data/spec/filters/bugs/objectspace.rb +16 -16
  121. data/spec/filters/bugs/openstruct.rb +1 -1
  122. data/spec/filters/bugs/pack_unpack.rb +51 -51
  123. data/spec/filters/bugs/pathname.rb +7 -7
  124. data/spec/filters/bugs/proc.rb +63 -63
  125. data/spec/filters/bugs/random.rb +7 -6
  126. data/spec/filters/bugs/range.rb +12 -9
  127. data/spec/filters/bugs/rational.rb +8 -7
  128. data/spec/filters/bugs/regexp.rb +49 -48
  129. data/spec/filters/bugs/ruby-32.rb +56 -0
  130. data/spec/filters/bugs/set.rb +30 -30
  131. data/spec/filters/bugs/singleton.rb +4 -4
  132. data/spec/filters/bugs/string.rb +187 -99
  133. data/spec/filters/bugs/stringio.rb +7 -0
  134. data/spec/filters/bugs/stringscanner.rb +68 -68
  135. data/spec/filters/bugs/struct.rb +11 -9
  136. data/spec/filters/bugs/symbol.rb +1 -1
  137. data/spec/filters/bugs/time.rb +78 -63
  138. data/spec/filters/bugs/trace_point.rb +4 -4
  139. data/spec/filters/bugs/unboundmethod.rb +32 -17
  140. data/spec/filters/bugs/warnings.rb +8 -12
  141. data/spec/filters/unsupported/array.rb +24 -107
  142. data/spec/filters/unsupported/basicobject.rb +12 -12
  143. data/spec/filters/unsupported/bignum.rb +27 -52
  144. data/spec/filters/unsupported/class.rb +1 -2
  145. data/spec/filters/unsupported/delegator.rb +3 -3
  146. data/spec/filters/unsupported/enumerable.rb +2 -9
  147. data/spec/filters/unsupported/enumerator.rb +2 -11
  148. data/spec/filters/unsupported/file.rb +1 -1
  149. data/spec/filters/unsupported/float.rb +28 -47
  150. data/spec/filters/unsupported/hash.rb +8 -14
  151. data/spec/filters/unsupported/integer.rb +75 -91
  152. data/spec/filters/unsupported/kernel.rb +17 -35
  153. data/spec/filters/unsupported/language.rb +11 -19
  154. data/spec/filters/unsupported/marshal.rb +22 -41
  155. data/spec/filters/unsupported/matchdata.rb +28 -52
  156. data/spec/filters/unsupported/math.rb +1 -1
  157. data/spec/filters/unsupported/privacy.rb +229 -285
  158. data/spec/filters/unsupported/range.rb +1 -5
  159. data/spec/filters/unsupported/regexp.rb +40 -66
  160. data/spec/filters/unsupported/set.rb +2 -2
  161. data/spec/filters/unsupported/singleton.rb +4 -4
  162. data/spec/filters/unsupported/string.rb +305 -508
  163. data/spec/filters/unsupported/struct.rb +3 -4
  164. data/spec/filters/unsupported/symbol.rb +15 -18
  165. data/spec/filters/unsupported/thread.rb +1 -7
  166. data/spec/filters/unsupported/time.rb +159 -202
  167. data/spec/filters/unsupported/usage_of_files.rb +170 -259
  168. data/spec/lib/builder_spec.rb +4 -4
  169. data/spec/lib/rewriters/forward_args_spec.rb +32 -12
  170. data/spec/mspec-opal/runner.rb +2 -0
  171. data/spec/ruby_specs +4 -0
  172. data/stdlib/deno/base.rb +28 -0
  173. data/stdlib/deno/file.rb +340 -0
  174. data/stdlib/{headless_chrome.rb → headless_browser/base.rb} +1 -1
  175. data/stdlib/headless_browser/file.rb +15 -0
  176. data/stdlib/headless_browser.rb +4 -0
  177. data/stdlib/native.rb +1 -1
  178. data/stdlib/nodejs/file.rb +5 -0
  179. data/stdlib/opal/platform.rb +8 -6
  180. data/stdlib/opal-platform.rb +14 -8
  181. data/stdlib/set.rb +1 -258
  182. data/tasks/benchmarking.rake +62 -19
  183. data/tasks/performance.rake +1 -1
  184. data/tasks/testing.rake +5 -3
  185. data/test/nodejs/test_file.rb +29 -10
  186. data/test/opal/http_server.rb +28 -11
  187. data/test/opal/unsupported_and_bugs.rb +2 -1
  188. metadata +89 -50
  189. data/lib/opal/cli_runners/node_modules/ultron/LICENSE +0 -22
  190. data/lib/opal/cli_runners/node_modules/ultron/index.js +0 -138
  191. data/lib/opal/cli_runners/node_modules/ultron/package.json +0 -112
  192. data/lib/opal/cli_runners/node_modules/ws/SECURITY.md +0 -33
  193. data/lib/opal/cli_runners/node_modules/ws/lib/BufferUtil.fallback.js +0 -56
  194. data/lib/opal/cli_runners/node_modules/ws/lib/BufferUtil.js +0 -15
  195. data/lib/opal/cli_runners/node_modules/ws/lib/ErrorCodes.js +0 -28
  196. data/lib/opal/cli_runners/node_modules/ws/lib/EventTarget.js +0 -158
  197. data/lib/opal/cli_runners/node_modules/ws/lib/Extensions.js +0 -69
  198. data/lib/opal/cli_runners/node_modules/ws/lib/PerMessageDeflate.js +0 -339
  199. data/lib/opal/cli_runners/node_modules/ws/lib/Receiver.js +0 -520
  200. data/lib/opal/cli_runners/node_modules/ws/lib/Sender.js +0 -438
  201. data/lib/opal/cli_runners/node_modules/ws/lib/Validation.fallback.js +0 -9
  202. data/lib/opal/cli_runners/node_modules/ws/lib/Validation.js +0 -17
  203. data/lib/opal/cli_runners/node_modules/ws/lib/WebSocket.js +0 -705
  204. data/lib/opal/cli_runners/node_modules/ws/lib/WebSocketServer.js +0 -336
  205. data/spec/filters/bugs/boolean.rb +0 -3
  206. data/spec/filters/bugs/matrix.rb +0 -3
  207. data/spec/filters/unsupported/fixnum.rb +0 -15
  208. data/spec/filters/unsupported/freeze.rb +0 -102
  209. data/spec/filters/unsupported/pathname.rb +0 -4
  210. data/spec/filters/unsupported/proc.rb +0 -4
  211. data/spec/filters/unsupported/random.rb +0 -5
  212. data/spec/filters/unsupported/taint.rb +0 -162
data/stdlib/set.rb CHANGED
@@ -1,258 +1 @@
1
- # helpers: freeze
2
- # Portions Copyright (c) 2002-2013 Akinori MUSHA <knu@iDaemons.org>
3
- class ::Set
4
- include ::Enumerable
5
-
6
- def self.[](*ary)
7
- new(ary)
8
- end
9
-
10
- def initialize(enum = nil, &block)
11
- @hash = {}
12
-
13
- return if enum.nil?
14
- ::Kernel.raise ::ArgumentError, 'value must be enumerable' unless ::Enumerable === enum
15
-
16
- if block
17
- enum.each { |item| add yield(item) }
18
- else
19
- merge(enum)
20
- end
21
- end
22
-
23
- def dup
24
- result = self.class.new
25
- result.merge(self)
26
- end
27
-
28
- def -(enum)
29
- unless enum.respond_to? :each
30
- ::Kernel.raise ::ArgumentError, 'value must be enumerable'
31
- end
32
-
33
- dup.subtract(enum)
34
- end
35
-
36
- def inspect
37
- "#<Set: {#{to_a.join(',')}}>"
38
- end
39
-
40
- def ==(other)
41
- if equal?(other)
42
- true
43
- elsif other.instance_of?(self.class)
44
- @hash == other.instance_variable_get(:@hash)
45
- elsif other.is_a?(::Set) && size == other.size
46
- other.all? { |o| @hash.include?(o) }
47
- else
48
- false
49
- end
50
- end
51
-
52
- def add(o)
53
- @hash[o] = true
54
- self
55
- end
56
-
57
- def classify(&block)
58
- return enum_for(:classify) unless block_given?
59
-
60
- result = ::Hash.new { |h, k| h[k] = self.class.new }
61
-
62
- each { |item| result[yield(item)].add item }
63
-
64
- result
65
- end
66
-
67
- def collect!(&block)
68
- return enum_for(:collect!) unless block_given?
69
- result = self.class.new
70
- each { |item| result << yield(item) }
71
- replace result
72
- end
73
-
74
- def compare_by_identity
75
- if @hash.respond_to?(:compare_by_identity)
76
- @hash.compare_by_identity
77
- self
78
- else
79
- raise NotImplementedError, "#{self.class.name}\##{__method__} is not implemented"
80
- end
81
- end
82
-
83
- def compare_by_identity?
84
- @hash.respond_to?(:compare_by_identity?) && @hash.compare_by_identity?
85
- end
86
-
87
- def delete(o)
88
- @hash.delete(o)
89
- self
90
- end
91
-
92
- def delete?(o)
93
- if include?(o)
94
- delete(o)
95
- self
96
- end
97
- end
98
-
99
- def delete_if
100
- return enum_for(:delete_if) unless block_given?
101
- # @hash.delete_if should be faster, but using it breaks the order
102
- # of enumeration in subclasses.
103
- select { |o| yield o }.each { |o| @hash.delete(o) }
104
- self
105
- end
106
-
107
- def freeze
108
- return self if frozen?
109
-
110
- @hash.freeze
111
- `$freeze(self)`
112
- end
113
-
114
- def keep_if
115
- return enum_for(:keep_if) unless block_given?
116
- reject { |o| yield o }.each { |o| @hash.delete(o) }
117
- self
118
- end
119
-
120
- def reject!(&block)
121
- return enum_for(:reject!) unless block_given?
122
- before = size
123
- delete_if(&block)
124
- size == before ? nil : self
125
- end
126
-
127
- def select!(&block)
128
- return enum_for(:select!) unless block_given?
129
- before = size
130
- keep_if(&block)
131
- size == before ? nil : self
132
- end
133
-
134
- def add?(o)
135
- if include?(o)
136
- nil
137
- else
138
- add(o)
139
- end
140
- end
141
-
142
- def each(&block)
143
- return enum_for(:each) unless block_given?
144
- @hash.each_key(&block)
145
- self
146
- end
147
-
148
- def empty?
149
- @hash.empty?
150
- end
151
-
152
- def eql?(other)
153
- @hash.eql?(other.instance_eval { @hash })
154
- end
155
-
156
- def clear
157
- @hash.clear
158
- self
159
- end
160
-
161
- def include?(o)
162
- @hash.include?(o)
163
- end
164
-
165
- def merge(enum)
166
- enum.each { |item| add item }
167
- self
168
- end
169
-
170
- def replace(enum)
171
- clear
172
- merge(enum)
173
-
174
- self
175
- end
176
-
177
- def size
178
- @hash.size
179
- end
180
-
181
- def subtract(enum)
182
- enum.each { |item| delete item }
183
- self
184
- end
185
-
186
- def |(enum)
187
- unless enum.respond_to? :each
188
- ::Kernel.raise ::ArgumentError, 'value must be enumerable'
189
- end
190
- dup.merge(enum)
191
- end
192
-
193
- %x{
194
- function is_set(set) {
195
- #{`set`.is_a?(::Set) || ::Kernel.raise(::ArgumentError, 'value must be a set')}
196
- }
197
- }
198
-
199
- def superset?(set)
200
- `is_set(set)`
201
- return false if size < set.size
202
- set.all? { |o| include?(o) }
203
- end
204
-
205
- def proper_superset?(set)
206
- `is_set(set)`
207
- return false if size <= set.size
208
- set.all? { |o| include?(o) }
209
- end
210
-
211
- def subset?(set)
212
- `is_set(set)`
213
- return false if set.size < size
214
- all? { |o| set.include?(o) }
215
- end
216
-
217
- def proper_subset?(set)
218
- `is_set(set)`
219
- return false if set.size <= size
220
- all? { |o| set.include?(o) }
221
- end
222
-
223
- def intersect?(set)
224
- `is_set(set)`
225
- if size < set.size
226
- any? { |o| set.include?(o) }
227
- else
228
- set.any? { |o| include?(o) }
229
- end
230
- end
231
-
232
- def disjoint?(set)
233
- !intersect?(set)
234
- end
235
-
236
- def to_a
237
- @hash.keys
238
- end
239
-
240
- alias + |
241
- alias < proper_subset?
242
- alias << add
243
- alias <= subset?
244
- alias > proper_superset?
245
- alias >= superset?
246
- alias difference -
247
- alias filter! select!
248
- alias length size
249
- alias map! collect!
250
- alias member? include?
251
- alias union |
252
- end
253
-
254
- module ::Enumerable
255
- def to_set(klass = Set, *args, &block)
256
- klass.new(self, *args, &block)
257
- end
258
- end
1
+ # Set has been moved to corelib
@@ -1,3 +1,6 @@
1
+ require_relative '../lib/opal/version'
2
+ require_relative '../lib/opal/cli_runners'
3
+
1
4
  namespace :bench do
2
5
  directory "tmp/bench"
3
6
 
@@ -6,19 +9,37 @@ namespace :bench do
6
9
  "tmp/bench/#{index}_#{name.gsub('.', '-')}.txt"
7
10
  }
8
11
 
9
- desc "Benchmark Opal"
10
- task :opal => "tmp/bench" do |t, args|
11
- require 'opal/version'
12
- files = Array(args[:files]) + args.extras
13
- report = report_file_for["opal-#{Opal::VERSION}"]
14
- sh "bundle exec opal benchmark/run.rb #{files.join(" ")} | tee #{report}"
12
+ runners = Opal::CliRunners.registered_runners.sort.reject { |r| r == 'Compiler' }
13
+ runners.each do |runner|
14
+ desc "Benchmark Opal with #{runner}"
15
+ runner_dc = runner.downcase
16
+ task_name = "opal_#{runner_dc}".to_sym
17
+ task task_name => "tmp/bench" do |t, args|
18
+ files = Array(args[:files]) + args.extras
19
+ report = report_file_for["opal-#{runner_dc}-#{Opal::VERSION}"]
20
+ sh "bundle exec ruby benchmark/run.rb --#{runner_dc} #{files.join(" ")} | tee #{report}"
21
+ end
15
22
  end
16
23
 
17
24
  desc "Benchmark Ruby"
18
25
  task :ruby => "tmp/bench" do |t, args|
19
26
  files = Array(args[:files]) + args.extras
20
27
  report = report_file_for["ruby-#{RUBY_VERSION}"]
21
- sh "bundle exec ruby benchmark/run.rb #{files.join(" ")} | tee #{report}"
28
+ sh "bundle exec ruby benchmark/run.rb --ruby #{files.join(" ")} | tee #{report}"
29
+ end
30
+
31
+ desc "Benchmark Ruby vs Opal Node"
32
+ task :ruby_vs_opal => "tmp/bench" do |t, args|
33
+ files = Array(args[:files]) + args.extras
34
+ report = report_file_for["ruby-#{RUBY_VERSION}-vs-opal-node-#{Opal::VERSION}"]
35
+ sh "bundle exec ruby benchmark/run.rb --ruby --node #{files.join(" ")} | tee #{report}"
36
+ end
37
+
38
+ desc "Benchmark All Engines"
39
+ task :all => "tmp/bench" do |t, args|
40
+ files = Array(args[:files]) + args.extras
41
+ report = report_file_for["ruby-#{RUBY_VERSION}-vs-opal-all-#{Opal::VERSION}"]
42
+ sh "bundle exec ruby benchmark/run.rb --ruby --node --chrome --firefox #{files.join(" ")} | tee #{report}"
22
43
  end
23
44
 
24
45
  desc "Delete all benchmark results"
@@ -26,6 +47,21 @@ namespace :bench do
26
47
  sh "rm tmp/bench/*"
27
48
  end
28
49
 
50
+ def results_to_f(results)
51
+ ips = results.compact
52
+ ips.each_with_index do |i, idx|
53
+ factor = case i[-1]
54
+ when 'G' then 1_000_000_000
55
+ when 'M' then 1_000_000
56
+ when 'k' then 1_000
57
+ else
58
+ 1
59
+ end
60
+ ips[idx] = (factor > 1 ? i[0..-2].to_f : i.to_f) * factor
61
+ end
62
+ ips
63
+ end
64
+
29
65
  desc "Combined report of all benchmark results"
30
66
  task :report do |t, args|
31
67
  files = Array(args[:files]) + args.extras
@@ -41,8 +77,13 @@ namespace :bench do
41
77
  report_name = File.basename(file, File.extname(file))
42
78
  report_results = {}
43
79
  File.read(file).each_line do |line|
44
- benchmark_name, benchmark_result = line.split(" ")
45
- report_results[benchmark_name] = benchmark_result
80
+ benchmark_name, benchmark_result_a, benchmark_result_b, benchmark_result_c = line.split(" ")
81
+ if benchmark_result_b == "i/s"
82
+ benchmark_result_b = benchmark_result_c = nil
83
+ elsif benchmark_result_c == "i/s"
84
+ benchmark_result_c = nil
85
+ end
86
+ report_results[benchmark_name] = [benchmark_result_a, benchmark_result_b, benchmark_result_c]
46
87
  benchmark_names << benchmark_name
47
88
  end
48
89
  reports << [report_name, report_results]
@@ -66,17 +107,19 @@ namespace :bench do
66
107
  results_string = ""
67
108
 
68
109
  if report_results[benchmark_name]
69
- sec = report_results[benchmark_name].to_f
70
-
71
- if report_name != base_report_name && base_report_results[benchmark_name]
72
- base_sec = base_report_results[benchmark_name].to_f
73
- delta_percent = -((1 - sec/base_sec)*100)
74
- results_string << format("%+0.2f%%", delta_percent).rjust(10).ljust(12)
75
- else
76
- results_string << (" "*14)
110
+ ips = results_to_f(report_results[benchmark_name])
111
+ base_ips = report_name != base_report_name && base_report_results[benchmark_name] ? results_to_f(base_report_results[benchmark_name]) : []
112
+
113
+ ips.each_with_index do |i, idx|
114
+ if base_ips[idx]
115
+ delta_percent = -((1 - i/base_ips[idx])*100)
116
+ results_string << format("%+0.2f%%", delta_percent).rjust(10).ljust(12)
117
+ else
118
+ results_string << (" "*14)
119
+ end
120
+
121
+ results_string << format("%0.3f i/s", i).rjust(9)
77
122
  end
78
-
79
- results_string << format("%0.3fms", sec).rjust(9)
80
123
  end
81
124
  results_string << ' | '
82
125
  row << results_string
@@ -3,7 +3,7 @@
3
3
  require_relative "#{__dir__}/../lib/opal/util"
4
4
  require_relative "#{__dir__}/../lib/opal/os"
5
5
 
6
- OS = Opal::OS
6
+ OS = Opal::OS unless defined? OS
7
7
 
8
8
  class Timing
9
9
  def initialize(tries: 31, &block)
data/tasks/testing.rake CHANGED
@@ -1,7 +1,9 @@
1
1
  require_relative "#{__dir__}/../lib/opal/os"
2
+ require_relative "#{__dir__}/../lib/opal/cli_runners"
3
+
2
4
  require 'rspec/core/rake_task'
3
5
 
4
- OS = Opal::OS
6
+ OS = Opal::OS unless defined? OS
5
7
 
6
8
  RSpec::Core::RakeTask.new(:rspec) do |t|
7
9
  t.pattern = 'spec/lib/**/*_spec.rb'
@@ -283,8 +285,8 @@ Use PATTERN environment variable to manually set the glob for specs:
283
285
  bundle exec rake mspec_nodejs PATTERN=spec/ruby/core/module/class_variable*_spec.rb
284
286
  bundle exec rake mspec_nodejs PATTERN=spec/ruby/core/numeric/**_spec.rb
285
287
  DESC
286
-
287
- platforms = %w[nodejs opalopal_nodejs server chrome gjs quickjs]
288
+ runners = Opal::CliRunners.to_h.keys.map(&:to_s).reject { |r| r == 'compiler' }
289
+ platforms = (%w[opalopal_nodejs] + runners).sort
288
290
  node_platforms = %w[nodejs opalopal_nodejs]
289
291
  mspec_suites = %w[ruby opal]
290
292
  minitest_suites = %w[cruby]
@@ -130,10 +130,25 @@ class TestNodejsFile < Test::Unit::TestCase
130
130
  refute(File.directory?('test/nodejs/fixtures/hello.rb'), 'test/nodejs/fixtures/hello.rb should not be a directory')
131
131
  end
132
132
 
133
+ # Let's not ship our repo with symlinks, but create them on the go
134
+ def with_symlinks(&block)
135
+ dir_symlink = 'test/nodejs/fixtures/symlink-to-directory'
136
+ file_symlink = 'test/nodejs/fixtures/symlink-to-file'
137
+
138
+ File.symlink('.', dir_symlink)
139
+ File.symlink('hello.rb', file_symlink)
140
+ block.call(dir_symlink, file_symlink)
141
+ ensure
142
+ File.unlink(dir_symlink)
143
+ File.unlink(file_symlink)
144
+ end
145
+
133
146
  def test_directory_check_with_symlinks
134
- assert(File.directory?('test/nodejs/fixtures/symlink-to-directory'), 'test/nodejs/fixtures/symlink-to-directory should be a directory')
135
- assert(File.directory?('test/nodejs/fixtures/symlink-to-directory/'), 'test/nodejs/fixtures/symlink-to-directory/ should be a directory')
136
- refute(File.directory?('test/nodejs/fixtures/symlink-to-file'), 'test/nodejs/fixtures/symlink-to-file should not be a directory')
147
+ with_symlinks do |dir_symlink, file_symlink|
148
+ assert(File.directory?(dir_symlink), dir_symlink+' should be a directory')
149
+ assert(File.directory?(dir_symlink+'/'), dir_symlink+'/ should be a directory')
150
+ refute(File.directory?(file_symlink), file_symlink+' should not be a directory')
151
+ end
137
152
  end unless windows_platform?
138
153
 
139
154
  def test_file_check
@@ -144,16 +159,20 @@ class TestNodejsFile < Test::Unit::TestCase
144
159
  end
145
160
 
146
161
  def test_file_check_with_symlinks
147
- refute(File.file?('test/nodejs/fixtures/symlink-to-directory'), 'test/nodejs/fixtures/symlink-to-directory should not be a file')
148
- refute(File.file?('test/nodejs/fixtures/symlink-to-directory/'), 'test/nodejs/fixtures/symlink-to-directory/ should not be a file')
149
- assert(File.file?('test/nodejs/fixtures/symlink-to-file'), 'test/nodejs/fixtures/symlink-to-file should be a file')
162
+ with_symlinks do |dir_symlink, file_symlink|
163
+ refute(File.file?(dir_symlink), dir_symlink+' should not be a file')
164
+ refute(File.file?(dir_symlink+'/'), dir_symlink+'/ should not be a file')
165
+ assert(File.file?(file_symlink), file_symlink+' should be a file')
166
+ end
150
167
  end unless windows_platform?
151
168
 
152
169
  def test_file_symlink?
153
- assert(File.symlink?('test/nodejs/fixtures/symlink-to-file'))
154
- assert(File.symlink?('test/nodejs/fixtures/symlink-to-directory'))
155
- refute(File.symlink?('test/nodejs/fixtures'))
156
- refute(File.symlink?('test/nodejs/fixtures/hello.rb'))
170
+ with_symlinks do |dir_symlink, file_symlink|
171
+ assert(File.symlink?(file_symlink))
172
+ assert(File.symlink?(dir_symlink))
173
+ refute(File.symlink?('test/nodejs/fixtures'))
174
+ refute(File.symlink?('test/nodejs/fixtures/hello.rb'))
175
+ end
157
176
  end unless windows_platform?
158
177
 
159
178
  def test_file_readable
@@ -3,50 +3,67 @@ require 'sinatra'
3
3
  cat_image = File.open(File.join(File.dirname(__FILE__), 'cat.png'), 'rb').read
4
4
 
5
5
  get '/' do
6
+ headers \
7
+ 'Access-Control-Allow-Origin' => '*'
6
8
  'Ready!'
7
9
  end
8
10
 
9
11
  get '/plain_text' do
10
12
  status 200
11
- headers \
12
- 'Content-Type' => 'text/plain'
13
+ headers(
14
+ 'Content-Type' => 'text/plain',
15
+ 'Access-Control-Allow-Origin' => '*' )
13
16
  body 'plain text'
14
17
  end
15
18
 
16
19
 
17
20
  get '/no_header' do
18
21
  status 200
19
- headers \
20
- 'Content-Type' => ''
22
+ headers(
23
+ 'Content-Type' => '',
24
+ 'Access-Control-Allow-Origin' => '*')
21
25
  body 'no header'
22
26
  end
23
27
 
24
28
  get '/html' do
25
29
  status 200
26
- headers \
27
- 'Content-Type' => 'text/html; charset=utf-8'
30
+ headers(
31
+ 'Content-Type' => 'text/html; charset=utf-8',
32
+ 'Access-Control-Allow-Origin' => '*')
28
33
  body '<body>'
29
34
  end
30
35
 
31
36
  get '/png' do
32
37
  status 200
33
- headers \
34
- 'Content-Type' => 'image/png'
38
+ headers(
39
+ 'Content-Type' => 'image/png',
40
+ 'Access-Control-Allow-Origin' => '*')
35
41
  body cat_image
36
42
  end
37
43
 
38
44
  get '/404' do
39
45
  status 404
46
+ headers \
47
+ 'Access-Control-Allow-Origin' => '*'
40
48
  end
41
49
 
42
50
  get '/500' do
43
51
  status 500
52
+ headers \
53
+ 'Access-Control-Allow-Origin' => '*'
44
54
  end
45
55
 
46
56
  get '/last_modified' do
47
57
  status 200
48
- headers \
49
- 'Content-Type' => 'text/plain',
50
- 'Last-Modified' => 'Wed, 21 Oct 2015 07:28:00 GMT'
58
+ headers(
59
+ 'Content-Type' => 'text/plain',
60
+ 'Last-Modified' => 'Wed, 21 Oct 2015 07:28:00 GMT',
61
+ 'Access-Control-Allow-Origin' => '*')
51
62
  body 'Look Ma, I have a Last-Modified header'
52
63
  end
64
+
65
+ get '/*' do
66
+ status 404
67
+ headers \
68
+ 'Access-Control-Allow-Origin' => '*'
69
+ end
@@ -41,4 +41,5 @@ end
41
41
  class TestBenchmark
42
42
  # sleep is unsupported if not awaited
43
43
  unsupported :test_realtime_output
44
- end
44
+ bug :test_bugs_ruby_dev_40906_can_add_in_place_the_time_of_execution_of_the_block_given
45
+ end