opal 0.10.6 → 0.11.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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