opal 0.4.3 → 0.4.4

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 (303) hide show
  1. data/.rspec +3 -0
  2. data/.travis.yml +0 -4
  3. data/README.md +6 -0
  4. data/Rakefile +30 -6
  5. data/bin/opal +6 -82
  6. data/corelib/{opal/array.rb → array.rb} +40 -56
  7. data/corelib/{opal/basic_object.rb → basic_object.rb} +2 -2
  8. data/corelib/{opal/boolean.rb → boolean.rb} +0 -8
  9. data/corelib/class.rb +47 -0
  10. data/corelib/{opal/comparable.rb → comparable.rb} +0 -0
  11. data/corelib/{opal/enumerable.rb → enumerable.rb} +208 -141
  12. data/corelib/{opal/enumerator.rb → enumerator.rb} +3 -3
  13. data/corelib/{opal/error.rb → error.rb} +1 -0
  14. data/corelib/{opal/hash.rb → hash.rb} +67 -56
  15. data/corelib/io.rb +39 -0
  16. data/corelib/{opal/kernel.rb → kernel.rb} +35 -31
  17. data/corelib/{opal/class.rb → module.rb} +29 -57
  18. data/corelib/native.rb +148 -0
  19. data/corelib/{opal/nil_class.rb → nil_class.rb} +2 -10
  20. data/corelib/{opal/numeric.rb → numeric.rb} +39 -14
  21. data/corelib/opal.rb +42 -25
  22. data/corelib/{opal/proc.rb → proc.rb} +3 -3
  23. data/corelib/{opal/range.rb → range.rb} +5 -1
  24. data/corelib/{opal/regexp.rb → regexp.rb} +0 -0
  25. data/corelib/{opal/runtime.js → runtime.js} +96 -188
  26. data/corelib/{opal/string.rb → string.rb} +20 -15
  27. data/corelib/struct.rb +139 -0
  28. data/corelib/{opal/time.rb → time.rb} +0 -0
  29. data/lib/opal.rb +4 -0
  30. data/lib/opal/cli.rb +79 -32
  31. data/lib/opal/cli_options.rb +91 -0
  32. data/lib/opal/erb.rb +41 -8
  33. data/lib/opal/grammar.rb +24 -10
  34. data/lib/opal/grammar.y +15 -4
  35. data/lib/opal/grammar_helpers.rb +4 -0
  36. data/lib/opal/lexer.rb +214 -143
  37. data/lib/opal/parser.rb +596 -562
  38. data/lib/opal/require_parser.rb +1 -1
  39. data/lib/opal/source_map.rb +15 -30
  40. data/lib/opal/target_scope.rb +24 -5
  41. data/lib/opal/version.rb +1 -1
  42. data/mri_spec/cli_spec.rb +18 -0
  43. data/mri_spec/fixtures/opal_file.rb +2 -0
  44. data/mri_spec/spec_helper.rb +17 -0
  45. data/opal.gemspec +5 -2
  46. data/spec/{rubyspec/filters → filters}/bugs/alias.rb +0 -0
  47. data/spec/{rubyspec/filters → filters}/bugs/ancestors.rb +0 -0
  48. data/spec/{rubyspec/filters → filters}/bugs/array.rb +0 -0
  49. data/spec/filters/bugs/array/combination.rb +11 -0
  50. data/spec/filters/bugs/array/count.rb +3 -0
  51. data/spec/filters/bugs/array/delete_if.rb +3 -0
  52. data/spec/filters/bugs/array/drop.rb +3 -0
  53. data/spec/filters/bugs/array/drop_while.rb +5 -0
  54. data/spec/filters/bugs/array/eql.rb +3 -0
  55. data/spec/filters/bugs/array/flatten.rb +9 -0
  56. data/spec/filters/bugs/array/minus.rb +5 -0
  57. data/spec/filters/bugs/array/multipliy.rb +9 -0
  58. data/spec/filters/bugs/array/new.rb +3 -0
  59. data/spec/filters/bugs/array/pop.rb +6 -0
  60. data/spec/filters/bugs/array/rassoc.rb +4 -0
  61. data/spec/filters/bugs/array/rindex.rb +6 -0
  62. data/spec/filters/bugs/array/select.rb +3 -0
  63. data/spec/filters/bugs/array/shift.rb +7 -0
  64. data/spec/filters/bugs/array/shuffle.rb +11 -0
  65. data/spec/filters/bugs/array/slice.rb +7 -0
  66. data/spec/filters/bugs/array/take.rb +3 -0
  67. data/spec/filters/bugs/array/to_a.rb +3 -0
  68. data/spec/filters/bugs/array/try_convert.rb +7 -0
  69. data/spec/filters/bugs/array/uniq.rb +10 -0
  70. data/spec/filters/bugs/array/zip.rb +4 -0
  71. data/spec/{rubyspec/filters → filters}/bugs/array_delete.rb +1 -0
  72. data/spec/{rubyspec/filters → filters}/bugs/array_fetch.rb +0 -0
  73. data/spec/{rubyspec/filters → filters}/bugs/array_first.rb +0 -0
  74. data/spec/{rubyspec/filters → filters}/bugs/array_flatten.rb +0 -0
  75. data/spec/{rubyspec/filters → filters}/bugs/array_intersection.rb +0 -0
  76. data/spec/{rubyspec/filters → filters}/bugs/array_join.rb +0 -0
  77. data/spec/{rubyspec/filters → filters}/bugs/break.rb +0 -0
  78. data/spec/filters/bugs/case.rb +4 -0
  79. data/spec/{rubyspec/filters → filters}/bugs/coerce_integer.rb +0 -0
  80. data/spec/filters/bugs/enumerable_sort_by.rb +3 -0
  81. data/spec/{rubyspec/filters → filters}/bugs/kernel/instance_variables.rb +0 -0
  82. data/spec/filters/bugs/kernel/rand.rb +4 -0
  83. data/spec/filters/bugs/language/array.rb +3 -0
  84. data/spec/filters/bugs/language/block.rb +6 -0
  85. data/spec/filters/bugs/language/break.rb +3 -0
  86. data/spec/{rubyspec/filters → filters}/bugs/language/class.rb +3 -0
  87. data/spec/{rubyspec/filters → filters}/bugs/language/class_variables.rb +0 -0
  88. data/spec/filters/bugs/language/def.rb +27 -0
  89. data/spec/filters/bugs/language/defined.rb +3 -0
  90. data/spec/filters/bugs/language/ensure.rb +4 -0
  91. data/spec/filters/bugs/language/execution.rb +4 -0
  92. data/spec/filters/bugs/language/for.rb +18 -0
  93. data/spec/filters/bugs/language/if.rb +13 -0
  94. data/spec/filters/bugs/language/loop.rb +4 -0
  95. data/spec/filters/bugs/language/metaclass.rb +14 -0
  96. data/spec/filters/bugs/language/module.rb +6 -0
  97. data/spec/filters/bugs/language/next.rb +3 -0
  98. data/spec/filters/bugs/language/or.rb +3 -0
  99. data/spec/filters/bugs/language/order.rb +4 -0
  100. data/spec/filters/bugs/language/precedence.rb +10 -0
  101. data/spec/filters/bugs/language/proc.rb +24 -0
  102. data/spec/filters/bugs/language/redo.rb +5 -0
  103. data/spec/filters/bugs/language/rescue.rb +9 -0
  104. data/spec/filters/bugs/language/retry.rb +5 -0
  105. data/spec/filters/bugs/language/send.rb +10 -0
  106. data/spec/filters/bugs/language/super.rb +9 -0
  107. data/spec/filters/bugs/language/until.rb +8 -0
  108. data/spec/filters/bugs/language/variables.rb +37 -0
  109. data/spec/filters/bugs/language/while.rb +6 -0
  110. data/spec/filters/bugs/language/yield.rb +5 -0
  111. data/spec/{rubyspec/filters → filters}/bugs/module/class_variables.rb +0 -0
  112. data/spec/filters/bugs/module/method_defined.rb +6 -0
  113. data/spec/filters/bugs/parser.rb +10 -0
  114. data/spec/{rubyspec/filters → filters}/bugs/public_methods.rb +1 -0
  115. data/spec/filters/bugs/return.rb +7 -0
  116. data/spec/filters/bugs/singleton/instance.rb +4 -0
  117. data/spec/filters/bugs/source_map.rb +3 -0
  118. data/spec/filters/bugs/string/center.rb +4 -0
  119. data/spec/filters/bugs/string/lines.rb +3 -0
  120. data/spec/{rubyspec/filters → filters}/mspec/mocks.rb +0 -0
  121. data/spec/{rubyspec/filters → filters}/mspec/ruby_exe.rb +0 -0
  122. data/spec/{rubyspec/filters → filters}/mspec/should_receive.rb +0 -0
  123. data/spec/{rubyspec/filters → filters}/parser/block_args.rb +0 -0
  124. data/spec/{rubyspec/filters → filters}/unsupported/array_subclasses.rb +1 -0
  125. data/spec/filters/unsupported/frozen.rb +32 -0
  126. data/spec/filters/unsupported/immutable_strings.rb +3 -0
  127. data/spec/filters/unsupported/tainted.rb +17 -0
  128. data/spec/filters/unsupported/trusted.rb +15 -0
  129. data/spec/opal/class/constants_spec.rb +7 -0
  130. data/spec/opal/erb/erb_spec.rb +7 -1
  131. data/spec/opal/erb/inline_block.opalerb +3 -0
  132. data/spec/opal/hash/allocate_spec.rb +16 -0
  133. data/spec/opal/hash/new_spec.rb +10 -0
  134. data/spec/opal/hash/to_s_spec.rb +9 -0
  135. data/spec/opal/kernel/instance_variable_defined_spec.rb +15 -0
  136. data/spec/opal/kernel/rand_spec.rb +5 -5
  137. data/spec/opal/kernel/respond_to_spec.rb +14 -1
  138. data/spec/opal/language/block_spec.rb +13 -0
  139. data/spec/opal/language/rescue_spec.rb +27 -0
  140. data/spec/opal/language/return_spec.rb +38 -0
  141. data/spec/opal/language/singleton_class_spec.rb +13 -0
  142. data/spec/opal/language/super_spec.rb +99 -0
  143. data/spec/opal/language/variables_spec.rb +20 -0
  144. data/spec/opal/module/attr_accessor_spec.rb +8 -0
  145. data/spec/opal/module/constants_spec.rb +2 -2
  146. data/spec/opal/native/alias_native_spec.rb +18 -0
  147. data/spec/opal/native/each_spec.rb +14 -0
  148. data/spec/opal/native/element_reference_spec.rb +14 -0
  149. data/spec/opal/native/method_missing_spec.rb +39 -0
  150. data/spec/opal/native/new_spec.rb +19 -0
  151. data/spec/opal/native/nil_spec.rb +14 -0
  152. data/spec/opal/runtime2/class_hierarchy_spec.rb +2 -2
  153. data/spec/opal/source_map_spec.rb +3 -7
  154. data/spec/ospec/main.rb.erb +2 -5
  155. data/spec/parser/alias_spec.rb +4 -4
  156. data/spec/parser/and_spec.rb +2 -2
  157. data/spec/parser/array_spec.rb +6 -6
  158. data/spec/parser/attrasgn_spec.rb +8 -8
  159. data/spec/parser/begin_spec.rb +11 -11
  160. data/spec/parser/block_spec.rb +3 -3
  161. data/spec/parser/break_spec.rb +4 -4
  162. data/spec/parser/call_spec.rb +50 -48
  163. data/spec/parser/class_spec.rb +2 -2
  164. data/spec/parser/const_spec.rb +1 -1
  165. data/spec/parser/cvar_spec.rb +1 -1
  166. data/spec/parser/def_spec.rb +5 -5
  167. data/spec/parser/gvar_spec.rb +2 -2
  168. data/spec/parser/hash_spec.rb +4 -4
  169. data/spec/parser/iasgn_spec.rb +3 -3
  170. data/spec/parser/if_spec.rb +6 -6
  171. data/spec/parser/iter_spec.rb +6 -6
  172. data/spec/parser/lambda_spec.rb +5 -5
  173. data/spec/parser/lasgn_spec.rb +2 -2
  174. data/spec/parser/line_spec.rb +2 -2
  175. data/spec/parser/lvar_spec.rb +5 -5
  176. data/spec/parser/masgn_spec.rb +1 -1
  177. data/spec/parser/module_spec.rb +2 -2
  178. data/spec/parser/not_spec.rb +4 -4
  179. data/spec/parser/op_asgn1_spec.rb +2 -2
  180. data/spec/parser/op_asgn2_spec.rb +2 -2
  181. data/spec/parser/or_spec.rb +2 -2
  182. data/spec/parser/parse_spec.rb +66 -0
  183. data/spec/parser/parser_spec.rb +32 -38
  184. data/spec/parser/regexp_spec.rb +4 -4
  185. data/spec/parser/return_spec.rb +4 -4
  186. data/spec/parser/sclass_spec.rb +4 -4
  187. data/spec/parser/str_spec.rb +3 -3
  188. data/spec/parser/super_spec.rb +6 -6
  189. data/spec/parser/undef_spec.rb +3 -3
  190. data/spec/parser/unless_spec.rb +4 -4
  191. data/spec/parser/while_spec.rb +3 -3
  192. data/spec/parser/xstr_spec.rb +3 -3
  193. data/spec/parser/yield_spec.rb +6 -6
  194. data/spec/rubyspec/core/array/drop_spec.rb +1 -1
  195. data/spec/rubyspec/core/array/keep_if_spec.rb +1 -3
  196. data/spec/rubyspec/core/array/length_spec.rb +1 -3
  197. data/spec/rubyspec/core/array/map_spec.rb +2 -6
  198. data/spec/rubyspec/core/array/minus_spec.rb +3 -3
  199. data/spec/rubyspec/core/array/multiply_spec.rb +14 -16
  200. data/spec/rubyspec/core/array/new_spec.rb +3 -5
  201. data/spec/rubyspec/core/array/plus_spec.rb +2 -2
  202. data/spec/rubyspec/core/array/pop_spec.rb +4 -4
  203. data/spec/rubyspec/core/array/rassoc_spec.rb +2 -2
  204. data/spec/rubyspec/core/array/reject_spec.rb +2 -6
  205. data/spec/rubyspec/core/array/replace_spec.rb +1 -3
  206. data/spec/rubyspec/core/array/reverse_each_spec.rb +1 -3
  207. data/spec/rubyspec/core/array/reverse_spec.rb +4 -4
  208. data/spec/rubyspec/core/array/rindex_spec.rb +1 -1
  209. data/spec/rubyspec/core/array/select_spec.rb +3 -7
  210. data/spec/rubyspec/core/array/shared/collect.rb +7 -0
  211. data/spec/rubyspec/core/array/shared/index.rb +1 -1
  212. data/spec/rubyspec/core/array/shared/keep_if.rb +3 -0
  213. data/spec/rubyspec/core/array/shared/length.rb +3 -0
  214. data/spec/rubyspec/core/array/shared/replace.rb +3 -0
  215. data/spec/rubyspec/core/array/shared/slice.rb +3 -0
  216. data/spec/rubyspec/core/array/shuffle_spec.rb +1 -1
  217. data/spec/rubyspec/core/array/size_spec.rb +1 -3
  218. data/spec/rubyspec/core/array/slice_spec.rb +4 -6
  219. data/spec/rubyspec/core/array/sort_spec.rb +2 -2
  220. data/spec/rubyspec/core/array/to_a_spec.rb +1 -1
  221. data/spec/rubyspec/core/array/try_convert_spec.rb +7 -7
  222. data/spec/rubyspec/core/array/uniq_spec.rb +7 -7
  223. data/spec/rubyspec/core/array/zip_spec.rb +1 -1
  224. data/spec/rubyspec/core/enumerable/collect_spec.rb +24 -0
  225. data/spec/rubyspec/core/enumerable/count_spec.rb +35 -19
  226. data/spec/rubyspec/core/enumerable/find_spec.rb +5 -0
  227. data/spec/rubyspec/core/hash/each_pair_spec.rb +7 -7
  228. data/spec/rubyspec/core/hash/each_spec.rb +13 -7
  229. data/spec/rubyspec/core/module/method_defined_spec.rb +4 -4
  230. data/spec/rubyspec/core/module/public_method_defined_spec.rb +19 -0
  231. data/spec/rubyspec/core/module/remove_const_spec.rb +23 -0
  232. data/spec/rubyspec/core/numeric/step_spec.rb +14 -0
  233. data/spec/rubyspec/core/string/center_spec.rb +43 -65
  234. data/spec/rubyspec/core/string/lines_spec.rb +1 -1
  235. data/spec/rubyspec/core/string/ljust_spec.rb +25 -9
  236. data/spec/rubyspec/core/string/rjust_spec.rb +26 -10
  237. data/spec/rubyspec/core/struct/fixtures/classes.rb +26 -0
  238. data/spec/rubyspec/core/struct/initialize_spec.rb +11 -0
  239. data/spec/rubyspec/core/struct/new_spec.rb +24 -0
  240. data/spec/rubyspec/fixtures/constants.rb +7 -0
  241. data/spec/rubyspec/language/break_spec.rb +1 -1
  242. data/spec/rubyspec/language/case_spec.rb +30 -30
  243. data/spec/rubyspec/language/def_spec.rb +34 -34
  244. data/spec/rubyspec/language/defined_spec.rb +2 -2
  245. data/spec/rubyspec/language/ensure_spec.rb +2 -2
  246. data/spec/rubyspec/language/execution_spec.rb +2 -2
  247. data/spec/rubyspec/language/for_spec.rb +17 -17
  248. data/spec/rubyspec/language/hash_spec.rb +3 -3
  249. data/spec/rubyspec/language/if_spec.rb +11 -11
  250. data/spec/rubyspec/language/loop_spec.rb +3 -3
  251. data/spec/rubyspec/language/metaclass_spec.rb +14 -14
  252. data/spec/rubyspec/language/module_spec.rb +6 -6
  253. data/spec/rubyspec/language/next_spec.rb +5 -5
  254. data/spec/rubyspec/language/not_spec.rb +1 -1
  255. data/spec/rubyspec/language/or_spec.rb +1 -1
  256. data/spec/rubyspec/language/order_spec.rb +3 -5
  257. data/spec/rubyspec/language/precedence_spec.rb +19 -19
  258. data/spec/rubyspec/language/proc_spec.rb +29 -29
  259. data/spec/rubyspec/language/redo_spec.rb +3 -5
  260. data/spec/rubyspec/language/rescue_spec.rb +7 -7
  261. data/spec/rubyspec/language/retry_spec.rb +2 -2
  262. data/spec/rubyspec/language/return_spec.rb +12 -12
  263. data/spec/rubyspec/language/send_spec.rb +9 -9
  264. data/spec/rubyspec/language/singleton_class_spec.rb +3 -4
  265. data/spec/rubyspec/language/super_spec.rb +7 -11
  266. data/spec/rubyspec/language/until_spec.rb +10 -10
  267. data/spec/rubyspec/language/variables_spec.rb +59 -67
  268. data/spec/rubyspec/language/versions/array_1.9.rb +1 -1
  269. data/spec/rubyspec/language/versions/block_1.9.rb +0 -0
  270. data/spec/rubyspec/language/versions/break_1.9.rb +0 -0
  271. data/spec/rubyspec/language/versions/literal_lambda_1.9.rb +12 -12
  272. data/spec/rubyspec/language/versions/send_1.9.rb +23 -23
  273. data/spec/rubyspec/language/versions/symbol_1.9.rb +2 -2
  274. data/spec/rubyspec/language/versions/variables_1.9.rb +1 -1
  275. data/spec/rubyspec/language/while_spec.rb +4 -4
  276. data/spec/rubyspec/language/yield_spec.rb +3 -3
  277. data/spec/rubyspec/library/erb/util/html_escape_spec.rb +10 -0
  278. data/spec/rubyspec/library/singleton/clone_spec.rb +8 -0
  279. data/spec/rubyspec/library/singleton/dup_spec.rb +8 -0
  280. data/spec/rubyspec/library/singleton/fixtures/classes.rb +18 -0
  281. data/spec/rubyspec/library/singleton/instance_spec.rb +30 -0
  282. data/spec/spec_helper.rb +214 -0
  283. data/stdlib/buffer.rb +40 -0
  284. data/stdlib/buffer/array.rb +66 -0
  285. data/stdlib/buffer/view.rb +70 -0
  286. data/stdlib/erb.rb +11 -20
  287. data/stdlib/forwardable.rb +71 -0
  288. data/stdlib/json.rb +78 -0
  289. data/stdlib/ostruct.rb +69 -0
  290. data/stdlib/rbconfig.rb +1 -0
  291. data/stdlib/singleton.rb +40 -0
  292. data/stdlib/stringio.rb +173 -0
  293. data/stdlib/template.rb +44 -0
  294. metadata +285 -79
  295. data/corelib/opal/native.rb +0 -31
  296. data/spec/opal/class/bridge_class_spec.rb +0 -39
  297. data/spec/opal/native_spec.rb +0 -209
  298. data/spec/ospec/runner.rb +0 -223
  299. data/spec/rubyspec/filters/bugs/block_args.rb +0 -3
  300. data/spec/rubyspec/filters/bugs/case.rb +0 -8
  301. data/spec/rubyspec/filters/bugs/language/module.rb +0 -3
  302. data/spec/rubyspec/filters/unsupported/frozen.rb +0 -4
  303. data/spec/rubyspec/filters/unsupported/tainted.rb +0 -7
