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,11 @@
1
+ require "benchmark"
2
+
3
+ time = Benchmark.measure do
4
+ a = 0
5
+ 100000.times do
6
+ a = a + 1
7
+ end
8
+ puts a
9
+ end
10
+
11
+ puts time
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Error codes are taken from /usr/include/sysexits.h
4
+
5
+ require 'opal/cli_options'
6
+ options = Opal::CLIOptions.new
7
+ begin
8
+ options.parse!
9
+ rescue OptionParser::InvalidOption => e
10
+ $stderr.puts "#{$0}: #{e.message} (-h will show valid options)"
11
+ exit 64
12
+ end
13
+
14
+ require 'opal/cli'
15
+ cli = Opal::CLI.new options.options.merge(:file => ARGF.file, :argv => ARGV.dup)
16
+
17
+ begin
18
+ cli.run
19
+ rescue Opal::CliRunners::RunnerError => e
20
+ $stderr.puts e.message
21
+ exit 72
22
+ end
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+
5
+ module Opal
6
+ class BuilderOptions < OptionParser
7
+ def initialize
8
+ @options = {}
9
+
10
+ super do |opts|
11
+ opts.banner = 'Usage: opal-build [options] -- [libname]'
12
+
13
+ opts.separator ''
14
+ opts.separator 'Options:'
15
+
16
+ opts.on("-h", "--help", "Show this message") do
17
+ puts opts
18
+ exit
19
+ end
20
+
21
+ opts.on('-g', '--gem GEM_NAME', String,
22
+ 'Adds the specified GEM_NAME lib dir to Opal\'s load path.',
23
+ 'E.g.: opal-build --gem erubis -- erubis`',
24
+ 'Will build erubis.rb from the regular "erubis" gem') do |g|
25
+ options[:gems] ||= []
26
+ options[:gems] << g
27
+ end
28
+
29
+ opts.on('-s', '--stub STUB', String) do |stub|
30
+ options[:stubs] ||= []
31
+ options[:stubs] << stub
32
+ end
33
+
34
+ opts.on('-r', '--require LIBRARY', String,
35
+ 'Require the library before executing your script',
36
+ 'E.g.: opal-build --require opal-browser browser`',
37
+ 'Will build browser.rb from the Opal gem opal-browser') do |library|
38
+ options[:requires] ||= []
39
+ options[:requires] << library
40
+ end
41
+
42
+ opts.on('-o', '--output FILE', String,
43
+ 'Write the built lib to a file (defaults to STDOUT)') do |file|
44
+ options[:output] = file
45
+ end
46
+ end
47
+ end
48
+
49
+ attr_reader :options
50
+ end
51
+ end
52
+
53
+ option_parser = Opal::BuilderOptions.new
54
+ option_parser.parse!
55
+
56
+ if ARGV.empty?
57
+ puts option_parser
58
+ else
59
+ require 'opal'
60
+ options = option_parser.options
61
+
62
+ if options[:gems]
63
+ require 'rubygems'
64
+ options[:gems].each { |gem_name| Opal.use_gem gem_name }
65
+ end
66
+
67
+ if options[:requires]
68
+ options[:requires].each { |required_lib| require required_lib }
69
+ end
70
+
71
+ lib_name = ARGV.first
72
+
73
+ output = options[:output] ? File.open(options[:output], 'w') : $stdout
74
+ output.puts Opal::Builder.build(lib_name.dup.untaint)
75
+ end
76
+
77
+
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ specs = ARGV.map do |s|
4
+ s.end_with?('.rb') ? s : "#{s}/**/*_spec.rb"
5
+ end
6
+ pattern = %Q{MSPEC_PATTERN="{#{specs.join(',')}}"} if specs.any?
7
+ command = [pattern, 'rake mspec'].compact.join(' ')
8
+ exec command
9
+
10
+ # bundle exec mspec run -t opal -pspec/corelib/spec_helper spec/corelib/core/true/*
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'opal'
4
+
5
+ module Opal
6
+ class V8Context
7
+ def initialize
8
+ @builder = Opal::Builder.new
9
+ end
10
+
11
+ def run(filename = nil)
12
+ return if @v8
13
+
14
+ begin
15
+ require 'v8'
16
+ rescue LoadError
17
+ abort 'therubyracer must be installed'
18
+ end
19
+
20
+ @v8 = V8::Context.new
21
+ @v8['console'] = self
22
+ @v8.eval Opal::Builder.new.build('opal').to_s
23
+
24
+ if filename
25
+ if File.exist? filename
26
+ eval_ruby File.read(filename)
27
+ else
28
+ fail "file does not exist: #{filename}"
29
+ end
30
+ end
31
+
32
+ run_repl
33
+ end
34
+
35
+ def log(*str)
36
+ puts(*str)
37
+ end
38
+
39
+ def run_repl
40
+ require 'readline'
41
+
42
+ loop do
43
+ # on SIGINT lets just return from the loop..
44
+ trap("SIGINT") { finish; return }
45
+ line = Readline.readline '>> ', true
46
+
47
+ # if we type exit, then we need to close down context
48
+ if line == "exit" or line.nil?
49
+ break
50
+ end
51
+
52
+ puts "=> #{eval_ruby line}"
53
+ end
54
+
55
+ finish
56
+ end
57
+
58
+ def eval_ruby(str)
59
+ code = Opal::Builder.new.build_str(str, '(irb)', :irb => true, :const_missing => true)
60
+ code.processed[0...-1].each{ |c| @v8.eval(c.to_s) }
61
+ @v8.eval "var $_result = #{code.processed.last.to_s} ($_result == null ? 'nil' : $_result.$inspect());"
62
+ rescue => e
63
+ puts "#{e.message}\n\t#{e.backtrace.join("\n\t")}"
64
+ end
65
+
66
+ def finish
67
+ @v8 = nil
68
+ end
69
+ end
70
+ end
71
+
72
+ Opal::V8Context.new.run ARGV.first
@@ -0,0 +1,14 @@
1
+ require 'bundler'
2
+ Bundler.require
3
+
4
+ require 'mspec/opal/rake_task'
5
+
6
+ ::Opal::Processor.arity_check_enabled = true
7
+ ::Opal::Processor.dynamic_require_severity = :raise
8
+
9
+ use Rack::ShowExceptions
10
+ use Rack::ShowStatus
11
+ use MSpec::Opal::Index
12
+ run MSpec::Opal::Environment.new
13
+
14
+
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'opal', :path => '../../'
@@ -0,0 +1,13 @@
1
+ require 'opal'
2
+ require 'user'
3
+
4
+ module MyApp
5
+ class Application
6
+ def initialize
7
+ @user = User.new('Bill')
8
+ @user.authenticated?
9
+ end
10
+ end
11
+ end
12
+
13
+ MyApp::Application.new
@@ -0,0 +1,21 @@
1
+ class User
2
+ def initialize(name)
3
+ @name = name
4
+ end
5
+
6
+ def authenticated?
7
+ if admin? or special_permission?
8
+ true
9
+ else
10
+ raise "not authenticated"
11
+ end
12
+ end
13
+
14
+ def admin?
15
+ @name == 'Bob'
16
+ end
17
+
18
+ def special_permission?
19
+ false
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ require 'bundler'
2
+ Bundler.require
3
+
4
+ run Opal::Server.new { |s|
5
+ s.main = 'application'
6
+ s.append_path 'app'
7
+ }
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>opal-sprockets demo</title>
5
+
6
+ <%= javascript_include_tag 'application' %>
7
+ </head>
8
+ <body>
9
+ </body>
10
+ </html>
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'opal', :path => '../..'
4
+ gem 'sinatra'
@@ -0,0 +1,7 @@
1
+ require 'opal'
2
+
3
+ def alert(msg)
4
+ `alert(msg)`
5
+ end
6
+
7
+ alert "Hi there!"
@@ -0,0 +1,28 @@
1
+ require 'opal'
2
+ require 'sinatra'
3
+
4
+ opal = Opal::Server.new {|s|
5
+ s.append_path 'app'
6
+ s.main = 'application'
7
+ }
8
+
9
+ map opal.source_maps.prefix do
10
+ run opal.source_maps
11
+ end
12
+
13
+ map '/assets' do
14
+ run opal.sprockets
15
+ end
16
+
17
+ get '/' do
18
+ <<-HTML
19
+ <!doctype html>
20
+ <html>
21
+ <head>
22
+ <script src="/assets/application.js"></script>
23
+ </head>
24
+ </html>
25
+ HTML
26
+ end
27
+
28
+ run Sinatra::Application
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ # This file just greps for all spec files in spec/ and requires them
4
+ <% ENV['OPAL_SPEC'].split(',').each do |s| %>
5
+ require <%= s.inspect %>
6
+ <% end %>
7
+
8
+ # All specs have been run, so we notify mspec that we are done
9
+ OSpecRunner.main.did_finish
@@ -0,0 +1,278 @@
1
+ require 'opal/nodes'
2
+ class Opal::Nodes::CallNode
3
+ # Rubyspec uses this call to load in language specific features at runtime.
4
+ # We can't do this at runtime, so handle it during compilation
5
+ add_special :language_version do
6
+ if meth == :language_version and scope.top?
7
+ lang_type = arglist[2][1]
8
+ target = "corelib/language/versions/#{lang_type}_1.9"
9
+
10
+ if File.exist?(target)
11
+ compiler.requires << target
12
+ end
13
+
14
+ push fragment("nil")
15
+ end
16
+ end
17
+
18
+ add_special :not_supported_on do
19
+ unless meth == :not_supported_on and arglist[1][1] == :opal
20
+ compile_default!
21
+ end
22
+ end
23
+ end
24
+
25
+
26
+ require 'rack'
27
+ require 'webrick'
28
+
29
+ module MSpec
30
+ module Opal
31
+ DEFAULT_BASEDIR = 'spec'
32
+
33
+ require 'rake'
34
+ require 'rake/tasklib'
35
+ class RakeTask < ::Rake::TaskLib
36
+ include ::Rake::DSL if defined?(::Rake::DSL)
37
+
38
+ def initialize(name, &task_block)
39
+ namespace name do
40
+ desc 'Run MSpec::Opal code examples' unless ::Rake.application.last_comment
41
+ task :default do
42
+ puts 'Starting MSpec Runner...'
43
+ runner = Runner.new(&task_block)
44
+ runner.run
45
+ end
46
+
47
+ desc 'Build specs to build/specs.js and build/specs.min.js'
48
+ task :build do
49
+ require 'opal/util'
50
+ path = './build/specs.js'
51
+ min_path = './build/specs.min.js'
52
+ Environment.new.build_specs(path)
53
+ min = ::Opal::Util.uglify File.read(path)
54
+ File.open(min_path, 'w') { |f| f << min_path }
55
+ end
56
+ end
57
+
58
+ task name => "#{name}:default"
59
+ end
60
+ end
61
+
62
+ class Runner
63
+ def initialize &block
64
+ @app = RackApp.new(&block).to_app
65
+ @port = 9999
66
+ end
67
+
68
+ attr_reader :app, :server
69
+ attr_accessor :port
70
+
71
+ def passed?
72
+ @passed
73
+ end
74
+
75
+ def run
76
+ start_server
77
+ start_phantomjs
78
+
79
+ exit 1 unless passed?
80
+ rescue => e
81
+ puts e.message
82
+ ensure
83
+ stop_server if server
84
+ end
85
+
86
+ def stop_server
87
+ server.kill
88
+ end
89
+
90
+ require 'opal/util'
91
+ class PhantomJS < ::Opal::Util::Command
92
+ require 'shellwords'
93
+
94
+ def initialize(runner, url)
95
+ runner = runner.shellescape
96
+ url = url.shellescape
97
+ super 'phantomjs', "#{runner} #{url}", '. Please install PhantomJS'
98
+ end
99
+
100
+ def run
101
+ system "#{command} #{options}"
102
+ end
103
+ end
104
+
105
+ def start_phantomjs
106
+ runner = File.expand_path('../sprockets.js', __FILE__).shellescape
107
+ url = "http://localhost:#{port}/".shellescape
108
+ command = PhantomJS.new(runner, url)
109
+ @passed = command.run
110
+ end
111
+
112
+ def start_server
113
+ @server = Thread.new do
114
+ Rack::Server.start(:app => app, :Port => port, :AccessLog => [],
115
+ :Logger => WEBrick::Log.new("/dev/null"))
116
+ end
117
+ end
118
+ end
119
+
120
+ class Environment < ::Opal::Environment
121
+ attr_reader :basedir, :pattern
122
+
123
+ def initialize(basedir = nil, pattern = nil)
124
+ ::Opal::Processor.arity_check_enabled = true
125
+ ::Opal::Processor.dynamic_require_severity = :error
126
+
127
+ @pattern = pattern
128
+ @basedir = basedir = File.expand_path(basedir || DEFAULT_BASEDIR)
129
+
130
+ ::Opal.append_path basedir
131
+ ::Opal.use_gem 'mspec'
132
+
133
+ stubs.each do |asset|
134
+ ::Opal::Processor.stub_file asset
135
+ end
136
+
137
+ ENV['OPAL_SPEC'] ||= files_to_run(pattern).join(',')
138
+
139
+ super()
140
+ end
141
+
142
+ def stubs
143
+ # missing stdlib
144
+ stubs = %w[fileutils iconv yaml]
145
+
146
+ # use x-strings which generate bad javascript
147
+ stubs << "mspec/helpers/tmp"
148
+ stubs << "mspec/helpers/environment"
149
+ stubs << "mspec/guards/block_device"
150
+ stubs << "mspec/guards/endian"
151
+
152
+ stubs
153
+ end
154
+
155
+ def specs
156
+ @specs ||= self['mspec/opal/main'] || raise("Cannot find mspec/opal/main inside #{paths.inspect}")
157
+ end
158
+
159
+ def build_min file = "#{basedir}/build/specs.min.js"
160
+ require 'opal/util'
161
+ build ::Opal::Util.uglify(specs.to_s), file
162
+ end
163
+
164
+ def files
165
+ @files ||= []
166
+ end
167
+
168
+ def add_files specs, tag = ''
169
+ tag = "[#{tag}] "
170
+ puts "#{tag}Adding #{specs.size} spec files..."
171
+ specs = specs.flatten.map do |path|
172
+ dirname = File.join([basedir, path])
173
+ if File.directory? dirname
174
+ rubyspec_paths_in_dir(dirname, path)
175
+ else
176
+ path
177
+ end
178
+ end.flatten
179
+ files.concat specs
180
+ end
181
+
182
+ def paths_from_glob pattern
183
+ Dir.glob(File.expand_path(pattern)).map do |s|
184
+ s.sub(/^#{basedir}\//, '').sub(/\.rb$/, '')
185
+ end
186
+ end
187
+
188
+ def rubyspec_paths_in_dir(dirname, path)
189
+ Dir.entries(dirname).select do |spec|
190
+ spec.end_with? '.rb'
191
+ end.map do |spec|
192
+ File.join path, spec
193
+ end
194
+ end
195
+
196
+ def rubyspec_white_list
197
+ File.read("#{basedir}/rubyspecs").split("\n").reject do |line|
198
+ line.sub(/#.*/, '').strip.empty?
199
+ end
200
+ end
201
+
202
+ def files_to_run(pattern=nil)
203
+ # add any filters in spec/filters of specs we dont want to run
204
+ add_files paths_from_glob("#{basedir}/filters/**/*.rb"), :filters
205
+
206
+ if pattern
207
+ # add custom opal specs from spec/
208
+ add_files paths_from_glob(pattern) & rubyspec_white_list, :rubyspec_custom_pattern
209
+ add_files paths_from_glob(pattern).grep(/(?!spec\/(corelib|stdlib)\/)/), :other_custom_pattern
210
+
211
+ else
212
+ # add opal specific specs
213
+ add_files paths_from_glob("#{basedir}/opal/**/*_spec.rb"), 'opal/*'
214
+ add_files paths_from_glob("#{basedir}/lib/{lexer_spec.rb,parser/**/*_spec.rb}"), 'lib/{lexer,parser}'
215
+
216
+ # add any rubyspecs we want to run (defined in spec/rubyspecs)
217
+ add_files rubyspec_white_list, :rubyspec_white_list
218
+ end
219
+ end
220
+
221
+ def build_specs file = "#{basedir}/build/specs.js"
222
+ code = specs.to_s
223
+ FileUtils.mkdir_p File.dirname(file)
224
+ puts "Building #{file}..."
225
+ File.open(file, 'w+') { |o| o << code }
226
+ end
227
+ end
228
+
229
+ class RackApp < Rack::Builder
230
+ attr_accessor :pattern, :basedir
231
+
232
+ def initialize
233
+ self.pattern = nil
234
+ self.basedir = DEFAULT_BASEDIR
235
+
236
+ yield(self) if block_given?
237
+ super()
238
+
239
+ use Rack::ShowExceptions
240
+ use Rack::ShowStatus
241
+ use Index
242
+ run environment
243
+ end
244
+
245
+ def environment
246
+ @environment ||= Environment.new(basedir, pattern)
247
+ end
248
+ end
249
+
250
+ class Index
251
+ HTML = <<-HTML
252
+ <!DOCTYPE html>
253
+ <html>
254
+ <head>
255
+ <meta charset="UTF-8" />
256
+ <title>Opal Specs</title>
257
+ </head>
258
+ <body>
259
+ <script src="/mspec/opal/main.js"></script>
260
+ </body>
261
+ </html>
262
+ HTML
263
+
264
+ def initialize(app)
265
+ @app = app
266
+ end
267
+
268
+ def call(env)
269
+ if %w[/ /index.html].include? env['PATH_INFO']
270
+ [200, { 'Content-Type' => 'text/html' }, [HTML]]
271
+ else
272
+ @app.call env
273
+ end
274
+ end
275
+ end
276
+
277
+ end
278
+ end