opal 0.10.6 → 0.11.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (450) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +19 -0
  3. data/.gitmodules +1 -1
  4. data/.jshintrc +1 -2
  5. data/.travis.yml +26 -18
  6. data/CHANGELOG.md +89 -23
  7. data/{CODE_OF_CONDUCT.md → CONDUCT.md} +0 -0
  8. data/Gemfile +19 -21
  9. data/HACKING.md +2 -0
  10. data/README.md +7 -6
  11. data/Rakefile +1 -1
  12. data/appveyor.yml +21 -4
  13. data/benchmark-ips/bm_case.rb +33 -0
  14. data/benchmark-ips/bm_constants_lookup.rb +13 -0
  15. data/benchmark-ips/bm_is_number.rb +29 -0
  16. data/benchmark-ips/bm_symbol_to_proc.rb +19 -0
  17. data/benchmark/bm_constant_lookup_big.rb +799 -0
  18. data/benchmark/bm_constant_lookup_small.rb +59 -0
  19. data/benchmark/bm_module_definition_big.rb +400 -0
  20. data/benchmark/bm_module_definition_small.rb +30 -0
  21. data/bin/opal-repl +23 -1
  22. data/docs/compiled_ruby.md +16 -14
  23. data/docs/faq.md +3 -3
  24. data/docs/rspec.md +2 -1
  25. data/docs/unsupported_features.md +6 -4
  26. data/examples/rack/Gemfile +1 -0
  27. data/examples/rack/app/application.rb +14 -3
  28. data/examples/rack/app/user.rb +2 -0
  29. data/examples/rack/config.ru +1 -1
  30. data/examples/rack/index.html.erb +1 -0
  31. data/lib/opal.rb +6 -1
  32. data/lib/opal/ast/builder.rb +17 -0
  33. data/lib/opal/ast/node.rb +30 -0
  34. data/lib/opal/builder.rb +14 -3
  35. data/lib/opal/builder_processors.rb +1 -0
  36. data/lib/opal/cli.rb +45 -59
  37. data/lib/opal/cli_options.rb +11 -7
  38. data/lib/opal/cli_runners.rb +1 -0
  39. data/lib/opal/cli_runners/applescript.rb +3 -3
  40. data/lib/opal/cli_runners/nashorn.rb +1 -0
  41. data/lib/opal/cli_runners/nodejs.rb +4 -1
  42. data/lib/opal/cli_runners/phantom.js +1 -2
  43. data/lib/opal/cli_runners/phantomjs.rb +3 -2
  44. data/lib/opal/cli_runners/server.rb +1 -0
  45. data/lib/opal/compiler.rb +145 -94
  46. data/lib/opal/config.rb +1 -0
  47. data/lib/opal/deprecations.rb +18 -0
  48. data/lib/opal/erb.rb +1 -0
  49. data/lib/opal/errors.rb +1 -0
  50. data/lib/opal/fragment.rb +1 -0
  51. data/lib/opal/hike_path_finder.rb +1 -0
  52. data/lib/opal/nodes.rb +3 -0
  53. data/lib/opal/nodes/arglist.rb +2 -1
  54. data/lib/opal/nodes/args/initialize_kwargs.rb +1 -0
  55. data/lib/opal/nodes/args/kwarg.rb +7 -7
  56. data/lib/opal/nodes/args/kwoptarg.rb +6 -7
  57. data/lib/opal/nodes/args/kwrestarg.rb +5 -5
  58. data/lib/opal/nodes/args/mlhsarg.rb +3 -2
  59. data/lib/opal/nodes/args/normarg.rb +6 -7
  60. data/lib/opal/nodes/args/optarg.rb +5 -7
  61. data/lib/opal/nodes/args/post_args.rb +6 -5
  62. data/lib/opal/nodes/args/post_kwargs.rb +1 -0
  63. data/lib/opal/nodes/args/restarg.rb +7 -7
  64. data/lib/opal/nodes/array.rb +1 -0
  65. data/lib/opal/nodes/base.rb +24 -3
  66. data/lib/opal/nodes/call.rb +167 -155
  67. data/lib/opal/nodes/call_special.rb +31 -217
  68. data/lib/opal/nodes/case.rb +36 -22
  69. data/lib/opal/nodes/class.rb +4 -3
  70. data/lib/opal/nodes/constants.rb +28 -48
  71. data/lib/opal/nodes/csend.rb +25 -0
  72. data/lib/opal/nodes/def.rb +49 -16
  73. data/lib/opal/nodes/defined.rb +170 -60
  74. data/lib/opal/nodes/definitions.rb +40 -133
  75. data/lib/opal/nodes/defs.rb +29 -0
  76. data/lib/opal/nodes/for.rb +52 -25
  77. data/lib/opal/nodes/hash.rb +12 -35
  78. data/lib/opal/nodes/helpers.rb +27 -54
  79. data/lib/opal/nodes/if.rb +21 -32
  80. data/lib/opal/nodes/inline_args.rb +12 -13
  81. data/lib/opal/nodes/iter.rb +61 -36
  82. data/lib/opal/nodes/literal.rb +189 -116
  83. data/lib/opal/nodes/logic.rb +20 -25
  84. data/lib/opal/nodes/masgn.rb +20 -18
  85. data/lib/opal/nodes/module.rb +10 -11
  86. data/lib/opal/nodes/node_with_args.rb +14 -17
  87. data/lib/opal/nodes/rescue.rb +37 -70
  88. data/lib/opal/nodes/runtime_helpers.rb +8 -3
  89. data/lib/opal/nodes/scope.rb +9 -5
  90. data/lib/opal/nodes/singleton_class.rb +4 -3
  91. data/lib/opal/nodes/super.rb +115 -87
  92. data/lib/opal/nodes/top.rb +7 -2
  93. data/lib/opal/nodes/variables.rb +46 -35
  94. data/lib/opal/nodes/while.rb +11 -1
  95. data/lib/opal/nodes/yield.rb +1 -17
  96. data/lib/opal/parser.rb +28 -770
  97. data/lib/opal/path_reader.rb +5 -1
  98. data/lib/opal/paths.rb +10 -4
  99. data/lib/opal/regexp_anchors.rb +1 -0
  100. data/lib/opal/rewriter.rb +60 -0
  101. data/lib/opal/rewriters/base.rb +60 -0
  102. data/lib/opal/rewriters/binary_operator_assignment.rb +144 -0
  103. data/lib/opal/rewriters/block_to_iter.rb +17 -0
  104. data/lib/opal/rewriters/break_finder.rb +34 -0
  105. data/lib/opal/rewriters/dot_js_syntax.rb +60 -0
  106. data/lib/opal/rewriters/explicit_writer_return.rb +58 -0
  107. data/lib/opal/rewriters/js_reserved_words.rb +111 -0
  108. data/lib/opal/rewriters/logical_operator_assignment.rb +155 -0
  109. data/lib/opal/rewriters/opal_engine_check.rb +42 -0
  110. data/lib/opal/rewriters/rubyspec/filters_rewriter.rb +67 -0
  111. data/lib/opal/server.rb +4 -0
  112. data/lib/opal/simple_server.rb +100 -0
  113. data/lib/opal/source_map.rb +1 -1
  114. data/lib/opal/util.rb +5 -5
  115. data/lib/opal/version.rb +2 -1
  116. data/lib/tilt/opal.rb +1 -0
  117. data/opal.gemspec +8 -7
  118. data/opal/README.md +1 -1
  119. data/opal/corelib/array.rb +137 -83
  120. data/opal/corelib/basic_object.rb +6 -6
  121. data/opal/corelib/class.rb +14 -11
  122. data/opal/corelib/complex.rb +5 -1
  123. data/opal/corelib/constants.rb +3 -3
  124. data/opal/corelib/enumerable.rb +129 -11
  125. data/opal/corelib/error.rb +35 -17
  126. data/opal/corelib/file.rb +65 -170
  127. data/opal/corelib/hash.rb +128 -13
  128. data/opal/corelib/helpers.rb +12 -15
  129. data/opal/corelib/io.rb +1 -0
  130. data/opal/corelib/kernel.rb +40 -21
  131. data/opal/corelib/marshal/read_buffer.rb +1 -1
  132. data/opal/corelib/method.rb +33 -13
  133. data/opal/corelib/module.rb +133 -81
  134. data/opal/corelib/number.rb +141 -25
  135. data/opal/corelib/numeric.rb +0 -8
  136. data/opal/corelib/process.rb +44 -4
  137. data/opal/corelib/random.rb +117 -0
  138. data/opal/corelib/random/seedrandom.js.rb +15 -0
  139. data/opal/corelib/range.rb +133 -10
  140. data/opal/corelib/regexp.rb +37 -9
  141. data/opal/corelib/runtime.js +601 -390
  142. data/opal/corelib/string.rb +39 -8
  143. data/opal/corelib/string/encoding.rb +51 -7
  144. data/opal/corelib/struct.rb +20 -0
  145. data/opal/corelib/time.rb +3 -3
  146. data/opal/corelib/variables.rb +1 -1
  147. data/opal/opal.rb +1 -0
  148. data/spec/filters/bugs/array.rb +5 -1
  149. data/spec/filters/bugs/basicobject.rb +2 -5
  150. data/spec/filters/bugs/bigdecimal.rb +8 -22
  151. data/spec/filters/bugs/class.rb +2 -1
  152. data/spec/filters/bugs/comparable.rb +5 -0
  153. data/spec/filters/bugs/date.rb +3 -3
  154. data/spec/filters/bugs/enumerable.rb +4 -11
  155. data/spec/filters/bugs/enumerator.rb +2 -4
  156. data/spec/filters/bugs/exception.rb +16 -2
  157. data/spec/filters/bugs/file.rb +8 -0
  158. data/spec/filters/bugs/float.rb +7 -1
  159. data/spec/filters/bugs/hash.rb +6 -2
  160. data/spec/filters/bugs/integer.rb +2 -0
  161. data/spec/filters/bugs/io.rb +8 -0
  162. data/spec/filters/bugs/kernel.rb +9 -138
  163. data/spec/filters/bugs/language.rb +89 -174
  164. data/spec/filters/bugs/marshal.rb +33 -35
  165. data/spec/filters/bugs/method.rb +0 -24
  166. data/spec/filters/bugs/module.rb +19 -55
  167. data/spec/filters/bugs/numeric.rb +0 -119
  168. data/spec/filters/bugs/pathname.rb +2 -0
  169. data/spec/filters/bugs/proc.rb +5 -4
  170. data/spec/filters/bugs/random.rb +7 -0
  171. data/spec/filters/bugs/range.rb +12 -120
  172. data/spec/filters/bugs/rational.rb +1 -1
  173. data/spec/filters/bugs/regexp.rb +2 -40
  174. data/spec/filters/bugs/set.rb +0 -1
  175. data/spec/filters/bugs/string.rb +5 -8
  176. data/spec/filters/bugs/stringscanner.rb +11 -19
  177. data/spec/filters/bugs/time.rb +7 -1
  178. data/spec/filters/bugs/unboundmethod.rb +1 -11
  179. data/spec/filters/unsupported/array.rb +5 -1
  180. data/spec/filters/unsupported/basicobject.rb +1 -1
  181. data/spec/filters/unsupported/bignum.rb +4 -1
  182. data/spec/filters/unsupported/class.rb +1 -1
  183. data/spec/filters/unsupported/delegator.rb +1 -1
  184. data/spec/filters/unsupported/enumerable.rb +1 -1
  185. data/spec/filters/unsupported/enumerator.rb +1 -1
  186. data/spec/filters/unsupported/file.rb +4 -0
  187. data/spec/filters/unsupported/fixnum.rb +1 -1
  188. data/spec/filters/unsupported/float.rb +4 -1
  189. data/spec/filters/unsupported/freeze.rb +27 -5
  190. data/spec/filters/unsupported/hash.rb +7 -15
  191. data/spec/filters/unsupported/integer.rb +1 -1
  192. data/spec/filters/unsupported/kernel.rb +2 -1
  193. data/spec/filters/unsupported/language.rb +6 -1
  194. data/spec/filters/unsupported/marshal.rb +1 -1
  195. data/spec/filters/unsupported/matchdata.rb +4 -1
  196. data/spec/filters/unsupported/math.rb +1 -1
  197. data/spec/filters/unsupported/pathname.rb +1 -1
  198. data/spec/filters/unsupported/privacy.rb +141 -9
  199. data/spec/filters/unsupported/proc.rb +1 -1
  200. data/spec/filters/unsupported/random.rb +4 -0
  201. data/spec/filters/unsupported/range.rb +7 -0
  202. data/spec/filters/unsupported/regexp.rb +25 -15
  203. data/spec/filters/unsupported/set.rb +1 -1
  204. data/spec/filters/unsupported/singleton.rb +1 -1
  205. data/spec/filters/unsupported/string.rb +110 -101
  206. data/spec/filters/unsupported/struct.rb +1 -1
  207. data/spec/filters/unsupported/symbol.rb +2 -1
  208. data/spec/filters/unsupported/taint.rb +22 -7
  209. data/spec/filters/unsupported/thread.rb +1 -1
  210. data/spec/filters/unsupported/time.rb +1 -1
  211. data/spec/lib/builder_spec.rb +17 -0
  212. data/spec/lib/cli_spec.rb +37 -8
  213. data/spec/lib/compiler/call_spec.rb +98 -66
  214. data/spec/lib/compiler_spec.rb +39 -30
  215. data/spec/lib/dependency_resolver_spec.rb +2 -2
  216. data/spec/lib/deprecations_spec.rb +16 -0
  217. data/spec/lib/fixtures/source_location_test.rb +7 -0
  218. data/spec/lib/rewriters/binary_operator_assignment_spec.rb +151 -0
  219. data/spec/lib/rewriters/block_to_iter_spec.rb +28 -0
  220. data/spec/lib/rewriters/dot_js_syntax_spec.rb +108 -0
  221. data/spec/lib/rewriters/explicit_writer_return_spec.rb +186 -0
  222. data/spec/lib/rewriters/js_reserved_words_spec.rb +116 -0
  223. data/spec/lib/rewriters/logical_operator_assignment_spec.rb +202 -0
  224. data/spec/lib/rewriters/opal_engine_check_spec.rb +82 -0
  225. data/spec/lib/rewriters/rubyspec/filters_rewriter_spec.rb +53 -0
  226. data/spec/lib/simple_server_spec.rb +54 -0
  227. data/spec/mspec-opal/formatters.rb +65 -17
  228. data/spec/mspec-opal/runner.rb +47 -67
  229. data/spec/opal/core/date_spec.rb +14 -0
  230. data/spec/opal/core/exception_spec.rb +10 -0
  231. data/spec/opal/core/hash/internals_spec.rb +10 -10
  232. data/spec/opal/core/kernel/rand_spec.rb +0 -4
  233. data/spec/opal/core/kernel/respond_to_spec.rb +5 -2
  234. data/spec/opal/core/language/constant_lookup_spec.rb +38 -0
  235. data/spec/opal/core/language/predefined_spec.rb +1 -1
  236. data/spec/opal/core/language/safe_navigator_spec.rb +7 -0
  237. data/spec/opal/core/language/send_spec.rb +1 -9
  238. data/spec/opal/core/language/string_spec.rb +8 -8
  239. data/spec/opal/core/language/versions/def_2_0_spec.rb +0 -4
  240. data/spec/opal/core/language_spec.rb +32 -0
  241. data/spec/opal/core/module/const_get_spec.rb +1 -1
  242. data/spec/opal/core/runtime/is_a_spec.rb +36 -0
  243. data/spec/opal/core/runtime/rescue_spec.rb +35 -0
  244. data/spec/opal/core/runtime_spec.rb +4 -4
  245. data/spec/opal/core/string_spec.rb +8 -8
  246. data/spec/opal/core/time_spec.rb +26 -17
  247. data/spec/opal/stdlib/erb/quoted.opalerb +1 -1
  248. data/spec/opal/stdlib/json/parse_spec.rb +4 -0
  249. data/spec/opal/stdlib/native/hash_spec.rb +16 -0
  250. data/spec/ruby_specs +2 -1
  251. data/spec/spec_helper.rb +1 -0
  252. data/spec/support/rewriters_helper.rb +24 -0
  253. data/stdlib/base64.rb +4 -2
  254. data/stdlib/bigdecimal/bignumber.js.rb +1 -1
  255. data/stdlib/date.rb +18 -19
  256. data/stdlib/json.rb +16 -4
  257. data/stdlib/nashorn/file.rb +15 -0
  258. data/stdlib/native.rb +21 -12
  259. data/stdlib/nodejs/dir.rb +1 -1
  260. data/stdlib/nodejs/file.rb +49 -20
  261. data/stdlib/nodejs/io.rb +22 -1
  262. data/stdlib/nodejs/{node_modules/js-yaml/dist/js-yaml.js → js-yaml-3-6-1.js} +815 -626
  263. data/stdlib/nodejs/kernel.rb +3 -1
  264. data/stdlib/nodejs/package.json +0 -1
  265. data/stdlib/nodejs/stacktrace.rb +163 -0
  266. data/stdlib/nodejs/yaml.rb +2 -1
  267. data/stdlib/opal-platform.rb +15 -0
  268. data/stdlib/opal/platform.rb +5 -13
  269. data/stdlib/pathname.rb +1 -1
  270. data/stdlib/strscan.rb +15 -1
  271. data/stdlib/yaml.rb +1 -1
  272. data/tasks/benchmarking.rake +9 -0
  273. data/tasks/building.rake +24 -20
  274. data/tasks/linting.rake +24 -13
  275. data/tasks/testing.rake +322 -205
  276. data/tasks/testing/mspec_special_calls.rb +44 -15
  277. data/tasks/testing/opal_rspec_smoketest.Gemfile +13 -0
  278. data/test/nodejs/fixtures/hello.rb +1 -0
  279. data/test/nodejs/test_file.rb +57 -0
  280. data/test/nodejs/test_io.rb +18 -0
  281. data/test/nodejs/test_opal_builder.rb +12 -0
  282. data/test/opal/unsupported_and_bugs.rb +9 -0
  283. metadata +127 -240
  284. data/lib/opal/parser/grammar.rb +0 -6157
  285. data/lib/opal/parser/grammar.y +0 -2011
  286. data/lib/opal/parser/keywords.rb +0 -66
  287. data/lib/opal/parser/lexer.rb +0 -1352
  288. data/lib/opal/parser/parser_scope.rb +0 -28
  289. data/lib/opal/parser/sexp.rb +0 -90
  290. data/lib/opal/sprockets.rb +0 -77
  291. data/lib/opal/sprockets/environment.rb +0 -23
  292. data/lib/opal/sprockets/erb.rb +0 -28
  293. data/lib/opal/sprockets/path_reader.rb +0 -36
  294. data/lib/opal/sprockets/processor.rb +0 -173
  295. data/lib/opal/sprockets/server.rb +0 -133
  296. data/lib/opal/sprockets/source_map_header_patch.rb +0 -41
  297. data/lib/opal/sprockets/source_map_server.rb +0 -117
  298. data/spec/filters/bugs/compiler_opal.rb +0 -5
  299. data/spec/filters/bugs/language_opal.rb +0 -88
  300. data/spec/filters/unsupported/module.rb +0 -8
  301. data/spec/lib/compiler/pre_processed_conditionals_spec.rb +0 -87
  302. data/spec/lib/lexer_spec.rb +0 -110
  303. data/spec/lib/parser/alias_spec.rb +0 -26
  304. data/spec/lib/parser/and_spec.rb +0 -13
  305. data/spec/lib/parser/aref_spec.rb +0 -10
  306. data/spec/lib/parser/attrasgn_spec.rb +0 -28
  307. data/spec/lib/parser/begin_spec.rb +0 -42
  308. data/spec/lib/parser/block_spec.rb +0 -12
  309. data/spec/lib/parser/break_spec.rb +0 -17
  310. data/spec/lib/parser/call_spec.rb +0 -201
  311. data/spec/lib/parser/class_spec.rb +0 -35
  312. data/spec/lib/parser/comments_spec.rb +0 -11
  313. data/spec/lib/parser/def_spec.rb +0 -109
  314. data/spec/lib/parser/if_spec.rb +0 -26
  315. data/spec/lib/parser/iter_spec.rb +0 -59
  316. data/spec/lib/parser/lambda_spec.rb +0 -219
  317. data/spec/lib/parser/literal_spec.rb +0 -118
  318. data/spec/lib/parser/masgn_spec.rb +0 -37
  319. data/spec/lib/parser/module_spec.rb +0 -27
  320. data/spec/lib/parser/not_spec.rb +0 -21
  321. data/spec/lib/parser/op_asgn1_spec.rb +0 -23
  322. data/spec/lib/parser/op_asgn2_spec.rb +0 -23
  323. data/spec/lib/parser/op_asgn_spec.rb +0 -17
  324. data/spec/lib/parser/or_spec.rb +0 -13
  325. data/spec/lib/parser/return_spec.rb +0 -22
  326. data/spec/lib/parser/sclass_spec.rb +0 -21
  327. data/spec/lib/parser/string_spec.rb +0 -286
  328. data/spec/lib/parser/super_spec.rb +0 -20
  329. data/spec/lib/parser/unary_spec.rb +0 -52
  330. data/spec/lib/parser/undef_spec.rb +0 -19
  331. data/spec/lib/parser/unless_spec.rb +0 -13
  332. data/spec/lib/parser/variables_spec.rb +0 -112
  333. data/spec/lib/parser/while_spec.rb +0 -15
  334. data/spec/lib/parser/yield_spec.rb +0 -20
  335. data/spec/lib/sprockets/erb_spec.rb +0 -38
  336. data/spec/lib/sprockets/path_reader_spec.rb +0 -41
  337. data/spec/lib/sprockets/processor_spec.rb +0 -79
  338. data/spec/lib/sprockets/server_spec.rb +0 -102
  339. data/spec/lib/sprockets_spec.rb +0 -39
  340. data/spec/lib/tilt/opal_spec.rb +0 -37
  341. data/spec/opal/core/language/block_spec.rb +0 -538
  342. data/spec/opal/core/language/proc_spec.rb +0 -263
  343. data/spec/opal/core/language/variables_spec.rb +0 -1366
  344. data/spec/opal/core/runtime/block_send_spec.rb +0 -28
  345. data/spec/opal/core/runtime/send_spec.rb +0 -34
  346. data/spec/support/parser_helpers.rb +0 -37
  347. data/stdlib/nodejs/node_modules/js-yaml/HISTORY.md +0 -277
  348. data/stdlib/nodejs/node_modules/js-yaml/LICENSE +0 -21
  349. data/stdlib/nodejs/node_modules/js-yaml/README.md +0 -288
  350. data/stdlib/nodejs/node_modules/js-yaml/bin/js-yaml.js +0 -140
  351. data/stdlib/nodejs/node_modules/js-yaml/bower.json +0 -23
  352. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.min.js +0 -3
  353. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.js +0 -102
  354. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.yml +0 -18
  355. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.js +0 -31
  356. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.json +0 -22
  357. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.js +0 -18
  358. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.yml +0 -197
  359. data/stdlib/nodejs/node_modules/js-yaml/index.js +0 -7
  360. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml.js +0 -39
  361. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/common.js +0 -62
  362. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/dumper.js +0 -554
  363. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/exception.js +0 -25
  364. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/loader.js +0 -1581
  365. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/mark.js +0 -78
  366. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema.js +0 -103
  367. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/core.js +0 -18
  368. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_full.js +0 -25
  369. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js +0 -28
  370. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js +0 -17
  371. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/json.js +0 -25
  372. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type.js +0 -61
  373. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/binary.js +0 -133
  374. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/bool.js +0 -37
  375. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/float.js +0 -110
  376. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/int.js +0 -183
  377. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/function.js +0 -85
  378. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js +0 -84
  379. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js +0 -27
  380. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/map.js +0 -8
  381. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/merge.js +0 -12
  382. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/null.js +0 -36
  383. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/omap.js +0 -56
  384. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/pairs.js +0 -61
  385. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/seq.js +0 -8
  386. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/set.js +0 -33
  387. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/str.js +0 -8
  388. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/timestamp.js +0 -98
  389. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/HISTORY.md +0 -115
  390. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/LICENSE +0 -21
  391. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/README.md +0 -239
  392. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/arguments.js +0 -36
  393. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/choice.js +0 -22
  394. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/constants.js +0 -59
  395. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/help.js +0 -13
  396. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/nargs.js +0 -33
  397. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/parents.js +0 -28
  398. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/prefix_chars.js +0 -23
  399. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sub_commands.js +0 -49
  400. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sum.js +0 -35
  401. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/testformatters.js +0 -270
  402. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/index.js +0 -1
  403. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action.js +0 -146
  404. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append.js +0 -55
  405. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append/constant.js +0 -47
  406. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/count.js +0 -40
  407. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/help.js +0 -48
  408. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store.js +0 -50
  409. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/constant.js +0 -43
  410. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/false.js +0 -27
  411. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/true.js +0 -26
  412. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/subparsers.js +0 -148
  413. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/version.js +0 -50
  414. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action_container.js +0 -481
  415. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argparse.js +0 -14
  416. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/error.js +0 -50
  417. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/exclusive.js +0 -54
  418. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/group.js +0 -75
  419. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js +0 -1168
  420. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/const.js +0 -18
  421. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/added_formatters.js +0 -88
  422. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js +0 -798
  423. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/namespace.js +0 -77
  424. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.npmignore +0 -2
  425. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml +0 -8
  426. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown +0 -825
  427. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/bower.json +0 -33
  428. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json +0 -11
  429. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/foo.js +0 -10
  430. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/gulpfile.js +0 -26
  431. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js +0 -673
  432. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/libpeerconnection.log +0 -0
  433. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json +0 -107
  434. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/LICENSE +0 -23
  435. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/README.md +0 -22
  436. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json +0 -69
  437. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js +0 -6
  438. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js +0 -1415
  439. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/package.json +0 -62
  440. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/README.md +0 -73
  441. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esparse.js +0 -117
  442. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esvalidate.js +0 -177
  443. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/esprima.js +0 -3908
  444. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/package.json +0 -69
  445. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/compat.js +0 -239
  446. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/reflect.js +0 -422
  447. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/run.js +0 -66
  448. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/runner.js +0 -387
  449. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/test.js +0 -20238
  450. data/stdlib/nodejs/node_modules/js-yaml/package.json +0 -83