@@ -145,10 +145,6 @@ class String
145
145
  }
146
146
  end
147
147
 
148
- def as_json
149
- self
150
- end
151
-
152
148
  def capitalize
153
149
  `#{self}.charAt(0).toUpperCase() + #{self}.substr(1).toLowerCase()`
154
150
  end
@@ -402,15 +398,19 @@ class String
402
398
 
403
399
  def ljust(width, padstr = ' ')
404
400
  %x{
405
- if (width <= #{self}.length) {
406
- return #{self};
401
+ var length = #{self}.length;
402
+
403
+ if (width <= length) {
404
+ return #{self};
407
405
  }
408
406
  else {
409
- var n_chars = Math.floor(width - #{self}.length)
410
- var n_patterns = Math.floor(n_chars/padstr.length);
411
- var result = Array(n_patterns + 1).join(padstr);
412
- var remaining = n_chars - result.length;
413
- return result + padstr.slice(0, remaining) + #{self};
407
+ var index = -1, result = "";
408
+
409
+ while (++index < (width - length)) {
410
+ result += padstr;
411
+ }
412
+
413
+ return #{self} + result.slice(0, width - length);
414
414
  }
415
415
  }
416
416
  end
@@ -504,8 +504,11 @@ class String
504
504
  return #{self};
505
505
  }
506
506
  else {
507
- var ljustified = #{ self.ljust(width, padstr) };
508
- return #{self} + ljustified.slice(0, -#{self}.length);
507
+ var n_chars = Math.floor(width - #{self}.length)
508
+ var n_patterns = Math.floor(n_chars/padstr.length);
509
+ var result = Array(n_patterns + 1).join(padstr);
510
+ var remaining = n_chars - result.length;
511
+ return result + padstr.slice(0, remaining) + #{self};
509
512
  }
510
513
  }
511
514
  end
@@ -684,8 +687,6 @@ class String
684
687
  }
