opal-cj 0.7.0.beta1

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 (470) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.gitmodules +27 -0
  4. data/.rspec +3 -0
  5. data/.spectator +2 -0
  6. data/.spectator-mspec +3 -0
  7. data/.travis.yml +45 -0
  8. data/CHANGELOG.md +406 -0
  9. data/CONTRIBUTING.md +41 -0
  10. data/Gemfile +27 -0
  11. data/Guardfile +77 -0
  12. data/LICENSE +19 -0
  13. data/README.md +178 -0
  14. data/Rakefile +116 -0
  15. data/benchmarks/operators.rb +11 -0
  16. data/bin/opal +22 -0
  17. data/bin/opal-build +77 -0
  18. data/bin/opal-mspec +10 -0
  19. data/bin/opal-repl +72 -0
  20. data/config.ru +14 -0
  21. data/examples/rack/Gemfile +3 -0
  22. data/examples/rack/app/application.rb +13 -0
  23. data/examples/rack/app/user.rb +21 -0
  24. data/examples/rack/config.ru +7 -0
  25. data/examples/rack/index.html.erb +10 -0
  26. data/examples/sinatra/Gemfile +4 -0
  27. data/examples/sinatra/app/application.rb +7 -0
  28. data/examples/sinatra/config.ru +28 -0
  29. data/lib/mspec/opal/main.rb.erb +9 -0
  30. data/lib/mspec/opal/rake_task.rb +278 -0
  31. data/lib/mspec/opal/runner.rb +206 -0
  32. data/lib/mspec/opal/sprockets.js +57 -0
  33. data/lib/opal.rb +11 -0
  34. data/lib/opal/builder.rb +135 -0
  35. data/lib/opal/builder_processors.rb +165 -0
  36. data/lib/opal/cli.rb +145 -0
  37. data/lib/opal/cli_options.rb +149 -0
  38. data/lib/opal/cli_runners.rb +10 -0
  39. data/lib/opal/cli_runners/nodejs.rb +56 -0
  40. data/lib/opal/cli_runners/phantom.js +35 -0
  41. data/lib/opal/cli_runners/phantomjs.rb +28 -0
  42. data/lib/opal/cli_runners/server.rb +54 -0
  43. data/lib/opal/compiler.rb +307 -0
  44. data/lib/opal/erb.rb +64 -0
  45. data/lib/opal/fragment.rb +41 -0
  46. data/lib/opal/hike_path_finder.rb +18 -0
  47. data/lib/opal/nodes.rb +26 -0
  48. data/lib/opal/nodes/arglist.rb +56 -0
  49. data/lib/opal/nodes/array.rb +54 -0
  50. data/lib/opal/nodes/base.rb +151 -0
  51. data/lib/opal/nodes/call.rb +283 -0
  52. data/lib/opal/nodes/call_special.rb +178 -0
  53. data/lib/opal/nodes/case.rb +96 -0
  54. data/lib/opal/nodes/class.rb +42 -0
  55. data/lib/opal/nodes/constants.rb +78 -0
  56. data/lib/opal/nodes/def.rb +157 -0
  57. data/lib/opal/nodes/defined.rb +113 -0
  58. data/lib/opal/nodes/definitions.rb +168 -0
  59. data/lib/opal/nodes/for.rb +35 -0
  60. data/lib/opal/nodes/hash.rb +67 -0
  61. data/lib/opal/nodes/helpers.rb +114 -0
  62. data/lib/opal/nodes/if.rb +67 -0
  63. data/lib/opal/nodes/iter.rb +131 -0
  64. data/lib/opal/nodes/literal.rb +230 -0
  65. data/lib/opal/nodes/logic.rb +217 -0
  66. data/lib/opal/nodes/masgn.rb +62 -0
  67. data/lib/opal/nodes/module.rb +46 -0
  68. data/lib/opal/nodes/rescue.rb +135 -0
  69. data/lib/opal/nodes/runtime_helpers.rb +45 -0
  70. data/lib/opal/nodes/scope.rb +293 -0
  71. data/lib/opal/nodes/singleton_class.rb +25 -0
  72. data/lib/opal/nodes/super.rb +97 -0
  73. data/lib/opal/nodes/top.rb +101 -0
  74. data/lib/opal/nodes/variables.rb +158 -0
  75. data/lib/opal/nodes/while.rb +65 -0
  76. data/lib/opal/nodes/yield.rb +95 -0
  77. data/lib/opal/parser.rb +658 -0
  78. data/lib/opal/parser/grammar.rb +5452 -0
  79. data/lib/opal/parser/grammar.y +1684 -0
  80. data/lib/opal/parser/keywords.rb +66 -0
  81. data/lib/opal/parser/lexer.rb +1208 -0
  82. data/lib/opal/parser/parser_scope.rb +25 -0
  83. data/lib/opal/parser/sexp.rb +75 -0
  84. data/lib/opal/path_reader.rb +28 -0
  85. data/lib/opal/paths.rb +38 -0
  86. data/lib/opal/source_map.rb +70 -0
  87. data/lib/opal/sprockets.rb +4 -0
  88. data/lib/opal/sprockets/cache_key_fix.rb +17 -0
  89. data/lib/opal/sprockets/environment.rb +37 -0
  90. data/lib/opal/sprockets/erb.rb +37 -0
  91. data/lib/opal/sprockets/path_reader.rb +34 -0
  92. data/lib/opal/sprockets/processor.rb +124 -0
  93. data/lib/opal/sprockets/server.rb +180 -0
  94. data/lib/opal/util.rb +64 -0
  95. data/lib/opal/version.rb +3 -0
  96. data/opal.gemspec +36 -0
  97. data/opal/README.md +6 -0
  98. data/opal/corelib/array.rb +1556 -0
  99. data/opal/corelib/array/inheritance.rb +113 -0
  100. data/opal/corelib/basic_object.rb +73 -0
  101. data/opal/corelib/boolean.rb +41 -0
  102. data/opal/corelib/class.rb +55 -0
  103. data/opal/corelib/comparable.rb +56 -0
  104. data/opal/corelib/complex.rb +3 -0
  105. data/opal/corelib/dir.rb +20 -0
  106. data/opal/corelib/enumerable.rb +1132 -0
  107. data/opal/corelib/enumerator.rb +422 -0
  108. data/opal/corelib/error.rb +63 -0
  109. data/opal/corelib/file.rb +56 -0
  110. data/opal/corelib/hash.rb +728 -0
  111. data/opal/corelib/helpers.rb +102 -0
  112. data/opal/corelib/io.rb +59 -0
  113. data/opal/corelib/kernel.rb +569 -0
  114. data/opal/corelib/main.rb +7 -0
  115. data/opal/corelib/match_data.rb +114 -0
  116. data/opal/corelib/method.rb +58 -0
  117. data/opal/corelib/module.rb +462 -0
  118. data/opal/corelib/nil_class.rb +62 -0
  119. data/opal/corelib/numeric.rb +532 -0
  120. data/opal/corelib/proc.rb +52 -0
  121. data/opal/corelib/range.rb +116 -0
  122. data/opal/corelib/rational.rb +3 -0
  123. data/opal/corelib/regexp.rb +133 -0
  124. data/opal/corelib/runtime.js +1240 -0
  125. data/opal/corelib/string.rb +1212 -0
  126. data/opal/corelib/string/inheritance.rb +78 -0
  127. data/opal/corelib/struct.rb +141 -0
  128. data/opal/corelib/time.rb +584 -0
  129. data/opal/corelib/variables.rb +24 -0
  130. data/opal/opal.rb +32 -0
  131. data/package.json +9 -0
  132. data/spec/filters/bugs/array.rb +232 -0
  133. data/spec/filters/bugs/basic_object.rb +14 -0
  134. data/spec/filters/bugs/class.rb +21 -0
  135. data/spec/filters/bugs/enumerable.rb +69 -0
  136. data/spec/filters/bugs/enumerator.rb +3 -0
  137. data/spec/filters/bugs/hash.rb +128 -0
  138. data/spec/filters/bugs/kernel.rb +10 -0
  139. data/spec/filters/bugs/language.rb +415 -0
  140. data/spec/filters/bugs/math.rb +95 -0
  141. data/spec/filters/bugs/module.rb +14 -0
  142. data/spec/filters/bugs/nil.rb +7 -0
  143. data/spec/filters/bugs/numeric.rb +20 -0
  144. data/spec/filters/bugs/opal.rb +14 -0
  145. data/spec/filters/bugs/regexp.rb +11 -0
  146. data/spec/filters/bugs/set.rb +7 -0
  147. data/spec/filters/bugs/singleton.rb +6 -0
  148. data/spec/filters/bugs/string.rb +360 -0
  149. data/spec/filters/bugs/stringscanner.rb +22 -0
  150. data/spec/filters/bugs/struct.rb +45 -0
  151. data/spec/filters/bugs/time.rb +177 -0
  152. data/spec/filters/bugs/unknown.rb +11 -0
  153. data/spec/filters/unsupported/encoding.rb +95 -0
  154. data/spec/filters/unsupported/enumerator.rb +14 -0
  155. data/spec/filters/unsupported/float.rb +5 -0
  156. data/spec/filters/unsupported/frozen.rb +90 -0
  157. data/spec/filters/unsupported/hash_compare_by_identity.rb +16 -0
  158. data/spec/filters/unsupported/integer_size.rb +7 -0
  159. data/spec/filters/unsupported/method_added.rb +10 -0
  160. data/spec/filters/unsupported/mutable_strings.rb +361 -0
  161. data/spec/filters/unsupported/private_constants.rb +30 -0
  162. data/spec/filters/unsupported/private_methods.rb +44 -0
  163. data/spec/filters/unsupported/random.rb +4 -0
  164. data/spec/filters/unsupported/ruby_exe.rb +5 -0
  165. data/spec/filters/unsupported/tainted.rb +155 -0
  166. data/spec/filters/unsupported/time.rb +21 -0
  167. data/spec/filters/unsupported/trusted.rb +80 -0
  168. data/spec/lib/builder_processors_spec.rb +27 -0
  169. data/spec/lib/builder_spec.rb +66 -0
  170. data/spec/lib/cli_spec.rb +134 -0
  171. data/spec/lib/compiler_spec.rb +197 -0
  172. data/spec/lib/dependency_resolver_spec.rb +40 -0
  173. data/spec/lib/fixtures/no_requires.rb +1 -0
  174. data/spec/lib/fixtures/opal_file.rb +2 -0
  175. data/spec/lib/fixtures/require_tree_test.rb +3 -0
  176. data/spec/lib/fixtures/required_tree_test/required_file1.rb +1 -0
  177. data/spec/lib/fixtures/required_tree_test/required_file2.rb +1 -0
  178. data/spec/lib/fixtures/requires.rb +7 -0
  179. data/spec/lib/fixtures/sprockets_file.js.rb +3 -0
  180. data/spec/lib/fixtures/sprockets_require_tree_test.rb +3 -0
  181. data/spec/lib/hike_path_finder_spec.rb +23 -0
  182. data/spec/lib/lexer_spec.rb +110 -0
  183. data/spec/lib/parser/alias_spec.rb +26 -0
  184. data/spec/lib/parser/and_spec.rb +13 -0
  185. data/spec/lib/parser/attrasgn_spec.rb +28 -0
  186. data/spec/lib/parser/begin_spec.rb +42 -0
  187. data/spec/lib/parser/block_spec.rb +12 -0
  188. data/spec/lib/parser/break_spec.rb +17 -0
  189. data/spec/lib/parser/call_spec.rb +139 -0
  190. data/spec/lib/parser/class_spec.rb +35 -0
  191. data/spec/lib/parser/comments_spec.rb +11 -0
  192. data/spec/lib/parser/def_spec.rb +61 -0
  193. data/spec/lib/parser/if_spec.rb +26 -0
  194. data/spec/lib/parser/iter_spec.rb +59 -0
  195. data/spec/lib/parser/lambda_spec.rb +64 -0
  196. data/spec/lib/parser/literal_spec.rb +118 -0
  197. data/spec/lib/parser/masgn_spec.rb +37 -0
  198. data/spec/lib/parser/module_spec.rb +27 -0
  199. data/spec/lib/parser/not_spec.rb +27 -0
  200. data/spec/lib/parser/op_asgn1_spec.rb +23 -0
  201. data/spec/lib/parser/op_asgn2_spec.rb +23 -0
  202. data/spec/lib/parser/or_spec.rb +13 -0
  203. data/spec/lib/parser/return_spec.rb +17 -0
  204. data/spec/lib/parser/sclass_spec.rb +21 -0
  205. data/spec/lib/parser/string_spec.rb +276 -0
  206. data/spec/lib/parser/super_spec.rb +20 -0
  207. data/spec/lib/parser/unary_spec.rb +48 -0
  208. data/spec/lib/parser/undef_spec.rb +15 -0
  209. data/spec/lib/parser/unless_spec.rb +13 -0
  210. data/spec/lib/parser/variables_spec.rb +92 -0
  211. data/spec/lib/parser/while_spec.rb +15 -0
  212. data/spec/lib/parser/yield_spec.rb +20 -0
  213. data/spec/lib/path_reader_spec.rb +24 -0
  214. data/spec/lib/shared/path_finder_shared.rb +19 -0
  215. data/spec/lib/shared/path_reader_shared.rb +31 -0
  216. data/spec/lib/spec_helper.rb +9 -0
  217. data/spec/lib/sprockets/environment_spec.rb +30 -0
  218. data/spec/lib/sprockets/erb_spec.rb +25 -0
  219. data/spec/lib/sprockets/path_reader_spec.rb +25 -0
  220. data/spec/lib/sprockets/processor_spec.rb +35 -0
  221. data/spec/lib/sprockets/server_spec.rb +20 -0
  222. data/spec/opal/compiler/irb_spec.rb +44 -0
  223. data/spec/opal/core/array/select_spec.rb +14 -0
  224. data/spec/opal/core/array/set_range_to_array_spec.rb +7 -0
  225. data/spec/opal/core/date_spec.rb +122 -0
  226. data/spec/opal/core/enumerable/all_break_spec.rb +5 -0
  227. data/spec/opal/core/enumerable/any_break_spec.rb +5 -0
  228. data/spec/opal/core/enumerable/collect_break_spec.rb +13 -0
  229. data/spec/opal/core/enumerable/count_break_spec.rb +5 -0
  230. data/spec/opal/core/enumerable/detect_break_spec.rb +5 -0
  231. data/spec/opal/core/enumerable/drop_while_break_spec.rb +5 -0
  232. data/spec/opal/core/enumerable/each_slice_break.rb +6 -0
  233. data/spec/opal/core/enumerable/each_with_index_break_spec.rb +5 -0
  234. data/spec/opal/core/enumerable/each_with_object_break_spec.rb +5 -0
  235. data/spec/opal/core/enumerable/find_all_break_spec.rb +5 -0
  236. data/spec/opal/core/enumerable/find_index_break_spec.rb +5 -0
  237. data/spec/opal/core/enumerable/grep_break_spec.rb +5 -0
  238. data/spec/opal/core/enumerable/max_break_spec.rb +5 -0
  239. data/spec/opal/core/enumerable/max_by_break_spec.rb +5 -0
  240. data/spec/opal/core/enumerable/min_break_spec.rb +5 -0
  241. data/spec/opal/core/enumerable/min_by_break_spec.rb +5 -0
  242. data/spec/opal/core/enumerable/none_break_spec.rb +5 -0
  243. data/spec/opal/core/enumerable/one_break_spec.rb +5 -0
  244. data/spec/opal/core/enumerable/reduce_break_spec.rb +5 -0
  245. data/spec/opal/core/enumerable/take_while_break_spec.rb +5 -0
  246. data/spec/opal/core/fixtures/class.rb +124 -0
  247. data/spec/opal/core/fixtures/class_variables.rb +0 -0
  248. data/spec/opal/core/fixtures/constants.rb +33 -0
  249. data/spec/opal/core/fixtures/require_tree_files/file 1.rb +1 -0
  250. data/spec/opal/core/fixtures/require_tree_files/file 2.rb +1 -0
  251. data/spec/opal/core/fixtures/require_tree_files/file 3.rb +1 -0
  252. data/spec/opal/core/fixtures/require_tree_files/file 4.rb +1 -0
  253. data/spec/opal/core/fixtures/require_tree_files/file 5.rb +1 -0
  254. data/spec/opal/core/kernel/Array_spec.rb +10 -0
  255. data/spec/opal/core/kernel/block_given_spec.rb +30 -0
  256. data/spec/opal/core/kernel/class_spec.rb +6 -0
  257. data/spec/opal/core/kernel/define_singleton_method_spec.rb +21 -0
  258. data/spec/opal/core/kernel/equal_value_spec.rb +12 -0
  259. data/spec/opal/core/kernel/extend_spec.rb +21 -0
  260. data/spec/opal/core/kernel/format_spec.rb +122 -0
  261. data/spec/opal/core/kernel/freeze_spec.rb +15 -0
  262. data/spec/opal/core/kernel/instance_eval_spec.rb +28 -0
  263. data/spec/opal/core/kernel/instance_variable_defined_spec.rb +15 -0
  264. data/spec/opal/core/kernel/instance_variable_get_spec.rb +14 -0
  265. data/spec/opal/core/kernel/instance_variable_set_spec.rb +10 -0
  266. data/spec/opal/core/kernel/loop_spec.rb +23 -0
  267. data/spec/opal/core/kernel/match_spec.rb +5 -0
  268. data/spec/opal/core/kernel/method_spec.rb +31 -0
  269. data/spec/opal/core/kernel/methods_spec.rb +25 -0
  270. data/spec/opal/core/kernel/nil_spec.rb +7 -0
  271. data/spec/opal/core/kernel/p_spec.rb +15 -0
  272. data/spec/opal/core/kernel/printf_spec.rb +11 -0
  273. data/spec/opal/core/kernel/proc_spec.rb +13 -0
  274. data/spec/opal/core/kernel/rand_spec.rb +23 -0
  275. data/spec/opal/core/kernel/require_tree_spec.rb +7 -0
  276. data/spec/opal/core/kernel/respond_to_spec.rb +41 -0
  277. data/spec/opal/core/kernel/send_spec.rb +56 -0
  278. data/spec/opal/core/kernel/sprintf_spec.rb +5 -0
  279. data/spec/opal/core/language/block_spec.rb +538 -0
  280. data/spec/opal/core/language/fixtures/array.rb +11 -0
  281. data/spec/opal/core/language/fixtures/block.rb +57 -0
  282. data/spec/opal/core/language/fixtures/break.rb +240 -0
  283. data/spec/opal/core/language/fixtures/ensure.rb +72 -0
  284. data/spec/opal/core/language/fixtures/literal_lambda.rb +7 -0
  285. data/spec/opal/core/language/fixtures/metaclass.rb +33 -0
  286. data/spec/opal/core/language/fixtures/module.rb +24 -0
  287. data/spec/opal/core/language/fixtures/next.rb +128 -0
  288. data/spec/opal/core/language/fixtures/return.rb +118 -0
  289. data/spec/opal/core/language/fixtures/send.rb +110 -0
  290. data/spec/opal/core/language/fixtures/send_1.9.rb +22 -0
  291. data/spec/opal/core/language/fixtures/super.rb +308 -0
  292. data/spec/opal/core/language/fixtures/variables.rb +58 -0
  293. data/spec/opal/core/language/fixtures/yield.rb +28 -0
  294. data/spec/opal/core/language/predefined_spec.rb +85 -0
  295. data/spec/opal/core/language/proc_spec.rb +263 -0
  296. data/spec/opal/core/language/regexp_spec.rb +20 -0
  297. data/spec/opal/core/language/send_spec.rb +225 -0
  298. data/spec/opal/core/language/string_spec.rb +44 -0
  299. data/spec/opal/core/language/symbol_spec.rb +40 -0
  300. data/spec/opal/core/language/variables_spec.rb +1366 -0
  301. data/spec/opal/core/language/versions/array_1.9.rb +39 -0
  302. data/spec/opal/core/language/versions/block_1.9.rb +0 -0
  303. data/spec/opal/core/language/versions/break_1.9.rb +0 -0
  304. data/spec/opal/core/language/versions/case_1.9.rb +20 -0
  305. data/spec/opal/core/language/versions/hash_1.9.rb +18 -0
  306. data/spec/opal/core/language/versions/literal_lambda_1.9.rb +143 -0
  307. data/spec/opal/core/language/versions/not_1.9.rb +22 -0
  308. data/spec/opal/core/language/versions/send_1.9.rb +241 -0
  309. data/spec/opal/core/language/versions/symbol_1.9.rb +15 -0
  310. data/spec/opal/core/language/versions/variables_1.9.rb +8 -0
  311. data/spec/opal/core/module/alias_method_spec.rb +28 -0
  312. data/spec/opal/core/module/ancestors_spec.rb +11 -0
  313. data/spec/opal/core/module/append_features_spec.rb +14 -0
  314. data/spec/opal/core/module/attr_accessor_spec.rb +26 -0
  315. data/spec/opal/core/module/const_defined_spec.rb +85 -0
  316. data/spec/opal/core/module/const_get_spec.rb +85 -0
  317. data/spec/opal/core/module/const_missing_spec.rb +17 -0
  318. data/spec/opal/core/module/const_set_spec.rb +64 -0
  319. data/spec/opal/core/module/constants_spec.rb +49 -0
  320. data/spec/opal/core/module/fixtures/classes.rb +434 -0
  321. data/spec/opal/core/module/method_defined_spec.rb +48 -0
  322. data/spec/opal/core/module/module_function_spec.rb +25 -0
  323. data/spec/opal/core/module/name_spec.rb +52 -0
  324. data/spec/opal/core/module/public_method_defined_spec.rb +18 -0
  325. data/spec/opal/core/module/remove_const_spec.rb +22 -0
  326. data/spec/opal/core/module/undef_method_spec.rb +66 -0
  327. data/spec/opal/core/numeric/bit_and_spec.rb +7 -0
  328. data/spec/opal/core/numeric/bit_or_spec.rb +8 -0
  329. data/spec/opal/core/numeric/bit_xor_spec.rb +6 -0
  330. data/spec/opal/core/numeric/ceil_spec.rb +8 -0
  331. data/spec/opal/core/numeric/chr_spec.rb +8 -0
  332. data/spec/opal/core/numeric/comparison_spec.rb +24 -0
  333. data/spec/opal/core/numeric/complement_spec.rb +8 -0
  334. data/spec/opal/core/numeric/divide_spec.rb +10 -0
  335. data/spec/opal/core/numeric/eql_spec.rb +9 -0
  336. data/spec/opal/core/numeric/exponent_spec.rb +33 -0
  337. data/spec/opal/core/numeric/floor_spec.rb +8 -0
  338. data/spec/opal/core/numeric/gt_spec.rb +11 -0
  339. data/spec/opal/core/numeric/gte_spec.rb +12 -0
  340. data/spec/opal/core/numeric/integer_spec.rb +9 -0
  341. data/spec/opal/core/numeric/left_shift_spec.rb +21 -0
  342. data/spec/opal/core/numeric/lt_spec.rb +11 -0
  343. data/spec/opal/core/numeric/lte_spec.rb +12 -0
  344. data/spec/opal/core/numeric/minus_spec.rb +8 -0
  345. data/spec/opal/core/numeric/modulo_spec.rb +19 -0
  346. data/spec/opal/core/numeric/multiply_spec.rb +9 -0
  347. data/spec/opal/core/numeric/next_spec.rb +9 -0
  348. data/spec/opal/core/numeric/ord_spec.rb +9 -0
  349. data/spec/opal/core/numeric/plus_spec.rb +8 -0
  350. data/spec/opal/core/numeric/pred_spec.rb +7 -0
  351. data/spec/opal/core/numeric/right_shift_spec.rb +25 -0
  352. data/spec/opal/core/numeric/step_spec.rb +11 -0
  353. data/spec/opal/core/numeric/succ_spec.rb +9 -0
  354. data/spec/opal/core/numeric/times_spec.rb +36 -0
  355. data/spec/opal/core/numeric/to_f_spec.rb +7 -0
  356. data/spec/opal/core/numeric/to_i_spec.rb +7 -0
  357. data/spec/opal/core/numeric/to_json_spec.rb +8 -0
  358. data/spec/opal/core/numeric/to_s_spec.rb +26 -0
  359. data/spec/opal/core/numeric/uminus_spec.rb +9 -0
  360. data/spec/opal/core/numeric/upto_spec.rb +19 -0
  361. data/spec/opal/core/numeric/zero_spec.rb +7 -0
  362. data/spec/opal/core/proc/call_spec.rb +21 -0
  363. data/spec/opal/core/proc/element_reference_spec.rb +21 -0
  364. data/spec/opal/core/proc/proc_tricks_spec.rb +7 -0
  365. data/spec/opal/core/runtime/begin_spec.rb +39 -0
  366. data/spec/opal/core/runtime/block_send_spec.rb +28 -0
  367. data/spec/opal/core/runtime/block_spec.rb +23 -0
  368. data/spec/opal/core/runtime/bridged_classes_spec.rb +64 -0
  369. data/spec/opal/core/runtime/constants_spec.rb +13 -0
  370. data/spec/opal/core/runtime/eval_spec.rb +5 -0
  371. data/spec/opal/core/runtime/main_methods_spec.rb +27 -0
  372. data/spec/opal/core/runtime/method_missing_spec.rb +62 -0
  373. data/spec/opal/core/runtime/method_spec.rb +31 -0
  374. data/spec/opal/core/runtime/operator_call_spec.rb +13 -0
  375. data/spec/opal/core/runtime/paren_spec.rb +14 -0
  376. data/spec/opal/core/runtime/rescue_spec.rb +38 -0
  377. data/spec/opal/core/runtime/return_spec.rb +38 -0
  378. data/spec/opal/core/runtime/send_spec.rb +34 -0
  379. data/spec/opal/core/runtime/singleton_class_spec.rb +13 -0
  380. data/spec/opal/core/runtime/super_spec.rb +212 -0
  381. data/spec/opal/core/runtime/truthy_spec.rb +23 -0
  382. data/spec/opal/core/runtime/variables_spec.rb +20 -0
  383. data/spec/opal/core/source_map_spec.rb +15 -0
  384. data/spec/opal/core/string_spec.rb +11 -0
  385. data/spec/opal/stdlib/erb/erb_spec.rb +30 -0
  386. data/spec/opal/stdlib/erb/inline_block.opalerb +3 -0
  387. data/spec/opal/stdlib/erb/quoted.opalerb +1 -0
  388. data/spec/opal/stdlib/erb/simple.opalerb +1 -0
  389. data/spec/opal/stdlib/json/ext_spec.rb +48 -0
  390. data/spec/opal/stdlib/json/parse_spec.rb +33 -0
  391. data/spec/opal/stdlib/native/alias_native_spec.rb +27 -0
  392. data/spec/opal/stdlib/native/each_spec.rb +13 -0
  393. data/spec/opal/stdlib/native/element_reference_spec.rb +16 -0
  394. data/spec/opal/stdlib/native/exposure_spec.rb +33 -0
  395. data/spec/opal/stdlib/native/ext_spec.rb +19 -0
  396. data/spec/opal/stdlib/native/initialize_spec.rb +17 -0
  397. data/spec/opal/stdlib/native/method_missing_spec.rb +51 -0
  398. data/spec/opal/stdlib/native/native_reader_spec.rb +22 -0
  399. data/spec/opal/stdlib/native/native_writer_spec.rb +30 -0
  400. data/spec/opal/stdlib/native/new_spec.rb +8 -0
  401. data/spec/opal/stdlib/promise/error_spec.rb +15 -0
  402. data/spec/opal/stdlib/promise/rescue_spec.rb +35 -0
  403. data/spec/opal/stdlib/promise/then_spec.rb +54 -0
  404. data/spec/opal/stdlib/promise/trace_spec.rb +35 -0
  405. data/spec/opal/stdlib/promise/value_spec.rb +15 -0
  406. data/spec/opal/stdlib/promise/when_spec.rb +34 -0
  407. data/spec/opal/stdlib/template/paths_spec.rb +10 -0
  408. data/spec/opal/stdlib/thread/mutex_spec.rb +40 -0
  409. data/spec/opal/stdlib/thread/thread_queue_spec.rb +32 -0
  410. data/spec/opal/stdlib/thread/thread_spec.rb +60 -0
  411. data/spec/rubyspecs +329 -0
  412. data/spec/spec_helper.rb +42 -0
  413. data/spec/support/mspec_rspec_adapter.rb +33 -0
  414. data/spec/support/parser_helpers.rb +37 -0
  415. data/stdlib/README.md +3 -0
  416. data/stdlib/base64.rb +152 -0
  417. data/stdlib/benchmark.rb +10 -0
  418. data/stdlib/buffer.rb +40 -0
  419. data/stdlib/buffer/array.rb +66 -0
  420. data/stdlib/buffer/view.rb +70 -0
  421. data/stdlib/date.rb +170 -0
  422. data/stdlib/delegate.rb +29 -0
  423. data/stdlib/dir.rb +1 -0
  424. data/stdlib/encoding.rb +166 -0
  425. data/stdlib/enumerator.rb +1 -0
  426. data/stdlib/erb.rb +16 -0
  427. data/stdlib/file.rb +1 -0
  428. data/stdlib/forwardable.rb +71 -0
  429. data/stdlib/json.rb +182 -0
  430. data/stdlib/math.rb +370 -0
  431. data/stdlib/native.rb +530 -0
  432. data/stdlib/nodejs.rb +5 -0
  433. data/stdlib/nodejs/dir.rb +13 -0
  434. data/stdlib/nodejs/file.rb +98 -0
  435. data/stdlib/nodejs/fileutils.rb +26 -0
  436. data/stdlib/nodejs/io.rb +2 -0
  437. data/stdlib/nodejs/irb.rb +45 -0
  438. data/stdlib/nodejs/process.rb +16 -0
  439. data/stdlib/nodejs/require.rb +32 -0
  440. data/stdlib/nodejs/rubygems.rb +68 -0
  441. data/stdlib/nodejs/runtime.rb +25 -0
  442. data/stdlib/nodejs/yaml.rb +11 -0
  443. data/stdlib/observer.rb +202 -0
  444. data/stdlib/opal-parser.rb +53 -0
  445. data/stdlib/opal-source-maps.rb +2 -0
  446. data/stdlib/ostruct.rb +69 -0
  447. data/stdlib/pathname.rb +31 -0
  448. data/stdlib/phantomjs.rb +8 -0
  449. data/stdlib/pp.rb +12 -0
  450. data/stdlib/process.rb +10 -0
  451. data/stdlib/promise.rb +300 -0
  452. data/stdlib/racc/parser.rb +215 -0
  453. data/stdlib/rbconfig.rb +20 -0
  454. data/stdlib/securerandom.rb +12 -0
  455. data/stdlib/set.rb +116 -0
  456. data/stdlib/singleton.rb +40 -0
  457. data/stdlib/source_map.rb +5 -0
  458. data/stdlib/source_map/map.rb +220 -0
  459. data/stdlib/source_map/mapping.rb +26 -0
  460. data/stdlib/source_map/offset.rb +88 -0
  461. data/stdlib/source_map/version.rb +3 -0
  462. data/stdlib/source_map/vlq.rb +98 -0
  463. data/stdlib/sourcemap.rb +1 -0
  464. data/stdlib/stringio.rb +181 -0
  465. data/stdlib/strscan.rb +155 -0
  466. data/stdlib/template.rb +46 -0
  467. data/stdlib/thread.rb +160 -0
  468. data/stdlib/time.rb +9 -0
  469. data/tasks/github.rake +19 -0
  470. metadata +690 -0
