opal 0.2.2 → 0.3.0

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 (325) hide show
  1. data/.gitignore +5 -10
  2. data/LICENSE +75 -0
  3. data/README.md +55 -3
  4. data/Rakefile +62 -139
  5. data/bin/opal +7 -10
  6. data/gems/core/README.md +5 -0
  7. data/gems/core/Rakefile +7 -0
  8. data/gems/core/core.gemspec +13 -0
  9. data/gems/core/lib/core.rb +33 -0
  10. data/gems/core/lib/core/array.rb +1470 -0
  11. data/gems/core/lib/core/basic_object.rb +15 -0
  12. data/gems/core/lib/core/class.rb +31 -0
  13. data/gems/core/lib/core/dir.rb +26 -0
  14. data/gems/core/lib/core/error.rb +43 -0
  15. data/gems/core/lib/core/false_class.rb +21 -0
  16. data/gems/core/lib/core/file.rb +54 -0
  17. data/gems/core/lib/core/hash.rb +725 -0
  18. data/gems/core/lib/core/kernel.rb +240 -0
  19. data/gems/core/lib/core/module.rb +98 -0
  20. data/gems/core/lib/core/nil_class.rb +41 -0
  21. data/gems/core/lib/core/numeric.rb +370 -0
  22. data/gems/core/lib/core/proc.rb +11 -0
  23. data/gems/core/lib/core/range.rb +17 -0
  24. data/gems/core/lib/core/regexp.rb +18 -0
  25. data/gems/core/lib/core/string.rb +328 -0
  26. data/gems/core/lib/core/symbol.rb +15 -0
  27. data/gems/core/lib/core/top_self.rb +8 -0
  28. data/gems/core/lib/core/true_class.rb +20 -0
  29. data/gems/core/lib/core/vm.rb +16 -0
  30. data/{opals/opal/opal → gems/core}/spec/core/array/append_spec.rb +0 -0
  31. data/{opals/opal/opal → gems/core}/spec/core/array/assoc_spec.rb +0 -0
  32. data/{opals/opal/opal → gems/core}/spec/core/array/at_spec.rb +0 -0
  33. data/{opals/opal/opal → gems/core}/spec/core/array/clear_spec.rb +1 -1
  34. data/{opals/opal/opal → gems/core}/spec/core/array/collect_bang_spec.rb +0 -0
  35. data/{opals/opal/opal → gems/core}/spec/core/array/collect_spec.rb +0 -0
  36. data/gems/core/spec/core/array/compact_spec.rb +41 -0
  37. data/{opals/opal/opal → gems/core}/spec/core/array/concat_spec.rb +0 -0
  38. data/{opals/opal/opal → gems/core}/spec/core/array/constructor_spec.rb +0 -0
  39. data/{opals/opal/opal → gems/core}/spec/core/array/each_spec.rb +0 -0
  40. data/{opals/opal/opal → gems/core}/spec/core/array/element_reference_spec.rb +0 -0
  41. data/{opals/opal/opal → gems/core}/spec/core/array/first_spec.rb +1 -1
  42. data/{opals/opal/opal → gems/core}/spec/core/array/include_spec.rb +0 -0
  43. data/gems/core/spec/core/array/join_spec.rb +6 -0
  44. data/gems/core/spec/core/array/last_spec.rb +51 -0
  45. data/gems/core/spec/core/array/length_spec.rb +6 -0
  46. data/{opals/opal/opal → gems/core}/spec/core/array/map_spec.rb +2 -0
  47. data/gems/core/spec/core/array/reverse_spec.rb +6 -0
  48. data/{opals/opal/opal → gems/core}/spec/core/builtin_constants/builtin_constants_spec.rb +0 -0
  49. data/{opals/opal/opal → gems/core}/spec/core/false/and_spec.rb +0 -0
  50. data/{opals/opal/opal → gems/core}/spec/core/false/inspect_spec.rb +0 -0
  51. data/{opals/opal/opal → gems/core}/spec/core/false/or_spec.rb +0 -0
  52. data/{opals/opal/opal → gems/core}/spec/core/false/to_s_spec.rb +0 -0
  53. data/{opals/opal/opal → gems/core}/spec/core/false/xor_spec.rb +0 -0
  54. data/{opals/opal/opal → gems/core}/spec/core/file/join_spec.rb +1 -1
  55. data/gems/core/spec/core/hash/assoc_spec.rb +32 -0
  56. data/{opals/opal/opal → gems/core}/spec/core/kernel/instance_eval_spec.rb +0 -0
  57. data/{opals/opal/opal → gems/core}/spec/core/kernel/loop_spec.rb +0 -0
  58. data/{opals/opal/opal → gems/core}/spec/core/kernel/raise_spec.rb +0 -0
  59. data/{opals/opal/opal → gems/core}/spec/core/module/attr_accessor_spec.rb +0 -0
  60. data/{opals/opal/opal → gems/core}/spec/core/number/lt_spec.rb +0 -0
  61. data/gems/core/spec/core/string/sub_spec.rb +24 -0
  62. data/{opals/opal/opal → gems/core}/spec/core/true/and_spec.rb +0 -0
  63. data/{opals/opal/opal → gems/core}/spec/core/true/inspect_spec.rb +0 -0
  64. data/{opals/opal/opal → gems/core}/spec/core/true/or_spec.rb +0 -0
  65. data/{opals/opal/opal → gems/core}/spec/core/true/to_s_spec.rb +0 -0
  66. data/{opals/opal/opal → gems/core}/spec/core/true/xor_spec.rb +0 -0
  67. data/{opals/opal/opal → gems/core}/spec/language/and_spec.rb +2 -3
  68. data/{opals/opal/opal → gems/core}/spec/language/array_spec.rb +21 -5
  69. data/gems/core/spec/language/block_spec.rb +38 -0
  70. data/{opals/opal/opal → gems/core}/spec/language/break_spec.rb +0 -0
  71. data/gems/core/spec/language/case_spec.rb +103 -0
  72. data/{opals/opal/opal → gems/core}/spec/language/def_spec.rb +11 -1
  73. data/{opals/opal/opal → gems/core}/spec/language/eigenclass_spec.rb +0 -0
  74. data/gems/core/spec/language/file_spec.rb +13 -0
  75. data/gems/core/spec/language/fixtures/block.rb +21 -0
  76. data/gems/core/spec/language/fixtures/super.rb +293 -0
  77. data/{opals/opal/opal → gems/core}/spec/language/hash_spec.rb +0 -0
  78. data/{opals/opal/opal → gems/core}/spec/language/if_spec.rb +0 -0
  79. data/{opals/opal/opal → gems/core}/spec/language/loop_spec.rb +0 -0
  80. data/gems/core/spec/language/metaclass_spec.rb +21 -0
  81. data/{opals/opal/opal → gems/core}/spec/language/method_spec.rb +60 -0
  82. data/{opals/opal/opal → gems/core}/spec/language/next_spec.rb +0 -0
  83. data/{opals/opal/opal → gems/core}/spec/language/or_spec.rb +0 -0
  84. data/{opals/opal/opal → gems/core}/spec/language/redo_spec.rb +0 -0
  85. data/gems/core/spec/language/regexp_spec.rb +26 -0
  86. data/{opals/opal/opal → gems/core}/spec/language/rescue_spec.rb +0 -0
  87. data/{opals/opal/opal → gems/core}/spec/language/return_spec.rb +0 -0
  88. data/{opals/opal/opal → gems/core}/spec/language/string_spec.rb +0 -0
  89. data/gems/core/spec/language/super_spec.rb +32 -0
  90. data/{opals/opal/opal → gems/core}/spec/language/until_spec.rb +47 -47
  91. data/gems/core/spec/language/variables_spec.rb +155 -0
  92. data/{opals/opal/opal → gems/core}/spec/language/while_spec.rb +47 -47
  93. data/{opals/opal/opal → gems/core}/spec/spec_helper.rb +1 -1
  94. data/gems/core_fs/README.md +19 -0
  95. data/gems/dev/Rakefile +5 -0
  96. data/gems/dev/lib/dev.js +99 -0
  97. data/gems/dev/lib/dev/generator.js +1264 -0
  98. data/gems/dev/lib/dev/parser.js +979 -0
  99. data/gems/dev/lib/dev/ruby_parser.js +1088 -0
  100. data/gems/dev/lib/dev/ruby_parser.y +1267 -0
  101. data/gems/dev/lib/dev/string_scanner.js +38 -0
  102. data/gems/dev/tools/racc2js/README.md +39 -0
  103. data/gems/dev/tools/racc2js/math_parser.js +222 -0
  104. data/gems/dev/tools/racc2js/math_parser.rb +133 -0
  105. data/gems/dev/tools/racc2js/math_parser.y +28 -0
  106. data/gems/dev/tools/racc2js/parser.js +218 -0
  107. data/gems/dev/tools/racc2js/racc2js.rb +153 -0
  108. data/gems/json/README.md +4 -0
  109. data/gems/json/json.gemspec +14 -0
  110. data/gems/json/lib/json.rb +64 -0
  111. data/gems/json/lib/json/ext.rb +51 -0
  112. data/{opals/opal/browser/lib/browser/json_parse.js → gems/json/lib/json/json2.js} +197 -37
  113. data/gems/ospec/README.md +0 -0
  114. data/gems/ospec/lib/ospec.rb +6 -0
  115. data/gems/ospec/lib/ospec/autorun.rb +3 -0
  116. data/gems/ospec/lib/ospec/dsl.rb +15 -0
  117. data/gems/ospec/lib/ospec/example.rb +11 -0
  118. data/gems/ospec/lib/ospec/example/before_and_after_hooks.rb +56 -0
  119. data/gems/ospec/lib/ospec/example/errors.rb +17 -0
  120. data/gems/ospec/lib/ospec/example/example_group.rb +12 -0
  121. data/gems/ospec/lib/ospec/example/example_group_factory.rb +21 -0
  122. data/gems/ospec/lib/ospec/example/example_group_hierarchy.rb +20 -0
  123. data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/example/example_group_methods.rb +26 -68
  124. data/gems/ospec/lib/ospec/example/example_group_proxy.rb +14 -0
  125. data/gems/ospec/lib/ospec/example/example_methods.rb +46 -0
  126. data/gems/ospec/lib/ospec/example/example_proxy.rb +18 -0
  127. data/gems/ospec/lib/ospec/expectations.rb +19 -0
  128. data/gems/ospec/lib/ospec/expectations/errors.rb +8 -0
  129. data/gems/ospec/lib/ospec/expectations/fail_with.rb +8 -0
  130. data/gems/ospec/lib/ospec/expectations/handler.rb +27 -0
  131. data/gems/ospec/lib/ospec/matchers.rb +24 -0
  132. data/{opals/opal/Rakefile → gems/ospec/lib/ospec/matchers/be.rb} +0 -0
  133. data/gems/ospec/lib/ospec/matchers/generated_descriptions.rb +20 -0
  134. data/gems/ospec/lib/ospec/matchers/operator_matcher.rb +52 -0
  135. data/gems/ospec/lib/ospec/runner.rb +40 -0
  136. data/gems/ospec/lib/ospec/runner/example_group_runner.rb +44 -0
  137. data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/runner/formatter/html_formatter.rb +31 -40
  138. data/gems/ospec/lib/ospec/runner/formatter/terminal_formatter.rb +48 -0
  139. data/gems/ospec/lib/ospec/runner/options.rb +36 -0
  140. data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/runner/reporter.rb +23 -55
  141. data/gems/ospec/ospec.gemspec +0 -0
  142. data/gems/rquery/README.md +9 -0
  143. data/gems/rquery/lib/rquery.rb +10 -0
  144. data/gems/rquery/lib/rquery/ajax.rb +4 -0
  145. data/gems/rquery/lib/rquery/css.rb +96 -0
  146. data/gems/rquery/lib/rquery/document.rb +25 -0
  147. data/gems/rquery/lib/rquery/element.rb +292 -0
  148. data/gems/rquery/lib/rquery/event.rb +108 -0
  149. data/gems/rquery/lib/rquery/jquery.js +8177 -0
  150. data/gems/rquery/lib/rquery/request.rb +138 -0
  151. data/gems/rquery/lib/rquery/response.rb +49 -0
  152. data/gems/rquery/rquery.gemspec +16 -0
  153. data/lib/opal.js +1597 -0
  154. data/lib/opal.rb +6 -69
  155. data/lib/opal/builder.rb +115 -0
  156. data/lib/opal/bundle.rb +131 -0
  157. data/lib/opal/command.rb +11 -0
  158. data/lib/opal/context.rb +69 -0
  159. data/lib/opal/context/console.rb +12 -0
  160. data/lib/opal/context/file_system.rb +19 -0
  161. data/lib/opal/context/loader.rb +117 -0
  162. data/lib/opal/gem.rb +153 -0
  163. data/lib/opal/ruby/nodes.rb +1302 -0
  164. data/lib/opal/ruby/parser.rb +780 -0
  165. data/lib/opal/ruby/ruby_parser.rb +5170 -0
  166. data/lib/opal/ruby/ruby_parser.y +1298 -0
  167. data/opal.gemspec +11 -256
  168. metadata +179 -240
  169. data/.gitmodules +0 -6
  170. data/Opalfile +0 -384
  171. data/VERSION +0 -1
  172. data/demos/apps/browser_demo/index.html +0 -11
  173. data/demos/apps/browser_demo/lib/browser_demo.rb +0 -31
  174. data/demos/apps/simple_opal/Opalfile +0 -13
  175. data/demos/apps/simple_opal/index.html +0 -11
  176. data/demos/apps/simple_opal/lib/app_controller.rb +0 -62
  177. data/demos/apps/simple_opal/lib/main_window.rb +0 -146
  178. data/demos/browser/request/index.html +0 -52
  179. data/demos/browser/request/request.rb +0 -48
  180. data/gen/browser/__PROJECT_NAME__/Rakefile +0 -12
  181. data/gen/browser/__PROJECT_NAME__/index.html +0 -11
  182. data/gen/browser/__PROJECT_NAME__/javascripts/opal.debug.js +0 -4687
  183. data/gen/browser/__PROJECT_NAME__/javascripts/opal.min.js +0 -175
  184. data/gen/browser/__PROJECT_NAME__/lib/__PROJECT_NAME__.rb +0 -1
  185. data/lib/opal/builders/base.rb +0 -50
  186. data/lib/opal/builders/css.rb +0 -46
  187. data/lib/opal/builders/javascript.rb +0 -44
  188. data/lib/opal/builders/opal.rb +0 -79
  189. data/lib/opal/builders/ruby.rb +0 -50
  190. data/lib/opal/builders/ruby/generate.rb +0 -1851
  191. data/lib/opal/builders/ruby/nodes.rb +0 -210
  192. data/lib/opal/builders/ruby/ruby.rb +0 -916
  193. data/lib/opal/builders/ruby/ruby_parser.rb +0 -6008
  194. data/lib/opal/builders/ruby/ruby_parser.rb.y +0 -1451
  195. data/lib/opal/models/build_item.rb +0 -104
  196. data/lib/opal/models/hash_struct.rb +0 -40
  197. data/lib/opal/models/project.rb +0 -252
  198. data/lib/opal/models/struct_accessors.rb +0 -58
  199. data/lib/opal/models/target.rb +0 -176
  200. data/lib/opal/opal/build.rb +0 -169
  201. data/lib/opal/opal/env/console.rb +0 -66
  202. data/lib/opal/opal/env/fs.rb +0 -98
  203. data/lib/opal/opal/env/object.rb +0 -48
  204. data/lib/opal/opal/environment.rb +0 -139
  205. data/lib/opal/opal/gen.rb +0 -62
  206. data/lib/opal/opal/opal.rb +0 -75
  207. data/lib/opal/opal/repl.rb +0 -38
  208. data/lib/opal/opalfile/dsl.rb +0 -62
  209. data/lib/opal/opalfile/opalfile.rb +0 -133
  210. data/lib/opal/opalfile/task.rb +0 -96
  211. data/lib/opal/opalfile/task_manager.rb +0 -63
  212. data/lib/opal/opalfile/task_scope.rb +0 -52
  213. data/lib/opal/rack/app_server.rb +0 -119
  214. data/lib/opal/rake/opal_task.rb +0 -34
  215. data/opals/opal/README.md +0 -37
  216. data/opals/opal/browser/Opalfile +0 -11
  217. data/opals/opal/browser/README.md +0 -146
  218. data/opals/opal/browser/SIZZLE_LICESNSE.txt +0 -148
  219. data/opals/opal/browser/lib/browser.rb +0 -118
  220. data/opals/opal/browser/lib/browser/builder.rb +0 -41
  221. data/opals/opal/browser/lib/browser/canvas_context.rb +0 -115
  222. data/opals/opal/browser/lib/browser/dimensions.rb +0 -50
  223. data/opals/opal/browser/lib/browser/document.rb +0 -146
  224. data/opals/opal/browser/lib/browser/element.rb +0 -487
  225. data/opals/opal/browser/lib/browser/element/attributes.rb +0 -88
  226. data/opals/opal/browser/lib/browser/element/css.rb +0 -290
  227. data/opals/opal/browser/lib/browser/element/form.rb +0 -146
  228. data/opals/opal/browser/lib/browser/event/dom_events.rb +0 -81
  229. data/opals/opal/browser/lib/browser/event/event.rb +0 -177
  230. data/opals/opal/browser/lib/browser/event/trigger_events.rb +0 -53
  231. data/opals/opal/browser/lib/browser/geometry.rb +0 -97
  232. data/opals/opal/browser/lib/browser/json.rb +0 -32
  233. data/opals/opal/browser/lib/browser/request/request.rb +0 -201
  234. data/opals/opal/browser/lib/browser/sizzle.js +0 -1068
  235. data/opals/opal/browser/lib/browser/string.rb +0 -42
  236. data/opals/opal/browser/lib/browser/touch.rb +0 -37
  237. data/opals/opal/browser/lib/browser/vml_context.js +0 -33
  238. data/opals/opal/browser/lib/browser/window.rb +0 -36
  239. data/opals/opal/browser/spec/browser/browser_detection_spec.rb +0 -7
  240. data/opals/opal/browser/spec/document/aref_spec.rb +0 -110
  241. data/opals/opal/browser/spec/document/ready_spec.rb +0 -16
  242. data/opals/opal/browser/spec/element/body_spec.rb +0 -11
  243. data/opals/opal/browser/spec/element/clear_spec.rb +0 -26
  244. data/opals/opal/browser/spec/element/empty_spec.rb +0 -29
  245. data/opals/opal/browser/spec/element/has_class_spec.rb +0 -40
  246. data/opals/opal/browser/spec/element/hidden_spec.rb +0 -23
  247. data/opals/opal/browser/spec/element/hide_spec.rb +0 -31
  248. data/opals/opal/browser/spec/element/remove_spec.rb +0 -25
  249. data/opals/opal/browser/spec/element/show_spec.rb +0 -31
  250. data/opals/opal/browser/spec/element/style_spec.rb +0 -69
  251. data/opals/opal/browser/spec/element/toggle_spec.rb +0 -31
  252. data/opals/opal/browser/spec/element/visible_spec.rb +0 -23
  253. data/opals/opal/browser/spec/spec_helper.rb +0 -1
  254. data/opals/opal/opal/Opalfile +0 -14
  255. data/opals/opal/opal/spec/core/array/compact_spec.rb +0 -15
  256. data/opals/opal/opal/spec/fixtures/super.rb +0 -70
  257. data/opals/opal/opal/spec/language/____temp_remove_this.rb +0 -12
  258. data/opals/opal/opal/spec/language/block_spec.rb +0 -18
  259. data/opals/opal/opal/spec/language/case_spec.rb +0 -103
  260. data/opals/opal/opal/spec/language/metaclass_spec.rb +0 -21
  261. data/opals/opal/opal/spec/language/super_spec.rb +0 -26
  262. data/opals/opal/runtime/Opalfile +0 -78
  263. data/opals/opal/runtime/README.md +0 -12
  264. data/opals/opal/runtime/docs/debugging.md +0 -51
  265. data/opals/opal/runtime/lib/array.rb +0 -1516
  266. data/opals/opal/runtime/lib/basic_object.rb +0 -49
  267. data/opals/opal/runtime/lib/class.rb +0 -54
  268. data/opals/opal/runtime/lib/dir.rb +0 -36
  269. data/opals/opal/runtime/lib/error.rb +0 -49
  270. data/opals/opal/runtime/lib/false_class.rb +0 -52
  271. data/opals/opal/runtime/lib/file.rb +0 -79
  272. data/opals/opal/runtime/lib/hash.rb +0 -791
  273. data/opals/opal/runtime/lib/io.rb +0 -39
  274. data/opals/opal/runtime/lib/kernel.rb +0 -288
  275. data/opals/opal/runtime/lib/match_data.rb +0 -36
  276. data/opals/opal/runtime/lib/module.rb +0 -109
  277. data/opals/opal/runtime/lib/nil_class.rb +0 -69
  278. data/opals/opal/runtime/lib/number.rb +0 -398
  279. data/opals/opal/runtime/lib/proc.rb +0 -77
  280. data/opals/opal/runtime/lib/range.rb +0 -63
  281. data/opals/opal/runtime/lib/regexp.rb +0 -111
  282. data/opals/opal/runtime/lib/ruby.rb +0 -30
  283. data/opals/opal/runtime/lib/string.rb +0 -328
  284. data/opals/opal/runtime/lib/symbol.rb +0 -40
  285. data/opals/opal/runtime/lib/top_self.rb +0 -33
  286. data/opals/opal/runtime/lib/true_class.rb +0 -45
  287. data/opals/opal/runtime/runtime/browser.js +0 -287
  288. data/opals/opal/runtime/runtime/debug.js +0 -180
  289. data/opals/opal/runtime/runtime/opal.js +0 -1008
  290. data/opals/opal/runtime/runtime/post_opal.js +0 -1
  291. data/opals/opal/runtime/runtime/pre_opal.js +0 -2
  292. data/opals/opal/runtime/runtime/server_side.js +0 -50
  293. data/opals/opal/spec/LICENSE.txt +0 -26
  294. data/opals/opal/spec/Opalfile +0 -5
  295. data/opals/opal/spec/bin/spec.rb +0 -43
  296. data/opals/opal/spec/lib/spec.rb +0 -33
  297. data/opals/opal/spec/lib/spec/dsl.rb +0 -41
  298. data/opals/opal/spec/lib/spec/example.rb +0 -35
  299. data/opals/opal/spec/lib/spec/example/before_and_after_hooks.rb +0 -81
  300. data/opals/opal/spec/lib/spec/example/errors.rb +0 -42
  301. data/opals/opal/spec/lib/spec/example/example_group.rb +0 -37
  302. data/opals/opal/spec/lib/spec/example/example_group_factory.rb +0 -43
  303. data/opals/opal/spec/lib/spec/example/example_group_hierarchy.rb +0 -45
  304. data/opals/opal/spec/lib/spec/example/example_group_proxy.rb +0 -41
  305. data/opals/opal/spec/lib/spec/example/example_methods.rb +0 -73
  306. data/opals/opal/spec/lib/spec/example/example_proxy.rb +0 -48
  307. data/opals/opal/spec/lib/spec/expectations.rb +0 -46
  308. data/opals/opal/spec/lib/spec/expectations/errors.rb +0 -35
  309. data/opals/opal/spec/lib/spec/expectations/fail_with.rb +0 -37
  310. data/opals/opal/spec/lib/spec/expectations/handler.rb +0 -48
  311. data/opals/opal/spec/lib/spec/matchers.rb +0 -50
  312. data/opals/opal/spec/lib/spec/matchers/be.rb +0 -26
  313. data/opals/opal/spec/lib/spec/matchers/generated_descriptions.rb +0 -47
  314. data/opals/opal/spec/lib/spec/matchers/operator_matcher.rb +0 -66
  315. data/opals/opal/spec/lib/spec/runner.rb +0 -48
  316. data/opals/opal/spec/lib/spec/runner/example_group_runner.rb +0 -71
  317. data/opals/opal/spec/lib/spec/runner/formatter/terminal_formatter.rb +0 -82
  318. data/opals/opal/spec/lib/spec/runner/options.rb +0 -63
  319. data/opals/opal/spec/resources/index.html +0 -25
  320. data/opals/opal/spec/resources/spec.css +0 -132
  321. data/spec/cherry_kit/iseq_spec.rb +0 -38
  322. data/spec/spec_helper.rb +0 -16
  323. data/spec/vienna_spec.rb +0 -7
  324. data/yard/index.html +0 -43
  325. data/yard/style.css +0 -765