685
688
  end
686
689
 
687
- alias to_json inspect
688
-
689
690
  def to_proc
690
691
  %x{
691
692
  var name = '$' + #{self};
@@ -705,6 +706,10 @@ class String
705
706
 
706
707
  alias to_sym intern
707
708
 
709
+ def to_n
710
+ `#{self}.valueOf()`
711
+ end
712
+
708
713
  def tr(from, to)
709
714
  %x{
710
715
  if (from.length == 0 || from === to) {
data/corelib/struct.rb ADDED
@@ -0,0 +1,139 @@
1
+ class Struct
2
+ def self.new(name = undefined, *args)
3
+ return super unless self == Struct
4
+
5
+ if name[0] == name[0].upcase
6
+ Struct.const_set(name, new(*args))
7
+ else
8
+ args.unshift name
9
+
10
+ Class.new(self) {
11
+ args.each { |arg| define_struct_attribute arg }
12
+ }
13
+ end
14
+ end
15
+
16
+ def self.define_struct_attribute(name)
17
+ if self == Struct
18
+ raise ArgumentError, 'you cannot define attributes to the Struct class'
19
+ end
20
+
21
+ members << name
22
+
23
+ define_method name do
24
+ instance_variable_get "@#{name}"
25
+ end
26
+
27
+ define_method "#{name}=" do |value|
28
+ instance_variable_set "@#{name}", value
29
+ end
30
+ end
31
+
32
+ def self.members
33
+ if self == Struct
34
+ raise ArgumentError, 'the Struct class has no members'
35
+ end
36
+
37
+ @members ||= []
38
+ end
39
+
40
+ include Enumerable
41
+
42
+ def initialize(*args)
43
+ if args.length == 1 && native?(args[0])
44
+ object = args[0]
45
+
46
+ members.each {|name|
47
+ instance_variable_set "@#{name}", Native(`#{object}[#{name}]`)
48
+ }
49
+ else
50
+ members.each_with_index {|name, index|
51
+ instance_variable_set "@#{name}", args[index]
52
+ }
53
+ end
54
+ end
55
+
56
+ def members
57
+ self.class.members
58
+ end
59
+
60
+ def [](name)
61
+ if Integer === name
62
+ raise IndexError, "offset #{name} too large for struct(size:#{members.size})" if name >= members.size
63
+
64
+ name = members[name]
65
+ else
66
+ raise NameError, "no member '#{name}' in struct" unless members.include?(name.to_sym)
67
+ end
68
+
69
+ instance_variable_get "@#{name}"
70
+ end
71
+
72
+ def []=(name, value)
73
+ if Integer === name
74
+ raise IndexError, "offset #{name} too large for struct(size:#{members.size})" if name >= members.size
75
+
76
+ name = members[name]
77
+ else
78
+ raise NameError, "no member '#{name}' in struct" unless members.include?(name.to_sym)
79
+ end
80
+
81
+ instance_variable_set "@#{name}", value
82
+ end
83
+
84
+ def each
85
+ return enum_for :each unless block_given?
86
+
87
+ members.each { |name| yield self[name] }
88
+ end
89
+
90
+ def each_pair
91
+ return enum_for :each_pair unless block_given?
92
+
93
+ members.each { |name| yield name, self[name] }
94
+ end
95
+
96
+ def eql?(other)
97
+ hash == other.hash || other.each_with_index.all? {|object, index|
98
+ self[members[index]] == object
99
+ }
100
+ end
101
+
102
+ def length
103
+ members.length
104
+ end
105
+
106
+ alias size length
107
+
108
+ def to_a
109
+ members.map { |name| self[name] }
110
+ end
111
+
112
+ alias values to_a
113
+
114
+ def to_n
115
+ result = `{}`
116
+
117
+ each_pair {|name, value|
118
+ `#{result}[#{name}] = #{value.to_n}`
119
+ }
120
+
121
+ result
122
+ end
123
+
124
+ def inspect
125
+ result = "#<struct "
126
+
127
+ if self.class == Struct
128
+ result += "#{self.class.name} "
129
+ end
130
+
131
+ result += each_pair.map {|name, value|
132
+ "#{name}=#{value.inspect}"
133
+ }.join ", "
134
+
135
+ result += ">"
136
+
137
+ result
138
+ end
139
+ end
File without changes
data/lib/opal.rb CHANGED
@@ -34,6 +34,10 @@ module Opal
34
34
  paths << path
35
35
  end
36
36
 
37
+ def self.use_gem(gem_name)
38
+ Opal.append_path File.join(Gem::Specification.find_by_name(gem_name).gem_dir, 'lib')
39
+ end
40
+
37
41
  # Private, don't add to these directly (use .append_path instead).
38
42
  def self.paths
39
43
  @paths ||= [core_dir, std_dir]
data/lib/opal/cli.rb CHANGED
@@ -1,5 +1,3 @@
1
- require 'opal'
2
-
3
1
  begin
4
2
  require 'opal-sprockets'
5
3
  rescue LoadError
@@ -10,25 +8,63 @@ rescue LoadError
10
8
  exit -1
11
9
  end
12
10
 
11
+ require 'opal'
12
+ require 'rack'
13
+
13
14
  module Opal
14
15
  class CLI
15
16
  attr_reader :options, :filename
16
17
 
17
- def initialize _filename, options
18
- require 'rack'
18
+ def initialize filename, options
19
+ @options = options || {}
20
+ @filename = filename
21
+ end
22
+
23
+ def puts *args
24
+ output.puts *args
25
+ end
26
+
27
+ def output
28
+ @output ||= options[:output] || $stdout
29
+ end
30
+
31
+
32
+ def run
33
+ set_processor_options
34
+ prepare_eval_code
35
+
36
+ case
37
+ when options[:sexp]; show_sexp
38
+ when options[:compile]; show_compiled_source
39
+ when options[:server]; start_server
40
+ else run_code
41
+ end
42
+ end
43
+
44
+ def show_compiled_source
45
+ if sprockets[filename]
46
+ puts sprockets[filename].to_a.last
47
+ else
48
+ puts Opal.parse(filename, options)
49
+ end
50
+ end
19
51
 
20
- @options = options
21
- @filename = _filename
52
+ def show_sexp
53
+ puts sexp.inspect
54
+ end
22
55
 
56
+ def set_processor_options
23
57
  processor_options.each do |option|
24
58
  key = option.to_sym
25
59
  next unless options.has_key? key
26
60
  Opal::Processor.send("#{option}=", options[key])
27
61
  end
62
+ end
28
63
 
64
+ def prepare_eval_code
29
65
  if options[:evals] and options[:evals].any?
30
- require 'tempfile'
31
- path = File.join(Dir.tmpdir,"opal-#{$$}.js.rb")
66
+ require 'tmpdir'
67
+ path = File.join(Dir.mktmpdir,"opal-#{$$}.js.rb")
32
68
  File.open(path, 'w') do |tempfile|
33
69
  options[:load_paths] ||= []
34
70
  options[:load_paths] << File.dirname(path)
@@ -40,39 +76,46 @@ module Opal
40
76
  end
41
77
  @filename = File.basename(path)
42
78
  end
43
-
44
- case
45
- when options[:sexp]
46
- puts sexp.inspect
47
- when options[:compile]
48
- if File.exist?(filename)
49
- puts sprockets[filename].to_a.last
50
- else
51
- puts Opal.parse(filename, options)
52
- end
53
- when options[:server]
54
- server_start
55
- else
56
- run
57
- end
58
79
  end
59
80
 
60
- def run
81
+ def run_code
61
82
  begin
62
83
  full_source = sprockets[filename]
63
- IO.popen('node', 'w') do |stdin|
64
- stdin.write full_source
65
- end
66
- rescue Errno::ENOENT
67
- $stderr.puts 'Please install Node.js to be able to run Opal scripts.'
68
- exit 127
84
+ rescue Sprockets::FileOutsidePaths => e
85
+ @server = nil
86
+ full_path = File.expand_path(filename)
87
+ load_paths << File.dirname(full_path)
88
+ _filename = File.basename(full_path)
89
+ full_source = sprockets[_filename]
69
90
  end
91
+
92
+ require 'open3'
93
+
94
+ # out, err, status = Open3.capture3('node', :stdin_data => full_source)
95
+ i, o, e = Open3.popen3('node')
96
+ i.write full_source
97
+ i.close
98
+ output_text = o.read
99
+ status = $?
100
+
101
+ raise "Errored: #{e}" if status != 0
102
+ puts output_text
103
+
104
+ rescue Errno::ENOENT
105
+ $stderr.puts 'Please install Node.js to be able to run Opal scripts.'
106
+ exit 127
70
107
  end
71
108
 
72
109
  def sexp
73
110
  Opal::Grammar.new.parse(source)
74
111
  end
75
112
 
113
+ def map
114
+ parser = Opal::Parser.new
115
+ parser.parse(filename, options)
116
+ parser.source_map
117
+ end
118
+
76
119
  def source
77
120
  File.exist?(filename) ? File.read(filename) : filename
78
121
  end
@@ -95,14 +138,18 @@ module Opal
95
138
 
96
139
  def server
97
140
  @server ||= Opal::Server.new do |s|
98
- (options[:load_paths] || []).each do |path|
141
+ load_paths.each do |path|
99
142
  s.append_path path
100
143
  end
101
144
  s.main = File.basename(filename, '.rb')
102
145
  end
103
146
  end
104
147
 
105
- def server_start
148
+ def load_paths
149
+ @load_paths ||= options[:load_paths] || []
150
+ end
151
+
152
+ def start_server
106
153
  require 'rack'
107
154
  require 'webrick'
108
155
  require 'logger'
@@ -0,0 +1,91 @@
1
+ require 'optparse'
2
+
3
+ module Opal
4
+ class CLIOptions < OptionParser
5
+ def initialize
6
+ @options = {}
7
+
8
+ super do |opts|
9
+ opts.banner = 'Usage: opal [options] -- [programfile]'
10
+
11
+ opts.on('-v', '--version', 'Display Opal Version') do |v|
12
+ require 'opal/version'
13
+ puts "Opal v#{Opal::VERSION}"
14
+ exit
15
+ end
16
+
17
+ opts.on("-h", "--help", "Show this message") do
18
+ puts opts
19
+ exit
20
+ end
21
+
22
+ opts.separator ''
23
+ opts.separator 'Basic Options:'
24
+
25
+ opts.on('-I', '--include DIR',
26
+ 'Append a load path (may be used more than once)') do |i|
27
+ options[:load_paths] ||= []
28
+ options[:load_paths] << i
29
+ end
30
+
31
+ opts.on('-e', '--eval SOURCE', String,
32
+ 'One line of script. Several -e\'s allowed. Omit [programfile]') do |source|
33
+ options[:evals] ||= []
34
+ options[:evals] << source
35
+ end
36
+
37
+ opts.on('-s', '--sexp', 'Show Sexps') do
38
+ options[:sexp] = true
39
+ end
40
+
41
+ opts.on('-m', '--map', 'Show sourcemap') do
42
+ options[:map] = true
43
+ end
44
+
45
+ opts.on('-c', '--compile', 'Compile to JavaScript') do
46
+ options[:compile] = true
47
+ end
48
+
49
+ opts.on('-s', '--server [PORT]', 'Start a server (default port: 3000)') do |port|
50
+ options[:server] = port.to_i
51
+ end
52
+
53
+
54
+ opts.separator ''
55
+ opts.separator 'Compilation Options:'
56
+
57
+ opts.on('-M', '--no-method-missing', 'Disable method missing') do |value|
58
+ options[:method_missing] = false
59
+ end
60
+
61
+ opts.on('-O', '--no-optimized-operators', 'Disable optimized operators') do |value|
62
+ options[:optimized_operators_enabled] = false
63
+ end
64
+
65
+ opts.on('-A', '--arity-check', 'Enable arity check') do |value|
66
+ options[:arity_check] = true
67
+ end
68
+
69
+ opts.on('-C', '--no-const-missing', 'Disable const missing') do |value|
70
+ options[:const_missing] = false
71
+ end
72
+
73
+ dynamic_require_levels = %w[error warning ignore]
74
+ opts.on('-D', '--dynamic-require LEVEL', dynamic_require_levels,
75
+ 'Set levelDynamic require severity') do |level|
76
+ options[:dynamic_require_severity] = level
77
+ end
78
+
79
+ opts.on('-P', '--no-source-map', 'Disable source map') do |value|
80
+ options[:source_map_enabled] = false
81
+ end
82
+
83
+ opts.on("--irb", "IRB var mode") do |i|
84
+ options[:irb] = true
85
+ end
86
+ end
87
+ end
88
+
89
+ attr_reader :options
90
+ end
91
+ end