opal 0.8.1 → 0.9.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 (331) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -2
  3. data/.gitmodules +3 -3
  4. data/.jshintrc +17 -20
  5. data/.travis.yml +22 -11
  6. data/CHANGELOG.md +51 -1
  7. data/CODE_OF_CONDUCT.md +15 -0
  8. data/CONTRIBUTING.md +125 -9
  9. data/Gemfile +1 -1
  10. data/Guardfile +2 -2
  11. data/README.md +95 -29
  12. data/Rakefile +1 -1
  13. data/benchmark/benchmarks +103 -0
  14. data/benchmark/bm_array_flatten.rb +9 -0
  15. data/benchmark/bm_array_intersection_numbers.rb +7 -0
  16. data/benchmark/bm_array_intersection_objects.rb +7 -0
  17. data/benchmark/bm_array_intersection_strings.rb +7 -0
  18. data/benchmark/bm_array_join_ary.rb +9 -0
  19. data/benchmark/bm_array_minus_numbers.rb +7 -0
  20. data/benchmark/bm_array_minus_objects.rb +7 -0
  21. data/benchmark/bm_array_minus_strings.rb +7 -0
  22. data/benchmark/bm_array_union_numbers.rb +7 -0
  23. data/benchmark/bm_array_union_objects.rb +7 -0
  24. data/benchmark/bm_array_union_strings.rb +7 -0
  25. data/benchmark/bm_array_uniq_bang_numbers.rb +5 -0
  26. data/benchmark/bm_array_uniq_bang_objects.rb +5 -0
  27. data/benchmark/bm_array_uniq_bang_strings.rb +5 -0
  28. data/benchmark/bm_array_uniq_numbers.rb +5 -0
  29. data/benchmark/bm_array_uniq_objects.rb +5 -0
  30. data/benchmark/bm_array_uniq_strings.rb +5 -0
  31. data/benchmark/bm_dispatch_bind_table.rb +57 -0
  32. data/benchmark/bm_dispatch_code_gen.rb +65 -0
  33. data/benchmark/bm_dispatch_code_gen_if.rb +64 -0
  34. data/benchmark/bm_dispatch_hardcoded.rb +44 -0
  35. data/benchmark/bm_dispatch_send.rb +38 -0
  36. data/benchmark/bm_dispatch_send_table.rb +57 -0
  37. data/benchmark/bm_hash_assoc_object.rb +11 -0
  38. data/benchmark/bm_hash_assoc_string.rb +9 -0
  39. data/benchmark/bm_hash_clone_object.rb +9 -0
  40. data/benchmark/bm_hash_clone_string.rb +9 -0
  41. data/benchmark/bm_hash_delete_object.rb +11 -0
  42. data/benchmark/bm_hash_delete_string.rb +9 -0
  43. data/benchmark/bm_hash_each_key_object.rb +9 -0
  44. data/benchmark/bm_hash_each_key_string.rb +9 -0
  45. data/benchmark/bm_hash_each_object.rb +9 -0
  46. data/benchmark/bm_hash_each_string.rb +9 -0
  47. data/benchmark/bm_hash_each_value_object.rb +9 -0
  48. data/benchmark/bm_hash_each_value_string.rb +9 -0
  49. data/benchmark/bm_hash_element_reference_object.rb +11 -0
  50. data/benchmark/bm_hash_element_reference_string.rb +9 -0
  51. data/benchmark/bm_hash_element_set_object.rb +5 -0
  52. data/benchmark/bm_hash_element_set_string.rb +5 -0
  53. data/benchmark/bm_hash_equal_value_object.rb +14 -0
  54. data/benchmark/bm_hash_equal_value_string.rb +11 -0
  55. data/benchmark/bm_hash_fetch_object.rb +11 -0
  56. data/benchmark/bm_hash_fetch_string.rb +9 -0
  57. data/benchmark/bm_hash_flatten_object.rb +9 -0
  58. data/benchmark/bm_hash_flatten_string.rb +9 -0
  59. data/benchmark/bm_hash_has_key_object.rb +11 -0
  60. data/benchmark/bm_hash_has_key_string.rb +9 -0
  61. data/benchmark/bm_hash_has_value_object.rb +9 -0
  62. data/benchmark/bm_hash_has_value_string.rb +9 -0
  63. data/benchmark/bm_hash_hash_object.rb +9 -0
  64. data/benchmark/bm_hash_hash_string.rb +9 -0
  65. data/benchmark/bm_hash_inspect_object.rb +9 -0
  66. data/benchmark/bm_hash_inspect_string.rb +9 -0
  67. data/benchmark/bm_hash_invert_object.rb +9 -0
  68. data/benchmark/bm_hash_invert_string.rb +9 -0
  69. data/benchmark/bm_hash_keep_if_object.rb +9 -0
  70. data/benchmark/bm_hash_keep_if_string.rb +9 -0
  71. data/benchmark/bm_hash_key_object.rb +9 -0
  72. data/benchmark/bm_hash_key_string.rb +9 -0
  73. data/benchmark/bm_hash_keys_object.rb +9 -0
  74. data/benchmark/bm_hash_keys_string.rb +9 -0
  75. data/benchmark/bm_hash_literal_mixed_large.rb +3 -0
  76. data/benchmark/bm_hash_literal_mixed_small.rb +3 -0
  77. data/benchmark/bm_hash_literal_object_large.rb +4 -0
  78. data/benchmark/bm_hash_literal_object_small.rb +3 -0
  79. data/benchmark/bm_hash_literal_string_large.rb +4 -0
  80. data/benchmark/bm_hash_literal_string_small.rb +3 -0
  81. data/benchmark/bm_hash_merge_object.rb +22 -0
  82. data/benchmark/bm_hash_merge_string.rb +18 -0
  83. data/benchmark/bm_hash_rassoc_object.rb +9 -0
  84. data/benchmark/bm_hash_rassoc_string.rb +9 -0
  85. data/benchmark/bm_hash_rehash_object.rb +9 -0
  86. data/benchmark/bm_hash_rehash_string.rb +9 -0
  87. data/benchmark/bm_hash_reject_bang_object.rb +9 -0
  88. data/benchmark/bm_hash_reject_bang_string.rb +9 -0
  89. data/benchmark/bm_hash_reject_object.rb +9 -0
  90. data/benchmark/bm_hash_reject_string.rb +9 -0
  91. data/benchmark/bm_hash_replace_object.rb +18 -0
  92. data/benchmark/bm_hash_replace_string.rb +14 -0
  93. data/benchmark/bm_hash_select_bang_object.rb +9 -0
  94. data/benchmark/bm_hash_select_bang_string.rb +9 -0
  95. data/benchmark/bm_hash_select_object.rb +9 -0
  96. data/benchmark/bm_hash_select_string.rb +9 -0
  97. data/benchmark/bm_hash_shift_object.rb +10 -0
  98. data/benchmark/bm_hash_shift_string.rb +10 -0
  99. data/benchmark/bm_hash_to_a_object.rb +9 -0
  100. data/benchmark/bm_hash_to_a_string.rb +9 -0
  101. data/benchmark/bm_hash_to_h_object.rb +10 -0
  102. data/benchmark/bm_hash_to_h_string.rb +10 -0
  103. data/benchmark/bm_hash_values_object.rb +9 -0
  104. data/benchmark/bm_hash_values_string.rb +9 -0
  105. data/benchmark/run.rb +48 -0
  106. data/bin/opal-mspec +1 -1
  107. data/bin/opal-repl +4 -4
  108. data/docs/compiled_ruby.md +214 -56
  109. data/docs/configuring_gems.md +2 -2
  110. data/docs/faq.md +2 -2
  111. data/docs/getting_started.md +19 -2
  112. data/docs/jquery.md +5 -5
  113. data/docs/opal_parser.md +53 -0
  114. data/docs/unsupported_features.md +2 -2
  115. data/docs/upgrading.md +22 -0
  116. data/docs/using_sprockets.md +15 -0
  117. data/examples/rack/config.ru +13 -0
  118. data/examples/sinatra/config.ru +4 -5
  119. data/lib/mspec/opal/runner.rb +54 -11
  120. data/lib/opal.rb +1 -1
  121. data/lib/opal/builder.rb +1 -1
  122. data/lib/opal/builder_processors.rb +1 -1
  123. data/lib/opal/cli.rb +17 -13
  124. data/lib/opal/cli_options.rb +1 -1
  125. data/lib/opal/compiler.rb +12 -0
  126. data/lib/opal/config.rb +4 -0
  127. data/lib/opal/nodes/arglist.rb +5 -7
  128. data/lib/opal/nodes/call.rb +6 -1
  129. data/lib/opal/nodes/call_special.rb +74 -0
  130. data/lib/opal/nodes/def.rb +35 -28
  131. data/lib/opal/nodes/definitions.rb +3 -5
  132. data/lib/opal/nodes/for.rb +13 -0
  133. data/lib/opal/nodes/helpers.rb +15 -1
  134. data/lib/opal/nodes/if.rb +5 -5
  135. data/lib/opal/nodes/iter.rb +6 -1
  136. data/lib/opal/nodes/literal.rb +1 -1
  137. data/lib/opal/nodes/logic.rb +2 -2
  138. data/lib/opal/nodes/masgn.rb +1 -2
  139. data/lib/opal/nodes/module.rb +2 -1
  140. data/lib/opal/nodes/rescue.rb +10 -1
  141. data/lib/opal/nodes/scope.rb +8 -2
  142. data/lib/opal/nodes/singleton_class.rb +1 -1
  143. data/lib/opal/nodes/top.rb +11 -0
  144. data/lib/opal/nodes/variables.rb +4 -4
  145. data/lib/opal/parser.rb +21 -3
  146. data/lib/opal/parser/grammar.rb +3115 -2961
  147. data/lib/opal/parser/grammar.y +29 -6
  148. data/lib/opal/parser/lexer.rb +18 -8
  149. data/lib/opal/sprockets.rb +85 -0
  150. data/lib/opal/sprockets/processor.rb +11 -35
  151. data/lib/opal/sprockets/server.rb +3 -15
  152. data/lib/opal/version.rb +2 -2
  153. data/opal.gemspec +4 -4
  154. data/opal/README.md +9 -0
  155. data/opal/corelib/array.rb +433 -181
  156. data/opal/corelib/basic_object.rb +48 -4
  157. data/opal/corelib/boolean.rb +15 -6
  158. data/opal/corelib/class.rb +6 -5
  159. data/opal/corelib/comparable.rb +12 -0
  160. data/opal/corelib/complex.rb +282 -0
  161. data/opal/corelib/constants.rb +9 -0
  162. data/opal/corelib/enumerable.rb +83 -34
  163. data/opal/corelib/enumerator.rb +3 -1
  164. data/opal/corelib/error.rb +49 -10
  165. data/opal/corelib/file.rb +1 -0
  166. data/opal/corelib/hash.rb +353 -577
  167. data/opal/corelib/helpers.rb +20 -0
  168. data/opal/corelib/kernel.rb +114 -59
  169. data/opal/corelib/math.rb +470 -0
  170. data/opal/corelib/method.rb +11 -2
  171. data/opal/corelib/module.rb +96 -96
  172. data/opal/corelib/{nil_class.rb → nil.rb} +20 -1
  173. data/opal/corelib/number.rb +751 -0
  174. data/opal/corelib/numeric.rb +77 -437
  175. data/opal/corelib/proc.rb +81 -1
  176. data/opal/corelib/process.rb +27 -0
  177. data/opal/corelib/rational.rb +358 -0
  178. data/opal/corelib/regexp.rb +156 -27
  179. data/opal/corelib/runtime.js +724 -335
  180. data/opal/corelib/string.rb +93 -104
  181. data/opal/corelib/string/encoding.rb +177 -0
  182. data/opal/corelib/string/inheritance.rb +2 -0
  183. data/opal/corelib/struct.rb +105 -18
  184. data/opal/corelib/time.rb +267 -146
  185. data/opal/corelib/unsupported.rb +216 -0
  186. data/opal/corelib/variables.rb +0 -6
  187. data/opal/opal.rb +8 -22
  188. data/opal/opal/base.rb +9 -0
  189. data/opal/opal/mini.rb +17 -0
  190. data/spec/README.md +1 -1
  191. data/spec/filters/bugs/array.rb +38 -136
  192. data/spec/filters/bugs/{basic_object.rb → basicobject.rb} +14 -15
  193. data/spec/filters/bugs/class.rb +6 -12
  194. data/spec/filters/bugs/complex.rb +3 -0
  195. data/spec/filters/bugs/date.rb +162 -10
  196. data/spec/filters/bugs/enumerable.rb +31 -58
  197. data/spec/filters/bugs/enumerator.rb +42 -0
  198. data/spec/filters/bugs/exception.rb +66 -10
  199. data/spec/filters/bugs/float.rb +17 -0
  200. data/spec/filters/bugs/hash.rb +11 -97
  201. data/spec/filters/bugs/inheritance.rb +5 -0
  202. data/spec/filters/bugs/integer.rb +28 -0
  203. data/spec/filters/bugs/kernel.rb +304 -12
  204. data/spec/filters/bugs/language.rb +133 -399
  205. data/spec/filters/bugs/language_opal.rb +88 -0
  206. data/spec/filters/bugs/module.rb +203 -62
  207. data/spec/filters/bugs/numeric.rb +32 -0
  208. data/spec/filters/bugs/proc.rb +39 -0
  209. data/spec/filters/bugs/range.rb +148 -0
  210. data/spec/filters/bugs/regexp.rb +168 -0
  211. data/spec/filters/bugs/set.rb +46 -3
  212. data/spec/filters/bugs/singleton.rb +1 -2
  213. data/spec/filters/bugs/string.rb +59 -90
  214. data/spec/filters/bugs/strscan.rb +80 -0
  215. data/spec/filters/bugs/struct.rb +10 -20
  216. data/spec/filters/bugs/time.rb +17 -184
  217. data/spec/filters/bugs/unboundmethod.rb +22 -0
  218. data/spec/filters/unsupported/array.rb +163 -0
  219. data/spec/filters/unsupported/basicobject.rb +14 -0
  220. data/spec/filters/unsupported/bignum.rb +46 -0
  221. data/spec/filters/unsupported/class.rb +4 -0
  222. data/spec/filters/unsupported/delegator.rb +5 -0
  223. data/spec/filters/unsupported/enumerable.rb +11 -0
  224. data/spec/filters/unsupported/enumerator.rb +8 -9
  225. data/spec/filters/unsupported/fixnum.rb +14 -0
  226. data/spec/filters/unsupported/float.rb +41 -7
  227. data/spec/filters/unsupported/freeze.rb +45 -0
  228. data/spec/filters/unsupported/hash.rb +50 -0
  229. data/spec/filters/unsupported/integer.rb +3 -0
  230. data/spec/filters/unsupported/kernel.rb +31 -0
  231. data/spec/filters/unsupported/language.rb +17 -0
  232. data/spec/filters/unsupported/matchdata.rb +30 -0
  233. data/spec/filters/unsupported/math.rb +3 -0
  234. data/spec/filters/unsupported/module.rb +5 -3
  235. data/spec/filters/unsupported/pathname.rb +3 -0
  236. data/spec/filters/unsupported/privacy.rb +136 -0
  237. data/spec/filters/unsupported/proc.rb +3 -0
  238. data/spec/filters/unsupported/regexp.rb +59 -0
  239. data/spec/filters/unsupported/set.rb +4 -0
  240. data/spec/filters/unsupported/{marshal.rb → singleton.rb} +4 -2
  241. data/spec/filters/unsupported/{mutable_strings.rb → string.rb} +456 -336
  242. data/spec/filters/unsupported/struct.rb +3 -0
  243. data/spec/filters/unsupported/symbol.rb +5 -0
  244. data/spec/filters/unsupported/taint.rb +16 -0
  245. data/spec/filters/unsupported/thread.rb +5 -0
  246. data/spec/filters/unsupported/time.rb +197 -16
  247. data/spec/lib/cli_spec.rb +14 -4
  248. data/spec/lib/compiler_spec.rb +9 -1
  249. data/spec/lib/parser/call_spec.rb +18 -0
  250. data/spec/lib/parser/not_spec.rb +2 -8
  251. data/spec/lib/sprockets_spec.rb +24 -0
  252. data/spec/opal/core/array/intersection_spec.rb +38 -0
  253. data/spec/opal/core/array/minus_spec.rb +38 -0
  254. data/spec/opal/core/array/union_spec.rb +38 -0
  255. data/spec/opal/core/array/uniq_spec.rb +49 -0
  256. data/spec/opal/core/exception_spec.rb +7 -0
  257. data/spec/opal/core/fixtures/require_tree_with_dot/file 1.rb +1 -0
  258. data/spec/opal/core/fixtures/require_tree_with_dot/file 2.rb +1 -0
  259. data/spec/opal/core/fixtures/require_tree_with_dot/file 3.rb +1 -0
  260. data/spec/opal/core/fixtures/require_tree_with_dot/index.rb +3 -0
  261. data/spec/opal/core/hash/internals_spec.rb +332 -0
  262. data/spec/opal/core/helpers_spec.rb +14 -0
  263. data/spec/opal/core/kernel/freeze_spec.rb +1 -1
  264. data/spec/opal/core/kernel/raise_spec.rb +13 -0
  265. data/spec/opal/core/kernel/require_tree_spec.rb +9 -0
  266. data/spec/opal/core/language/class_spec.rb +55 -0
  267. data/spec/opal/core/language/fixtures/send.rb +1 -0
  268. data/spec/opal/core/language/keyword_arguments_spec.rb +11 -0
  269. data/spec/opal/core/language/send_spec.rb +5 -0
  270. data/spec/opal/core/method/to_proc_spec.rb +28 -0
  271. data/spec/opal/core/module/name_spec.rb +0 -17
  272. data/spec/opal/core/runtime/bridged_classes_spec.rb +2 -2
  273. data/spec/opal/core/runtime/eval_spec.rb +1 -1
  274. data/spec/opal/core/runtime/method_missing_spec.rb +6 -0
  275. data/spec/opal/core/runtime_spec.rb +51 -0
  276. data/spec/opal/stdlib/js_spec.rb +66 -0
  277. data/spec/opal/stdlib/native/hash_spec.rb +36 -0
  278. data/spec/rubyspecs +152 -273
  279. data/spec/spec_helper.rb +10 -11
  280. data/stdlib/base64.rb +9 -9
  281. data/stdlib/benchmark.rb +551 -4
  282. data/stdlib/console.rb +94 -0
  283. data/stdlib/date.rb +1 -1
  284. data/stdlib/encoding.rb +1 -170
  285. data/stdlib/js.rb +56 -0
  286. data/stdlib/json.rb +9 -14
  287. data/stdlib/math.rb +1 -370
  288. data/stdlib/native.rb +133 -63
  289. data/stdlib/nodejs/file.rb +5 -0
  290. data/stdlib/nodejs/fileutils.rb +13 -6
  291. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/README.md +1 -1
  292. data/stdlib/opal-parser.rb +1 -2
  293. data/stdlib/ostruct.rb +65 -6
  294. data/stdlib/pp.rb +2 -4
  295. data/stdlib/rbconfig.rb +1 -3
  296. data/stdlib/strscan.rb +164 -28
  297. data/tasks/benchmarking.rake +88 -0
  298. data/tasks/testing.rake +181 -55
  299. data/{lib/mspec/opal/special_calls.rb → tasks/testing/mspec_special_calls.rb} +1 -1
  300. data/{lib/mspec/opal/sprockets.js → tasks/testing/phantomjs1-sprockets.js} +17 -6
  301. data/test/opal/test_keyword.rb +590 -0
  302. data/vendored-minitest/minitest.rb +2 -2
  303. data/vendored-minitest/test/unit.rb +5 -0
  304. metadata +229 -62
  305. data/benchmarks/operators.rb +0 -11
  306. data/benchmarks/prova.js.rb +0 -13
  307. data/docs/libraries.md +0 -36
  308. data/lib/mspec/opal/new.html.erb +0 -1
  309. data/lib/mspec/opal/rake_task.rb +0 -248
  310. data/opal/corelib/match_data.rb +0 -128
  311. data/spec/filters/bugs/math.rb +0 -95
  312. data/spec/filters/bugs/nil.rb +0 -7
  313. data/spec/filters/bugs/opal.rb +0 -9
  314. data/spec/filters/bugs/regular_expressions.rb +0 -41
  315. data/spec/filters/bugs/stringscanner.rb +0 -33
  316. data/spec/filters/unsupported/encoding.rb +0 -102
  317. data/spec/filters/unsupported/frozen.rb +0 -92
  318. data/spec/filters/unsupported/hash_compare_by_identity.rb +0 -16
  319. data/spec/filters/unsupported/integer_size.rb +0 -59
  320. data/spec/filters/unsupported/method_added.rb +0 -10
  321. data/spec/filters/unsupported/private_constants.rb +0 -30
  322. data/spec/filters/unsupported/private_methods.rb +0 -55
  323. data/spec/filters/unsupported/random.rb +0 -4
  324. data/spec/filters/unsupported/rational_numbers.rb +0 -4
  325. data/spec/filters/unsupported/regular_expressions.rb +0 -137
  326. data/spec/filters/unsupported/ruby_exe.rb +0 -5
  327. data/spec/filters/unsupported/symbols.rb +0 -17
  328. data/spec/filters/unsupported/tainted.rb +0 -180
  329. data/spec/filters/unsupported/trusted.rb +0 -88
  330. data/stdlib/process.rb +0 -10
  331. data/tasks/documenting.rake +0 -37
