opal 0.0.1 → 0.1.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 (306) hide show
  1. data/.gitignore +10 -1
  2. data/.gitmodules +0 -0
  3. data/Opalfile +371 -0
  4. data/README.md +45 -0
  5. data/Rakefile +237 -34
  6. data/VERSION +1 -1
  7. data/bin/opal +13 -0
  8. data/demos/apps/browser_demo/index.html +11 -0
  9. data/demos/apps/browser_demo/lib/browser_demo.rb +31 -0
  10. data/demos/apps/simple_opal/Opalfile +13 -0
  11. data/demos/apps/simple_opal/index.html +11 -0
  12. data/demos/apps/simple_opal/lib/app_controller.rb +62 -0
  13. data/demos/apps/simple_opal/lib/main_window.rb +146 -0
  14. data/demos/browser/request/index.html +52 -0
  15. data/demos/browser/request/request.rb +48 -0
  16. data/gen/browser/__PROJECT_NAME__/index.html +10 -0
  17. data/gen/browser/__PROJECT_NAME__/lib/__PROJECT_NAME__.rb +1 -0
  18. data/lib/opal.rb +48 -3
  19. data/lib/opal/builders/base.rb +50 -0
  20. data/lib/opal/builders/css.rb +46 -0
  21. data/lib/opal/builders/javascript.rb +44 -0
  22. data/lib/opal/builders/opal.rb +79 -0
  23. data/lib/opal/builders/ruby.rb +50 -0
  24. data/lib/opal/builders/ruby/generate.rb +1851 -0
  25. data/lib/opal/builders/ruby/nodes.rb +210 -0
  26. data/lib/opal/builders/ruby/ruby.rb +916 -0
  27. data/lib/opal/builders/ruby/ruby_parser.rb +6008 -0
  28. data/lib/opal/builders/ruby/ruby_parser.rb.y +1451 -0
  29. data/lib/opal/models/build_item.rb +104 -0
  30. data/lib/opal/models/hash_struct.rb +40 -0
  31. data/lib/opal/models/project.rb +215 -0
  32. data/lib/opal/models/struct_accessors.rb +58 -0
  33. data/lib/opal/models/target.rb +176 -0
  34. data/lib/opal/opal/env/console.rb +66 -0
  35. data/lib/opal/opal/env/fs.rb +98 -0
  36. data/lib/opal/opal/env/object.rb +48 -0
  37. data/lib/opal/opal/environment.rb +139 -0
  38. data/lib/opal/opal/gen.rb +62 -0
  39. data/lib/opal/opal/opal.rb +68 -0
  40. data/lib/opal/opal/repl.rb +38 -0
  41. data/lib/opal/opalfile/dsl.rb +62 -0
  42. data/lib/opal/opalfile/opalfile.rb +133 -0
  43. data/lib/opal/opalfile/task.rb +96 -0
  44. data/lib/opal/opalfile/task_manager.rb +63 -0
  45. data/lib/opal/opalfile/task_scope.rb +52 -0
  46. data/lib/opal/rack/app_server.rb +119 -0
  47. data/opals/aristo/README.md +16 -0
  48. data/opals/browser/Opalfile +11 -0
  49. data/opals/browser/README.md +146 -0
  50. data/opals/browser/SIZZLE_LICESNSE.txt +148 -0
  51. data/opals/browser/lib/browser.rb +118 -0
  52. data/opals/browser/lib/browser/builder.rb +41 -0
  53. data/opals/browser/lib/browser/canvas_context.rb +115 -0
  54. data/opals/browser/lib/browser/dimensions.rb +50 -0
  55. data/opals/browser/lib/browser/document.rb +146 -0
  56. data/opals/browser/lib/browser/element.rb +487 -0
  57. data/opals/browser/lib/browser/element/attributes.rb +88 -0
  58. data/opals/browser/lib/browser/element/css.rb +290 -0
  59. data/opals/browser/lib/browser/element/form.rb +146 -0
  60. data/opals/browser/lib/browser/event/dom_events.rb +81 -0
  61. data/opals/browser/lib/browser/event/event.rb +177 -0
  62. data/opals/browser/lib/browser/event/trigger_events.rb +53 -0
  63. data/opals/browser/lib/browser/geometry.rb +97 -0
  64. data/opals/browser/lib/browser/json.rb +32 -0
  65. data/opals/browser/lib/browser/json_parse.js +321 -0
  66. data/opals/browser/lib/browser/request/request.rb +201 -0
  67. data/opals/browser/lib/browser/sizzle.js +1068 -0
  68. data/opals/browser/lib/browser/string.rb +42 -0
  69. data/opals/browser/lib/browser/touch.rb +37 -0
  70. data/{runtime/yaml.js → opals/browser/lib/browser/vml_context.js} +8 -8
  71. data/opals/browser/lib/browser/window.rb +36 -0
  72. data/opals/browser/spec/browser/browser_detection_spec.rb +7 -0
  73. data/opals/browser/spec/document/aref_spec.rb +110 -0
  74. data/opals/browser/spec/document/ready_spec.rb +16 -0
  75. data/opals/browser/spec/element/body_spec.rb +11 -0
  76. data/opals/browser/spec/element/clear_spec.rb +26 -0
  77. data/opals/browser/spec/element/empty_spec.rb +29 -0
  78. data/opals/browser/spec/element/has_class_spec.rb +40 -0
  79. data/opals/browser/spec/element/hidden_spec.rb +23 -0
  80. data/opals/browser/spec/element/hide_spec.rb +31 -0
  81. data/opals/browser/spec/element/remove_spec.rb +25 -0
  82. data/opals/browser/spec/element/show_spec.rb +31 -0
  83. data/opals/browser/spec/element/style_spec.rb +69 -0
  84. data/opals/browser/spec/element/toggle_spec.rb +31 -0
  85. data/opals/browser/spec/element/visible_spec.rb +23 -0
  86. data/opals/browser/spec/spec_helper.rb +1 -0
  87. data/opals/cherry_kit/Opalfile +6 -0
  88. data/opals/cherry_kit/bin/cherry_kit.rb +11 -0
  89. data/opals/cherry_kit/lib/cherry_kit.rb +29 -0
  90. data/opals/foundation/Opalfile +11 -0
  91. data/opals/foundation/bin/foundation.rb +12 -0
  92. data/opals/foundation/lib/foundation.rb +32 -0
  93. data/opals/foundation/lib/foundation/__table_view_desktop/outline_view.rb +57 -0
  94. data/opals/foundation/lib/foundation/__table_view_desktop/table_column.rb +59 -0
  95. data/opals/foundation/lib/foundation/__table_view_desktop/table_header_view.rb +34 -0
  96. data/opals/foundation/lib/foundation/__table_view_desktop/table_view.rb +304 -0
  97. data/opals/foundation/lib/foundation/controllers/array_controller.rb +54 -0
  98. data/opals/foundation/lib/foundation/controllers/controller.rb +74 -0
  99. data/opals/foundation/lib/foundation/controllers/controller_selection_proxy.rb +67 -0
  100. data/opals/foundation/lib/foundation/controllers/object_controller.rb +145 -0
  101. data/opals/foundation/lib/foundation/controllers/view.rb +40 -0
  102. data/opals/foundation/lib/foundation/core/application.rb +476 -0
  103. data/opals/foundation/lib/foundation/core/attributes.rb +146 -0
  104. data/opals/foundation/lib/foundation/core/bindings.rb +125 -0
  105. data/opals/foundation/lib/foundation/core/builder.rb +101 -0
  106. data/opals/foundation/lib/foundation/core/event.rb +112 -0
  107. data/opals/foundation/lib/foundation/core/index_path.rb +49 -0
  108. data/opals/foundation/lib/foundation/core/index_set.rb +97 -0
  109. data/opals/foundation/lib/foundation/core/notification.rb +113 -0
  110. data/opals/foundation/lib/foundation/core/observable.rb +275 -0
  111. data/opals/foundation/lib/foundation/core/observable_array.rb +30 -0
  112. data/opals/foundation/lib/foundation/core/responder.rb +85 -0
  113. data/opals/foundation/lib/foundation/core/run_loop.rb +89 -0
  114. data/opals/foundation/lib/foundation/core/touch.rb +95 -0
  115. data/opals/foundation/lib/foundation/gestures/gesture_recognizer.rb +35 -0
  116. data/opals/foundation/lib/foundation/rendering/render_context.rb +100 -0
  117. data/opals/foundation/lib/foundation/rendering/renderer.rb +137 -0
  118. data/opals/foundation/lib/foundation/rendering/root_theme.rb +77 -0
  119. data/opals/foundation/lib/foundation/rendering/root_theme/button.rb +62 -0
  120. data/opals/foundation/lib/foundation/rendering/root_theme/control.rb +72 -0
  121. data/opals/foundation/lib/foundation/rendering/root_theme/label.rb +54 -0
  122. data/opals/foundation/lib/foundation/rendering/root_theme/scroller.rb +58 -0
  123. data/opals/foundation/lib/foundation/rendering/root_theme/slider.rb +72 -0
  124. data/opals/foundation/lib/foundation/rendering/root_theme/table_view.rb +97 -0
  125. data/opals/foundation/lib/foundation/rendering/root_theme/text_field.rb +55 -0
  126. data/opals/foundation/lib/foundation/rendering/root_theme/view.rb +81 -0
  127. data/opals/foundation/lib/foundation/rendering/theme.rb +38 -0
  128. data/opals/foundation/lib/foundation/table_view/cell.rb +39 -0
  129. data/opals/foundation/lib/foundation/table_view/table.rb +171 -0
  130. data/opals/foundation/lib/foundation/views/button.rb +63 -0
  131. data/opals/foundation/lib/foundation/views/checkbox.rb +28 -0
  132. data/opals/foundation/lib/foundation/views/clip.rb +47 -0
  133. data/opals/foundation/lib/foundation/views/control.rb +199 -0
  134. data/opals/foundation/lib/foundation/views/label.rb +54 -0
  135. data/opals/foundation/lib/foundation/views/scroll.rb +294 -0
  136. data/opals/foundation/lib/foundation/views/scroll_view_desktop.rb +152 -0
  137. data/opals/foundation/lib/foundation/views/scroller.rb +54 -0
  138. data/opals/foundation/lib/foundation/views/slider.rb +93 -0
  139. data/opals/foundation/lib/foundation/views/text_field.rb +83 -0
  140. data/opals/foundation/lib/foundation/views/view.rb +426 -0
  141. data/opals/foundation/lib/foundation/windows/window.rb +191 -0
  142. data/opals/foundation/resources/button/button.css +23 -0
  143. data/{runtime/init.js → opals/foundation/resources/foundation.css} +27 -33
  144. data/opals/foundation/resources/scroll/scroll.css +22 -0
  145. data/opals/foundation/resources/scroll_view/scroll_view.css +3 -0
  146. data/opals/foundation/resources/scroll_view/scroller.css +3 -0
  147. data/opals/foundation/resources/slider/regular/slider.css +3 -0
  148. data/opals/foundation/resources/slider/slider.css +27 -0
  149. data/opals/foundation/resources/table_view/outline_view.css +3 -0
  150. data/opals/foundation/resources/table_view/table_view.css +15 -0
  151. data/opals/foundation/resources/text_field/text_field.css +71 -0
  152. data/opals/foundation/spec/spec_helper.rb +1 -0
  153. data/opals/foundation/spec/system/attributes/get_attribute_spec.rb +69 -0
  154. data/opals/foundation/spec/system/attributes/get_path_spec.rb +44 -0
  155. data/opals/foundation/spec/system/attributes/set_path_spec.rb +24 -0
  156. data/opals/foundation/spec/system/attributes/set_spec.rb +58 -0
  157. data/opals/foundation/spec/system/bindings/bindings.rb +85 -0
  158. data/opals/foundation/spec/system/key_value_binding/bind_spec.rb +43 -0
  159. data/opals/foundation/spec/system/observable/dependant_keys_spec.rb +74 -0
  160. data/opals/foundation/spec/system/observable/observe_spec.rb +292 -0
  161. data/opals/foundation/spec/system/observable/remove_observer_spec.rb +60 -0
  162. data/opals/opal/Opalfile +14 -0
  163. data/opals/opal/spec/core/array/append_spec.rb +30 -0
  164. data/opals/opal/spec/core/array/assoc_spec.rb +29 -0
  165. data/opals/opal/spec/core/array/at_spec.rb +37 -0
  166. data/opals/opal/spec/core/array/clear_spec.rb +22 -0
  167. data/opals/opal/spec/core/array/collect_bang_spec.rb +27 -0
  168. data/opals/opal/spec/core/array/collect_spec.rb +27 -0
  169. data/opals/opal/spec/core/array/compact_spec.rb +15 -0
  170. data/opals/opal/spec/core/array/concat_spec.rb +15 -0
  171. data/opals/opal/spec/core/array/constructor_spec.rb +14 -0
  172. data/opals/opal/spec/core/array/each_spec.rb +9 -0
  173. data/opals/opal/spec/core/array/element_reference_spec.rb +4 -0
  174. data/opals/opal/spec/core/array/first_spec.rb +35 -0
  175. data/opals/opal/spec/core/array/include_spec.rb +9 -0
  176. data/opals/opal/spec/core/array/map_spec.rb +31 -0
  177. data/opals/opal/spec/core/builtin_constants/builtin_constants_spec.rb +7 -0
  178. data/opals/opal/spec/core/false/and_spec.rb +10 -0
  179. data/opals/opal/spec/core/false/inspect_spec.rb +6 -0
  180. data/opals/opal/spec/core/false/or_spec.rb +10 -0
  181. data/opals/opal/spec/core/false/to_s_spec.rb +6 -0
  182. data/opals/opal/spec/core/false/xor_spec.rb +10 -0
  183. data/opals/opal/spec/core/file/join_spec.rb +19 -0
  184. data/opals/opal/spec/core/kernel/instance_eval_spec.rb +0 -0
  185. data/opals/opal/spec/core/kernel/loop_spec.rb +24 -0
  186. data/opals/opal/spec/core/kernel/raise_spec.rb +0 -0
  187. data/opals/opal/spec/core/module/attr_accessor_spec.rb +28 -0
  188. data/opals/opal/spec/core/number/lt_spec.rb +12 -0
  189. data/opals/opal/spec/core/true/and_spec.rb +10 -0
  190. data/opals/opal/spec/core/true/inspect_spec.rb +6 -0
  191. data/opals/opal/spec/core/true/or_spec.rb +10 -0
  192. data/opals/opal/spec/core/true/to_s_spec.rb +6 -0
  193. data/opals/opal/spec/core/true/xor_spec.rb +10 -0
  194. data/opals/opal/spec/fixtures/super.rb +70 -0
  195. data/opals/opal/spec/language/____temp_remove_this.rb +12 -0
  196. data/opals/opal/spec/language/and_spec.rb +62 -0
  197. data/opals/opal/spec/language/array_spec.rb +52 -0
  198. data/opals/opal/spec/language/block_spec.rb +18 -0
  199. data/opals/opal/spec/language/break_spec.rb +36 -0
  200. data/opals/opal/spec/language/case_spec.rb +103 -0
  201. data/opals/opal/spec/language/def_spec.rb +11 -0
  202. data/opals/opal/spec/language/eigenclass_spec.rb +60 -0
  203. data/opals/opal/spec/language/hash_spec.rb +29 -0
  204. data/opals/opal/spec/language/if_spec.rb +54 -0
  205. data/opals/opal/spec/language/loop_spec.rb +11 -0
  206. data/opals/opal/spec/language/metaclass_spec.rb +21 -0
  207. data/opals/opal/spec/language/method_spec.rb +64 -0
  208. data/opals/opal/spec/language/next_spec.rb +25 -0
  209. data/opals/opal/spec/language/or_spec.rb +34 -0
  210. data/opals/opal/spec/language/redo_spec.rb +24 -0
  211. data/opals/opal/spec/language/rescue_spec.rb +20 -0
  212. data/opals/opal/spec/language/return_spec.rb +47 -0
  213. data/opals/opal/spec/language/string_spec.rb +25 -0
  214. data/opals/opal/spec/language/super_spec.rb +26 -0
  215. data/opals/opal/spec/language/until_spec.rb +157 -0
  216. data/opals/opal/spec/language/while_spec.rb +163 -0
  217. data/opals/opal/spec/spec_helper.rb +5 -0
  218. data/opals/runtime/Opalfile +68 -0
  219. data/opals/runtime/README.md +12 -0
  220. data/opals/runtime/docs/debugging.md +51 -0
  221. data/opals/runtime/lib/array.rb +1516 -0
  222. data/opals/runtime/lib/basic_object.rb +49 -0
  223. data/opals/runtime/lib/class.rb +54 -0
  224. data/opals/runtime/lib/dir.rb +36 -0
  225. data/opals/runtime/lib/error.rb +49 -0
  226. data/opals/runtime/lib/false_class.rb +52 -0
  227. data/opals/runtime/lib/file.rb +79 -0
  228. data/opals/runtime/lib/hash.rb +791 -0
  229. data/opals/runtime/lib/io.rb +39 -0
  230. data/opals/runtime/lib/kernel.rb +288 -0
  231. data/opals/runtime/lib/match_data.rb +36 -0
  232. data/opals/runtime/lib/module.rb +109 -0
  233. data/opals/runtime/lib/nil_class.rb +69 -0
  234. data/opals/runtime/lib/number.rb +398 -0
  235. data/opals/runtime/lib/proc.rb +77 -0
  236. data/opals/runtime/lib/range.rb +63 -0
  237. data/opals/runtime/lib/regexp.rb +111 -0
  238. data/opals/runtime/lib/ruby.rb +30 -0
  239. data/opals/runtime/lib/string.rb +328 -0
  240. data/opals/runtime/lib/symbol.rb +40 -0
  241. data/opals/runtime/lib/top_self.rb +33 -0
  242. data/opals/runtime/lib/true_class.rb +45 -0
  243. data/opals/runtime/runtime/browser.js +287 -0
  244. data/opals/runtime/runtime/debug.js +182 -0
  245. data/opals/runtime/runtime/opal.js +1010 -0
  246. data/opals/runtime/runtime/post_opal.js +1 -0
  247. data/opals/runtime/runtime/pre_opal.js +2 -0
  248. data/opals/runtime/runtime/server_side.js +50 -0
  249. data/opals/spec/LICENSE.txt +26 -0
  250. data/opals/spec/Opalfile +5 -0
  251. data/opals/spec/bin/spec.rb +43 -0
  252. data/opals/spec/lib/spec.rb +33 -0
  253. data/opals/spec/lib/spec/dsl.rb +41 -0
  254. data/opals/spec/lib/spec/example.rb +35 -0
  255. data/opals/spec/lib/spec/example/before_and_after_hooks.rb +81 -0
  256. data/opals/spec/lib/spec/example/errors.rb +42 -0
  257. data/opals/spec/lib/spec/example/example_group.rb +37 -0
  258. data/opals/spec/lib/spec/example/example_group_factory.rb +43 -0
  259. data/opals/spec/lib/spec/example/example_group_hierarchy.rb +45 -0
  260. data/opals/spec/lib/spec/example/example_group_methods.rb +142 -0
  261. data/opals/spec/lib/spec/example/example_group_proxy.rb +41 -0
  262. data/opals/spec/lib/spec/example/example_methods.rb +73 -0
  263. data/opals/spec/lib/spec/example/example_proxy.rb +48 -0
  264. data/opals/spec/lib/spec/expectations.rb +46 -0
  265. data/opals/spec/lib/spec/expectations/errors.rb +35 -0
  266. data/opals/spec/lib/spec/expectations/fail_with.rb +37 -0
  267. data/opals/spec/lib/spec/expectations/handler.rb +48 -0
  268. data/opals/spec/lib/spec/matchers.rb +50 -0
  269. data/opals/spec/lib/spec/matchers/be.rb +26 -0
  270. data/opals/spec/lib/spec/matchers/generated_descriptions.rb +47 -0
  271. data/opals/spec/lib/spec/matchers/operator_matcher.rb +66 -0
  272. data/opals/spec/lib/spec/runner.rb +48 -0
  273. data/opals/spec/lib/spec/runner/example_group_runner.rb +71 -0
  274. data/opals/spec/lib/spec/runner/formatter/html_formatter.rb +100 -0
  275. data/opals/spec/lib/spec/runner/formatter/terminal_formatter.rb +82 -0
  276. data/opals/spec/lib/spec/runner/options.rb +63 -0
  277. data/opals/spec/lib/spec/runner/reporter.rb +123 -0
  278. data/opals/spec/resources/index.html +25 -0
  279. data/opals/spec/resources/spec.css +132 -0
  280. data/spec/cherry_kit/iseq_spec.rb +38 -0
  281. data/spec/spec_helper.rb +16 -0
  282. data/spec/vienna_spec.rb +7 -0
  283. data/yard/index.html +43 -0
  284. data/yard/style.css +765 -0
  285. metadata +312 -49
  286. data/docs/jarv.rdoc +0 -27
  287. data/runtime/array.js +0 -153
  288. data/runtime/class.js +0 -469
  289. data/runtime/compar.js +0 -73
  290. data/runtime/dir.js +0 -115
  291. data/runtime/enum.js +0 -74
  292. data/runtime/file.js +0 -165
  293. data/runtime/gem.js +0 -241
  294. data/runtime/hash.js +0 -181
  295. data/runtime/load.js +0 -251
  296. data/runtime/module.js +0 -98
  297. data/runtime/number.js +0 -148
  298. data/runtime/object.js +0 -522
  299. data/runtime/opal.js +0 -200
  300. data/runtime/parse.js +0 -2218
  301. data/runtime/range.js +0 -56
  302. data/runtime/re.js +0 -91
  303. data/runtime/string.js +0 -199
  304. data/runtime/variable.js +0 -184
  305. data/runtime/vm.js +0 -1150
  306. data/tasks/build.rb +0 -16