@@ -1 +1 @@
1
- <div class="foo">hello <%= "there " + @name %></div>
1
+ <div class="foo">hello <%= "there" + " #{@name}" %></div>
@@ -30,4 +30,8 @@ describe "JSON.parse" do
30
30
  JSON.parse('{"a": "b"}').should == {"a" => "b"}
31
31
  JSON.parse('{"a": null, "b": 10, "c": [true, false]}').should == {"a" => nil, "b" => 10, "c" => [true, false]}
32
32
  end
33
+
34
+ it "raises ParserError for invalid JSON" do
35
+ lambda { JSON.parse("invalid_json") }.should raise_error(JSON::ParserError)
36
+ end
33
37
  end
@@ -12,6 +12,7 @@ describe Hash do
12
12
  e: [
13
13
  {
14
14
  f: 'g',
15
+ h: [null],
15
16
  },
16
17
  ],
17
18
  }
@@ -27,6 +28,7 @@ describe Hash do
27
28
  e: [
28
29
  {
29
30
  f: 'g',
31
+ h: [nil],
30
32
  },
31
33
  ],
32
34
  }
@@ -34,6 +36,20 @@ describe Hash do
34
36
  expect(h).to eq(expected_hash)
35
37
  end
36
38
 
39
+ it 'turns Object.create(null) JS objects into a hash' do
40
+ %x{
41
+ var obj = Object.create(null);
42
+ var foo = Object.create(null);
43
+ var bar = Object.create(null);
44
+ obj.foo = foo;
45
+ foo.bar = bar;
46
+ bar.baz = 'baz';
47
+ }
48
+ hash = Hash.new(`obj`)
49
+
50
+ expect(hash).to eq({ foo: { bar: { baz: 'baz' } } })
51
+ end
52
+
37
53
  describe '#to_n' do