@@ -1,49 +0,0 @@
1
- #
2
- # basic_object.rb
3
- # vienna
4
- #
5
- # Created by Adam Beynon.
6
- # Copyright 2010 Adam Beynon.
7
- #
8
- # Permission is hereby granted, free of charge, to any person obtaining a copy
9
- # of this software and associated documentation files (the "Software"), to deal
10
- # in the Software without restriction, including without limitation the rights
11
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- # copies of the Software, and to permit persons to whom the Software is
13
- # furnished to do so, subject to the following conditions:
14
- #
15
- # The above copyright notice and this permission notice shall be included in
16
- # all copies or substantial portions of the Software.
17
- #
18
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
- # THE SOFTWARE.
25
- #
26
-
27
- class BasicObject
28
-
29
- def initialize
30
- # puts "in basicobject initialize"
31
- end
32
-
33
- def ==(obj)
34
- `return #{self} === #{obj} ? #{self}.t : #{self}.f;`
35
- end
36
-
37
- def equal? other
38
-
39
- end
40
-
41
- def !()
42
- false
43
- end
44
-
45
- def !=(other)
46
- `return #{self == other}.r ? #{false} : #{true};`
47
- end
48
-
49
- end
@@ -1,54 +0,0 @@
1
- #
2
- # class.rb
3
- # vienna
4
- #
5
- # Created by Adam Beynon.
6
- # Copyright 2010 Adam Beynon.
7
- #
8
- # Permission is hereby granted, free of charge, to any person obtaining a copy
9
- # of this software and associated documentation files (the "Software"), to deal
10
- # in the Software without restriction, including without limitation the rights
11
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- # copies of the Software, and to permit persons to whom the Software is
13
- # furnished to do so, subject to the following conditions:
14
- #
15
- # The above copyright notice and this permission notice shall be included in
16
- # all copies or substantial portions of the Software.
17
- #
18
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
- # THE SOFTWARE.
25
- #
26
-
27
- class Class
28
-
29
- def include(mod)
30
- `return #{self}.include(#{mod});`
31
- end
32
-
33
- def extend(mod)
34
- `return #{self}.extend(#{mod});`
35
- end
36
-
37
- def allocate
38
- `return new #{self}.allocator();`
39
- end
40
-
41
- def self.new(super_class)
42
- `return opal.__subclass("", #{super_class});`
43
- end
44
-
45
- def new
46
- obj = allocate
47
- `#{obj}.$initialize.apply(#{obj}, arguments);`
48
- obj
49
- end
50
-
51
- def initialize
52
- puts "in Class.new initialize"
53
- end
54
- end
@@ -1,36 +0,0 @@
1
- #
2
- # dir.rb
3
- # vienna
4
- #
5
- # Created by Adam Beynon.
6
- # Copyright 2010 Adam Beynon.
7
- #
8
- # Permission is hereby granted, free of charge, to any person obtaining a copy
9
- # of this software and associated documentation files (the "Software"), to deal
10
- # in the Software without restriction, including without limitation the rights
11
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- # copies of the Software, and to permit persons to whom the Software is
13
- # furnished to do so, subject to the following conditions:
14
- #
15
- # The above copyright notice and this permission notice shall be included in
16
- # all copies or substantial portions of the Software.
17
- #
18
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
- # THE SOFTWARE.
25
- #
26
-
27
- class Dir
28
-
29
- def self.getwd
30
- `return opal.getwd;`
31
- end
32
-
33
- def self.glob(glob)
34
- `return opal.glob_files(#{glob});`
35
- end
36
- end
@@ -1,49 +0,0 @@
1
- #
2
- # error.rb
3
- # vienna
4
- #
5
- # Created by Adam Beynon.
6
- # Copyright 2010 Adam Beynon.
7
- #
8
- # Permission is hereby granted, free of charge, to any person obtaining a copy
9
- # of this software and associated documentation files (the "Software"), to deal
10
- # in the Software without restriction, including without limitation the rights
11
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- # copies of the Software, and to permit persons to whom the Software is
13
- # furnished to do so, subject to the following conditions:
14
- #
15
- # The above copyright notice and this permission notice shall be included in
16
- # all copies or substantial portions of the Software.
17
- #
18
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
- # THE SOFTWARE.
25
- #
26
-
27
-
28
- class Exception
29
-
30
- def message
31
- @message
32
- end
33
-
34
- def initialize(message)
35
- `if (!#{message}) {
36
- #{message} = #{nil};
37
- }`
38
- @message = message
39
- end
40
- end
41
-
42
-
43
- class RuntimeError < Exception
44
-
45
- end
46
-
47
- class StandardError < Exception
48
-
49
- end
@@ -1,52 +0,0 @@
1
- #
2
- # false_class.rb
3
- # vienna
4
- #
5
- # Created by Adam Beynon.
6
- # Copyright 2010 Adam Beynon.
7
- #
8
- # Permission is hereby granted, free of charge, to any person obtaining a copy
9
- # of this software and associated documentation files (the "Software"), to deal
10
- # in the Software without restriction, including without limitation the rights
11
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- # copies of the Software, and to permit persons to whom the Software is
13
- # furnished to do so, subject to the following conditions:
14
- #
15
- # The above copyright notice and this permission notice shall be included in
16
- # all copies or substantial portions of the Software.
17
- #
18
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
- # THE SOFTWARE.
25
- #
26
-
27
- class FalseClass
28
-
29
- def inspect
30
- "false"
31
- end
32
-
33
- def to_s
34
- "false"
35
- end
36
-
37
- def !()
38
- true
39
- end
40
-
41
- def &(other)
42
- false
43
- end
44
-
45
- def |(other)
46
- other ? true : false
47
- end
48
-
49
- def ^(other)
50
- other ? true : false
51
- end
52
- end
@@ -1,79 +0,0 @@
1
- #
2
- # file.rb
3
- # vienna
4
- #
5
- # Created by Adam Beynon.
6
- # Copyright 2010 Adam Beynon.
7
- #
8
- # Permission is hereby granted, free of charge, to any person obtaining a copy
9
- # of this software and associated documentation files (the "Software"), to deal
10
- # in the Software without restriction, including without limitation the rights
11
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- # copies of the Software, and to permit persons to whom the Software is
13
- # furnished to do so, subject to the following conditions:
14
- #
15
- # The above copyright notice and this permission notice shall be included in
16
- # all copies or substantial portions of the Software.
17
- #
18
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
- # THE SOFTWARE.
25
- #
26
-
27
- class File
28
-
29
- # class << self
30
-
31
- # end
32
-
33
- def self.join(*parts)
34
- `return #{parts}.join("/");`
35
- end
36
-
37
- # Returns all components of the filename given in `file_name` except the last
38
- # one. The filename must be formed using forward slashed ("/") regardless of
39
- # the separator used on the local filesystem.
40
- #
41
- # @example
42
- # File.dirname "home/adam/work/ruby.rb"
43
- # # => "/home/adam/work"
44
- #
45
- # @param [String] file_name
46
- # @return [String]
47
- def self.dirname(file_name)
48
- `return #{file_name}.substr(0, #{file_name}.lastIndexOf('/'));`
49
- end
50
-
51
- def self.expand_path(path = "")
52
- `var start_slash = (#{path}[0] === "/");
53
- var parts = #{path}.split("/");
54
- var result = [];
55
- var part;
56
- for (var i = 0; i < parts.length; i++) {
57
- part = parts[i];
58
- switch (part) {
59
- case '..':
60
- result.pop();
61
- break;
62
- case '.':
63
- break;
64
- case '':
65
- break;
66
- default:
67
- result.push(part);
68
- }
69
- }
70
-
71
- if (start_slash) {
72
- // if we started with a slash, use that
73
- return "/" + result.join("/");
74
- } else {
75
- // otherwise join with our current working dir
76
- return opal.getwd + "/" + result.join("/");
77
- }`
78
- end
79
- end
@@ -1,791 +0,0 @@
1
- #
2
- # hash.rb
3
- # vienna
4
- #
5
- # Created by Adam Beynon.
6
- # Copyright 2010 Adam Beynon.
7
- #
8
- # Permission is hereby granted, free of charge, to any person obtaining a copy
9
- # of this software and associated documentation files (the "Software"), to deal
10
- # in the Software without restriction, including without limitation the rights
11
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- # copies of the Software, and to permit persons to whom the Software is
13
- # furnished to do so, subject to the following conditions:
14
- #
15
- # The above copyright notice and this permission notice shall be included in
16
- # all copies or substantial portions of the Software.
17
- #
18
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
- # THE SOFTWARE.
25
- #
26
-
27
- # A {Hash} is a collection of key-value pairs. It is similar to an {Array},
28
- # except that indexing is done via arbitrary keys of any object type, not an
29
- # integer index. Hashes enumerate their values in the order that the
30
- # corresponding keys were inserted.
31
- #
32
- # Hashes have a default value that is returned when accessing keys that do not
33
- # exist in the hash. By default, that value is `nil`.
34
- class Hash
35
-
36
- # Creates a new hash populated with the given objects. Equivalent to the
37
- # literal `{ key => value, ... }`.
38
- #
39
- # @example
40
- # Hash["a", 100, "b", 200]
41
- # # => {"a" =>100, "b"=>200}
42
- #
43
- # @return [Hash]
44
- def self.[](*all)
45
- `return vnH.apply(#{self}, #{all});`
46
- end
47
-
48
- # Equality - Two hashes are equal if they each contain the same number of keys
49
- # and if each key-value pair is equal to (according to {Object#==}) the
50
- # corresponding elements in the other hash.
51
- #
52
- # @example
53
- # h1 = {"a" => 1, "c" => 2}
54
- # h2 = {7 => 35, "c" => 2, "a" => 1}
55
- # h3 = {"a" => 1, "c" => 2, 7 => 35}
56
- # h4 = {"a" => 1, "d" => 2, "f" => 35}
57
- # h1 == h2
58
- # # => false
59
- # h2 == h3
60
- # # => true
61
- # h3 == h4
62
- # # => false
63
- #
64
- # @param [Hash] other another hash to comapre
65
- # @return [Boolean]
66
- def ==(other)
67
- `if (#{self} === #{other}) return #{true};
68
- if (!(#{other}.info & #{self}.TH)) return #{false}
69
- if (#{self}.__keys__.length !== #{other}.__keys__.length) return #{false};
70
- for (var i = 0; i < #{self}.__keys__.length; i++) {
71
- var key = #{self}.__keys__[i].hash();
72
- if (!(#{self}.__assocs__[key]['$=='](#{other}.__assocs__[key]).r)) return #{false};
73
- }`
74
- true
75
- end
76
-
77
- alias_method :eql?, :==
78
-
79
- # Element Reference - retrieves the `value` object corresponding to the `key`
80
- # object. If not found, returns the default value.
81
- #
82
- # @example
83
- # h = {"a" => 100, "b" => 200}
84
- # h["a"]
85
- # # => 100
86
- # h["c"]
87
- # # => nil
88
- #
89
- # @param [Object] key key to look for
90
- # @return [Object] result or default value
91
- def [](key)
92
- `return #{self}.hash_fetch(#{key});`
93
- end
94
-
95
- # Element Assignment - Associates the value give by `value` with the key given
96
- # by `key`. `key` should not have its value changed while it is in use as a
97
- # key.
98
- #
99
- # @example
100
- # h = {"a" => 100, "b" => 200}
101
- # h["a"] = 9
102
- # # => 9
103
- # h["c"] = 4
104
- # # => 4
105
- # h
106
- # # => {"a" => 9, "b" => 200, "c" => 4}
107
- #
108
- # @param [Object] key key for hash
109
- # @param [Object] value value for key
110
- # @return [Object] returns the value
111
- def []=(key, value)
112
- `return #{self}.hash_store(#{key}, #{value});`
113
- end
114
-
115
- alias_method :store, :[]=
116
-
117
- # Searches through the hash comparing `obj` with the key using ==. Returns the
118
- # key-value pair (two elements array) or nil if no match is found. See
119
- # {Array#assoc}.
120
- #
121
- # @example
122
- # h = { "a" => [1, 2, 3], "b" => [4, 5, 6] }
123
- # h["a"]
124
- # # => ["a", [1, 2, 3]]
125
- # h["c"]
126
- # # => nil
127
- #
128
- # @param [Object] obj key to search for
129
- # @return [Array<Object, Object>, nil] result or nil
130
- def assoc(obj)
131
- `var key;
132
- for (var i = 0; i < #{self}.__keys__.length; i++) {
133
- key = #{self}.__keys__[i];
134
- if (key['$=='](#{obj}).r) {
135
- return [key, #{self}.__assocs__[key.hash()]];
136
- }
137
- }`
138
- nil
139
- end
140
-
141
- # Removes all key-value pairs from `self`.
142
- #
143
- # @example
144
- # h = { "a" => [1, 2, 3], "b" => [4, 5, 6] }
145
- # h.clear
146
- # # => {}
147
- #
148
- # @return [Hash] returns receiver
149
- def clear
150
- `#{self}.__keys__ = [];
151
- #{self}.__assocs__ = {};`
152
- self
153
- end
154
-
155
- # Returns the default value, the value that would be returned by hsh[key] if
156
- # key did not exist in hsh.
157
- #
158
- # @example
159
- # h = Hash.new # => {}
160
- # h.default # => nil
161
- # h.default(2) # => nil
162
- #
163
- # h = Hash.new 'cat' # => {}
164
- # h.default # => 'cat'
165
- # h.default(2) # => 'cat'
166
- #
167
- # @todo Using block as default does not currently work
168
- #
169
- # @param [Object] key to check with
170
- # @return [Object] returns default
171
- def default(key = nil)
172
- `return #{self}.__default__;`
173
- end
174
-
175
- # Sets the default value, the value returned for a key that does not exist in
176
- # the hash. It is not possible to set the default to a {Proc} that will be
177
- # executed on each key lookup.
178
- #
179
- # @example
180
- # h = { "a" => 100, "b" => 200 }
181
- # h.default = "Go fish"
182
- # h['a']
183
- # # => 100
184
- # h['z']
185
- # # => "Go fish"
186
- #
187
- # @param [Object] obj the new default
188
- # @return [Object] returns the default value
189
- def default=(obj)
190
- `return #{self}.__default__ = #{obj};`
191
- end
192
-
193
- # Deletes and returns a key-value pair from `self` whose key is equal to
194
- # `key`. If the key is not found, returns the default value. If the optional
195
- # code block is given and the key is not found, pass in the key and return
196
- # the result of `block`.
197
- #
198
- # @todo Use with block functionality not yet implemented.
199
- #
200
- # @example
201
- # h = { "a" => 100, "b" => 200}
202
- # h.delete("a")
203
- # # => 100
204
- # h.delete("z")
205
- # # => nil
206
- #
207
- # @param [Object] key to delete
208
- # @return [Object] returns value or default value
209
- def delete(key)
210
- `return #{self}.hash_delete(#{key});`
211
- end
212
-
213
- # Deletes every key-pair value from `self` for which block evaluates to
214
- # `true`.
215
- #
216
- # If no block is given, an enumerator is returned instead.
217
- #
218
- # @todo Enumerator functionality not yet implemented.
219
- #
220
- # @example
221
- # h = { "a" => 100, "b" => 200, "c" => 300 }
222
- # h.delete_if { |key, value| key >= "b" }
223
- # # => { "a" => 100 }
224
- #
225
- # @return [Hash] returns receiver
226
- def delete_if(&block)
227
- `var key, value;
228
- for (var i = 0; i < #{self}.__keys__.length; i++) {
229
- key = #{self}.__keys__[i];
230
- value = #{self}.__assocs__[key.hash()];
231
- if (#{block}.apply(#{block}.__self__, [key, value]).r) {
232
- #{self}.hash_delete(key);
233
- i--;
234
- };
235
- }`
236
- self
237
- end
238
-
239
- # Calls `block` once for each key in `self`, passing the key-value pair as
240
- # parameters.
241
- #
242
- # If no block is given, an enumerator is returned instead.
243
- #
244
- # @todo Enumerator functionality not yet implemented.
245
- #
246
- # @example
247
- # h = { "a" => 100, "b" => 200 }
248
- # h.each { |k, v| puts "#{k} is #{v}" }
249
- # # => "a is 100"
250
- # # => "b is 200"
251
- #
252
- # @return [Hash] returns reciever
253
- def each(&block)
254
- `var key, value;
255
- for (var i = 0; i < #{self}.__keys__.length; i++) {
256
- key = #{self}.__keys__[i];
257
- value = #{self}.__assocs__[key.hash()];
258
- #{block}.apply(#{block}.__self__, [key, value]);
259
- }`
260
- self
261
- end
262
-
263
- alias_method :each_pair, :each
264
-
265
- # Calls block once for each key in `self`, passing key as a parameter.
266
- #
267
- # @example
268
- # h = { "a" => 100, "b" => 200 }
269
- # h.each_key { |key| puts key }
270
- # # => "a"
271
- # # => "b"
272
- #
273
- # @return [Hash] returns receiver
274
- def each_key(&block)
275
- `var key;
276
- for (var i = 0; i < #{self}.__keys__.length; i++) {
277
- key = #{self}.__keys__[i];
278
- #{block}.apply(#{block}.__self__, [key]);
279
- }`
280
- self
281
- end
282
-
283
- # Calls `block` once for each key in `hsh`, passing the value as a parameter.
284
- #
285
- # @example
286
- # h = { "a" => 100, "b" => 200 }
287
- # h.each_value { |value| puts value }
288
- # # => 100
289
- # # => 200
290
- #
291
- # @return [Hash] returns receiver
292
- def each_value(&block)
293
- `var key, value;
294
- for (var i = 0; i < #{self}.__keys__.length; i++) {
295
- key = #{self}.__keys__[i];
296
- value = #{self}.__assocs__[key.hash()];
297
- #{block}.apply(#{block}.__self__, [value]);
298
- }`
299
- self
300
- end
301
-
302
- # Returns true if `self` contains no key-value pairs.
303
- #
304
- # @example
305
- # {}.empty?
306
- # # => true
307
- #
308
- # @return [Boolean]
309
- def empty?
310
- `return #{self}.__keys__.length == 0 ? #{true} : #{false};`
311
- end
312
-
313
- # Returns a value from the hash for the given key. If the key can't be found,
314
- # there are several options: With no other arguments, it will raise an
315
- # KeyError exception; if `default` is given, then that will be returned; if
316
- # the optional code block is specified, then that will be run and its result
317
- # returned.
318
- #
319
- # @example
320
- # h = { "a" => 100, "b" => 200 }
321
- # h.fetch("a")
322
- # # => 100
323
- # h.fetch("z", "Go fish")
324
- # # => "Go fish"
325
- # h.fetch("z") { |el| "Go fish, #{el}" }
326
- # # => "Go fish, z"
327
- # h.fetch("z")
328
- # # => (opal):2: in `fetch`: key not found (KeyError)
329
- #
330
- # @param [Object] key the key to lookup
331
- # @param [Object] defaults the default value to return
332
- # @return [Object] value from hash
333
- def fetch(key, defaults)
334
- `var value = #{self}.__assocs__[#{key}.hash()];
335
- if (value !== undefined) {
336
- return value;
337
- } else if (#{defaults} === undefined) {
338
- throw "KeyError: key not found";
339
- } else if (#{defaults}.info & #{self}.TP) {
340
- return #{defaults}.apply(#{defaults}.__self__, [#{key}]);
341
- } else {
342
- return #{defaults};
343
- }`
344
- end
345
-
346
- # Returns a new array that is a one-dimensional flattening of this hash. That
347
- # is, for every key or value that is an array, extract its elements into the
348
- # new array. Unlike {Array#flatten}, this method does not flatten recursively
349
- # by default. The optional `level` argument determines the level of
350
- # recursion to flatten.
351
- #
352
- # @example
353
- # a = { 1 => "one", 2 => [2, "two"], 3 => "three" }
354
- # a.flatten
355
- # # => [1, "one", 2, [2, "two"], 3, "three"]
356
- # a.flatten(2)
357
- # # => [1, "one", 2, 2, "two", 3, "three"]
358
- #
359
- # @param [Number] level the level to flatten until
360
- # @return [Array] flattened hash
361
- def flatten(level = 1)
362
- `var result = [], key, value;
363
- for (var i = 0; i < #{self}.__keys__.length; i++) {
364
- key = #{self}.__keys__[i];
365
- value = #{self}.__assocs__[key.hash()];
366
- result.push(key);
367
- if (value.info & #{self}.TA) {
368
- if (#{level} == 1) {
369
- result.push(value);
370
- } else {
371
- var temp = value.$flatten(#{level} - 1);
372
- result = result.concat(temp);
373
- }
374
- } else {
375
- result.push(value);
376
- }
377
- }
378
- return result;`
379
- end
380
-
381
- # Returns `true` if the given `key` is present in `self`.
382
- #
383
- # @example
384
- # h = { "a" => 100, "b" => 200 }
385
- # h.has_key? "a"
386
- # # => true
387
- # h.has_key? "b"
388
- # # => false
389
- #
390
- # @param [Object] key the key to check for
391
- # @return [Boolean]
392
- def has_key?(key)
393
- `return #{self}.__assocs__.hasOwnProperty(#{key}.hash()) ? #{true} : #{false};`
394
- end
395
-
396
- alias_method :include?, :has_key?
397
- alias_method :key?, :has_key?
398
- alias_method :member?, :has_key?
399
-
400
- # Returns `true` if the given `value` is present for some key in `self`.
401
- #
402
- # @example
403
- # h = { "a" => 100, "b" => 200 }
404
- # h.has_value?(100)
405
- # # => true
406
- # h.has_value?(200)
407
- # # => false
408
- #
409
- # @param [Object] value the value to check for
410
- # @return [Boolean]
411
- def has_value?(value)
412
- `var key, val;
413
- for (var i = 0; i < #{self}.__keys__.length; i++) {
414
- key = #{self}.__keys__[i];
415
- val = #{self}.__assocs__[key.hash()];
416
- if (value['$=='](val).r) {
417
- return #{true};
418
- };
419
- }`
420
- false
421
- end
422
-
423
- alias_method :value?, :has_value?
424
-
425
- # Replaces the contents of `self` with the contents of `other_hash`.
426
- #
427
- # @example
428
- # h = { "a" => 100, "b" => 200 }
429
- # h.replace({ "c" => 200, "d" => 300 })
430
- # # => { "c" => 200, "d" => 300 }
431
- #
432
- # @param [Hash] other_hash hash for contents
433
- # @return [Hash] returns receiver
434
- def replace(other_hash)
435
- `#{self}.__keys__ = [];
436
- #{self}.__assocs__ = {};
437
- for (var i = 0; i < #{other_hash}.__keys__.length; i++) {
438
- key = #{other_hash}.__keys__[i];
439
- val = #{other_hash}.__assocs__[key.hash()];
440
- #{self}.hash_store(key, val)
441
- }`
442
- self
443
- end
444
-
445
- # Returns the contents of this hash as a string.
446
- #
447
- # @example
448
- # h = { "a" => 100, "b" => 200 }
449
- # # => "{ \"a\" => 100, \"b\" => 200 }"
450
- #
451
- # @return [String]
452
- def inspect
453
- `var result = ['{'], key, value;
454
- for (var i = 0; i < #{self}.__keys__.length; i++) {
455
- key = #{self}.__keys__[i];
456
- value = #{self}.__assocs__[key.hash()];
457
- if (i > 0) result.push(', ');
458
- result.push(key.$inspect());
459
- result.push('=>');
460
- result.push(value.$inspect());
461
- }
462
- result.push('}');
463
- return result.join('');`
464
- end
465
-
466
- alias_method :to_s, :inspect
467
-
468
- # Returns a new hash created by using `self`'s values as keys, and the keys as
469
- # values.
470
- #
471
- # @example
472
- # h = { "n" => 100, "m" => 100, "y" => 300, "d" => 200, "a" => 0 }
473
- # h.invert
474
- # # => { 0 => "a", 100 => "m", 200 => "d", 300 => "y" }
475
- #
476
- # @return [Hash] inverted hash
477
- def invert
478
- `var res = vnH();
479
- for (var i = 0; i < #{self}.__keys__.length; i++) {
480
- key = #{self}.__keys__[i];
481
- value = #{self}.__assocs__[key.hash()];
482
- res.hash_store(value, key);
483
- }
484
- return res;`
485
- end
486
-
487
- # Deletes every key-value pair from `self` for which block evaluates to
488
- # `false`.
489
- #
490
- # If no block is given, an enumerator is returned instead.
491
- #
492
- # @todo Enumerator functionality is not yet implemented.
493
- #
494
- # @example
495
- # h = { "a" => 100, "b" => 200, "c" => 300 }
496
- # h.keep_if { |key, value| key == "b" }
497
- # # => { "b" => 200 }
498
- #
499
- # @return [Hash] returns receiver
500
- def keep_if(&block)
501
- `var key, value;
502
- for (var i = 0; i < #{self}.__keys__.length; i++) {
503
- key = #{self}.__keys__[i];
504
- value = #{self}.__assocs__[key.hash()];
505
- if (!#{block}.apply(#{block}.__self__, [key, value]).r) {
506
- #{self}.hash_delete(key);
507
- i--;
508
- };
509
- }`
510
- self
511
- end
512
-
513
- # Returns the key for a given value. If not found, returns `nil`.
514
- #
515
- # @example
516
- # h = { "a" => 100, "b" => 200 }
517
- # h.key(200)
518
- # # => "b"
519
- # h.key(300)
520
- # # => nil
521
- #
522
- # @param [Object] value to check for
523
- # @return [Object] key or nil
524
- def key(value)
525
- `var key, val;
526
- for (var i = 0; i < #{self}.__keys__.length; i++) {
527
- key = #{self}.__keys__[i];
528
- val = #{self}.__assocs__[key.hash()];
529
- if (value['$=='](val).r) {
530
- return key;
531
- };
532
- }`
533
- nil
534
- end
535
-
536
- # Returns a new array populated with the keys from this hash. See also
537
- # {Hash#values}.
538
- #
539
- # @example
540
- # h = { "a" => 100, "b" => 200, "c" => 300 }
541
- # h.keys
542
- # # => ["a", "b", "c"]
543
- #
544
- # @return [Array] keys
545
- def keys
546
- `return #{self}.__keys__.slice();`
547
- end
548
-
549
- # Returns the number of key-value pairs in the hash.
550
- #
551
- # @example
552
- # h = { "a" => 100, "b" => 200 }
553
- # h.length
554
- # # => 2
555
- # h.delete "a"
556
- # h.length
557
- # # => 1
558
- #
559
- # @return [Number] length
560
- def length
561
- `return #{self}.__keys__.length;`
562
- end
563
-
564
- alias_method :size, :length
565
-
566
- # Returns a new hash containing the contents of `other_hash` and the contents
567
- # of `self`. If no block is specified, the value for entries with duplicate
568
- # keys will be that of `other_hash`. Otherwise the value for each duplicate
569
- # key is determined by calling the block with the key, its value in `self` and
570
- # its valye in `other_hash`.
571
- #
572
- # @todo Block functionality not yet implemented.
573
- #
574
- # @example
575
- # h = { "a" => 100, "b" => 200 }
576
- # h2 = { "b" => 300, "c" => 400 }
577
- # h.merge(h2)
578
- # # => { "a" => 100, "b" => 300, "c" => 400 }
579
- # h
580
- # # => { "a" => 100, "b" => 200 }
581
- #
582
- # @param [Hash] other_hash hash to merge
583
- # @return [Hash] returns new hash with merged contents
584
- def merge(other_hash)
585
- `var result = vnH(), key, val;
586
- for (var i = 0; i < #{self}.__keys__.length; i++) {
587
- key = #{self}.__keys__[i];
588
- val = #{self}.__assocs__[key.hash()];
589
- result.hash_store(key, val)
590
- }
591
- for (var i = 0; i < #{other_hash}.__keys__.length; i++) {
592
- key = #{other_hash}.__keys__[i];
593
- val = #{other_hash}.__assocs__[key.hash()];
594
- result.hash_store(key, val)
595
- }
596
- return result;`
597
- end
598
-
599
- # Adds the contents of `other_hash` to `self`. If no block is specified,
600
- # entries with duplicate keys are overwritten with the values from
601
- # `other_hash`, otherwise the value of each duplicate key is determined by
602
- # calling the block with the key, its value in `self` and its value in
603
- # `other_hash`.
604
- #
605
- # @todo Block functionality not yet implemented.
606
- #
607
- # @example
608
- # h = { "a" => 100, "b" => 200 }
609
- # h2 = { "b" => 300, "c" => 400 }
610
- # h.merge!(h2)
611
- # # => { "a" => 100, "b" => 300, "c" => 400 }
612
- # h
613
- # # => { "a" => 100, "b" => 300, "c" => 400 }
614
- #
615
- # @param [Hash] other_hash hash to merge
616
- # @return [Hash] returns receiver
617
- def merge!(other_hash)
618
- `var key, val;
619
- for (var i = 0; i < #{other_hash}.__keys__.length; i++) {
620
- key = #{other_hash}.__keys__[i];
621
- val = #{other_hash}.__assocs__[key.hash()];
622
- #{self}.hash_store(key, val)
623
- }
624
- return #{self};`
625
- end
626
-
627
- alias_method :update, :merge!
628
-
629
- # Searches through the hash comapring obj with the value using ==. Returns the
630
- # first key-value pair (two-element array) that matches. See also
631
- # {Array#rassoc}.
632
- #
633
- # @example
634
- # a = { 1 => "one", 2 => "two", 3 => "three" }
635
- # a.rassoc "two"
636
- # # => [2, "two"]
637
- # a.rassoc "four"
638
- # # => nil
639
- #
640
- # @param [Object] obj object to check
641
- # @return [Array]
642
- def rassoc(obj)
643
- `var key, val;
644
- for (var i = 0; i < #{self}.__keys__.length; i++) {
645
- key = #{self}.__keys__[i];
646
- val = #{self}.__assocs__[key.hash()];
647
- if (val['$=='](#{obj}).r) {
648
- return [key, val];
649
- }
650
- }`
651
- nil
652
- end
653
-
654
- # Same as {Hash#delete_if}, but it works on (and returns) a copy of the hash.
655
- #
656
- # @return [Hash]
657
- def reject(&block)
658
- `var result = vnH(), key, value;
659
- for (var i = 0; i < #{self}.__keys__.length; i++) {
660
- key = #{self}.__keys__[i];
661
- value = #{self}.__assocs__[key.hash()];
662
- if (!#{block}.apply(#{block}.__self__, [key, value]).r) {
663
- result.hash_store(key, value);
664
- };
665
- }
666
- return result;`
667
- end
668
-
669
- # Equivalent to {Hash#delete_if}, but returns `nil` if no changes were made.
670
- #
671
- # @return [Hash]
672
- def reject!(&block)
673
- `var key, value, size = #{self}.__keys__.length;
674
- for (var i = 0; i < #{self}.__keys__.length; i++) {
675
- key = #{self}.__keys__[i];
676
- value = #{self}.__assocs__[key.hash()];
677
- if (#{block}.apply(#{block}.__self__, [key, value]).r) {
678
- #{self}.hash_delete(key);
679
- i--;
680
- };
681
- }
682
- return #{self}.__keys__.length == size ? #{nil} : #{self}`
683
- end
684
-
685
- # Returns a new hash consisting of entries for which the block returns `true`.
686
- #
687
- # @todo Need to implement Enumerator functionality (when no block given).
688
- #
689
- # @example
690
- # h = { :a => 100, :b => 200, :c => 300 }
691
- # h.select { |k, v| k > "a" }
692
- # # => { :b => 200, :c => 300 }
693
- # h.select { |k, v| v < 200 }
694
- # # => { :a => 100 }
695
- #
696
- # @return [Hash]
697
- def select(&block)
698
- `var result = vnH(), key, value;
699
- for (var i = 0; i < #{self}.__keys__.length; i++) {
700
- key = #{self}.__keys__[i];
701
- value = #{self}.__assocs__[key.hash()];
702
- if (#{block}.apply(#{block}.__self__, [key, value]).r) {
703
- result.hash_store(key, value);
704
- };
705
- }
706
- return result;`
707
- end
708
-
709
- # Equivalent to {Hash#keep_if}, but returns `nil` if no changes were made.
710
- #
711
- # @return [Hash, nil]
712
- def select!(&block)
713
- `var key, value, size = #{self}.__keys__.length;
714
- for (var i = 0; i < #{self}.__keys__.length; i++) {
715
- key = #{self}.__keys__[i];
716
- value = #{self}.__assocs__[key.hash()];
717
- if (!#{block}.apply(#{block}.__self__, [key, value]).r) {
718
- #{self}.hash_delete(key);
719
- i--;
720
- };
721
- }
722
- return #{self}.__keys__.length == size ? #{nil} : #{self}`
723
- end
724
-
725
- # Removes a key-value pair from `self` and returns it as the two-item array,
726
- # [key, value], or returns the hash's default value if the hash is empty.
727
- #
728
- # @example
729
- # h = { :a => 1, :b => 2}
730
- # h.shift
731
- # # => [:a, 1]
732
- # h
733
- # # => {:b => 1}
734
- # {}.shift
735
- # # => nil
736
- #
737
- # @return [Array, Object] array or default value
738
- def shift
739
- `var key, value;
740
- if (#{self}.__keys__.length > 0) {
741
- key = #{self}.__keys__[0];
742
- value = #{self}.__assocs__[key.hash()];
743
- #{self}.hash_delete(key);
744
- return [key, value];
745
- } else {
746
- return #{self}.__default__;
747
- }`
748
- end
749
-
750
- # Convert `self` to a nested array of `[key, value]` arrays.
751
- #
752
- # @example
753
- # h = { :a => 1, :b => 2, :c => 3 }
754
- # h.to_a
755
- # # => [[:a, 1], [:b, 2], [:c, 3]]
756
- #
757
- # @return [Array]
758
- def to_a
759
- `var result = [], key, value;
760
- for (var i = 0; i < #{self}.__keys__.length; i++) {
761
- key = #{self}.__keys__[i];
762
- value = #{self}.__assocs__[key.hash()];
763
- result.push([key, value]);
764
- }
765
- return result;`
766
- end
767
-
768
- # Returns self.
769
- #
770
- # @return [Hash] self
771
- def to_hash
772
- self
773
- end
774
-
775
- # Returns a new array populated with the values from `self`.
776
- #
777
- # @example
778
- # h = { :a => 1, :b => 2 }
779
- # h.values
780
- # # => [1, 2]
781
- #
782
- # @return [Array]
783
- def values
784
- `var result = [];
785
- for (var i = 0; i < #{self}.__keys__.length; i++) {
786
- result.push(#{self}.__assocs__[#{self}.__keys__[i].hash()]);
787
- }
788
- return result;`
789
- end
790
-
791
- end