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,145 @@
1
+ require 'opal'
2
+ require 'rack'
3
+ require 'opal/builder'
4
+ require 'opal/cli_runners'
5
+
6
+ module Opal
7
+ class CLI
8
+ attr_reader :options, :file, :compiler_options, :evals, :load_paths, :argv,
9
+ :output, :requires, :gems, :stubs, :verbose, :port, :preload
10
+
11
+ def compile?
12
+ @compile
13
+ end
14
+
15
+ def sexp?
16
+ @sexp
17
+ end
18
+
19
+ def skip_opal_require?
20
+ @skip_opal_require
21
+ end
22
+
23
+ class << self
24
+ attr_accessor :stdout
25
+ end
26
+
27
+ def initialize options = nil
28
+ options ||= {}
29
+
30
+ # Runner
31
+ @runner_type = options.delete(:runner) || :nodejs
32
+ @port = options.delete(:port) || 3000
33
+
34
+ @options = options
35
+ @compile = !!options.delete(:compile)
36
+ @sexp = options.delete(:sexp)
37
+ @file = options.delete(:file)
38
+ @argv = options.delete(:argv) || []
39
+ @evals = options.delete(:evals) || []
40
+ @requires = options.delete(:requires) || []
41
+ @load_paths = options.delete(:load_paths) || []
42
+ @gems = options.delete(:gems) || []
43
+ @stubs = options.delete(:stubs) || []
44
+ @preload = options.delete(:preload) || []
45
+ @output = options.delete(:output) || self.class.stdout || $stdout
46
+ @verbose = options.fetch(:verbose, false); options.delete(:verbose)
47
+ @skip_opal_require = options.delete(:skip_opal_require)
48
+ @compiler_options = Hash[
49
+ *processor_option_names.map do |option|
50
+ key = option.to_sym
51
+ next unless options.has_key? key
52
+ value = options.delete(key)
53
+ [key, value]
54
+ end.compact.flatten
55
+ ]
56
+
57
+ raise ArgumentError, "no runnable code provided (evals or file)" if @evals.empty? and @file.nil?
58
+ raise ArgumentError, "unknown options: #{options.inspect}" unless @options.empty?
59
+ end
60
+
61
+ def run
62
+ case
63
+ when sexp?; show_sexp
64
+ when compile?; show_compiled_source
65
+ else run_code
66
+ end
67
+ end
68
+
69
+ def runner
70
+ @runner ||= case @runner_type
71
+ when :server; CliRunners::Server.new(output, port)
72
+ when :nodejs; CliRunners::Nodejs.new(output)
73
+ when :phantomjs; CliRunners::Phantomjs.new(output)
74
+ else raise ArgumentError, @runner_type.inspect
75
+ end
76
+ end
77
+
78
+ def run_code
79
+ runner.run(compiled_source, argv)
80
+ end
81
+
82
+ def compiled_source
83
+ Opal.paths.concat load_paths
84
+ gems.each { |gem_name| Opal.use_gem gem_name }
85
+
86
+ builder = Opal::Builder.new stubs: stubs, compiler_options: compiler_options
87
+
88
+ builder.build 'opal' unless skip_opal_require?
89
+
90
+ preload.each { |path| builder.build_require(path) }
91
+
92
+ # REQUIRES: -r
93
+ requires.each do |local_require|
94
+ builder.build_str("require #{local_require.inspect}", 'require')
95
+ end
96
+
97
+ if evals.any?
98
+ builder.build_str(evals.join("\n"), '-e')
99
+ else
100
+ if file and (file.path != '-' or evals.empty?)
101
+ builder.build_str(file.read, file.path)
102
+ end
103
+ end
104
+
105
+ builder.to_s
106
+ end
107
+
108
+ def show_compiled_source
109
+ puts compiled_source
110
+ end
111
+
112
+ def show_sexp
113
+ if evals.any?
114
+ sexp = Opal::Parser.new.parse(evals.join("\n"), '-e')
115
+ else
116
+ if file and (file.path != '-' or evals.empty?)
117
+ sexp = Opal::Parser.new.parse(file.read, file.path)
118
+ end
119
+ end
120
+ puts sexp.inspect
121
+ end
122
+
123
+ def map
124
+ compiler = Opal::Compiler.compile(file.read, options.merge(:file => file.path))
125
+ compiler.compile
126
+ compiler.source_map
127
+ end
128
+
129
+ def processor_option_names
130
+ %w[
131
+ method_missing_enabled
132
+ arity_check_enabled
133
+ dynamic_require_severity
134
+ source_map_enabled
135
+ irb_enabled
136
+ inline_operators
137
+ ]
138
+ end
139
+
140
+ def puts(*args)
141
+ output.puts(*args)
142
+ end
143
+
144
+ end
145
+ end
@@ -0,0 +1,149 @@
1
+ require 'optparse'
2
+
3
+ module Opal
4
+ class CLIOptions < OptionParser
5
+ def initialize
6
+ super
7
+ @options = {}
8
+
9
+ self.banner = 'Usage: opal [options] -- [programfile]'
10
+
11
+ separator ''
12
+
13
+ on('-v', '--verbose', 'print version number, then turn on verbose mode') do
14
+ print_version
15
+ options[:verbose] = true # TODO: print some warnings when verbose = true
16
+ end
17
+
18
+ on('--verbose', 'turn on verbose mode') do
19
+ options[:verbose] = true # TODO: print some warnings when verbose = true
20
+ end
21
+
22
+ on('--version', 'Print the version') do
23
+ print_version
24
+ exit
25
+ end
26
+
27
+ on("-h", "--help", "Show this message") do
28
+ puts self
29
+ exit
30
+ end
31
+
32
+
33
+ section 'Basic Options:'
34
+
35
+ on('-I', '--include DIR',
36
+ 'Append a load path (may be used more than once)') do |i|
37
+ options[:load_paths] ||= []
38
+ options[:load_paths] << i
39
+ end
40
+
41
+ on('-e', '--eval SOURCE', String,
42
+ 'One line of script. Several -e\'s allowed. Omit [programfile]') do |source|
43
+ options[:evals] ||= []
44
+ options[:evals] << source
45
+ end
46
+
47
+ on('-r', '--require LIBRARY', String,
48
+ 'Require the library before executing your script') do |library|
49
+ options[:requires] ||= []
50
+ options[:requires] << library
51
+ end
52
+
53
+ on('-s', '--stub FILE', String, 'Stubbed files will be compiled as empty files') do |stub|
54
+ options[:stubs] ||= []
55
+ options[:stubs] << stub
56
+ end
57
+
58
+ on('-p', '--preload FILE', String, 'Preloaded files will be prepared for dynamic requires') do |stub|
59
+ options[:preload] ||= []
60
+ options[:preload] << stub
61
+ end
62
+
63
+ on('-g', '--gem GEM_NAME', String, 'Adds the specified GEM_NAME to Opal\'s load path.') do |g|
64
+ options[:gems] ||= []
65
+ options[:gems] << g
66
+ end
67
+
68
+ section 'Running Options:'
69
+
70
+ on('--sexp', 'Show Sexps') do
71
+ options[:sexp] = true
72
+ end
73
+
74
+ on('-m', '--map', 'Show sourcemap') do
75
+ options[:map] = true
76
+ end
77
+
78
+ on('-c', '--compile', 'Compile to JavaScript') do
79
+ options[:compile] = true
80
+ end
81
+
82
+ on('--runner RUNNER', %w[nodejs server phantomjs], 'Choose the runner: nodejs (default), server') do |runner|
83
+ options[:runner] = runner.to_sym
84
+ end
85
+
86
+ on('--server-port PORT', 'Set the port for the server runner (default port: 3000)') do |port|
87
+ options[:runner] = :server
88
+ options[:port] = port.to_i
89
+ end
90
+
91
+
92
+ section 'Compilation Options:'
93
+
94
+ on('-M', '--no-method-missing', 'Enable/Disable method missing') do
95
+ options[:method_missing] = false
96
+ end
97
+
98
+ on('-O', '--no-opal', 'Enable/Disable implicit `require "opal"`') do
99
+ options[:skip_opal_require] = true
100
+ end
101
+
102
+ on('-A', '--arity-check', 'Enable arity check') do
103
+ options[:arity_check] = true
104
+ end
105
+
106
+ on('-V', 'Enable inline Operators') do
107
+ options[:inline_operators] = true
108
+ end
109
+
110
+ dynamic_require_levels = %w[error warning ignore]
111
+ on('-D', '--dynamic-require LEVEL', dynamic_require_levels,
112
+ 'Set level of dynamic require severity.',
113
+ "(deafult: error, values: #{dynamic_require_levels.join(', ')})") do |level|
114
+ options[:dynamic_require_severity] = level.to_sym
115
+ end
116
+
117
+ on('-P', '--source-map [FILE]', 'Enable/Disable source map') do |file|
118
+ options[:source_map_enabled] = true
119
+ options[:source_map_file] = file if file
120
+ end
121
+
122
+ on('-F', '--file FILE', 'Set filename for compiled code') do |file|
123
+ options[:file] = file
124
+ end
125
+
126
+ on("--irb", "Enable IRB var mode") do
127
+ options[:irb] = true
128
+ end
129
+
130
+ separator ''
131
+ end
132
+
133
+ attr_reader :options
134
+
135
+
136
+ private
137
+
138
+ def print_version
139
+ require 'opal/version'
140
+ puts "Opal v#{Opal::VERSION}"
141
+ end
142
+
143
+ def section title
144
+ separator ''
145
+ separator title
146
+ separator ''
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,10 @@
1
+ module Opal
2
+ module CliRunners
3
+ class RunnerError < StandardError
4
+ end
5
+ end
6
+ end
7
+
8
+ require 'opal/cli_runners/phantomjs'
9
+ require 'opal/cli_runners/nodejs'
10
+ require 'opal/cli_runners/server'
@@ -0,0 +1,56 @@
1
+ require 'opal/cli_runners'
2
+
3
+ module Opal
4
+ module CliRunners
5
+ class Nodejs
6
+ def initialize(output)
7
+ @output ||= output
8
+ end
9
+ attr_reader :output
10
+
11
+ def puts(*args)
12
+ output.puts(*args)
13
+ end
14
+
15
+ def node_modules
16
+ File.expand_path("../../../../node_modules", __FILE__)
17
+ end
18
+
19
+ def run(code, argv)
20
+ require 'tempfile'
21
+ tempfile = Tempfile.new('opal-nodejs-runner-')
22
+ # tempfile = File.new('opal-nodejs-runner.js', 'w') # for debugging
23
+ tempfile.write code
24
+ tempfile.close
25
+ system_with_output({'NODE_PATH' => node_modules}, 'node', tempfile.path , *argv)
26
+ rescue Errno::ENOENT
27
+ raise MissingNodeJS, 'Please install Node.js to be able to run Opal scripts.'
28
+ end
29
+
30
+ # Let's support fake IO objects like StringIO
31
+ def system_with_output(env, *cmd)
32
+ io_output = IO.try_convert(output)
33
+ return system(env,*cmd) if io_output
34
+
35
+ if RUBY_PLATFORM == 'java'
36
+ # JRuby has issues in dealing with subprocesses (at least up to 1.7.15)
37
+ # @headius told me it's mostly fixed on master, but while we wait for it
38
+ # to ship here's a tempfile workaround.
39
+ require 'tempfile'
40
+ require 'shellwords'
41
+ tempfile = Tempfile.new('opal-node-output')
42
+ system(env,cmd.shelljoin+" > #{tempfile.path}")
43
+ captured_output = File.read tempfile.path
44
+ tempfile.close
45
+ else
46
+ require 'open3'
47
+ captured_output, status = Open3.capture2(env,*cmd)
48
+ end
49
+ output.write captured_output
50
+ end
51
+
52
+ class MissingNodeJS < RunnerError
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,35 @@
1
+ var page = require('webpage').create();
2
+ var fs = require('fs');
3
+ var system = require('system');
4
+
5
+ page.onConsoleMessage = function(msg) {
6
+ system.stdout.write(msg);
7
+ };
8
+
9
+ var opal_code = fs.read('/dev/stdin');
10
+
11
+ page.onCallback = function(data) {
12
+ switch (data[0]) {
13
+ case 'exit':
14
+ var status = data[1] || 0;
15
+ phantom.exit(status);
16
+ case 'stdout':
17
+ system.stdout.write(data[1] || '');
18
+ break;
19
+ case 'stderr':
20
+ system.stderr.write(data[1] || '');
21
+ break;
22
+ default:
23
+ console.error('Unknown callback data: ', data);
24
+ }
25
+ };
26
+
27
+ page.content = '<!doctype html>'+
28
+ '<html>'+
29
+ ' <head><meta charset="utf-8"/></head>'+
30
+ " <body><script>//<![CDATA[\n"+
31
+ opal_code+
32
+ " //]]></script>"+
33
+ ' <script>callPhantom(["exit", 0]);</script></body>\n'+
34
+ ' </body>'+
35
+ '</html>';
@@ -0,0 +1,28 @@
1
+ require 'shellwords'
2
+
3
+ module Opal
4
+ module CliRunners
5
+ class Phantomjs
6
+ def initialize(output = $stdout)
7
+ @output = output
8
+ end
9
+ attr_reader :output
10
+
11
+ def run(code, argv)
12
+ unless argv.empty?
13
+ raise ArgumentError, 'Program arguments are not supported on the PhantomJS runner'
14
+ end
15
+
16
+ phantomjs = IO.popen(command, 'w', out: output) do |io|
17
+ io.write(code)
18
+ end
19
+ exit $?.exitstatus
20
+ end
21
+
22
+ def command
23
+ script_path = File.expand_path('../phantom.js', __FILE__)
24
+ "phantomjs #{script_path.shellescape}"
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,54 @@
1
+ require 'opal/cli_runners'
2
+
3
+ module Opal
4
+ module CliRunners
5
+ class Server
6
+ def initialize(output, port)
7
+ @output ||= output || $stdout
8
+ @port = port
9
+ end
10
+ attr_reader :output, :port, :server
11
+
12
+ def run(source, argv)
13
+ unless argv.empty?
14
+ raise ArgumentError, 'Program arguments are not supported on the PhantomJS runner'
15
+ end
16
+
17
+ require 'rack'
18
+ require 'webrick'
19
+ require 'logger'
20
+
21
+ @server = Rack::Server.start(
22
+ :app => app(source),
23
+ :Port => port,
24
+ :AccessLog => [],
25
+ :Logger => Logger.new(output)
26
+ )
27
+ end
28
+
29
+ def app(source)
30
+ lambda do |env|
31
+ case env['PATH_INFO']
32
+ when '/'
33
+ body = <<-HTML
34
+ <!doctype html>
35
+ <html>
36
+ <head>
37
+ <meta charset="utf-8"/>
38
+ <script>
39
+ //<![CDATA[
40
+ #{source}
41
+ //]]>
42
+ </script>
43
+ </head>
44
+ </html>
45
+ HTML
46
+ [200, {}, [body]]
47
+ else
48
+ [404, {}, [body]]
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end