38
54
  it 'converts a hash with native objects as values' do
39
55
  obj = { 'a_key' => `{ key: 1 }` }
@@ -18,6 +18,7 @@ ruby/core/fixnum
18
18
  ruby/core/file/basename_spec
19
19
  ruby/core/file/dirname_spec
20
20
  ruby/core/file/extname_spec
21
+ ruby/core/file/join_spec
21
22
  ruby/core/float
22
23
  ruby/core/hash
23
24
  ruby/core/integer
@@ -82,6 +83,7 @@ ruby/core/proc
82
83
  ruby/core/range
83
84
  ruby/core/rational
84
85
  ruby/core/regexp
86
+ ruby/core/random
85
87
 
86
88
  ruby/core/string
87
89
  !ruby/core/string/crypt_spec
@@ -98,7 +100,6 @@ ruby/core/true
98
100
  ruby/core/unboundmethod
99
101
 
100
102
  ruby/language
101
- !ruby/language/constants_spec
102
103
  !ruby/language/execution_spec
103
104
 
104
105
  ruby/library/base64
@@ -1,5 +1,6 @@
1
1
  require 'opal'
2
2
  require 'set'
3
+ require 'opal/platform'
3
4
  require 'opal-parser'
4
5
  require 'mspec'
5
6
  require 'mspec/version'
