opal 0.8.1 → 0.9.0.beta1

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