opal 1.0.3 → 1.1.1.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 (408) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +13 -12
  3. data/.gitattributes +1 -1
  4. data/.github/FUNDING.yml +1 -0
  5. data/.github/workflows/build.yml +90 -0
  6. data/.jshintrc +1 -1
  7. data/.overcommit.yml +35 -0
  8. data/.rubocop.yml +44 -7
  9. data/{.rubocop_todo.yml → .rubocop/todo.yml} +4 -5
  10. data/CHANGELOG.md +152 -1
  11. data/Gemfile +2 -3
  12. data/HACKING.md +2 -9
  13. data/LICENSE +1 -1
  14. data/README.md +21 -18
  15. data/UNRELEASED.md +4 -2
  16. data/benchmark-ips/bm_array_pop_1.rb +8 -0
  17. data/benchmark-ips/bm_array_shift.rb +7 -0
  18. data/benchmark-ips/bm_js_symbols_vs_strings.rb +7 -2
  19. data/benchmark-ips/class_shovel_vs_singleton_class.rb +16 -0
  20. data/bin/build-browser-source-map-support +4 -0
  21. data/bin/format-filters +54 -0
  22. data/bin/git-submodule-fast-install +49 -0
  23. data/bin/remove-filters +39 -0
  24. data/bin/setup +4 -0
  25. data/bin/yarn +11 -0
  26. data/docs/releasing.md +18 -0
  27. data/docs/roda-sprockets.md +86 -0
  28. data/docs/sinatra.md +5 -12
  29. data/examples/rack/Gemfile +1 -0
  30. data/examples/rack/app/application.rb +3 -0
  31. data/examples/rack/config.ru +5 -4
  32. data/exe/opal-repl +2 -83
  33. data/lib/opal/ast/builder.rb +1 -1
  34. data/lib/opal/builder.rb +2 -10
  35. data/lib/opal/builder_processors.rb +1 -1
  36. data/lib/opal/cli.rb +4 -1
  37. data/lib/opal/cli_options.rb +11 -3
  38. data/lib/opal/cli_runners.rb +27 -37
  39. data/lib/opal/cli_runners/applescript.rb +5 -44
  40. data/lib/opal/cli_runners/chrome.js +7 -35
  41. data/lib/opal/cli_runners/chrome.rb +75 -17
  42. data/lib/opal/cli_runners/compiler.rb +17 -0
  43. data/lib/opal/cli_runners/nashorn.rb +9 -43
  44. data/lib/opal/cli_runners/nodejs.rb +18 -47
  45. data/lib/opal/cli_runners/server.rb +18 -6
  46. data/lib/opal/cli_runners/source-map-support-browser.js +6449 -0
  47. data/lib/opal/cli_runners/source-map-support-node.js +3704 -0
  48. data/lib/opal/cli_runners/source-map-support.js +639 -0
  49. data/lib/opal/cli_runners/system_runner.rb +45 -0
  50. data/lib/opal/compiler.rb +57 -29
  51. data/lib/opal/config.rb +0 -5
  52. data/lib/opal/erb.rb +1 -1
  53. data/lib/opal/magic_comments.rb +34 -0
  54. data/lib/opal/nodes/args/arity_check.rb +2 -1
  55. data/lib/opal/nodes/base.rb +1 -1
  56. data/lib/opal/nodes/call.rb +1 -4
  57. data/lib/opal/nodes/def.rb +2 -0
  58. data/lib/opal/nodes/iter.rb +1 -1
  59. data/lib/opal/nodes/literal.rb +19 -14
  60. data/lib/opal/nodes/logic.rb +5 -80
  61. data/lib/opal/nodes/masgn.rb +2 -0
  62. data/lib/opal/nodes/rescue.rb +1 -1
  63. data/lib/opal/nodes/super.rb +24 -10
  64. data/lib/opal/nodes/top.rb +5 -4
  65. data/lib/opal/parser/with_c_lexer.rb +2 -1
  66. data/lib/opal/parser/with_ruby_lexer.rb +1 -1
  67. data/lib/opal/path_reader.rb +2 -2
  68. data/lib/opal/paths.rb +8 -5
  69. data/lib/opal/repl.rb +103 -0
  70. data/lib/opal/rewriter.rb +4 -0
  71. data/lib/opal/rewriters/for_rewriter.rb +1 -1
  72. data/lib/opal/rewriters/js_reserved_words.rb +7 -7
  73. data/lib/opal/rewriters/numblocks.rb +31 -0
  74. data/lib/opal/rewriters/returnable_logic.rb +33 -0
  75. data/lib/opal/util.rb +11 -48
  76. data/lib/opal/version.rb +1 -1
  77. data/opal.gemspec +26 -26
  78. data/opal/corelib/array.rb +160 -118
  79. data/opal/corelib/array/pack.rb +5 -3
  80. data/opal/corelib/basic_object.rb +4 -4
  81. data/opal/corelib/class.rb +2 -1
  82. data/opal/corelib/comparable.rb +49 -31
  83. data/opal/corelib/constants.rb +5 -5
  84. data/opal/corelib/enumerable.rb +108 -46
  85. data/opal/corelib/enumerator.rb +27 -12
  86. data/opal/corelib/file.rb +3 -1
  87. data/opal/corelib/hash.rb +6 -1
  88. data/opal/corelib/helpers.rb +8 -28
  89. data/opal/corelib/io.rb +12 -7
  90. data/opal/corelib/kernel.rb +45 -14
  91. data/opal/corelib/kernel/format.rb +3 -1
  92. data/opal/corelib/math.rb +8 -6
  93. data/opal/corelib/method.rb +8 -0
  94. data/opal/corelib/module.rb +17 -2
  95. data/opal/corelib/number.rb +3 -12
  96. data/opal/corelib/proc.rb +16 -0
  97. data/opal/corelib/random/mersenne_twister.rb +147 -0
  98. data/opal/corelib/range.rb +3 -13
  99. data/opal/corelib/regexp.rb +10 -6
  100. data/opal/corelib/runtime.js +208 -81
  101. data/opal/corelib/string.rb +55 -49
  102. data/opal/corelib/string/encoding.rb +109 -32
  103. data/opal/corelib/string/unpack.rb +2 -17
  104. data/opal/corelib/struct.rb +14 -1
  105. data/opal/corelib/time.rb +4 -0
  106. data/opal/opal.rb +1 -1
  107. data/opal/opal/mini.rb +1 -1
  108. data/package.json +16 -0
  109. data/spec/README.md +10 -0
  110. data/spec/filters/bugs/array.rb +76 -0
  111. data/spec/filters/bugs/base64.rb +10 -0
  112. data/spec/filters/bugs/basicobject.rb +12 -0
  113. data/spec/filters/bugs/bigdecimal.rb +248 -0
  114. data/spec/filters/bugs/class.rb +12 -0
  115. data/spec/filters/bugs/complex.rb +7 -0
  116. data/spec/filters/bugs/date.rb +104 -0
  117. data/spec/filters/bugs/encoding.rb +259 -0
  118. data/spec/filters/bugs/enumerable.rb +26 -0
  119. data/spec/filters/bugs/enumerator.rb +48 -0
  120. data/spec/filters/bugs/exception.rb +120 -0
  121. data/spec/filters/bugs/file.rb +48 -0
  122. data/spec/filters/bugs/float.rb +74 -0
  123. data/spec/filters/bugs/hash.rb +60 -0
  124. data/spec/filters/bugs/integer.rb +78 -0
  125. data/spec/filters/bugs/io.rb +9 -0
  126. data/spec/filters/bugs/kernel.rb +401 -0
  127. data/spec/filters/bugs/language.rb +451 -0
  128. data/spec/filters/bugs/marshal.rb +50 -0
  129. data/spec/filters/bugs/math.rb +4 -0
  130. data/spec/filters/bugs/method.rb +79 -0
  131. data/spec/filters/bugs/module.rb +281 -0
  132. data/spec/filters/bugs/nilclass.rb +4 -0
  133. data/spec/filters/bugs/numeric.rb +27 -0
  134. data/spec/filters/bugs/openstruct.rb +8 -0
  135. data/spec/filters/bugs/pack_unpack.rb +138 -0
  136. data/spec/filters/bugs/pathname.rb +9 -0
  137. data/spec/filters/bugs/proc.rb +80 -0
  138. data/spec/filters/bugs/random.rb +20 -0
  139. data/spec/filters/bugs/range.rb +139 -0
  140. data/spec/filters/bugs/rational.rb +12 -0
  141. data/spec/filters/bugs/regexp.rb +91 -0
  142. data/spec/filters/bugs/set.rb +51 -0
  143. data/spec/filters/bugs/singleton.rb +7 -0
  144. data/spec/filters/bugs/string.rb +341 -0
  145. data/spec/filters/bugs/stringscanner.rb +78 -0
  146. data/spec/filters/bugs/struct.rb +26 -0
  147. data/spec/filters/bugs/symbol.rb +7 -0
  148. data/spec/filters/bugs/time.rb +109 -0
  149. data/spec/filters/bugs/unboundmethod.rb +33 -0
  150. data/spec/filters/bugs/warnings.rb +30 -0
  151. data/spec/filters/unsupported/array.rb +168 -0
  152. data/spec/filters/unsupported/basicobject.rb +15 -0
  153. data/spec/filters/unsupported/bignum.rb +55 -0
  154. data/spec/filters/unsupported/class.rb +5 -0
  155. data/spec/filters/unsupported/delegator.rb +6 -0
  156. data/spec/filters/unsupported/enumerable.rb +12 -0
  157. data/spec/filters/unsupported/enumerator.rb +14 -0
  158. data/spec/filters/unsupported/file.rb +4 -0
  159. data/spec/filters/unsupported/fixnum.rb +15 -0
  160. data/spec/filters/unsupported/float.rb +47 -0
  161. data/spec/filters/unsupported/freeze.rb +259 -0
  162. data/spec/filters/unsupported/hash.rb +44 -0
  163. data/spec/filters/unsupported/integer.rb +101 -0
  164. data/spec/filters/unsupported/kernel.rb +35 -0
  165. data/spec/filters/unsupported/language.rb +25 -0
  166. data/spec/filters/unsupported/marshal.rb +44 -0
  167. data/spec/filters/unsupported/matchdata.rb +63 -0
  168. data/spec/filters/unsupported/math.rb +4 -0
  169. data/spec/filters/unsupported/pathname.rb +4 -0
  170. data/spec/filters/unsupported/privacy.rb +287 -0
  171. data/spec/filters/unsupported/proc.rb +4 -0
  172. data/spec/filters/unsupported/random.rb +5 -0
  173. data/spec/filters/unsupported/range.rb +8 -0
  174. data/spec/filters/unsupported/regexp.rb +70 -0
  175. data/spec/filters/unsupported/set.rb +5 -0
  176. data/spec/filters/unsupported/singleton.rb +7 -0
  177. data/spec/filters/unsupported/string.rb +687 -0
  178. data/spec/filters/unsupported/struct.rb +7 -0
  179. data/spec/filters/unsupported/symbol.rb +21 -0
  180. data/spec/filters/unsupported/taint.rb +162 -0
  181. data/spec/filters/unsupported/thread.rb +10 -0
  182. data/spec/filters/unsupported/time.rb +204 -0
  183. data/spec/filters/unsupported/usage_of_files.rb +262 -0
  184. data/spec/lib/builder_processors_spec.rb +44 -0
  185. data/spec/lib/builder_spec.rb +133 -0
  186. data/spec/lib/cli_runners/server_spec.rb +25 -0
  187. data/spec/lib/cli_runners_spec.rb +16 -0
  188. data/spec/lib/cli_spec.rb +256 -0
  189. data/spec/lib/compiler_spec.rb +693 -0
  190. data/spec/lib/config_spec.rb +112 -0
  191. data/spec/lib/dependency_resolver_spec.rb +43 -0
  192. data/spec/lib/deprecations_spec.rb +17 -0
  193. data/spec/lib/fixtures/complex_sprockets.js.rb.erb +4 -0
  194. data/spec/lib/fixtures/file_with_directives.js +2 -0
  195. data/spec/lib/fixtures/jst_file.js.jst +1 -0
  196. data/spec/lib/fixtures/no_requires.rb +1 -0
  197. data/spec/lib/fixtures/opal_file.rb +2 -0
  198. data/spec/lib/fixtures/require_tree_test.rb +3 -0
  199. data/spec/lib/fixtures/required_file.js +1 -0
  200. data/spec/lib/fixtures/required_tree_test/required_file1.rb +1 -0
  201. data/spec/lib/fixtures/required_tree_test/required_file2.rb +1 -0
  202. data/spec/lib/fixtures/requires.rb +7 -0
  203. data/spec/lib/fixtures/source_location_test.rb +7 -0
  204. data/spec/lib/fixtures/source_map.rb +1 -0
  205. data/spec/lib/fixtures/source_map/subfolder/other_file.rb +1 -0
  206. data/spec/lib/fixtures/sprockets_file.js.rb +3 -0
  207. data/spec/lib/fixtures/sprockets_require_tree_test.rb +3 -0
  208. data/spec/lib/path_reader_spec.rb +47 -0
  209. data/spec/lib/paths_spec.rb +18 -0
  210. data/spec/lib/repl_spec.rb +28 -0
  211. data/spec/lib/rewriters/base_spec.rb +68 -0
  212. data/spec/lib/rewriters/binary_operator_assignment_spec.rb +153 -0
  213. data/spec/lib/rewriters/block_to_iter_spec.rb +28 -0
  214. data/spec/lib/rewriters/dot_js_syntax_spec.rb +108 -0
  215. data/spec/lib/rewriters/explicit_writer_return_spec.rb +186 -0
  216. data/spec/lib/rewriters/for_rewriter_spec.rb +92 -0
  217. data/spec/lib/rewriters/hashes/key_duplicates_rewriter_spec.rb +47 -0
  218. data/spec/lib/rewriters/js_reserved_words_spec.rb +119 -0
  219. data/spec/lib/rewriters/logical_operator_assignment_spec.rb +202 -0
  220. data/spec/lib/rewriters/opal_engine_check_spec.rb +84 -0
  221. data/spec/lib/rewriters/returnable_logic_spec.rb +52 -0
  222. data/spec/lib/rewriters/rubyspec/filters_rewriter_spec.rb +59 -0
  223. data/spec/lib/simple_server_spec.rb +56 -0
  224. data/spec/lib/source_map/file_spec.rb +67 -0
  225. data/spec/lib/source_map/index_spec.rb +80 -0
  226. data/spec/lib/spec_helper.rb +105 -0
  227. data/spec/mspec-opal/formatters.rb +197 -0
  228. data/spec/mspec-opal/runner.rb +172 -0
  229. data/spec/opal/compiler/irb_spec.rb +44 -0
  230. data/spec/opal/compiler/unicode_spec.rb +10 -0
  231. data/spec/opal/core/array/dup_spec.rb +23 -0
  232. data/spec/opal/core/array/intersection_spec.rb +38 -0
  233. data/spec/opal/core/array/minus_spec.rb +38 -0
  234. data/spec/opal/core/array/union_spec.rb +38 -0
  235. data/spec/opal/core/array/uniq_spec.rb +49 -0
  236. data/spec/opal/core/class/inherited_spec.rb +18 -0
  237. data/spec/opal/core/enumerable/all_break_spec.rb +5 -0
  238. data/spec/opal/core/enumerable/any_break_spec.rb +5 -0
  239. data/spec/opal/core/enumerable/collect_break_spec.rb +13 -0
  240. data/spec/opal/core/enumerable/count_break_spec.rb +5 -0
  241. data/spec/opal/core/enumerable/detect_break_spec.rb +5 -0
  242. data/spec/opal/core/enumerable/drop_while_break_spec.rb +5 -0
  243. data/spec/opal/core/enumerable/each_slice_break_spec.rb +6 -0
  244. data/spec/opal/core/enumerable/each_with_index_break_spec.rb +5 -0
  245. data/spec/opal/core/enumerable/each_with_object_break_spec.rb +5 -0
  246. data/spec/opal/core/enumerable/find_all_break_spec.rb +5 -0
  247. data/spec/opal/core/enumerable/find_index_break_spec.rb +5 -0
  248. data/spec/opal/core/enumerable/grep_break_spec.rb +5 -0
  249. data/spec/opal/core/enumerable/max_break_spec.rb +5 -0
  250. data/spec/opal/core/enumerable/max_by_break_spec.rb +5 -0
  251. data/spec/opal/core/enumerable/min_break_spec.rb +5 -0
  252. data/spec/opal/core/enumerable/min_by_break_spec.rb +5 -0
  253. data/spec/opal/core/enumerable/none_break_spec.rb +5 -0
  254. data/spec/opal/core/enumerable/one_break_spec.rb +5 -0
  255. data/spec/opal/core/enumerable/reduce_break_spec.rb +5 -0
  256. data/spec/opal/core/enumerable/take_while_break_spec.rb +5 -0
  257. data/spec/opal/core/enumerator/with_index_spec.rb +6 -0
  258. data/spec/opal/core/exception_spec.rb +8 -0
  259. data/spec/opal/core/fixtures/require_tree_files/file 1.rb +1 -0
  260. data/spec/opal/core/fixtures/require_tree_files/file 2.rb +1 -0
  261. data/spec/opal/core/fixtures/require_tree_files/file 3.rb +1 -0
  262. data/spec/opal/core/fixtures/require_tree_files/file 4.rb +1 -0
  263. data/spec/opal/core/fixtures/require_tree_files/file 5.rb +1 -0
  264. data/spec/opal/core/fixtures/require_tree_files/nested/nested 1.rb +1 -0
  265. data/spec/opal/core/fixtures/require_tree_files/nested/nested 2.rb +1 -0
  266. data/spec/opal/core/fixtures/require_tree_files/other/other 1.rb +1 -0
  267. data/spec/opal/core/fixtures/require_tree_with_dot/file 1.rb +1 -0
  268. data/spec/opal/core/fixtures/require_tree_with_dot/file 2.rb +1 -0
  269. data/spec/opal/core/fixtures/require_tree_with_dot/file 3.rb +1 -0
  270. data/spec/opal/core/fixtures/require_tree_with_dot/index.rb +3 -0
  271. data/spec/opal/core/hash/internals_spec.rb +339 -0
  272. data/spec/opal/core/helpers_spec.rb +14 -0
  273. data/spec/opal/core/iterable_props_spec.rb +53 -0
  274. data/spec/opal/core/kernel/at_exit_spec.rb +70 -0
  275. data/spec/opal/core/kernel/freeze_spec.rb +15 -0
  276. data/spec/opal/core/kernel/instance_variables_spec.rb +110 -0
  277. data/spec/opal/core/kernel/methods_spec.rb +25 -0
  278. data/spec/opal/core/kernel/public_methods_spec.rb +25 -0
  279. data/spec/opal/core/kernel/require_tree_spec.rb +18 -0
  280. data/spec/opal/core/kernel/respond_to_spec.rb +15 -0
  281. data/spec/opal/core/language/DATA/characters_support_spec.rb +9 -0
  282. data/spec/opal/core/language/DATA/empty___END___spec.rb +7 -0
  283. data/spec/opal/core/language/DATA/multiple___END___spec.rb +10 -0
  284. data/spec/opal/core/language/arguments/mlhs_arg_spec.rb +18 -0
  285. data/spec/opal/core/language/keyword_arguments_spec.rb +9 -0
  286. data/spec/opal/core/language/numblocks_spec.rb +16 -0
  287. data/spec/opal/core/language/safe_navigator_spec.rb +7 -0
  288. data/spec/opal/core/language/while_spec.rb +31 -0
  289. data/spec/opal/core/language_spec.rb +29 -0
  290. data/spec/opal/core/marshal/dump_spec.rb +81 -0
  291. data/spec/opal/core/marshal/load_spec.rb +13 -0
  292. data/spec/opal/core/module_spec.rb +27 -0
  293. data/spec/opal/core/object_id_spec.rb +56 -0
  294. data/spec/opal/core/regexp/interpolation_spec.rb +40 -0
  295. data/spec/opal/core/regexp/match_spec.rb +78 -0
  296. data/spec/opal/core/runtime/bridged_classes_spec.rb +123 -0
  297. data/spec/opal/core/runtime/constants_spec.rb +16 -0
  298. data/spec/opal/core/runtime/eval_spec.rb +5 -0
  299. data/spec/opal/core/runtime/exit_spec.rb +29 -0
  300. data/spec/opal/core/runtime/is_a_spec.rb +48 -0
  301. data/spec/opal/core/runtime/loaded_spec.rb +20 -0
  302. data/spec/opal/core/runtime/main_methods_spec.rb +39 -0
  303. data/spec/opal/core/runtime/method_missing_spec.rb +68 -0
  304. data/spec/opal/core/runtime/rescue_spec.rb +37 -0
  305. data/spec/opal/core/runtime/string_spec.rb +25 -0
  306. data/spec/opal/core/runtime/truthy_spec.rb +61 -0
  307. data/spec/opal/core/runtime_spec.rb +58 -0
  308. data/spec/opal/core/string/each_byte_spec.rb +19 -0
  309. data/spec/opal/core/string/gsub_spec.rb +35 -0
  310. data/spec/opal/core/string/to_sym_spec.rb +9 -0
  311. data/spec/opal/core/string_spec.rb +28 -0
  312. data/spec/opal/core/struct/dup_spec.rb +11 -0
  313. data/spec/opal/core/time_spec.rb +68 -0
  314. data/spec/opal/stdlib/erb/erb_spec.rb +30 -0
  315. data/spec/opal/stdlib/erb/inline_block.opalerb +3 -0
  316. data/spec/opal/stdlib/erb/quoted.opalerb +1 -0
  317. data/spec/opal/stdlib/erb/simple.opalerb +1 -0
  318. data/spec/opal/stdlib/js_spec.rb +72 -0
  319. data/spec/opal/stdlib/json/ext_spec.rb +55 -0
  320. data/spec/opal/stdlib/json/parse_spec.rb +37 -0
  321. data/spec/opal/stdlib/logger/logger_spec.rb +308 -0
  322. data/spec/opal/stdlib/native/alias_native_spec.rb +27 -0
  323. data/spec/opal/stdlib/native/array_spec.rb +11 -0
  324. data/spec/opal/stdlib/native/date_spec.rb +12 -0
  325. data/spec/opal/stdlib/native/deprecated_include_spec.rb +8 -0
  326. data/spec/opal/stdlib/native/each_spec.rb +13 -0
  327. data/spec/opal/stdlib/native/element_reference_spec.rb +16 -0
  328. data/spec/opal/stdlib/native/exposure_spec.rb +33 -0
  329. data/spec/opal/stdlib/native/ext_spec.rb +19 -0
  330. data/spec/opal/stdlib/native/hash_spec.rb +67 -0
  331. data/spec/opal/stdlib/native/initialize_spec.rb +17 -0
  332. data/spec/opal/stdlib/native/method_missing_spec.rb +51 -0
  333. data/spec/opal/stdlib/native/native_alias_spec.rb +26 -0
  334. data/spec/opal/stdlib/native/native_class_spec.rb +18 -0
  335. data/spec/opal/stdlib/native/native_module_spec.rb +13 -0
  336. data/spec/opal/stdlib/native/native_reader_spec.rb +22 -0
  337. data/spec/opal/stdlib/native/native_writer_spec.rb +30 -0
  338. data/spec/opal/stdlib/native/new_spec.rb +92 -0
  339. data/spec/opal/stdlib/native/struct_spec.rb +12 -0
  340. data/spec/opal/stdlib/pp_spec.rb +5 -0
  341. data/spec/opal/stdlib/promise/always_spec.rb +49 -0
  342. data/spec/opal/stdlib/promise/error_spec.rb +15 -0
  343. data/spec/opal/stdlib/promise/rescue_spec.rb +53 -0
  344. data/spec/opal/stdlib/promise/then_spec.rb +79 -0
  345. data/spec/opal/stdlib/promise/trace_spec.rb +51 -0
  346. data/spec/opal/stdlib/promise/value_spec.rb +15 -0
  347. data/spec/opal/stdlib/promise/when_spec.rb +34 -0
  348. data/spec/opal/stdlib/source_map_spec.rb +8 -0
  349. data/spec/opal/stdlib/strscan/scan_spec.rb +11 -0
  350. data/spec/opal/stdlib/template/paths_spec.rb +10 -0
  351. data/spec/opal/stdlib/thread/mutex_spec.rb +40 -0
  352. data/spec/opal/stdlib/thread/thread_queue_spec.rb +32 -0
  353. data/spec/opal/stdlib/thread/thread_spec.rb +60 -0
  354. data/spec/ruby_specs +183 -0
  355. data/spec/spec_helper.rb +31 -0
  356. data/spec/support/guard_platform.rb +4 -0
  357. data/spec/support/match_helpers.rb +57 -0
  358. data/spec/support/mspec_rspec_adapter.rb +33 -0
  359. data/spec/support/rewriters_helper.rb +54 -0
  360. data/spec/support/source_map_helper.rb +190 -0
  361. data/stdlib/base64.rb +2 -2
  362. data/stdlib/bigdecimal.rb +15 -3
  363. data/stdlib/bigdecimal/bignumber.js.rb +1 -1
  364. data/stdlib/bigdecimal/util.rb +148 -0
  365. data/stdlib/delegate.rb +8 -0
  366. data/stdlib/nodejs/fileutils.rb +1 -1
  367. data/stdlib/nodejs/kernel.rb +0 -13
  368. data/stdlib/nodejs/stacktrace.rb +4 -179
  369. data/stdlib/ostruct.rb +5 -0
  370. data/stdlib/pp.rb +586 -19
  371. data/stdlib/prettyprint.rb +556 -0
  372. data/stdlib/rbconfig/sizeof.rb +2 -0
  373. data/stdlib/securerandom.rb +32 -0
  374. data/stdlib/set.rb +36 -0
  375. data/stdlib/strscan.rb +15 -0
  376. data/tasks/benchmarking.rake +1 -1
  377. data/tasks/linting.rake +3 -5
  378. data/tasks/releasing.rake +2 -5
  379. data/tasks/testing.rake +16 -11
  380. data/tasks/testing/mspec_special_calls.rb +1 -19
  381. data/test/nodejs/fixtures/cat.png +0 -0
  382. data/test/nodejs/fixtures/hello.rb +1 -0
  383. data/test/nodejs/fixtures/iso88591.txt +1 -0
  384. data/test/nodejs/fixtures/utf8.txt +1 -0
  385. data/test/nodejs/fixtures/win1258.txt +1 -0
  386. data/test/nodejs/test_dir.rb +39 -0
  387. data/test/nodejs/test_env.rb +62 -0
  388. data/test/nodejs/test_error.rb +29 -0
  389. data/test/nodejs/test_file.rb +206 -0
  390. data/test/nodejs/test_file_encoding.rb +20 -0
  391. data/test/nodejs/test_io.rb +18 -0
  392. data/test/nodejs/test_opal_builder.rb +12 -0
  393. data/test/nodejs/test_pathname.rb +16 -0
  394. data/test/opal/cat.png +0 -0
  395. data/test/opal/http_server.rb +52 -0
  396. data/test/opal/test_base64.rb +115 -0
  397. data/test/opal/test_keyword.rb +590 -0
  398. data/test/opal/test_matrix.rb +661 -0
  399. data/test/opal/test_openuri.rb +53 -0
  400. data/test/opal/unsupported_and_bugs.rb +39 -0
  401. data/yarn.lock +1355 -0
  402. metadata +905 -40
  403. data/.travis.yml +0 -109
  404. data/appveyor.yml +0 -35
  405. data/lib/opal/nodes/runtime_helpers.rb +0 -51
  406. data/opal/corelib/random/MersenneTwister.js +0 -137
  407. data/opal/corelib/random/mersenne_twister.js.rb +0 -13
  408. data/stdlib/bigdecimal/kernel.rb +0 -5