@@ -0,0 +1,24 @@
1
+ module RewritersHelper
2
+ def s(type, *children)
3
+ ::Opal::AST::Node.new(type, children)
4
+ end
5
+
6
+ def rewritten(ast)
7
+ described_class.new.process(ast)
8
+ end
9
+
10
+ def expect_rewritten(ast)
11
+ expect(rewritten(ast))
12
+ end
13
+
14
+ def expect_no_rewriting_for(ast)
15
+ expect_rewritten(ast).to eq(ast)
16
+ end
17
+
18
+ def ast_of(source)
19
+ buffer = Parser::Source::Buffer.new('(eval)')
20
+ buffer.source = source
21
+ parser = Opal::Parser.default_parser
22
+ parser.parse(buffer)
23
+ end
24
+ end
@@ -76,7 +76,9 @@ module Base64
76
76
  `decode(string.replace(/\-/g, '+').replace(/_/g, '/'))`
77
77
  end
78
78
 
79
- def self.urlsafe_encode64(string)
80
- `encode(string).replace(/\+/g, '-').replace(/\//g, '_')`
79
+ def self.urlsafe_encode64(string, padding: true)
80
+ str = `encode(string).replace(/\+/g, '-').replace(/\//g, '_')`
81
+ str = str.delete("=") unless padding
82
+ str
81
83
  end