@@ -0,0 +1 @@
1
+ require 'foundation'
@@ -0,0 +1,69 @@
1
+
2
+ class KVCTest
3
+
4
+ def initialize
5
+ @ivar_key_name = 300
6
+ end
7
+
8
+ def first_key
9
+ 100
10
+ end
11
+
12
+ def second_key?
13
+ 200
14
+ end
15
+
16
+ end
17
+
18
+ describe "Attributes#get_attribute" do
19
+
20
+ it "should call the getter method if one exists" do
21
+ t = KVCTest.new
22
+ t.get_attribute('first_key').should == 100
23
+ t.get_attribute(:first_key).should == 100
24
+ end
25
+
26
+ it "should call a designated boolean getter method if defined" do
27
+ t = KVCTest.new
28
+ t.get_attribute('second_key').should == 200
29
+ t.get_attribute(:second_key).should == 200
30
+ end
31
+
32
+ it "should access an instance variable with the key name" do
33
+ t = KVCTest.new
34
+ t.get_attribute('ivar_key_name').should == 300
35
+ t.get_attribute(:ivar_key_name).should == 300
36
+ end
37
+
38
+ it "should raise an error when the given key name cannot be found" do
39
+ t = KVCTest.new
40
+ t.get_attribute('unknown_key').should_raise
41
+ end
42
+
43
+ it "should always return nil when value_for_key is called on nil" do
44
+ nil.get_attribute('some_key_name_which_will_not_exist').should == nil
45
+ nil.get_attribute(:nil_key).should == nil
46
+ end
47
+ end
48
+
49
+ describe "Hash KeyValueCoding#value_for_key" do
50
+
51
+ it "should use string keys to access Hash keys and return their value" do
52
+ hash = { 'first_name' => 100, 'second_name' => 200 }
53
+ hash.get_attribute('first_name').should == 100
54
+ hash.get_attribute('second_name').should == 200
55
+ end
56
+
57
+ it "should return the Hash default for unknown keys" do
58
+ hash = {}
59
+ hash.get_attribute('some_unknown_key').should == nil
60
+ end
61
+
62
+ it "should not treat symbols as string names for accessing keys" do
63
+ hash = { :first_name => 100, 'second_name' => 200 }
64
+ hash.get_attribute(:first_name).should == nil
65
+ hash.get_attribute('second_name').should == 200
66
+ hash.get_attribute(:second_name).should == 200
67
+ end
68
+ end
69
+
@@ -0,0 +1,44 @@
1
+ class KVCPathTestA
2
+ attr_accessor :part_b
3
+ end
4
+
5
+ class KVCPathTestB
6
+ attr_accessor :part_c
7
+ end
8
+
9
+ class KVCPathTestC
10
+ attr_accessor :first_name
11
+ end
12
+
13
+
14
+ describe "Attributes#get_path" do
15
+
16
+ it "should call regular value_for_key when no dot-splitter detected" do
17
+ a = KVCPathTestA.new
18
+ b = KVCPathTestB.new
19
+ a.part_b = b
20
+ a.get_path('part_b').should == b
21
+ end
22
+
23
+ it "should split the path for paths which are dot seperated" do
24
+ a = KVCPathTestA.new
25
+ b = KVCPathTestB.new
26
+ c = KVCPathTestC.new
27
+
28
+ a.part_b = b
29
+ b.part_c = c
30
+ c.first_name = "adam"
31
+
32
+ a.get_path('part_b.part_c').should == c
33
+ a.get_path('part_b.part_c.first_name').should == "adam"
34
+ end
35
+
36
+ it "should eventually return nil if nil is encountered anywhere along path" do
37
+ nil.get_path('a.b.c.d.e').should == nil
38
+
39
+ c = KVCPathTestC.new
40
+ c.first_name = nil
41
+ c.get_path('first_name.second_name').should == nil
42
+
43
+ end
44
+ end
@@ -0,0 +1,24 @@
1
+
2
+ describe "Attributes#set_path" do
3
+
4
+ it "should call regular set_path when no dot used in path" do
5
+ a = KVCPathTestA.new
6
+ b = KVCPathTestB.new
7
+ a.set_path 'part_b', b
8
+ a.part_b.should == b
9
+ end
10
+
11
+ it "should split the path for dot seperated keys, using the last part to set the key" do
12
+ a = KVCPathTestA.new
13
+ b = KVCPathTestB.new
14
+ c = KVCPathTestC.new
15
+
16
+ a.set_path 'part_b', b
17
+ a.set_path 'part_b.part_c', c
18
+ a.set_path 'part_b.part_c.first_name', "adam"
19
+
20
+ a.get_path('part_b').should == b
21
+ a.get_path('part_b.part_c').should == c
22
+ a.get_path('part_b.part_c.first_name').should == "adam"
23
+ end
24
+ end
@@ -0,0 +1,58 @@
1
+
2
+ class KVCSettingTest
3
+
4
+ def initialize
5
+ @ivar_key = 200
6
+ @ivar_key_array = []
7
+ end
8
+
9
+ def will_change_attribute(key)
10
+ @ivar_key_array << :will
11
+ @ivar_key_array << key
12
+ end
13
+
14
+ def did_change_attribute(key)
15
+ @ivar_key_array << :did
16
+ @ivar_key_array << key
17
+ end
18
+
19
+ def ivar_key_array
20
+ @ivar_key_array
21
+ end
22
+
23
+ def ivar_key
24
+ @ivar_key
25
+ end
26
+ end
27
+
28
+ class KVCSettingTest2
29
+
30
+ def first_name=(first_name)
31
+ @first_name = "set_kvc_style_#{first_name}"
32
+ end
33
+
34
+ def first_name
35
+ @first_name
36
+ end
37
+ end
38
+
39
+ describe "Attributes#set_attribute" do
40
+
41
+ it "should call KVO observer methods when setting an ivar" do
42
+ a = KVCSettingTest.new
43
+ a.set_attribute 'ivar_key', 100
44
+ a.ivar_key_array.should == [:will, 'ivar_key', :did, 'ivar_key']
45
+ a.ivar_key.should == 100
46
+ end
47
+
48
+ it "should use the designated setter when available" do
49
+ a = KVCSettingTest2.new
50
+ a.set_attribute 'first_name', "adam"
51
+ a.first_name.should == "set_kvc_style_adam"
52
+ end
53
+
54
+ it "should raise an error when trying to set an unknown key" do
55
+ a = KVCSettingTest2.new
56
+ a.set_attribute 'some_random_key_name', 200
57
+ end
58
+ end
@@ -0,0 +1,85 @@
1
+ class BindingsSpecEmail
2
+
3
+ attr_accessor :properties
4
+
5
+ def initialize
6
+ @properties = {
7
+ :address => "test@test.com",
8
+ :subject => "Subject",
9
+ :date => "Date..",
10
+ :body => ""
11
+ }
12
+ end
13
+ end
14
+
15
+ class BindingsSpecMailbox
16
+
17
+ attr_accessor :properties, :emails
18
+
19
+ def initialize
20
+ @properties = { :title => "New Mailbox " }
21
+ @emails = []
22
+ end
23
+ end
24
+
25
+ class BindingsSpecController
26
+
27
+ def initialize
28
+ @mailboxes = [1, 2, 3, 4]
29
+ end
30
+
31
+ attr_accessor :mailboxes
32
+
33
+ def add_email(sender)
34
+
35
+ end
36
+
37
+ def add_mailbox(sender)
38
+
39
+ end
40
+
41
+ def remove_email(sender)
42
+
43
+ end
44
+
45
+ def remove_mailbox(sender)
46
+
47
+ end
48
+ end
49
+
50
+ describe "Bindings Spec Coded demo" do
51
+
52
+ it "should all be ok" do
53
+ controller = BindingsSpecController.new
54
+ # puts "making controller alias"
55
+ controller_alias = CherryKit::ObjectController.new
56
+ puts "going to set content"
57
+ # `console.log(#{controller});`
58
+ controller_alias.content = controller
59
+ puts "did set content"
60
+ # setup mailboxes array controller
61
+ mailboxes = CherryKit::ArrayController.new
62
+ mailboxes.bind :content_array,
63
+ :to => controller_alias,
64
+ :path => 'selection.mailboxes'
65
+
66
+ mailboxes.object_class = BindingsSpecMailbox
67
+
68
+ puts "mailboxes array controller:"
69
+ `console.log(#{mailboxes.content_array});`
70
+
71
+ # `console.log(#{controller_alias});`
72
+ puts "setting mailboxes!"
73
+ controller.mailboxes = [5, 6, 7, 8]
74
+ puts "mailboxes array controller after change:"
75
+ `console.log(#{mailboxes.content_array});`
76
+
77
+ # setup emails array controller
78
+ # emails = CherryKit::ArrayController.new
79
+ # emails.bind :content_array,
80
+ # :to => mailboxes,
81
+ # :path => 'selection.emails'
82
+ #
83
+ # emails.object_class = BindingsSpecEmail
84
+ end
85
+ end
@@ -0,0 +1,43 @@
1
+
2
+ class KVBTesterA
3
+
4
+ attr_accessor :first_name
5
+
6
+ end
7
+
8
+ class KVBTesterB
9
+
10
+ attr_reader :my_name
11
+
12
+ def initialize
13
+ @my_name = "Jon Stewart"
14
+ end
15
+
16
+ end
17
+
18
+ describe "KeyValueBinding#bind_to" do
19
+
20
+ it "show allow bindings to be exposed" do
21
+ KVBTesterA.expose_binding :foo_test
22
+ KVBTesterA.expose_binding :bar_test
23
+
24
+ KVBTesterA.new.respond_to?(:foo_test_binding=).should == true
25
+ KVBTesterA.new.respond_to?(:bar_test_binding=).should == true
26
+ end
27
+
28
+ it "should propogate KVC compliant chnages to bound objects" do
29
+ a = KVBTesterA.new
30
+ b = KVBTesterB.new
31
+
32
+ a.first_name = "Roger"
33
+
34
+ b.bind :my_name, :to => a, :path => :first_name
35
+
36
+ b.my_name.should == "Roger"
37
+
38
+ a.first_name = "Adam Beynon"
39
+
40
+ b.my_name.should == "Adam Beynon"
41
+ end
42
+
43
+ end
@@ -0,0 +1,74 @@
1
+
2
+ class DependantKeysTest
3
+
4
+ attr_reader :a, :b, :c
5
+
6
+ keys_affecting :a => [:b, :c]
7
+
8
+ def initialize
9
+ @a = "a"
10
+ @b = "b"
11
+ @c = "c"
12
+ end
13
+
14
+ def a=(a)
15
+ @a = a
16
+ end
17
+
18
+ def a
19
+ "#{@a}_#{b}_#{c}"
20
+ end
21
+
22
+ def b=(b)
23
+ @b = b
24
+ end
25
+
26
+ def c=(c)
27
+ @c = c
28
+ end
29
+ end
30
+
31
+ describe "KeyValueObserving#keys_affecting" do
32
+
33
+ it "should notify observer when an affecting key is changed" do
34
+ # puts "==================================================================="
35
+ obj = DependantKeysTest.new
36
+
37
+ capture_a = nil
38
+
39
+ notification_count = 0
40
+
41
+ notifications = []
42
+
43
+ obj.observe :a do |changes|
44
+ notifications << :a
45
+ capture_a = obj.a
46
+ notification_count = notification_count + 1
47
+ end
48
+
49
+ obj.observe :b do |changes|
50
+ notifications << :b
51
+ end
52
+
53
+ obj.observe :c do |changes|
54
+ notifications << :c
55
+ end
56
+
57
+ obj.a = "adam"
58
+ capture_a.should == "adam_b_c"
59
+ notification_count.should == 1
60
+ notifications.should == [:a]
61
+
62
+ notifications = []
63
+ obj.b = "tom"
64
+ capture_a.should == "adam_tom_c"
65
+ notification_count.should == 2
66
+ notifications.should == [:b, :a]
67
+
68
+ notifications = []
69
+ obj.c = "ben"
70
+ capture_a.should == "adam_tom_ben"
71
+ notification_count.should == 3
72
+ notifications.should == [:c, :a]
73
+ end
74
+ end
@@ -0,0 +1,292 @@
1
+ class KVOTestSimple
2
+
3
+ attr_reader :first_name
4
+
5
+ attr_accessor :second_name
6
+
7
+ def initialize
8
+ @some_ivar_we_can_set = nil
9
+ end
10
+
11
+ def first_name=(first_name)
12
+ @first_name = "setting_#{first_name}"
13
+ end
14
+
15
+ end
16
+
17
+
18
+ class KVOMultipartClass
19
+ attr_accessor :teacher, :students
20
+ end
21
+
22
+ class KVOMultipartPerson
23
+ attr_accessor :name, :car
24
+ end
25
+
26
+ class KVOMultipartCar
27
+ attr_accessor :model
28
+ end
29
+
30
+
31
+ class KVOTestRepeaterA
32
+ attr_accessor :b
33
+ end
34
+
35
+ class KVOTestRepeaterB
36
+ attr_accessor :c
37
+ end
38
+
39
+ class KVOTestRepeaterC
40
+ attr_accessor :d
41
+ end
42
+
43
+ class KVOTestRepeaterD
44
+ attr_accessor :e
45
+ end
46
+
47
+ class KVOTestRepeaterE
48
+ attr_accessor :f
49
+ end
50
+
51
+ class KVOTestRepeaterF
52
+ attr_accessor :g
53
+ end
54
+
55
+ describe "Observable#observe" do
56
+
57
+ it "should allow a simple observer to be added" do
58
+ a = KVOTestSimple.new
59
+
60
+ old_value = nil
61
+ new_value = nil
62
+ did_see_notification = false
63
+
64
+ a.observe :first_name do |changes|
65
+ did_see_notification = true
66
+ old_value = changes[:old]
67
+ new_value = changes[:new]
68
+ end
69
+
70
+ a.first_name = 'adam'
71
+ a.first_name.should == 'setting_adam'
72
+
73
+ did_see_notification.should == true
74
+
75
+ old_value.should == nil
76
+ new_value.should == 'setting_adam'
77
+ end
78
+
79
+
80
+
81
+ it "should only observe and post notifications for observed keys" do
82
+ b = KVOTestSimple.new
83
+
84
+ did_see_notification = false
85
+
86
+ b.observe :first_name do |changes|
87
+ did_see_notification = true
88
+ end
89
+
90
+ b.second_name = "adam"
91
+ b.second_name.should == "adam"
92
+ did_see_notification.should == false
93
+
94
+ end
95
+
96
+
97
+
98
+ it "should allow multiple observers for a single key" do
99
+ c = KVOTestSimple.new
100
+ d = KVOTestSimple.new
101
+
102
+ first_saw = false
103
+ second_saw = false
104
+
105
+ c.observe :first_name do |changes|
106
+ first_saw = true
107
+ end
108
+
109
+ c.observe :first_name do |changes|
110
+ second_saw = true
111
+ end
112
+
113
+ c.first_name = "some_name"
114
+ c.first_name.should == "setting_some_name"
115
+
116
+ first_saw.should == true
117
+ second_saw.should == true
118
+
119
+ end
120
+
121
+
122
+
123
+ it "should be possible to observe instance variables" do
124
+ e = KVOTestSimple.new
125
+
126
+ old_value = nil
127
+ new_value = nil
128
+ did_see_notification = false
129
+
130
+ e.observe :some_ivar_we_can_set do |changes|
131
+ did_see_notification = true
132
+ old_value = changes[:old]
133
+ new_value = changes[:new]
134
+ end
135
+
136
+ e.set_attribute :some_ivar_we_can_set, 200
137
+
138
+ did_see_notification.should == true
139
+ e.get_attribute(:some_ivar_we_can_set).should == 200
140
+
141
+ old_value.should == nil
142
+ new_value.should == 200
143
+
144
+ end
145
+
146
+
147
+
148
+ it "should allow observers for multipart keys" do
149
+ the_class = KVOMultipartClass.new
150
+ fred = KVOMultipartPerson.new
151
+
152
+ the_class.teacher = fred
153
+ did_see_observation = false
154
+
155
+ the_class.observe 'teacher.name' do |change|
156
+ did_see_observation = true
157
+ end
158
+
159
+ fred.name = "Fred"
160
+
161
+ the_class.get_path('teacher.name').should == "Fred"
162
+ did_see_observation.should == true
163
+ end
164
+
165
+
166
+
167
+ it "should allow a three part key" do
168
+ cls = KVOMultipartClass.new
169
+ fred = KVOMultipartPerson.new
170
+ car = KVOMultipartCar.new
171
+
172
+ did_see_observation = false
173
+
174
+ cls.teacher = fred
175
+ fred.car = car
176
+
177
+ cls.observe('teacher.car.model') do |info|
178
+ info[:path].should == "teacher.car.model"
179
+ did_see_observation = true
180
+ end
181
+
182
+ car.model = "Jaguar"
183
+
184
+ did_see_observation.should == true
185
+ cls.teacher.car.model.should == "Jaguar"
186
+ end
187
+
188
+
189
+
190
+ it "should allow long observer paths" do
191
+ a = KVOTestRepeaterA.new
192
+ a.set_path 'b', KVOTestRepeaterB.new
193
+ a.set_path 'b.c', KVOTestRepeaterC.new
194
+ a.set_path 'b.c.d', KVOTestRepeaterD.new
195
+ a.set_path 'b.c.d.e', KVOTestRepeaterE.new
196
+ a.set_path 'b.c.d.e.f', KVOTestRepeaterF.new
197
+ a.set_path 'b.c.d.e.f.g', "Hey G"
198
+
199
+ a.b.c.d.e.f.g.should == "Hey G"
200
+ did_see_observation = false
201
+
202
+ a.observe('b.c.d.e.f.g') do |info|
203
+ did_see_observation = true
204
+
205
+ info[:path].should == 'b.c'
206
+ info[:object].class.should == KVOTestRepeaterA
207
+ end
208
+
209
+ a.b.c = nil
210
+ did_see_observation.should == true
211
+
212
+ end
213
+
214
+
215
+
216
+ it "should allow long observer paths, part2" do
217
+ a = KVOTestRepeaterA.new
218
+ a.set_path 'b', KVOTestRepeaterB.new
219
+ a.set_path 'b.c', KVOTestRepeaterC.new
220
+ a.set_path 'b.c.d', KVOTestRepeaterD.new
221
+ a.set_path 'b.c.d.e', KVOTestRepeaterE.new
222
+ a.set_path 'b.c.d.e.f', KVOTestRepeaterF.new
223
+ a.set_path 'b.c.d.e.f.g', "Hey G"
224
+
225
+ did_see_observation = false
226
+
227
+ a.observe('b.c.d.e.f.g') do |info|
228
+ did_see_observation = true
229
+
230
+ info[:path].should == 'b.c.d'
231
+ info[:object].class.should == KVOTestRepeaterA
232
+ info[:new].should == nil
233
+ end
234
+
235
+ a.b.c.d = nil
236
+ did_see_observation.should == true
237
+
238
+ end
239
+
240
+
241
+
242
+ it "should allow long observer paths, part3" do
243
+ a = KVOTestRepeaterA.new
244
+ a.set_path 'b', KVOTestRepeaterB.new
245
+ a.set_path 'b.c', KVOTestRepeaterC.new
246
+ a.set_path 'b.c.d', KVOTestRepeaterD.new
247
+ a.set_path 'b.c.d.e', KVOTestRepeaterE.new
248
+ a.set_path 'b.c.d.e.f', KVOTestRepeaterF.new
249
+ a.set_path 'b.c.d.e.f.g', "Hey G"
250
+
251
+ did_see_observation = false
252
+
253
+ a.observe('b.c.d.e.f.g') do |info|
254
+ did_see_observation = true
255
+
256
+ info[:path].should == 'b.c.d.e.f.g'
257
+ info[:object].class.should == KVOTestRepeaterA
258
+ info[:new].should == 100
259
+ end
260
+
261
+ a.b.c.d.e.f.g = 100
262
+ did_see_observation.should == true
263
+
264
+ end
265
+
266
+
267
+
268
+ it "should allow long observer paths, part3" do
269
+ a = KVOTestRepeaterA.new
270
+ a.set_path 'b', KVOTestRepeaterB.new
271
+ a.set_path 'b.c', KVOTestRepeaterC.new
272
+ a.set_path 'b.c.d', KVOTestRepeaterD.new
273
+ a.set_path 'b.c.d.e', KVOTestRepeaterE.new
274
+ a.set_path 'b.c.d.e.f', KVOTestRepeaterF.new
275
+ a.set_path 'b.c.d.e.f.g', "Hey G"
276
+
277
+ did_see_observation = false
278
+
279
+ a.observe('b.c.d.e.f.g') do |info|
280
+ did_see_observation = true
281
+
282
+ info[:path].should == 'b'
283
+ info[:object].class.should == KVOTestRepeaterA
284
+ info[:new].should == 200
285
+ end
286
+
287
+ a.b = 200
288
+ did_see_observation.should == true
289
+
290
+ end
291
+
292
+ end