@@ -0,0 +1,31 @@
1
+ describe "The while expression" do
2
+ it "restarts the current iteration without reevaluating condition with redo" do
3
+ a = []
4
+ i = 0
5
+ j = 0
6
+ while (i+=1)<3
7
+ a << i
8
+ j+=1
9
+ redo if j<3
10
+ a << 5
11
+ end
12
+ a.should == [1, 1, 1, 5, 2, 5]
13
+ end
14
+
15
+ it "restarts the current iteration without evaluation the code below redo" do
16
+ a = []
17
+ i = 0
18
+ while true
19
+ i += 1
20
+ a << i
21
+ if i < 3
22
+ redo
23
+ else
24
+ break
25
+ end
26
+ a << 5 # should never get here
27
+ end
28
+ a.should == [1, 2, 3]
29
+ end
30
+
31
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe "generated method names" do
4
+ it "does not conflict with local Ruby variables" do
5
+ Class.new {
6
+ value = 123
7
+ def value
8
+ 456
9
+ end
10
+ value.should == 123
11
+ }
12
+ end
13
+
14
+ it "does not conflict with local JS variables" do
15
+ Class.new {
16
+ `var value = 123;`
17
+ def value
18
+ 456
19
+ end
20
+ `value`.should == 123
21
+ }
22
+ end
23
+ end
24
+
25
+ describe "Bridging" do
26
+ it "does not remove singleton methods of bridged classes" do
27
+ `typeof(String.call)`.should == "function"
28
+ end
29
+ end
@@ -0,0 +1,81 @@
1
+ # encoding: binary
2
+
3
+ require 'spec_helper'
4
+
5
+ module MarshalExtension
6
+ end
7
+
8
+ class MarshalUserRegexp < Regexp
9
+ end
10
+
11
+ class UserMarshal
12
+ attr_reader :data
13
+
14
+ def initialize
15
+ @data = 'stuff'
16
+ end
17
+ def marshal_dump() 'data' end
18
+ def marshal_load(data) @data = data end
19
+ def ==(other) self.class === other and @data == other.data end
20
+ end
21
+
22
+ describe 'Marshal.dump' do
23
+ it 'dumps non-empty Array' do
24
+ expect(Marshal.dump(['a', 1, 2])).to eq("\u0004\b[\b\"\u0006ai\u0006i\a")
25
+ end
26
+
27
+ it 'dumps case-sensitive regexp' do
28
+ expect(Marshal.dump(/\w+/)).to eq("\u0004\b/\b\\w+\u0000")
29
+ end
30
+
31
+ it 'dumps case-insensitive regexp' do
32
+ expect(Marshal.dump(/\w+/i)).to eq("\u0004\b/\b\\w+\u0001")
33
+ end
34
+
35
+ it "dumps a Float" do
36
+ Marshal.dump(123.4567).should == "\004\bf\r123.4567"
37
+ Marshal.dump(-0.841).should == "\x04\bf\v-0.841"
38
+ Marshal.dump(9876.345).should == "\004\bf\r9876.345"
39
+ Marshal.dump(Float::INFINITY).should == "\004\bf\binf"
40
+ Marshal.dump(-Float::INFINITY).should == "\004\bf\t-inf"
41
+ Marshal.dump(Float::NAN).should == "\004\bf\bnan"
42
+ end
43
+
44
+ it "dumps a Integer" do
45
+ Marshal.dump(0).should == "\x04\bi\x00"
46
+ Marshal.dump(123).should == "\x04\bi\x01{"
47
+ Marshal.dump(-123).should == "\x04\bi\x80"
48
+ Marshal.dump(1234567890).should == "\x04\bl+\a\xD2\x02\x96I"
49
+ Marshal.dump(-1234567890).should == "\x04\bl-\a\xD2\x02\x96I"
50
+ end
51
+
52
+ it "dumps a Regexp with flags" do
53
+ Marshal.dump(/\w/im).should == "\x04\b/\a\\w\u0005"
54
+ end
55
+
56
+ it 'dumps an extended Regexp' do
57
+ Marshal.dump(/\w/.extend(MarshalExtension)).should == "\x04\be:\u0015MarshalExtension/\a\\w\u0000"
58
+ end
59
+
60
+ it 'dumps object#marshal_dump when object responds to #marshal_dump' do
61
+ Marshal.dump(UserMarshal.new).should == "\u0004\bU:\u0010UserMarshal\"\tdata"
62
+ end
63
+
64
+ it 'saves a link to an object before processing its instance variables' do
65
+ top = Object.new
66
+ ref = Object.new
67
+ a = Object.new
68
+ b = Object.new
69
+ c = Object.new
70
+
71
+ top.instance_variable_set(:@a, a)
72
+ top.instance_variable_set(:@b, b)
73
+ top.instance_variable_set(:@a, c)
74
+ top.instance_variable_set(:@ref, ref)
75
+
76
+ expected = "\u0004\b[\ao:\vObject\b:\a@ao:\vObject\u0000:\a@bo:\vObject\u0000:\t@refo:\vObject\u0000@\t"
77
+ Marshal.dump([top, ref]).should == expected
78
+ loaded = Marshal.load(expected)
79
+ loaded[0].instance_variable_get(:@ref).object_id.should == loaded[1].object_id
80
+ end
81
+ end
@@ -0,0 +1,13 @@
1
+ describe "Marshal.load" do
2
+ it 'loads array with instance variable' do
3
+ a = Marshal.load("\x04\bI[\bi\x06i\ai\b\x06:\n@ivari\x01{")
4
+ a.should == [1, 2, 3]
5
+ a.instance_variable_get(:@ivar).should == 123
6
+ end
7
+
8
+ it 'loads a hash with a default value (hash_def)' do
9
+ hash = Marshal.load("\x04\b}\x06i\x06i\a:\bdef")
10
+ hash.should == { 1 => 2 }
11
+ hash.default.should == :def
12
+ end
13
+ end
@@ -0,0 +1,27 @@
1
+ module ModuleSubclassIncludedSpec
2
+ class Module1 < ::Module
3
+ def included(_descendant)
4
+ $ScratchPad << 'A included'
5
+ end
6
+ end
7
+
8
+ class Module2 < Module1
9
+ def included(_descendant)
10
+ $ScratchPad << 'B included'
11
+ end
12
+ end
13
+ M0 = Module.new
14
+ M1 = Module1.new
15
+ M2 = Module2.new
16
+ end
17
+
18
+ describe 'Module#included' do
19
+ it 'gets called in subclasses (regression for https://github.com/opal/opal/issues/1900)' do
20
+ $ScratchPad = []
21
+ klass = Class.new
22
+ klass.include ::ModuleSubclassIncludedSpec::M0
23
+ klass.include ::ModuleSubclassIncludedSpec::M1
24
+ klass.include ::ModuleSubclassIncludedSpec::M2
25
+ $ScratchPad.should == ['A included', 'B included']
26
+ end
27
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Opal.uid()" do
4
+ it "returns even sequential numbers in increments of 2" do
5
+ %x{
6
+ var id0 = Opal.uid(),
7
+ id1 = Opal.uid(),
8
+ id2 = Opal.uid(),
9
+ id3 = Opal.uid(),
10
+ id4 = Opal.uid();
11
+ }
12
+
13
+ modulo = `id0` % 2
14
+ modulo.should == 0
15
+
16
+ `id1`.should == `id0` + 2
17
+ `id2`.should == `id0` + 4
18
+ `id3`.should == `id0` + 6
19
+ `id4`.should == `id0` + 8
20
+ end
21
+ end
22
+
23
+ describe "FalseClass#object_id" do
24
+ it "returns 0" do
25
+ false.object_id.should == 0
26
+ end
27
+ end
28
+
29
+ describe "TrueClass#object_id" do
30
+ it "returns 2" do
31
+ true.object_id.should == 2
32
+ end
33
+ end
34
+
35
+ describe "NilClass#object_id" do
36
+ it "returns 4" do
37
+ nil.object_id.should == 4
38
+ end
39
+ end
40
+
41
+ describe "Numeric#object_id" do
42
+ it "returns (self * 2) + 1" do
43
+ 0.object_id.should == 1
44
+ 1.object_id.should == 3
45
+ 2.object_id.should == 5
46
+ 420.object_id.should == 841
47
+ -2.object_id.should == -3
48
+ -1.object_id.should == -1
49
+ end
50
+ end
51
+
52
+ describe "String#object_id" do
53
+ it "returns the primitive string version of self" do
54
+ `#{"hello".object_id} === "hello".toString()`.should be_true
55
+ end
56
+ end
@@ -0,0 +1,40 @@
1
+ describe 'Regexp interpolation' do
2
+ it 'can interpolate other regexps' do
3
+ a = /a/
4
+
5
+ /#{a}/.should =~ 'aaa'
6
+ /a+/.should =~ 'aaa'
7
+ /#{a}+/.should =~ 'aaa'
8
+ /aa/.should =~ 'aaa'
9
+ /#{a}a/.should =~ 'aaa'
10
+ end
11
+
12
+ it 'can interpolate objects' do
13
+ a = Object.new
14
+ def a.to_s; 'a'; end
15
+
16
+ /#{a}/.should =~ 'aaa'
17
+ /a+/.should =~ 'aaa'
18
+ /#{a}+/.should =~ 'aaa'
19
+ /aa/.should =~ 'aaa'
20
+ /#{a}a/.should =~ 'aaa'
21
+ end
22
+
23
+ it 'can interpolate strings' do
24
+ a = 'a'
25
+
26
+ /#{a}/.should =~ 'aaa'
27
+ /a+/.should =~ 'aaa'
28
+ /#{a}+/.should =~ 'aaa'
29
+ /aa/.should =~ 'aaa'
30
+ /#{a}a/.should =~ 'aaa'
31
+ end
32
+
33
+ it 'can interpolate string literals' do
34
+ /#{'a'}/.should =~ 'aaa'
35
+ /a+/.should =~ 'aaa'
36
+ /#{'a'}+/.should =~ 'aaa'
37
+ /aa/.should =~ 'aaa'
38
+ /#{'a'}a/.should =~ 'aaa'
39
+ end
40
+ end
@@ -0,0 +1,78 @@
1
+ describe 'Regexp#match' do
2
+ describe 'when pos is not specified' do
3
+ it 'calls .exec only once on the current object' do
4
+ regexp = /test/
5
+ calls = 0
6
+ %x(
7
+ regexp._exec = regexp.exec;
8
+ regexp.exec = function(str) {
9
+ var match = this._exec(str);
10
+ calls++;
11
+ return match;
12
+ }
13
+ )
14
+ result = regexp.match('test test')
15
+ calls.should == 1
16
+ result.begin(0).should == 0
17
+ result[0].should == 'test'
18
+ end
19
+ end
20
+
21
+ describe 'when pos is specified' do
22
+ it 'does not call .exec on the current object' do
23
+ regexp = /test/
24
+ calls = 0
25
+ %x(
26
+ regexp._exec = regexp.exec;
27
+ regexp.exec = function(str) {
28
+ var match = this._exec(str);
29
+ calls++;
30
+ return match;
31
+ }
32
+ )
33
+ result = regexp.match('test test', 1)
34
+ calls.should == 0
35
+ result[0].should == 'test'
36
+ result.begin(0).should == 5
37
+ end
38
+ end
39
+ end
40
+
41
+ describe 'Regexp#match?' do
42
+ describe 'when pos is not specified' do
43
+ it 'calls .test on the current object' do
44
+ regexp = /test/
45
+ calls = 0
46
+ %x(
47
+ regexp._test = regexp.test;
48
+ regexp.test = function(str) {
49
+ var verdict = this._test(str);
50
+ calls++;
51
+ return verdict;
52
+ }
53
+ )
54
+ result = regexp.match?('test test')
55
+ calls.should == 1
56
+ result.should == true
57
+ end
58
+ end
59
+
60
+ describe 'when pos is specified' do
61
+ it 'does not call .test on the current object' do
62
+ regexp = /test/
63
+ calls = 0
64
+ %x(
65
+ regexp._test = regexp.test;
66
+ regexp.test = function(str) {
67
+ var verdict = this._test(str);
68
+ calls++;
69
+ return verdict;
70
+ }
71
+ )
72
+ result = regexp.match?('test test', 1)
73
+ calls.should == 0
74
+ # FIXME pos is not yet supported by Opal's Regexp#match?
75
+ #result.should == true
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,123 @@
1
+ require 'spec_helper'
2
+
3
+ %x{
4
+ var bridge_class_demo = function(){};
5
+ bridge_class_demo.prototype.$foo = function() { return "bar" };
6
+ }
7
+ class TopBridgedClassDemo < `bridge_class_demo`
8
+ def some_bridged_method
9
+ [1, 2, 3]
10
+ end
11
+
12
+ def method_missing(name, *args, &block)
13
+ return :catched if name == :catched_by_method_missing
14
+ super
15
+ end
16
+ end
17
+
18
+ describe "Bridged Classes" do
19
+ describe "Passing native constructor to class keyword" do
20
+ before do
21
+ @bridged = ::TopBridgedClassDemo
22
+ @instance = `new bridge_class_demo()`
23
+ end
24
+
25
+ it "should expose the given class at the top level scope" do
26
+ @bridged.should be_kind_of(Class)
27
+ end
28
+
29
+ it "gives the class the correct name" do
30
+ @bridged.name.should == "TopBridgedClassDemo"
31
+ end
32
+
33
+ it "should have all BasicObject methods defined" do
34
+ @instance.should respond_to(:instance_eval)
35
+ @bridged.new.should respond_to(:==)
36
+ end
37
+
38
+ it "should have all Object methods defined" do
39
+ @instance.should respond_to(:class)
40
+ @bridged.new.should respond_to(:singleton_class)
41
+ end
42
+
43
+ it "instances of class should be able to call native ruby methods" do
44
+ @instance.foo.should == "bar"
45
+ @bridged.new.foo.should == "bar"
46
+ end
47
+
48
+ it "allows new methods to be defined on the bridged prototype" do
49
+ @instance.some_bridged_method.should == [1, 2, 3]
50
+ @bridged.new.some_bridged_method.should == [1, 2, 3]
51
+ end
52
+ end
53
+
54
+ describe ".instance_methdods" do
55
+ it "should report methods for class" do
56
+ Array.instance_methods(false).should include(:shift)
57
+ end
58
+
59
+ it "should not include methods donated from Object/Kernel" do
60
+ Array.instance_methods(false).should_not include(:class)
61
+ end
62
+
63
+ it "should not include methods donated from BasicObject" do
64
+ Array.instance_methods(false).should_not include(:__send__)
65
+ Array.instance_methods(false).should_not include(:send)
66
+ end
67
+ end
68
+
69
+ describe '#method_missing' do
70
+ it 'works' do
71
+ lambda { @instance.not_catched_by_method_missing }.should raise_error(NoMethodError)
72
+ @instance.catched_by_method_missing.should == :catched
73
+ end
74
+ end
75
+ end
76
+
77
+ class ModularizedBridgeClass
78
+ def something
79
+ 'different module'
80
+ end
81
+ end
82
+
83
+ %x{
84
+ var bridge_class_demo_module = function(){};
85
+ bridge_class_demo_module.prototype.$foo = function() { return "foobar" };
86
+ }
87
+
88
+ module BridgeModule
89
+ class ModularizedBridgeClass < `bridge_class_demo_module`
90
+ def some_bridged_method
91
+ [4, 5, 6]
92
+ end
93
+ end
94
+ end
95
+
96
+ describe 'Bridged classes in different modules' do
97
+ before do
98
+ @bridged = BridgeModule::ModularizedBridgeClass
99
+ @instance = `new bridge_class_demo_module()`
100
+ end
101
+
102
+ it "should expose the given class not at the top level scope" do
103
+ @bridged.should be_kind_of(Class)
104
+ end
105
+
106
+ it 'should not disturb an existing class at the top level scope' do
107
+ ModularizedBridgeClass.new.something.should == 'different module'
108
+ end
109
+
110
+ it "gives the class the correct name" do
111
+ @bridged.name.should == "BridgeModule::ModularizedBridgeClass"
112
+ end
113
+
114
+ it "instances of class should be able to call native ruby methods" do
115
+ @instance.foo.should == "foobar"
116
+ @bridged.new.foo.should == "foobar"
117
+ end
118
+
119
+ it "allows new methods to be defined on the bridged prototype" do
120
+ @instance.some_bridged_method.should == [4, 5, 6]
121
+ @bridged.new.some_bridged_method.should == [4, 5, 6]
122
+ end
123
+ end