82
84
  end
@@ -1,6 +1,6 @@
1
1
  class BigDecimal
2
2
  %x{
3
- var define = function (f) { Opal.casgn(self, 'BigNumber', f()); };
3
+ var define = function (f) { Opal.const_set(self, 'BigNumber', f()); };
4
4
  define.amd = true;
5
5
 
6
6
  /* jshint ignore:start */
@@ -1,4 +1,6 @@
1
1
  class Date
2
+ include Comparable
3
+
2
4
  class Infinity < Numeric
3
5
  include Comparable
4
6
 
@@ -122,7 +124,7 @@ class Date
122
124
  // Converts month abbr (nov) to a month number
123
125
  function fromMonthAbbr(fn) {
124
126
  return function(match) {
125
- var abbr = fn(match);
127
+ var abbr = fn(match).toLowerCase();
126
128
  return #{ABBR_MONTHNAMES}.indexOf(abbr) + 1;
127
129
  }
128
130
  }
@@ -419,29 +421,26 @@ class Date
419
421
  return #{self.jd <=> other}
420
422
  }
421
423
 
422
- var a = #@date, b = #{other}.date;
423
- a.setHours(0, 0, 0, 0);
424
- b.setHours(0, 0, 0, 0);
424
+ if (#{Date === other}) {
425
+ var a = #@date, b = #{other}.date;
426
+ a.setHours(0, 0, 0, 0);
427
+ b.setHours(0, 0, 0, 0);
425
428
 
426
- if (a < b) {
427
- return -1;
428
- }
429
- else if (a > b) {
430
- return 1;
431
- }
432
- else {
433
- return 0;
429
+ if (a < b) {
430
+ return -1;
431
+ }
432
+ else if (a > b) {
433
+ return 1;
434
+ }
435
+ else {
436
+ return 0;
437
+ }
438
+ } else {
439
+ return nil;
434
440
  }
435
441
  }