data/stdlib/native.rb CHANGED
@@ -1,3 +1,17 @@
1
+ # Public: Provides a complete set of tools to wrap native JavaScript
2
+ # into nice Ruby objects.
3
+ #
4
+ # Examples
5
+ #
6
+ # $$.document.querySelector('p').classList.add('blue')
7
+ # # => adds "blue" class to <p>
8
+ #
9
+ # $$.location.href = 'https://google.com'
10
+ # # => changes page location
11
+ #
12
+ # do_later = $$[:setTimeout] # Accessing the "setTimeout" property
13
+ # do_later.call(->{ puts :hello}, 500)
14
+ #
1
15
  module Native
2
16
  def self.is_a?(object, klass)
3
17
  %x{
@@ -64,8 +78,64 @@ module Native
64
78
  }
65
79
  end
66
80
 
81
+ def self.proc(&block)
82
+ raise LocalJumpError, "no block given" unless block
83
+
84
+ Kernel.proc {|*args|
85
+ args.map! { |arg| Native(arg) }
86
+ instance = Native(`this`)
87
+
88
+ %x{
89
+ // if global is current scope, run the block in the scope it was defined
90
+ if (this === Opal.global) {
91
+ return block.apply(self, #{args});
92
+ }
93
+
94
+ var self_ = block.$$s;
95
+ block.$$s = null;
96
+
97
+ try {
98
+ return block.apply(#{instance}, #{args});
99
+ }
100
+ finally {
101
+ block.$$s = self_;
102
+ }
103
+ }
104
+ }
105
+ end
106
+
67
107
  module Helpers
68
- def alias_native(new, old = new, options = {})
108
+ # Public: Exposes a native JavaScript method to Ruby
109
+ #
110
+ #
111
+ # new - The name of the newly created method.
112
+ # old - The name of the native JavaScript method to be exposed.
113
+ # If the name ends with "=" (e.g. `foo=`) it will be interpreted as
114
+ # a property setter. (default: the value of "new")
115
+ # as - If provided the values returned by the original method will be
116
+ # returned as instances of the passed class. The class passed to "as"
117
+ # is expected to accept a native JavaScript value.
118
+ #
119
+ # Examples
120
+ #
121
+ # class Element
122
+ # include Native::Helpers
123
+ #
124
+ # alias_native :add_class, :addClass
125
+ # alias_native :show
126
+ # alias_native :hide
127
+ #
128
+ # def initialize(selector)
129
+ # @native = `$(#{selector})`
130
+ # end
131
+ # end
132
+ #
133
+ # titles = Element.new('h1')
134
+ # titles.add_class :foo
135
+ # titles.hide
136
+ # titles.show
137
+ #
138
+ def alias_native(new, old = new, as: nil)
69
139
  if old.end_with? ?=
70
140
  define_method new do |value|
71
141
  `#@native[#{old[0 .. -2]}] = #{Native.convert(value)}`
@@ -73,7 +143,7 @@ module Native
73
143
  value
74
144
  end
75
145
  else
76
- if as = options[:as]
146
+ if as
77
147
  define_method new do |*args, &block|
78
148
  if value = Native.call(@native, old, *args, &block)
79
149
  as.new(value.to_n)
@@ -121,6 +191,7 @@ module Native
121
191
  @native = native
122
192
  end
123
193
 
194
+ # Public: Returns the internal native JavaScript value
124
195
  def to_n
125
196
  @native
126
197
  end
@@ -131,6 +202,12 @@ module Kernel
131
202
  `value == null || !value.$$class`
132
203
  end
133
204
 
205
+ # Public: Wraps a native JavaScript with Native::Object.new
206
+ #
207
+ # Returns:
208
+ # 1. The wrapped object if it is native
209
+ # 2. nil for `null` and `undefined`
210
+ # 3. The object itself if it's not native
134
211
  def Native(obj)
135
212
  if `#{obj} == null`
136
213
  nil
@@ -143,6 +220,7 @@ module Kernel
143
220
 
144
221
  alias_method :_Array, :Array
145
222
 
223
+ # Public: Wraps array-like JavaScript objects in Native::Array
146
224
  def Array(object, *args, &block)
147
225
  if native?(object)
148
226
  return Native::Array.new(object, *args, &block).to_a
@@ -205,7 +283,7 @@ class Native::Object < BasicObject
205
283
 
206
284
  def merge!(other)
207
285
  %x{
208
- var other = #{Native.convert(other)};
286
+ other = #{Native.convert(other)};
209
287
 
210
288
  for (var prop in other) {
211
289
  #@native[prop] = other[prop];
@@ -219,7 +297,7 @@ class Native::Object < BasicObject
219
297
  Kernel.instance_method(:respond_to?).bind(self).call(name, include_all)
220
298
  end
221
299
 
222
- def respond_to_missing?(name)
300
+ def respond_to_missing?(name, include_all = false)
223
301
  `Opal.hasOwnProperty.call(#@native, #{name})`
224
302
  end
225
303
 
@@ -349,50 +427,43 @@ class Native::Array
349
427
  end
350
428
 
351
429
  class Numeric
430
+ # Public: Returns the internal JavaScript value (with `valueOf`).
352
431
  def to_n
353
432
  `self.valueOf()`
354
433
  end
355
434
  end
356
435
 
357
436
  class Proc
437
+ # Public: Returns itself (an instance of `Function`)
358
438
  def to_n
359
439
  self
360
440
  end
361
441
  end
362
442
 
363
443
  class String
444
+ # Public: Returns the internal JavaScript value (with `valueOf`).
364
445
  def to_n
365
446
  `self.valueOf()`
366
447
  end
367
448
  end
368
449
 
369
450
  class Regexp
451
+ # Public: Returns the internal JavaScript value (with `valueOf`).
370
452
  def to_n
371
453
  `self.valueOf()`
372
454
  end
373
455
  end
374
456
 
375
457
  class MatchData
458
+ # Public: Returns the array of matches
376
459
  def to_n
377
460
  @matches
378
461
  end
379
462
  end
380
463
 
381
464
  class Struct
382
- def initialize(*args)
383
- if args.length == 1 && native?(args[0])
384
- object = args[0]
385
-
386
- members.each {|name|
387
- instance_variable_set "@#{name}", Native(`#{object}[#{name}]`)
388
- }
389
- else
390
- members.each_with_index {|name, index|
391
- instance_variable_set "@#{name}", args[index]
392
- }
393
- end
394
- end
395
-
465
+ # Public: Returns a JavaScript object with the members as keys and their
466
+ # values as values.
396
467
  def to_n
397
468
  result = `{}`
398
469
 
@@ -405,6 +476,7 @@ class Struct
405
476
  end
406
477
 
407
478
  class Array
479
+ # Public: Retuns a copy of itself trying to call #to_n on each member.
408
480
  def to_n
409
481
  %x{
410
482
  var result = [];
@@ -426,87 +498,83 @@ class Array
426
498
  end
427
499
 
428
500
  class Boolean
501
+ # Public: Returns the internal JavaScript value (with `valueOf`).
429
502
  def to_n
430
503
  `self.valueOf()`
431
504
  end
432
505
  end
433
506
 
434
507
  class Time
508
+ # Public: Returns itself (an instance of `Date`).
435
509
  def to_n
436
510
  self
437
511
  end
438
512
  end
439
513
 
440
514
  class NilClass
515
+ # Public: Returns the corresponding JavaScript value (`null`).
441
516
  def to_n
442
517
  `null`
443
518
  end
444
519
  end
445
520
 
446
521
  class Hash
522
+ alias_method :_initialize, :initialize
523
+
447
524
  def initialize(defaults = undefined, &block)
448
525
  %x{
449
- if (defaults != null) {
450
- if (defaults.constructor === Object) {
451
- var _map = self.map,
452
- smap = self.smap,
453
- keys = self.keys,
454
- map, khash, value;
455
-
456
- for (var key in defaults) {
457
- value = defaults[key];
458
-
459
- if (key.$$is_string) {
460
- map = smap;
461
- khash = key;
462
- } else {
463
- map = _map;
464
- khash = key.$hash();
465
- }
466
-
467
- if (value && value.constructor === Object) {
468
- map[khash] = #{Hash.new(`value`)};
469
- }
470
- else {
471
- map[khash] = #{Native(`value`)};
472
- }
473
-
474
- keys.push(key);
526
+ if (defaults !== undefined && defaults.constructor === Object) {
527
+ var smap = self.smap,
528
+ keys = self.keys,
529
+ key, value;
530
+
531
+ for (key in defaults) {
532
+ value = defaults[key];
533
+
534
+ if (value && value.constructor === Object) {
535
+ smap[key] = #{Hash.new(`value`)};
536
+ } else if (value && value.$$is_array) {
537
+ value = value.map(function(item) {
538
+ if (item && item.constructor === Object) {
539
+ return #{Hash.new(`item`)};
540
+ }
541
+
542
+ return item;
543
+ });
544
+ smap[key] = value
545
+ } else {
546
+ smap[key] = #{Native(`value`)};
475
547
  }
548
+
549
+ keys.push(key);
476
550
  }
477
- else {
478
- self.none = defaults;
479
- }
480
- }
481
- else if (block !== nil) {
482
- self.proc = block;
551
+
552
+ return self;
483
553
  }
484
554
 
485
- return self;
555
+ return #{_initialize(defaults, &block)};
486
556
  }
487
557
  end
488
558
 
559
+ # Public: Returns a JavaScript object with the same keys but calling #to_n on
560
+ # all values.
489
561
  def to_n
490
562
  %x{
491
563
  var result = {},
492
- keys = self.keys,
493
- _map = self.map,
494
- smap = self.smap,
495
- map, khash, value, key;
564
+ keys = self.keys,
565
+ smap = self.smap,
566
+ key, value;
496
567
 
497
568
  for (var i = 0, length = keys.length; i < length; i++) {
498
- key = keys[i];
569
+ key = keys[i];
499
570
 
500
571
  if (key.$$is_string) {
501
- map = smap;
502
- khash = key;
572
+ value = smap[key];
503
573
  } else {
504
- map = _map;
505
- khash = key.$hash();
574
+ key = key.key;
575
+ value = key.value;
506
576
  }
507
577
 
508
- value = map[khash];
509
-
510
578
  if (#{`value`.respond_to? :to_n}) {
511
579
  result[key] = #{`value`.to_n};
512
580
  }
@@ -521,6 +589,8 @@ class Hash
521
589
  end
522
590
 
523
591
  class Module
592
+ # Public: Exposes the current module as a property of
593
+ # the global object (e.g. `window`).
524
594
  def native_module
525
595
  `Opal.global[#{self.name}] = #{self}`
526
596
  end
@@ -543,5 +613,5 @@ class Class
543
613
  end
544
614
  end
545
615
 
546
- # native global
616
+ # Public: Exposes the global value (would be `window` inside a browser)
547
617
  $$ = $global = Native(`Opal.global`)
@@ -11,6 +11,11 @@ class File < IO
11
11
  `__fs__.readFileSync(#{path}).toString()`
12
12
  end
13
13
 
14
+ def self.write path, data
15
+ `__fs__.writeFileSync(#{path}, #{data})`
16
+ data.size
17
+ end
18
+
14
19
  def self.exist? path
15
20
  `__fs__.existsSync(#{path})`
16
21
  end
@@ -2,9 +2,11 @@ module FileUtils
2
2
  extend self
3
3
  `var __fs__ = #{File}.__fs__`
4
4
 
5
- def mkdir_p path
6
- return true if File.directory? path
7
- `__fs__.mkdirSync(#{path})`
5
+ def chmod(mode, file_list)
6
+ raise NotImplementedError, 'symbolic mode is not supported, use numeric mode' if String === mode
7
+ Array(file_list).each do |file|
8
+ `__fs__.chmodSync(mode, file)`
9
+ end
8
10
  end
9
11
 
10
12
  def cp source, target
@@ -16,11 +18,16 @@ module FileUtils
16
18
  `__fs__.unlinkSync(path)`
17
19
  end
18
20
 
19
- def mv source, target
20
- target = File.join(target, File.basename(source)) if File.directory? target
21
- `__fs__.renameSync(source, target)`
21
+ def mkdir_p path
22
+ return true if File.directory? path
23
+ `__fs__.mkdirSync(#{path})`
22
24
  end
23
25
 
24
26
  alias mkpath mkdir_p
25
27
  alias makedirs mkdir_p
28
+
29
+ def mv source, target
30
+ target = File.join(target, File.basename(source)) if File.directory? target
31
+ `__fs__.renameSync(source, target)`
32
+ end
26
33
  end
@@ -3,7 +3,7 @@ argparse
3
3
 
4
4
  [![Build Status](https://secure.travis-ci.org/nodeca/argparse.png?branch=master)](http://travis-ci.org/nodeca/argparse)
5
5
 
6
- CLI arguments parser for node.js. Javascript port of python's
6
+ CLI arguments parser for node.js. JavaScript port of python's
7
7
  [argparse](http://docs.python.org/dev/library/argparse.html) module
8
8
  (original version 3.2). That's a full port, except some very rare options,
9
9
  recorded in issue tracker.
@@ -1,7 +1,6 @@
1
1
  require 'opal/compiler'
2
2
  require 'opal/erb'
3
3
  require 'opal/version'
4
- require 'encoding'
5
4
 
6
5
  module Kernel
7
6
  def eval(str)
@@ -27,7 +26,7 @@ end
27
26
  return Opal.Opal.$compile(str, options);
28
27
  };
29
28
 
30
- Opal.eval = function(str, options) {
29
+ Opal['eval'] = function(str, options) {
31
30
  return eval(Opal.compile(str, options));
32
31
  };
33
32
 
data/stdlib/ostruct.rb CHANGED
@@ -3,7 +3,7 @@ class OpenStruct
3
3
  @table = {}
4
4
 
5
5
  hash.each_pair {|key, value|
6
- @table[key.to_sym] = value
6
+ @table[new_ostruct_member(key)] = value
7
7
  } if hash
8
8
  end
9
9
 
@@ -12,12 +12,18 @@ class OpenStruct
12
12
  end
13
13
 
14
14
  def []=(name, value)
15
- @table[name.to_sym] = value
15
+ @table[new_ostruct_member(name)] = value
16
16
  end
17
17
 
18
18
  def method_missing(name, *args)
19
+ if args.length > 2
20
+ raise NoMethodError.new "undefined method `#{name}' for #<OpenStruct>"
21
+ end
19
22
  if name.end_with? '='
20
- @table[name[0 .. -2].to_sym] = args[0]
23
+ if args.length != 1
24
+ raise ArgumentError.new "wrong number of arguments (0 for 1)"
25
+ end
26
+ @table[new_ostruct_member(name[0 .. -2])] = args[0]
21
27
  else
22
28
  @table[name.to_sym]
23
29
  end
@@ -60,10 +66,63 @@ class OpenStruct
60
66
  def hash
61
67
  @table.hash
62
68
  end
69
+
70
+ attr_reader :table
71
+
72
+ def delete_field(name)
73
+ sym = name.to_sym
74
+ begin
75
+ singleton_class.__send__(:remove_method, sym, "#{sym}=")
76
+ rescue NameError
77
+ end
78
+ @table.delete sym
79
+ end
80
+
81
+ def new_ostruct_member(name)
82
+ name = name.to_sym
83
+ unless respond_to?(name)
84
+ define_singleton_method(name) { @table[name] }
85
+ define_singleton_method("#{name}=") { |x| @table[name] = x }
86
+ end
87
+ name
88
+ end
63
89
 
90
+ `var ostruct_ids;`
91
+
64
92
  def inspect
65
- "#<#{self.class}: #{each_pair.map {|name, value|
66
- "#{name}=#{self[name].inspect}"
67
- }.join(" ")}>"
93
+ %x{
94
+ var top = (ostruct_ids === undefined),
95
+ ostruct_id = #{self.__id__};
96
+ }
97
+ begin
98
+ result = "#<#{self.class}"
99
+ %x{
100
+ if (top) {
101
+ ostruct_ids = {};
102
+ }
103
+ if (ostruct_ids.hasOwnProperty(ostruct_id)) {
104
+ return result + ' ...>';
105
+ }
106
+ ostruct_ids[ostruct_id] = true;
107
+ }
108
+
109
+ result += ' ' if @table.any?
110
+
111
+ result += each_pair.map {|name, value|
112
+ "#{name}=#{value.inspect}"
113
+ }.join ", "
114
+
115
+ result += ">"
116
+
117
+ result
118
+ ensure
119
+ %x{
120
+ if (top) {
121
+ ostruct_ids = undefined;
122
+ }
123
+ }
124
+ end
68
125
  end
126
+
127
+ alias to_s inspect
69
128
  end