opal 0.2.2 → 0.3.0

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