436
442
  end
437
443
 
438
- def ==(other)
439
- %x{
440
- var a = #@date, b = other.date;
441
- return (a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate());
442
- }
443
- end
444
-
445
444
  def >>(n)
446
445
  %x{
447
446
  if (!n.$$is_number) {
@@ -1,7 +1,20 @@
1
1
  module JSON
2
+ class JSONError < StandardError
3
+ end
4
+
5
+ class ParserError < JSONError
6
+ end
7
+
2
8
  %x{
3
- var $parse = JSON.parse,
4
- $hasOwn = Opal.hasOwnProperty;
9
+ var $hasOwn = Opal.hasOwnProperty;
10
+
11
+ function $parse(source) {
12
+ try {
13
+ return JSON.parse(source);
14
+ } catch (e) {
15
+ #{raise JSON::ParserError, `e.message`};
16
+ }
17
+ };
5
18
 
6
19
  function to_opal(value, options) {
7
20
  var klass, arr, hash, i, ii, k;
@@ -41,8 +54,7 @@ module JSON
41
54
  }
42
55
 
43
56
  if (!options.parse && (klass = #{`hash`[JSON.create_id]}) != nil) {
44
- klass = Opal.get(klass);
45
- return #{`klass`.json_create(`hash`)};
57
+ return #{::Object.const_get(`klass`).json_create(`hash`)};
46
58
  }
47
59
  else {
48
60
  return hash;
@@ -10,4 +10,19 @@ class File
10
10
  return data.join("\n");
11
11
  )
12
12
  end
13
+
14
+ def self.file? path
15
+ %x(
16
+ var Files = Java.type('java.nio.file.Files');
17
+ return Files.exists(path) && Files.isRegularFile(path);
18
+ )
19
+ end
20
+
21
+ def self.readable? path
22
+ %x(
23
+ var Files = Java.type('java.nio.file.Files');
24
+ return Files.exists(path) && Files.isReadable(path);
25
+ )
26
+ end
27
+
13
28
  end
@@ -12,6 +12,9 @@
12
12
  # do_later = $$[:setTimeout] # Accessing the "setTimeout" property
13
13
  # do_later.call(->{ puts :hello}, 500)
14
14
  #
15
+ # `$$` and `$global` wrap `Opal.global`, which the Opal JS runtime
16
+ # sets to the global `this` object.
17
+ #
15
18
  module Native
16
19
  def self.is_a?(object, klass)
17
20
  %x{
@@ -81,7 +84,7 @@ module Native
81
84
  def self.proc(&block)
82
85
  raise LocalJumpError, "no block given" unless block
83
86
 
84
- Kernel.proc {|*args|
87
+ ::Kernel.proc {|*args|
85
88
  args.map! { |arg| Native(arg) }
86
89
  instance = Native(`this`)
87
90
 
@@ -189,8 +192,8 @@ module Native
189
192
  end
190
193
 
191
194
  def initialize(native)
192
- unless Kernel.native?(native)
193
- Kernel.raise ArgumentError, "#{native.inspect} isn't native"
195
+ unless ::Kernel.native?(native)
196
+ ::Kernel.raise ArgumentError, "#{native.inspect} isn't native"
194
197
  end
195
198
 
196
199
  @native = native
@@ -245,7 +248,7 @@ class Native::Object < BasicObject
245
248
  include ::Native
246
249
 
247
250
  def ==(other)
248
- `#@native === #{Native.try_convert(other)}`
251
+ `#@native === #{::Native.try_convert(other)}`
249
252
  end
250
253
 
251
254
  def has_key?(name)
@@ -284,7 +287,7 @@ class Native::Object < BasicObject
284
287
  end
285
288
 
286
289
  def []=(key, value)
287
- native = Native.try_convert(value)
290
+ native = ::Native.try_convert(value)
288
291
 
289
292
  if `#{native} === nil`
290
293
  `#@native[key] = #{value}`
@@ -295,7 +298,7 @@ class Native::Object < BasicObject
295
298
 
296
299
  def merge!(other)
297
300
  %x{
298
- other = #{Native.convert(other)};
301
+ other = #{::Native.convert(other)};
299
302
 
300
303
  for (var prop in other) {
301
304
  #@native[prop] = other[prop];
@@ -306,7 +309,7 @@ class Native::Object < BasicObject
306
309
  end
307
310
 
308
311
  def respond_to?(name, include_all = false)
309
- Kernel.instance_method(:respond_to?).bind(self).call(name, include_all)
312
+ ::Kernel.instance_method(:respond_to?).bind(self).call(name, include_all)
310
313
  end
311
314
 
312
315
  def respond_to_missing?(name, include_all = false)
@@ -343,7 +346,7 @@ class Native::Object < BasicObject
343
346
  end
344
347
 
345
348
  def to_a(options = {}, &block)
346
- Native::Array.new(@native, options, &block).to_a
349
+ ::Native::Array.new(@native, options, &block).to_a
347
350
  end
348
351
 
349
352
  def inspect
@@ -526,7 +529,9 @@ class Hash
526
529
 
527
530
  def initialize(defaults = undefined, &block)
528
531
  %x{
529
- if (defaults != null && defaults.constructor === Object) {
532
+ if (defaults != null &&
533
+ (defaults.constructor === undefined ||
534
+ defaults.constructor === Object)) {
530
535
  var smap = self.$$smap,
531
536
  keys = self.$$keys,
532
537
  key, value;
@@ -534,15 +539,19 @@ class Hash
534
539
  for (key in defaults) {
535
540
  value = defaults[key];
536
541
 
537
- if (value && value.constructor === Object) {
542
+ if (value &&
543
+ (value.constructor === undefined ||
544
+ value.constructor === Object)) {
538
545
  smap[key] = #{Hash.new(`value`)};
539
546
  } else if (value && value.$$is_array) {
540
547
  value = value.map(function(item) {
541
- if (item && item.constructor === Object) {
548
+ if (item &&
549
+ (item.constructor === undefined ||
550
+ item.constructor === Object)) {
542
551
  return #{Hash.new(`item`)};
543
552
  }
544
553
 
545
- return item;
554
+ return #{Native(`item`)};
546
555
  });
547
556
  smap[key] = value
548
557
  } else {
@@ -21,7 +21,7 @@ class Dir
21
21
  %x{
22
22
  var result = [];
23
23
  var entries = __fs__.readdirSync(#{dirname});
24
- for (var i = 0; i < entries.length; i++) {
24
+ for (var i = 0, ii = entries.length; i < ii; i++) {
25
25
  result.push(entries[i]);
26
26
  }
27
27
  return result;
@@ -19,6 +19,20 @@
19
19
  warnings[string] = true;
20
20
  #{warn(`string`)};
21
21
  }
22
+ function executeIOAction(action) {
23
+ try {
24
+ return action();
25
+ } catch (error) {
26
+ if (error.code === 'EACCES' ||
27
+ error.code === 'EISDIR' ||
28
+ error.code === 'EMFILE' ||
29
+ error.code === 'ENOENT' ||
30
+ error.code === 'EPERM') {
31
+ throw Opal.IOError.$new(error.message)
32
+ }
33
+ throw error;
34
+ }
35
+ }
22
36
  }
23
37
 
24
38
  class File < IO
@@ -30,18 +44,22 @@ class File < IO
30
44
  `var __fs__ = #{@__fs__}`
31
45
  `var __path__ = #{@__path__}`
32
46
 
47
+ if `__path__.sep !== #{Separator}`
48
+ ALT_SEPARATOR = `__path__.sep`
49
+ end
50
+
33
51
  def self.read path
34
- `__fs__.readFileSync(#{path}).toString()`
52
+ `return executeIOAction(function(){return __fs__.readFileSync(#{path}).toString()})`
35
53
  end
36
54
 
37
55
  def self.write path, data
38
- `__fs__.writeFileSync(#{path}, #{data})`
56
+ `executeIOAction(function(){return __fs__.writeFileSync(#{path}, #{data})})`
39
57
  data.size
40
58
  end
41
59
 
42
60
  def self.exist? path
43
61
  path = path.path if path.respond_to? :path
44
- `__fs__.existsSync(#{path})`
62
+ `return executeIOAction(function(){return __fs__.existsSync(#{path})})`
45
63
  end
46
64
 
47
65
  def self.realpath(pathname, dir_string = nil, cache = nil, &block)
@@ -49,12 +67,12 @@ class File < IO
49
67
  if block_given?
50
68
  `
51
69
  __fs__.realpath(#{pathname}, #{cache}, function(error, realpath){
52
- if (error) #{raise error.message}
70
+ if (error) Opal.IOError.$new(error.message)
53
71
  else #{block.call(`realpath`)}
54
72
  })
55
73
  `
56
74
  else
57
- `__fs__.realpathSync(#{pathname}, #{cache})`
75
+ `return executeIOAction(function(){return __fs__.realpathSync(#{pathname}, #{cache})})`
58
76
  end
59
77
  end
60
78
 
@@ -63,18 +81,29 @@ class File < IO
63
81
  end
64
82
 
65
83
  def self.directory? path
66
- return nil unless exist? path
67
- `!!__fs__.lstatSync(path).isDirectory()`
84
+ return false unless exist? path
85
+ `return executeIOAction(function(){return !!__fs__.lstatSync(path).isDirectory()})`
68
86
  end
69
87
 
70
88
  def self.file? path
71
- return nil unless exist? path
72
- `!!__fs__.lstatSync(path).isFile()`
89
+ return false unless exist? path
90
+ `return executeIOAction(function(){return !!__fs__.lstatSync(path).isFile()})`
91
+ end
92
+
93
+ def self.readable? path
94
+ return false unless exist? path
95
+ %{
96
+ try {
97
+ __fs__.accessSync(path, __fs__.R_OK);
98
+ return true;
99
+ } catch (error) {
100
+ return false;
101
+ }
102
+ }
73
103
  end
74
104
 
75
105
  def self.size path
76
- return nil unless exist? path
77
- `__fs__.lstatSync(path).size`
106
+ `return executeIOAction(function(){return __fs__.lstatSync(path).size})`
78
107
  end
79
108
 
80
109
  def self.open path, flags
@@ -96,12 +125,12 @@ class File < IO
96
125
  end
97
126
 
98
127
  def self.mtime path
99
- `__fs__.statSync(#{path}).mtime`
128
+ `return executeIOAction(function(){return __fs__.statSync(#{path}).mtime})`
100
129
  end
101
130
 
102
131
  # Instance Methods
103
132
 
104
- def initialize(path, flags)
133
+ def initialize(path, flags = 'r')
105
134
  binary_flag_regexp = /b/
106
135
  encoding_flag_regexp = /:(.*)/
107
136
  # binary flag is unsupported
@@ -112,25 +141,25 @@ class File < IO
112
141
  flags = flags.gsub(encoding_flag_regexp, '')
113
142
  @path = path
114
143
  @flags = flags
115
- @fd = `__fs__.openSync(path, flags)`
144
+ @fd = `executeIOAction(function(){return __fs__.openSync(path, flags)})`
116
145
  end
117
146
 
118
147
  attr_reader :path
119
148
 
120
149
  def write string
121
- `__fs__.writeSync(#{@fd}, #{string})`
150
+ `executeIOAction(function(){return __fs__.writeSync(#{@fd}, #{string})})`
122
151
  end
123
152
 
124
153
  def flush
125
- `__fs__.fsyncSync(#@fd)`
154
+ `executeIOAction(function(){return __fs__.fsyncSync(#@fd)})`
126
155
  end
127
156
 
128
157
  def close
129
- `__fs__.closeSync(#{@fd})`
158
+ `executeIOAction(function(){return __fs__.closeSync(#{@fd})})`
130
159
  end
131
160
 
132
161
  def mtime
133
- `__fs__.statSync(#{@path}).mtime`
162
+ `return executeIOAction(function(){return __fs__.statSync(#{@path}).mtime})`
134
163
  end
135
164
  end
136
165
 
@@ -144,10 +173,10 @@ class File::Stat
144
173
  end
145
174
 
146
175
  def file?
147
- `__fs__.statSync(#{@path}).isFile()`
176
+ `return executeIOAction(function(){return __fs__.statSync(#{@path}).isFile()})`
148
177
  end
149
178
 
150
179
  def mtime
151
- `__fs__.statSync(#{@path}).mtime`
180
+ `return executeIOAction(function(){return __fs__.statSync(#{@path}).mtime})`
152
181
  end
153
182
  end