@@ -0,0 +1,102 @@
1
+ module Opal
2
+ def self.type_error(object, type, method = nil, coerced = nil)
3
+ if method && coerced
4
+ TypeError.new "can't convert #{object.class} into #{type} (#{object.class}##{method} gives #{coerced.class}"
5
+ else
6
+ TypeError.new "no implicit conversion of #{object.class} into #{type}"
7
+ end
8
+ end
9
+
10
+ def self.coerce_to(object, type, method)
11
+ return object if type === object
12
+
13
+ unless object.respond_to? method
14
+ raise type_error(object, type)
15
+ end
16
+
17
+ object.__send__ method
18
+ end
19
+
20
+ def self.coerce_to!(object, type, method)
21
+ coerced = coerce_to(object, type, method)
22
+
23
+ unless type === coerced
24
+ raise type_error(object, type, method, coerced)
25
+ end
26
+
27
+ coerced
28
+ end
29
+
30
+ def self.coerce_to?(object, type, method)
31
+ return unless object.respond_to? method
32
+
33
+ coerced = coerce_to(object, type, method)
34
+
35
+ return if coerced.nil?
36
+
37
+ unless type === coerced
38
+ raise type_error(object, type, method, coerced)
39
+ end
40
+
41
+ coerced
42
+ end
43
+
44
+ def self.try_convert(object, type, method)
45
+ return object if type === object
46
+
47
+ if object.respond_to? method
48
+ object.__send__ method
49
+ end
50
+ end
51
+
52
+ def self.compare(a, b)
53
+ compare = a <=> b
54
+
55
+ if `compare === nil`
56
+ raise ArgumentError, "comparison of #{a.class.name} with #{b.class.name} failed"
57
+ end
58
+
59
+ compare
60
+ end
61
+
62
+ def self.destructure(args)
63
+ %x{
64
+ if (args.length == 1) {
65
+ return args[0];
66
+ }
67
+ else if (args.$$is_array) {
68
+ return args;
69
+ }
70
+ else {
71
+ return $slice.call(args);
72
+ }
73
+ }
74
+ end
75
+
76
+ def self.respond_to?(obj, method)
77
+ %x{
78
+ if (obj == null || !obj.$$class) {
79
+ return false;
80
+ }
81
+ }
82
+
83
+ obj.respond_to? method
84
+ end
85
+
86
+ def self.inspect(obj)
87
+ %x{
88
+ if (obj === undefined) {
89
+ return "undefined";
90
+ }
91
+ else if (obj === null) {
92
+ return "null";
93
+ }
94
+ else if (!obj.$$class) {
95
+ return obj.toString();
96
+ }
97
+ else {
98
+ return #{obj.inspect};
99
+ }
100
+ }
101
+ end
102
+ end
@@ -0,0 +1,59 @@
1
+ class IO
2
+ SEEK_SET = 0
3
+ SEEK_CUR = 1
4
+ SEEK_END = 2
5
+
6
+ attr_accessor :write_proc
7
+
8
+ def write(string)
9
+ `self.write_proc(string)`
10
+ string.size
11
+ end
12
+
13
+ module Writable
14
+ def <<(string)
15
+ write(string)
16
+ self
17
+ end
18
+
19
+ def print(*args)
20
+ write args.map { |arg| String(arg) }.join($,)
21
+ nil
22
+ end
23
+
24
+ def puts(*args)
25
+ newline = $/
26
+ write args.map { |arg| String(arg).chomp }.concat([nil]).join(newline)
27
+ nil
28
+ end
29
+ end
30
+
31
+ module Readable
32
+ def readbyte
33
+ getbyte
34
+ end
35
+
36
+ def readchar
37
+ getc
38
+ end
39
+
40
+ def readline(sep = $/)
41
+ raise NotImplementedError
42
+ end
43
+
44
+ def readpartial(integer, outbuf = nil)
45
+ raise NotImplementedError
46
+ end
47
+ end
48
+ end
49
+
50
+ STDERR = $stderr = IO.new
51
+ STDIN = $stdin = IO.new
52
+ STDOUT = $stdout = IO.new
53
+
54
+
55
+ $stdout.write_proc = `typeof(process) === 'object' ? function(s){process.stdout.write(s)} : function(s){console.log(s)}`
56
+ $stderr.write_proc = `typeof(process) === 'object' ? function(s){process.stderr.write(s)} : function(s){console.warn(s)}`
57
+
58
+ $stdout.extend(IO::Writable)
59
+ $stderr.extend(IO::Writable)
@@ -0,0 +1,569 @@
1
+ module Kernel
2
+ def method_missing(symbol, *args, &block)
3
+ raise NoMethodError, "undefined method `#{symbol}' for #{inspect}"
4
+ end
5
+
6
+ def =~(obj)
7
+ false
8
+ end
9
+
10
+ def ===(other)
11
+ self == other
12
+ end
13
+
14
+ def <=>(other)
15
+ %x{
16
+ if (#{self == other}) {
17
+ return 0;
18
+ }
19
+
20
+ return nil;
21
+ }
22
+ end
23
+
24
+ def method(name)
25
+ %x{
26
+ var meth = self['$' + name];
27
+
28
+ if (!meth || meth.$$stub) {
29
+ #{raise NameError, "undefined method `#{name}' for class `#{self.class.name}'"};
30
+ }
31
+
32
+ return #{Method.new(self, `meth`, name)};
33
+ }
34
+ end
35
+
36
+ def methods(all = true)
37
+ %x{
38
+ var methods = [];
39
+
40
+ for (var key in self) {
41
+ if (key[0] == "$" && typeof(self[key]) === "function") {
42
+ if (all == false || all === nil) {
43
+ if (!$opal.hasOwnProperty.call(self, key)) {
44
+ continue;
45
+ }
46
+ }
47
+ if (self[key].$$stub === undefined) {
48
+ methods.push(key.substr(1));
49
+ }
50
+ }
51
+ }
52
+
53
+ return methods;
54
+ }
55
+ end
56
+
57
+ def Array(object, *args, &block)
58
+ %x{
59
+ if (object == null || object === nil) {
60
+ return [];
61
+ }
62
+ else if (#{object.respond_to? :to_ary}) {
63
+ return #{object.to_ary};
64
+ }
65
+ else if (#{object.respond_to? :to_a}) {
66
+ return #{object.to_a};
67
+ }
68
+ else {
69
+ return [object];
70
+ }
71
+ }
72
+ end
73
+
74
+ # Opal does not support #caller, but we stub it as an empty array to not
75
+ # break dependant libs
76
+ def caller
77
+ []
78
+ end
79
+
80
+ def class
81
+ `self.$$class`
82
+ end
83
+
84
+ def copy_instance_variables(other)
85
+ %x{
86
+ for (var name in other) {
87
+ if (name.charAt(0) !== '$') {
88
+ self[name] = other[name];
89
+ }
90
+ }
91
+ }
92
+ end
93
+
94
+ def clone
95
+ copy = self.class.allocate
96
+
97
+ copy.copy_instance_variables(self)
98
+ copy.initialize_clone(self)
99
+
100
+ copy
101
+ end
102
+
103
+ def initialize_clone(other)
104
+ initialize_copy(other)
105
+ end
106
+
107
+ def define_singleton_method(name, &body)
108
+ unless body
109
+ raise ArgumentError, "tried to create Proc object without a block"
110
+ end
111
+
112
+ %x{
113
+ var jsid = '$' + name;
114
+ body.$$jsid = name;
115
+ body.$$s = null;
116
+ body.$$def = body;
117
+
118
+ #{singleton_class}.$$proto[jsid] = body;
119
+
120
+ return self;
121
+ }
122
+ end
123
+
124
+ def dup
125
+ copy = self.class.allocate
126
+
127
+ copy.copy_instance_variables(self)
128
+ copy.initialize_dup(self)
129
+
130
+ copy
131
+ end
132
+
133
+ def initialize_dup(other)
134
+ initialize_copy(other)
135
+ end
136
+
137
+ def enum_for(method = :each, *args, &block)
138
+ Enumerator.for(self, method, *args, &block)
139
+ end
140
+
141
+ alias to_enum enum_for
142
+
143
+ def equal?(other)
144
+ `self === other`
145
+ end
146
+
147
+ def extend(*mods)
148
+ %x{
149
+ var singleton = #{singleton_class};
150
+
151
+ for (var i = mods.length - 1; i >= 0; i--) {
152
+ var mod = mods[i];
153
+
154
+ #{`mod`.append_features `singleton`};
155
+ #{`mod`.extended self};
156
+ }
157
+ }
158
+
159
+ self
160
+ end
161
+
162
+ def format(format, *args)
163
+ %x{
164
+ var idx = 0;
165
+ return format.replace(/%(\d+\$)?([-+ 0]*)(\d*|\*(\d+\$)?)(?:\.(\d*|\*(\d+\$)?))?([cspdiubBoxXfgeEG])|(%%)/g, function(str, idx_str, flags, width_str, w_idx_str, prec_str, p_idx_str, spec, escaped) {
166
+ if (escaped) {
167
+ return '%';
168
+ }
169
+
170
+ var width,
171
+ prec,
172
+ is_integer_spec = ("diubBoxX".indexOf(spec) != -1),
173
+ is_float_spec = ("eEfgG".indexOf(spec) != -1),
174
+ prefix = '',
175
+ obj;
176
+
177
+ if (width_str === undefined) {
178
+ width = undefined;
179
+ } else if (width_str.charAt(0) == '*') {
180
+ var w_idx = idx++;
181
+ if (w_idx_str) {
182
+ w_idx = parseInt(w_idx_str, 10) - 1;
183
+ }
184
+ width = #{`args[w_idx]`.to_i};
185
+ } else {
186
+ width = parseInt(width_str, 10);
187
+ }
188
+ if (!prec_str) {
189
+ prec = is_float_spec ? 6 : undefined;
190
+ } else if (prec_str.charAt(0) == '*') {
191
+ var p_idx = idx++;
192
+ if (p_idx_str) {
193
+ p_idx = parseInt(p_idx_str, 10) - 1;
194
+ }
195
+ prec = #{`args[p_idx]`.to_i};
196
+ } else {
197
+ prec = parseInt(prec_str, 10);
198
+ }
199
+ if (idx_str) {
200
+ idx = parseInt(idx_str, 10) - 1;
201
+ }
202
+ switch (spec) {
203
+ case 'c':
204
+ obj = args[idx];
205
+ if (obj.$$is_string) {
206
+ str = obj.charAt(0);
207
+ } else {
208
+ str = String.fromCharCode(#{`obj`.to_i});
209
+ }
210
+ break;
211
+ case 's':
212
+ str = #{`args[idx]`.to_s};
213
+ if (prec !== undefined) {
214
+ str = str.substr(0, prec);
215
+ }
216
+ break;
217
+ case 'p':
218
+ str = #{`args[idx]`.inspect};
219
+ if (prec !== undefined) {
220
+ str = str.substr(0, prec);
221
+ }
222
+ break;
223
+ case 'd':
224
+ case 'i':
225
+ case 'u':
226
+ str = #{`args[idx]`.to_i}.toString();
227
+ break;
228
+ case 'b':
229
+ case 'B':
230
+ str = #{`args[idx]`.to_i}.toString(2);
231
+ break;
232
+ case 'o':
233
+ str = #{`args[idx]`.to_i}.toString(8);
234
+ break;
235
+ case 'x':
236
+ case 'X':
237
+ str = #{`args[idx]`.to_i}.toString(16);
238
+ break;
239
+ case 'e':
240
+ case 'E':
241
+ str = #{`args[idx]`.to_f}.toExponential(prec);
242
+ break;
243
+ case 'f':
244
+ str = #{`args[idx]`.to_f}.toFixed(prec);
245
+ break;
246
+ case 'g':
247
+ case 'G':
248
+ str = #{`args[idx]`.to_f}.toPrecision(prec);
249
+ break;
250
+ }
251
+ idx++;
252
+ if (is_integer_spec || is_float_spec) {
253
+ if (str.charAt(0) == '-') {
254
+ prefix = '-';
255
+ str = str.substr(1);
256
+ } else {
257
+ if (flags.indexOf('+') != -1) {
258
+ prefix = '+';
259
+ } else if (flags.indexOf(' ') != -1) {
260
+ prefix = ' ';
261
+ }
262
+ }
263
+ }
264
+ if (is_integer_spec && prec !== undefined) {
265
+ if (str.length < prec) {
266
+ str = #{'0' * `prec - str.length`} + str;
267
+ }
268
+ }
269
+ var total_len = prefix.length + str.length;
270
+ if (width !== undefined && total_len < width) {
271
+ if (flags.indexOf('-') != -1) {
272
+ str = str + #{' ' * `width - total_len`};
273
+ } else {
274
+ var pad_char = ' ';
275
+ if (flags.indexOf('0') != -1) {
276
+ str = #{'0' * `width - total_len`} + str;
277
+ } else {
278
+ prefix = #{' ' * `width - total_len`} + prefix;
279
+ }
280
+ }
281
+ }
282
+ var result = prefix + str;
283
+ if ('XEG'.indexOf(spec) != -1) {
284
+ result = result.toUpperCase();
285
+ }
286
+ return result;
287
+ });
288
+ }
289
+ end
290
+
291
+ def hash
292
+ `self.$$id`
293
+ end
294
+
295
+ def initialize_copy(other)
296
+ end
297
+
298
+ def inspect
299
+ to_s
300
+ end
301
+
302
+ def instance_of?(klass)
303
+ `self.$$class === klass`
304
+ end
305
+
306
+ def instance_variable_defined?(name)
307
+ `$opal.hasOwnProperty.call(self, name.substr(1))`
308
+ end
309
+
310
+ def instance_variable_get(name)
311
+ %x{
312
+ var ivar = self[name.substr(1)];
313
+
314
+ return ivar == null ? nil : ivar;
315
+ }
316
+ end
317
+
318
+ def instance_variable_set(name, value)
319
+ `self[name.substr(1)] = value`
320
+ end
321
+
322
+ def instance_variables
323
+ %x{
324
+ var result = [];
325
+
326
+ for (var name in self) {
327
+ if (name.charAt(0) !== '$') {
328
+ if (name !== '$$class' && name !== '$$id') {
329
+ result.push('@' + name);
330
+ }
331
+ }
332
+ }
333
+
334
+ return result;
335
+ }
336
+ end
337
+
338
+ def Integer(value, base = nil)
339
+ if String === value
340
+ if value.empty?
341
+ raise ArgumentError, "invalid value for Integer: (empty string)"
342
+ end
343
+
344
+ return `parseInt(#{value}, #{base || `undefined`})`
345
+ end
346
+
347
+ if base
348
+ raise ArgumentError "base is only valid for String values"
349
+ end
350
+
351
+ case value
352
+ when Integer
353
+ value
354
+
355
+ when Float
356
+ if value.nan? or value.infinite?
357
+ raise FloatDomainError, "unable to coerce #{value} to Integer"
358
+ end
359
+
360
+ value.to_int
361
+
362
+ when NilClass
363
+ raise TypeError, "can't convert nil into Integer"
364
+
365
+ else
366
+ if value.respond_to? :to_int
367
+ value.to_int
368
+ elsif value.respond_to? :to_i
369
+ value.to_i
370
+ else
371
+ raise TypeError, "can't convert #{value.class} into Integer"
372
+ end
373
+ end
374
+ end
375
+
376
+ def Float(value)
377
+ if String === value
378
+ `parseFloat(value)`
379
+ elsif value.respond_to? :to_f
380
+ value.to_f
381
+ else
382
+ raise TypeError, "can't convert #{value.class} into Float"
383
+ end
384
+ end
385
+
386
+ def is_a?(klass)
387
+ `$opal.is_a(self, klass)`
388
+ end
389
+
390
+ alias kind_of? is_a?
391
+
392
+ def lambda(&block)
393
+ `block.$$is_lambda = true`
394
+
395
+ block
396
+ end
397
+
398
+ def loop(&block)
399
+ %x{
400
+ while (true) {
401
+ if (block() === $breaker) {
402
+ return $breaker.$v;
403
+ }
404
+ }
405
+ }
406
+
407
+ self
408
+ end
409
+
410
+ def nil?
411
+ false
412
+ end
413
+
414
+ alias object_id __id__
415
+
416
+ def printf(*args)
417
+ if args.length > 0
418
+ print format(*args)
419
+ end
420
+
421
+ nil
422
+ end
423
+
424
+ def private_methods(*)
425
+ []
426
+ end
427
+ alias private_instance_methods private_methods
428
+
429
+ def proc(&block)
430
+ unless block
431
+ raise ArgumentError, "tried to create Proc object without a block"
432
+ end
433
+
434
+ `block.$$is_lambda = false`
435
+ block
436
+ end
437
+
438
+ def puts(*strs)
439
+ $stdout.puts(*strs)
440
+ end
441
+
442
+ def p(*args)
443
+ args.each { |obj| $stdout.puts obj.inspect }
444
+
445
+ args.length <= 1 ? args[0] : args
446
+ end
447
+
448
+ def print(*strs)
449
+ $stdout.print(*strs)
450
+ end
451
+
452
+ def warn(*strs)
453
+ $stderr.puts(*strs) unless $VERBOSE.nil? || strs.empty?
454
+ end
455
+
456
+ def raise(exception = undefined, string = undefined)
457
+ %x{
458
+ if (exception == null && #$!) {
459
+ exception = #$!;
460
+ }
461
+ else if (exception.$$is_string) {
462
+ exception = #{RuntimeError.new exception};
463
+ }
464
+ else if (!#{exception.is_a? Exception}) {
465
+ exception = #{exception.new string};
466
+ }
467
+
468
+ #{$! = exception};
469
+ throw exception;
470
+ }
471
+ end
472
+
473
+ alias fail raise
474
+
475
+ def rand(max = undefined)
476
+ %x{
477
+ if (max === undefined) {
478
+ return Math.random();
479
+ }
480
+ else if (max.$$is_range) {
481
+ var arr = #{max.to_a};
482
+
483
+ return arr[#{rand(`arr.length`)}];
484
+ }
485
+ else {
486
+ return Math.floor(Math.random() *
487
+ Math.abs(#{Opal.coerce_to max, Integer, :to_int}));
488
+ }
489
+ }
490
+ end
491
+
492
+ alias srand rand
493
+
494
+ def respond_to?(name, include_all = false)
495
+ return true if respond_to_missing?(name)
496
+
497
+ %x{
498
+ var body = self['$' + name];
499
+
500
+ if (typeof(body) === "function" && !body.$$stub) {
501
+ return true;
502
+ }
503
+ }
504
+
505
+ false
506
+ end
507
+
508
+ alias send __send__
509
+ alias public_send __send__
510
+
511
+ def singleton_class
512
+ %x{$opal.get_singleton_class(self)}
513
+ end
514
+
515
+ alias sprintf format
516
+
517
+ def String(str)
518
+ `String(str)`
519
+ end
520
+
521
+ def tap(&block)
522
+ yield self
523
+ self
524
+ end
525
+
526
+ def to_proc
527
+ self
528
+ end
529
+
530
+ def to_s
531
+ `"#<" + #{self.class.name} + ":" + self.$$id + ">"`
532
+ end
533
+
534
+ def freeze
535
+ @___frozen___ = true
536
+ self
537
+ end
538
+
539
+ def frozen?
540
+ @___frozen___ || false
541
+ end
542
+
543
+ def respond_to_missing?(method_name)
544
+ false
545
+ end
546
+
547
+ def require file
548
+ `$opal.require( $opal.normalize_loadable_path(#{file}) )`
549
+ end
550
+
551
+ # `path` should be the ful path to be found in registered modules (`Opal.modules`)
552
+ def require_tree path
553
+ %x{
554
+ var file_name, file_names = Object.keys($opal.modules);
555
+ path = path.replace(/\/?$/, '/');
556
+ for (var i = 0; i < file_names.length; i++) {
557
+ file_name = file_names[i];
558
+ if (file_name['$start_with?'](path)) {
559
+ $opal.require(file_name);
560
+ }
561
+ }
562
+ }
563
+ nil
564
+ end
565
+
566
+ def load file
567
+ `$opal.load( $opal.normalize_loadable_path(#{file}) )`
568
+ end
569
+ end