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,25 @@
1
+ module Opal
2
+ # ParserScope is used during lexing to keep track of local variables
3
+ # created inside a scope. A lexer scope can be asked if it has a local
4
+ # variable defined, and it can also check its parent scope if applicable.
5
+ class ParserScope
6
+ attr_reader :locals
7
+ attr_accessor :parent
8
+
9
+ def initialize(type)
10
+ @block = type == :block
11
+ @locals = []
12
+ @parent = nil
13
+ end
14
+
15
+ def add_local(local)
16
+ @locals << local
17
+ end
18
+
19
+ def has_local?(local)
20
+ return true if @locals.include? local
21
+ return @parent.has_local?(local) if @parent and @block
22
+ false
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,75 @@
1
+ module Opal
2
+ class Sexp
3
+
4
+ attr_reader :array
5
+
6
+ attr_accessor :source
7
+
8
+ def initialize(args)
9
+ @array = args
10
+ end
11
+
12
+ def type
13
+ @array[0]
14
+ end
15
+
16
+ def type=(type)
17
+ @array[0] = type
18
+ end
19
+
20
+ def children
21
+ @array[1..-1]
22
+ end
23
+
24
+ def method_missing(sym, *args, &block)
25
+ @array.send sym, *args, &block
26
+ end
27
+
28
+ def <<(other)
29
+ @array << other
30
+ self
31
+ end
32
+
33
+ def push(*parts)
34
+ @array.push(*parts)
35
+ self
36
+ end
37
+
38
+ def to_ary
39
+ @array
40
+ end
41
+
42
+ def dup
43
+ Sexp.new(@array.dup)
44
+ end
45
+
46
+ def ==(other)
47
+ if other.is_a? Sexp
48
+ @array == other.array
49
+ else
50
+ @array == other
51
+ end
52
+ end
53
+
54
+ alias eql? ==
55
+
56
+ def line
57
+ @source && @source[0]
58
+ end
59
+
60
+ def column
61
+ @source && @source[1]
62
+ end
63
+
64
+ def inspect
65
+ "(#{@array.map { |e| e.inspect }.join ', '})"
66
+ end
67
+
68
+ def pretty_inspect
69
+ "(#{line ? "#{line} " : ''}#{@array.map { |e| e.inspect }.join ', '})"
70
+ end
71
+
72
+ alias to_s inspect
73
+ end
74
+ end
75
+
@@ -0,0 +1,28 @@
1
+ require 'opal/hike_path_finder'
2
+
3
+ module Opal
4
+ class PathReader
5
+ def initialize(file_finder = HikePathFinder.new)
6
+ @file_finder = file_finder
7
+ end
8
+
9
+ def read(path)
10
+ full_path = expand(path)
11
+ return nil if full_path.nil?
12
+ File.read(full_path)
13
+ end
14
+
15
+ def expand(path)
16
+ file_finder.find(path)
17
+ end
18
+
19
+ def paths
20
+ file_finder.paths
21
+ end
22
+
23
+
24
+ private
25
+
26
+ attr_reader :file_finder
27
+ end
28
+ end
@@ -0,0 +1,38 @@
1
+ module Opal
2
+ def self.gem_dir
3
+ File.expand_path('../..', __FILE__.untaint)
4
+ end
5
+
6
+ def self.core_dir
7
+ File.expand_path('../../../opal', __FILE__.untaint)
8
+ end
9
+
10
+ def self.std_dir
11
+ File.expand_path('../../../stdlib', __FILE__.untaint)
12
+ end
13
+
14
+ # Add a file path to opals load path. Any gem containing ruby code that Opal
15
+ # has access to should add a load path through this method. Load paths added
16
+ # here should only be paths which contain code targeted at being compiled by
17
+ # Opal.
18
+ def self.append_path(path)
19
+ paths << path
20
+ end
21
+
22
+ def self.use_gem(gem_name, include_dependecies = true)
23
+ spec = Gem::Specification.find_by_name(gem_name)
24
+
25
+ spec.runtime_dependencies.each do |dependency|
26
+ use_gem dependency.name
27
+ end if include_dependecies
28
+
29
+ spec.require_paths.each do |path|
30
+ Opal.append_path File.join(spec.gem_dir, path)
31
+ end
32
+ end
33
+
34
+ # Private, don't add to these directly (use .append_path instead).
35
+ def self.paths
36
+ @paths ||= [core_dir.untaint, std_dir.untaint, gem_dir.untaint]
37
+ end
38
+ end
@@ -0,0 +1,70 @@
1
+ # require 'opal'
2
+ require 'source_map'
3
+
4
+ module Opal
5
+ class SourceMap
6
+ attr_reader :fragments
7
+ attr_reader :file
8
+
9
+ def initialize(fragments, file)
10
+ @fragments = fragments
11
+ @file = file
12
+ end
13
+
14
+ def map
15
+ @map ||= begin
16
+ source_file = file+'.rb'
17
+ generated_line, generated_column = 1, 0
18
+
19
+ mappings = @fragments.map do |fragment|
20
+ mapping = nil
21
+ source_line = fragment.line
22
+ source_column = fragment.column
23
+ source_code = fragment.code
24
+
25
+ if source_line and source_column
26
+ source_offset = ::SourceMap::Offset.new(source_line, source_column)
27
+ generated_offset = ::SourceMap::Offset.new(generated_line, generated_column)
28
+
29
+ mapping = ::SourceMap::Mapping.new(
30
+ source_file,
31
+ generated_offset,
32
+ source_offset
33
+ )
34
+ end
35
+
36
+ new_lines = source_code.count "\n"
37
+ generated_line += new_lines
38
+
39
+ if new_lines > 0
40
+ generated_column = source_code.size - (source_code.rindex("\n") + 1)
41
+ else
42
+ generated_column += source_code.size
43
+ end
44
+
45
+ mapping
46
+ end
47
+
48
+ # Ensure mappings isn't empty: https://github.com/maccman/sourcemap/issues/11
49
+ unless mappings.any?
50
+ zero_offset = ::SourceMap::Offset.new(0,0)
51
+ mappings = [::SourceMap::Mapping.new(source_file,zero_offset,zero_offset)]
52
+ end
53
+
54
+ ::SourceMap::Map.new(mappings.compact)
55
+ end
56
+ end
57
+
58
+ def as_json
59
+ map.as_json
60
+ end
61
+
62
+ def to_s
63
+ map.to_s
64
+ end
65
+
66
+ def magic_comment map_path
67
+ "\n//# sourceMappingURL=file://#{map_path}"
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,4 @@
1
+ require 'opal/sprockets/environment'
2
+ require 'opal/sprockets/processor'
3
+ require 'opal/sprockets/erb'
4
+ require 'opal/sprockets/server'
@@ -0,0 +1,17 @@
1
+ require 'sprockets'
2
+ require 'sprockets/base'
3
+
4
+ module Sprockets
5
+ class Base
6
+ def cache_key_for(path, options)
7
+ "#{path}:#{options[:bundle] ? '1' : '0'}"
8
+ processors = attributes_for(path).processors
9
+ processors_key = processors.map do |p|
10
+ version = p.respond_to?(:version) ? p.version : '0'
11
+ "#{p.name}-#{version}"
12
+ end.join(':')
13
+
14
+ "#{path}:#{options[:bundle] ? '1' : '0'}:#{processors_key}"
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,37 @@
1
+ require 'sprockets'
2
+ require 'opal/sprockets/processor'
3
+ require 'opal/sprockets/erb'
4
+
5
+ module Opal
6
+ # Proccess using Sprockets
7
+ #
8
+ # Opal.process('opal-jquery') # => String
9
+ def self.process asset
10
+ Environment.new[asset].to_s
11
+ end
12
+
13
+ # Environment is a subclass of Sprockets::Environment which already has our opal
14
+ # load paths loaded. This makes it easy for stand-alone rack apps, or test runners
15
+ # that have opal load paths ready to use. You can also add an existing gem's lib
16
+ # directory to our load path to use real gems inside your opal environment.
17
+ #
18
+ # If you are running rails, then you just need opal-rails instead, which will
19
+ # do this for you.
20
+ class Environment < ::Sprockets::Environment
21
+ def initialize *args
22
+ super
23
+ append_opal_paths
24
+ end
25
+
26
+ def use_gem gem_name
27
+ Opal.use_gem gem_name
28
+ append_opal_paths
29
+ end
30
+
31
+ private
32
+
33
+ def append_opal_paths
34
+ Opal.paths.each { |p| append_path p }
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,37 @@
1
+ require 'tilt'
2
+ require 'sprockets'
3
+
4
+ module Opal
5
+ module ERB
6
+ class Processor < Tilt::Template
7
+ # vvv BOILERPLATE vvv
8
+ self.default_mime_type = 'application/javascript'
9
+
10
+ def self.engine_initialized?
11
+ true
12
+ end
13
+
14
+ def self.version
15
+ ::Opal::VERSION
16
+ end
17
+
18
+ def initialize_engine
19
+ require_template_library 'opal'
20
+ require_template_library 'opal/erb'
21
+ end
22
+
23
+ def prepare
24
+ end
25
+ # ^^^ BOILERPLATE ^^^
26
+
27
+
28
+ def evaluate(context, locals, &block)
29
+ context.require_asset 'erb'
30
+ Opal::ERB.compile data, context.logical_path.sub(/^templates\//, '')
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ Tilt.register 'opalerb', Opal::ERB::Processor
37
+ Sprockets.register_engine '.opalerb', Opal::ERB::Processor
@@ -0,0 +1,34 @@
1
+ module Opal
2
+ module Sprockets
3
+
4
+ class PathReader
5
+ def initialize(env, context)
6
+ @env ||= env
7
+ @context ||= context
8
+ end
9
+
10
+ def read path
11
+ if path.end_with? '.js'
12
+ context.depend_on_asset(path)
13
+ env[path].to_s
14
+ else
15
+ context.depend_on(path)
16
+ File.read(expand(path))
17
+ end
18
+ rescue ::Sprockets::FileNotFound
19
+ nil
20
+ end
21
+
22
+ def expand path
23
+ env.resolve(path)
24
+ end
25
+
26
+ def paths
27
+ env.paths
28
+ end
29
+
30
+ attr_reader :env, :context
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,124 @@
1
+ require 'set'
2
+ require 'tilt'
3
+ require 'sprockets'
4
+ require 'opal/version'
5
+ require 'opal/builder'
6
+ require 'opal/sprockets/path_reader'
7
+
8
+ $OPAL_SOURCE_MAPS = {}
9
+
10
+ module Opal
11
+ # The Processor class is used to make ruby files (with rb or opal extensions)
12
+ # available to any sprockets based server. Processor will then get passed any
13
+ # ruby source file to build. There are some options you can override globally
14
+ # which effect how certain ruby features are handled:
15
+ #
16
+ # * method_missing_enabled [true by default]
17
+ # * arity_check_enabled [false by default]
18
+ # * const_missing_enabled [true by default]
19
+ # * dynamic_require_severity [:error by default]
20
+ # * source_map_enabled [true by default]
21
+ # * irb_enabled [false by default]
22
+ # * inline_operators_enabled [false by default]
23
+ #
24
+ class Processor < Tilt::Template
25
+ # vvv BOILERPLATE vvv
26
+ self.default_mime_type = 'application/javascript'
27
+
28
+ def self.engine_initialized?
29
+ true
30
+ end
31
+
32
+ def self.version
33
+ ::Opal::VERSION
34
+ end
35
+
36
+ def initialize_engine
37
+ require_template_library 'opal'
38
+ end
39
+
40
+ def prepare
41
+ end
42
+ # ^^^ BOILERPLATE ^^^
43
+
44
+
45
+ class << self
46
+ attr_accessor :method_missing_enabled
47
+ attr_accessor :arity_check_enabled
48
+ attr_accessor :const_missing_enabled
49
+ attr_accessor :dynamic_require_severity
50
+ attr_accessor :source_map_enabled
51
+ attr_accessor :irb_enabled
52
+ attr_accessor :inline_operators_enabled
53
+
54
+ attr_accessor :source_map_register
55
+ end
56
+
57
+ self.method_missing_enabled = true
58
+ self.arity_check_enabled = false
59
+ self.const_missing_enabled = true
60
+ self.dynamic_require_severity = :error # :error, :warning or :ignore
61
+ self.source_map_enabled = true
62
+ self.irb_enabled = false
63
+
64
+ self.source_map_register = $OPAL_SOURCE_MAPS
65
+
66
+
67
+ def evaluate(context, locals, &block)
68
+ return Opal.compile data unless context.is_a? ::Sprockets::Context
69
+
70
+ path = context.logical_path
71
+ prerequired = []
72
+
73
+ builder = self.class.new_builder(context)
74
+ result = builder.build_str(data, path, :prerequired => prerequired)
75
+
76
+ if self.class.source_map_enabled
77
+ register_source_map(context.logical_path, result.source_map.to_s)
78
+ "#{result.to_s}\n//# sourceMappingURL=#{context.logical_path}.map\n"
79
+ else
80
+ result.to_s
81
+ end
82
+ end
83
+
84
+ def register_source_map path, map_contents
85
+ self.class.source_map_register[path] = map_contents
86
+ end
87
+
88
+ def self.stubbed_files
89
+ @stubbed_files ||= []
90
+ end
91
+
92
+ def self.stub_file(name)
93
+ stubbed_files << name.to_s
94
+ end
95
+
96
+ def stubbed_files
97
+ self.class.stubbed_files
98
+ end
99
+
100
+ def self.new_builder(context)
101
+ compiler_options = {
102
+ :method_missing => method_missing_enabled,
103
+ :arity_check => arity_check_enabled,
104
+ :const_missing => const_missing_enabled,
105
+ :dynamic_require_severity => dynamic_require_severity,
106
+ :irb => irb_enabled,
107
+ :inline_operators => inline_operators_enabled
108
+ }
109
+
110
+ path_reader = ::Opal::Sprockets::PathReader.new(context.environment, context)
111
+ return Builder.new(
112
+ compiler_options: compiler_options,
113
+ stubs: stubbed_files,
114
+ path_reader: path_reader
115
+ )
116
+ end
117
+ end
118
+ end
119
+
120
+ Tilt.register 'rb', Opal::Processor
121
+ Sprockets.register_engine '.rb', Opal::Processor
122
+
123
+ Tilt.register 'opal', Opal::Processor
124
+ Sprockets.register_engine '.opal', Opal::Processor