sproutit-sproutcore 1.0.0.20090416161445 → 1.0.0.20090720093355

Sign up to get free protection for your applications and to get access to all the features.
Files changed (754) hide show
  1. data/Buildfile +4 -2
  2. data/frameworks/sproutcore/Buildfile +3 -2
  3. data/frameworks/sproutcore/README +2 -1
  4. data/frameworks/sproutcore/apps/docs/core.js +27 -0
  5. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Preview.pdf +0 -0
  6. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Thumbnail.tiff +0 -0
  7. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/data.plist +14378 -0
  8. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image10.png +0 -0
  9. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image11.png +0 -0
  10. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image13.png +0 -0
  11. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image14.png +0 -0
  12. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image8.png +0 -0
  13. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image9.tiff +0 -0
  14. data/frameworks/sproutcore/apps/docs/english.lproj/loading.rhtml +9 -0
  15. data/frameworks/sproutcore/apps/docs/english.lproj/main_page.js +22 -0
  16. data/frameworks/sproutcore/apps/{sc_jsdoc → docs}/english.lproj/strings.js +7 -7
  17. data/frameworks/sproutcore/apps/docs/main.js +30 -0
  18. data/frameworks/sproutcore/apps/tests/controllers/detail.js +16 -0
  19. data/frameworks/sproutcore/apps/tests/controllers/source.js +29 -0
  20. data/frameworks/sproutcore/apps/tests/controllers/target.js +26 -0
  21. data/frameworks/sproutcore/apps/tests/controllers/targets.js +65 -26
  22. data/frameworks/sproutcore/apps/tests/controllers/tests.js +14 -19
  23. data/frameworks/sproutcore/apps/tests/core.js +114 -16
  24. data/frameworks/sproutcore/apps/tests/data_source.js +96 -0
  25. data/frameworks/sproutcore/apps/tests/english.lproj/main_page.css +22 -2
  26. data/frameworks/sproutcore/apps/tests/english.lproj/main_page.js +168 -22
  27. data/frameworks/sproutcore/apps/tests/english.lproj/strings.js +14 -5
  28. data/frameworks/sproutcore/apps/tests/fixtures/target.js +81 -37
  29. data/frameworks/sproutcore/apps/tests/fixtures/test.js +38 -37
  30. data/frameworks/sproutcore/apps/tests/main.js +9 -20
  31. data/frameworks/sproutcore/apps/tests/models/target.js +74 -31
  32. data/frameworks/sproutcore/apps/tests/models/test.js +30 -2
  33. data/frameworks/sproutcore/{frameworks/desktop/mixins/collection_item.js → apps/tests/states/no_targets.js} +16 -12
  34. data/frameworks/sproutcore/apps/tests/states/ready.js +56 -0
  35. data/frameworks/sproutcore/apps/tests/states/ready_detail.js +41 -0
  36. data/frameworks/sproutcore/apps/tests/states/ready_empty.js +48 -0
  37. data/frameworks/sproutcore/apps/tests/states/ready_list.js +41 -0
  38. data/frameworks/sproutcore/apps/tests/states/ready_loading.js +44 -0
  39. data/frameworks/sproutcore/apps/tests/states/ready_no_tests.js +31 -0
  40. data/frameworks/sproutcore/apps/tests/states/start.js +39 -0
  41. data/frameworks/sproutcore/apps/tests/tests/controllers/{test.js → detail.js} +3 -3
  42. data/frameworks/sproutcore/apps/tests/tests/controllers/source.js +15 -0
  43. data/frameworks/sproutcore/apps/tests/tests/controllers/target.js +15 -0
  44. data/frameworks/sproutcore/apps/tests/tests/controllers/targets.js +3 -3
  45. data/frameworks/sproutcore/apps/tests/tests/views/offset_checkbox.js +15 -0
  46. data/frameworks/sproutcore/apps/tests/views/offset_checkbox.js +26 -0
  47. data/frameworks/sproutcore/design/CollectionView State Charts.graffle +4848 -0
  48. data/frameworks/sproutcore/design/Design Charts.graffle +8788 -6375
  49. data/frameworks/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Preview.pdf +0 -0
  50. data/frameworks/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Thumbnail.tiff +0 -0
  51. data/frameworks/sproutcore/design/SproutCore Design Template.graffle/data.plist +1452 -0
  52. data/frameworks/sproutcore/design/SproutCore Design Template.graffle/image8.png +0 -0
  53. data/frameworks/sproutcore/design/TestRunner Design.graffle/QuickLook/Preview.pdf +0 -0
  54. data/frameworks/sproutcore/design/TestRunner Design.graffle/QuickLook/Thumbnail.tiff +0 -0
  55. data/frameworks/sproutcore/design/TestRunner Design.graffle/data.plist +24187 -0
  56. data/frameworks/sproutcore/design/TestRunner Design.graffle/image10.png +0 -0
  57. data/frameworks/sproutcore/design/TestRunner Design.graffle/image11.png +0 -0
  58. data/frameworks/sproutcore/design/TestRunner Design.graffle/image13.png +0 -0
  59. data/frameworks/sproutcore/design/TestRunner Design.graffle/image15.png +0 -0
  60. data/frameworks/sproutcore/design/TestRunner Design.graffle/image16.png +0 -0
  61. data/frameworks/sproutcore/design/TestRunner Design.graffle/image17.png +0 -0
  62. data/frameworks/sproutcore/design/TestRunner Design.graffle/image18.png +0 -0
  63. data/frameworks/sproutcore/design/TestRunner Design.graffle/image19.png +0 -0
  64. data/frameworks/sproutcore/design/TestRunner Design.graffle/image22.tiff +0 -0
  65. data/frameworks/sproutcore/design/TestRunner Design.graffle/image23.png +0 -0
  66. data/frameworks/sproutcore/design/TestRunner Design.graffle/image24.png +0 -0
  67. data/frameworks/sproutcore/design/TestRunner Design.graffle/image25.png +0 -0
  68. data/frameworks/sproutcore/design/TestRunner Design.graffle/image30.png +0 -0
  69. data/frameworks/sproutcore/design/TestRunner Design.graffle/image31.png +0 -0
  70. data/frameworks/sproutcore/design/TestRunner Design.graffle/image8.png +0 -0
  71. data/frameworks/sproutcore/design/TestRunner Design.graffle/image9.png +0 -0
  72. data/frameworks/sproutcore/frameworks/datastore/data_sources/cascade.js +2 -2
  73. data/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +66 -49
  74. data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +146 -31
  75. data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures_with_queries.js +238 -0
  76. data/frameworks/sproutcore/frameworks/datastore/models/many_attribute.js +27 -11
  77. data/frameworks/sproutcore/frameworks/datastore/models/record.js +163 -32
  78. data/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +67 -5
  79. data/frameworks/sproutcore/frameworks/datastore/system/many_array.js +157 -0
  80. data/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +202 -19
  81. data/frameworks/sproutcore/frameworks/datastore/system/query.js +929 -78
  82. data/frameworks/sproutcore/frameworks/datastore/system/record_array.js +143 -5
  83. data/frameworks/sproutcore/frameworks/datastore/system/store.js +443 -125
  84. data/frameworks/sproutcore/frameworks/datastore/tests/data_sources/fixtures.js +38 -3
  85. data/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +94 -0
  86. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/core_methods.js +30 -0
  87. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/normalize.js +238 -0
  88. data/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +105 -16
  89. data/frameworks/sproutcore/frameworks/datastore/tests/system/many_array/core_methods.js +178 -0
  90. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/chain.js +1 -1
  91. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChanges.js +9 -8
  92. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +6 -6
  93. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/dataHashDidChange.js +6 -6
  94. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/discardChanges.js +3 -3
  95. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readDataHash.js +7 -7
  96. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readEditableDataHash.js +4 -4
  97. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/removeDataHash.js +7 -7
  98. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/writeDataHash.js +7 -7
  99. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/compare_records.js +126 -0
  100. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation.js +165 -0
  101. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation_of_records.js +82 -0
  102. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/find_all.js +362 -0
  103. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/parsing.js +170 -0
  104. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/record_type_is.js +43 -0
  105. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/registered_comparisons.js +60 -0
  106. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/registered_query_extensions.js +67 -0
  107. data/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/core_methods.js +2 -13
  108. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +3 -4
  109. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/core_methods.js +73 -0
  110. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/createRecord.js +15 -0
  111. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/dataSourceCallbacks.js +4 -2
  112. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/destroyRecord.js +1 -1
  113. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushChanges.js +2 -2
  114. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/recordDidChange.js +1 -1
  115. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/retrieveRecord.js +2 -2
  116. data/frameworks/sproutcore/frameworks/debug/core.js +60 -0
  117. data/frameworks/sproutcore/frameworks/deprecated/core.js +0 -2
  118. data/frameworks/sproutcore/frameworks/deprecated/server/server.js +0 -1
  119. data/frameworks/sproutcore/frameworks/deprecated/system/browser.js +0 -2
  120. data/frameworks/sproutcore/frameworks/deprecated/system/classic_responder.js +0 -2
  121. data/frameworks/sproutcore/frameworks/deprecated/system/event.js +0 -2
  122. data/frameworks/sproutcore/frameworks/deprecated/system/misc.js +0 -2
  123. data/frameworks/sproutcore/frameworks/deprecated/system/object.js +0 -2
  124. data/frameworks/sproutcore/frameworks/deprecated/system/path_module.js +0 -1
  125. data/frameworks/sproutcore/frameworks/deprecated/system/string.js +0 -2
  126. data/frameworks/sproutcore/frameworks/designer/coders/design.js +1 -2
  127. data/frameworks/sproutcore/frameworks/designer/coders/localization.js +1 -2
  128. data/frameworks/sproutcore/frameworks/designer/coders/object.js +1 -1
  129. data/frameworks/sproutcore/frameworks/designer/controllers/page_design.js +1 -1
  130. data/frameworks/sproutcore/frameworks/designer/ext/page.js +0 -2
  131. data/frameworks/sproutcore/frameworks/designer/ext/view.js +0 -2
  132. data/frameworks/sproutcore/frameworks/designer/views/controls/button.js +2 -3
  133. data/frameworks/sproutcore/frameworks/designer/views/designer.js +24 -8
  134. data/frameworks/sproutcore/frameworks/designer/views/label.js +1 -2
  135. data/frameworks/sproutcore/frameworks/designer/views/mixins/button.js +0 -2
  136. data/frameworks/sproutcore/frameworks/designer/views/tab.js +1 -2
  137. data/frameworks/sproutcore/frameworks/desktop/english.lproj/alert.css +2 -2
  138. data/frameworks/sproutcore/frameworks/desktop/english.lproj/drag.css +6 -0
  139. data/frameworks/sproutcore/frameworks/desktop/english.lproj/list_item.css +63 -10
  140. data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu_item_view.css +5 -4
  141. data/frameworks/sproutcore/frameworks/desktop/english.lproj/modal.css +5 -0
  142. data/frameworks/sproutcore/frameworks/desktop/english.lproj/panel.css +1 -0
  143. data/frameworks/sproutcore/frameworks/desktop/english.lproj/slider.css +5 -0
  144. data/frameworks/sproutcore/frameworks/desktop/english.lproj/split_divider.css +1 -0
  145. data/frameworks/sproutcore/frameworks/desktop/english.lproj/tab.css +1 -1
  146. data/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +61 -0
  147. data/frameworks/sproutcore/frameworks/desktop/mixins/collection_view_delegate.js +136 -79
  148. data/frameworks/sproutcore/frameworks/desktop/panes/alert.js +55 -24
  149. data/frameworks/sproutcore/frameworks/desktop/panes/menu.js +295 -147
  150. data/frameworks/sproutcore/frameworks/desktop/panes/palette.js +1 -1
  151. data/frameworks/sproutcore/frameworks/desktop/panes/panel.js +1 -1
  152. data/frameworks/sproutcore/frameworks/desktop/panes/picker.js +18 -20
  153. data/frameworks/sproutcore/frameworks/desktop/panes/sheet.js +2 -2
  154. data/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +4 -4
  155. data/frameworks/sproutcore/frameworks/desktop/system/drag.js +337 -231
  156. data/frameworks/sproutcore/frameworks/desktop/system/root_responder.js +3 -3
  157. data/frameworks/sproutcore/frameworks/desktop/tests/integration/dialog.js +1 -1
  158. data/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +2 -2
  159. data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/methods.js +46 -1
  160. data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +4 -2
  161. data/frameworks/sproutcore/frameworks/desktop/tests/panes/palette/ui.js +5 -6
  162. data/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +11 -11
  163. data/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/ui.js +11 -7
  164. data/frameworks/sproutcore/frameworks/desktop/tests/panes/sheet/ui.js +9 -9
  165. data/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +19 -0
  166. data/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +0 -1
  167. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/content.js +249 -0
  168. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/deleteSelection.js +82 -0
  169. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/deselect.js +199 -0
  170. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/itemViewForContentIndex.js +288 -0
  171. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/layerIdFor.js +65 -0
  172. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/length.js +88 -0
  173. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/mouse.js +165 -0
  174. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/nowShowing.js +121 -0
  175. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/reload.js +177 -0
  176. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/select.js +240 -0
  177. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectNextItem.js +191 -0
  178. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectPreviousItem.js +197 -39
  179. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selection.js +141 -0
  180. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/ui_diagram.js +182 -0
  181. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowDelegate.js +183 -0
  182. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowHeightForContentIndex.js +133 -0
  183. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowOffsetForContentIndex.js +132 -0
  184. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_outline.js +56 -0
  185. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_row_heights.js +167 -0
  186. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_simple.js +127 -0
  187. data/frameworks/sproutcore/frameworks/desktop/tests/views/list_item.js +30 -1
  188. data/frameworks/sproutcore/frameworks/desktop/tests/views/menu_item/ui.js +8 -8
  189. data/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +9 -9
  190. data/frameworks/sproutcore/frameworks/desktop/tests/views/scroller/methods.js +45 -6
  191. data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/methods.js +2 -1
  192. data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +17 -1
  193. data/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/ui.js +44 -29
  194. data/frameworks/sproutcore/frameworks/desktop/tests/views/stacked/ui_comments.js +231 -0
  195. data/frameworks/sproutcore/frameworks/desktop/tests/views/web/ui.js +1 -1
  196. data/frameworks/sproutcore/frameworks/desktop/views/button.js +15 -4
  197. data/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +8 -1
  198. data/frameworks/sproutcore/frameworks/desktop/views/collection.js +1739 -1123
  199. data/frameworks/sproutcore/frameworks/desktop/views/form.js +0 -1
  200. data/frameworks/sproutcore/frameworks/desktop/views/grid.js +13 -11
  201. data/frameworks/sproutcore/frameworks/desktop/views/list.js +405 -571
  202. data/frameworks/sproutcore/frameworks/desktop/views/list_item.js +211 -74
  203. data/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +319 -169
  204. data/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +57 -51
  205. data/frameworks/sproutcore/frameworks/desktop/views/progress.js +2 -2
  206. data/frameworks/sproutcore/frameworks/desktop/views/scene.js +150 -2
  207. data/frameworks/sproutcore/frameworks/desktop/views/scroll.js +92 -50
  208. data/frameworks/sproutcore/frameworks/desktop/views/scroller.js +86 -63
  209. data/frameworks/sproutcore/frameworks/desktop/views/segmented.js +38 -22
  210. data/frameworks/sproutcore/frameworks/desktop/views/select_field.js +51 -12
  211. data/frameworks/sproutcore/frameworks/desktop/views/slider.js +2 -0
  212. data/frameworks/sproutcore/frameworks/desktop/views/source_list.js +17 -1087
  213. data/frameworks/sproutcore/frameworks/desktop/views/source_list_group.js +3 -3
  214. data/frameworks/sproutcore/frameworks/desktop/views/split.js +35 -9
  215. data/frameworks/sproutcore/frameworks/desktop/views/stacked.js +101 -0
  216. data/frameworks/sproutcore/frameworks/desktop/views/tab.js +23 -22
  217. data/frameworks/sproutcore/frameworks/desktop/views/toolbar.js +1 -1
  218. data/frameworks/sproutcore/frameworks/foundation/controllers/array.js +382 -363
  219. data/frameworks/sproutcore/frameworks/foundation/controllers/controller.js +7 -279
  220. data/frameworks/sproutcore/frameworks/foundation/controllers/object.js +212 -310
  221. data/frameworks/sproutcore/frameworks/foundation/controllers/tree.js +109 -0
  222. data/frameworks/sproutcore/frameworks/foundation/core.js +25 -0
  223. data/frameworks/sproutcore/frameworks/foundation/debug/control_test_pane.js +30 -8
  224. data/frameworks/sproutcore/frameworks/foundation/english.lproj/bootstrap.rhtml +19 -4
  225. data/frameworks/sproutcore/frameworks/foundation/english.lproj/core.css +219 -3
  226. data/frameworks/sproutcore/frameworks/foundation/english.lproj/debug/control-test-pane.css +1 -0
  227. data/frameworks/sproutcore/frameworks/foundation/english.lproj/label.css +30 -0
  228. data/frameworks/sproutcore/frameworks/foundation/english.lproj/strings.js +15 -0
  229. data/frameworks/sproutcore/frameworks/{desktop → foundation}/english.lproj/text_field.css +19 -3
  230. data/frameworks/sproutcore/frameworks/foundation/english.lproj/view.css +6 -1
  231. data/frameworks/sproutcore/frameworks/foundation/license.js +19 -0
  232. data/frameworks/sproutcore/frameworks/foundation/mixins/button.js +15 -7
  233. data/frameworks/sproutcore/frameworks/foundation/mixins/collection_content.js +171 -0
  234. data/frameworks/sproutcore/frameworks/foundation/mixins/control.js +5 -5
  235. data/frameworks/sproutcore/frameworks/foundation/mixins/inline_text_field.js +462 -0
  236. data/frameworks/sproutcore/frameworks/foundation/mixins/selection_support.js +162 -84
  237. data/frameworks/sproutcore/frameworks/foundation/mixins/static_layout.js +33 -2
  238. data/frameworks/sproutcore/frameworks/foundation/mixins/string.js +17 -3
  239. data/frameworks/sproutcore/frameworks/foundation/mixins/tree_item_content.js +159 -0
  240. data/frameworks/sproutcore/frameworks/foundation/panes/pane.js +49 -20
  241. data/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +887 -0
  242. data/frameworks/sproutcore/frameworks/foundation/system/application.js +36 -0
  243. data/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +310 -62
  244. data/frameworks/sproutcore/frameworks/foundation/system/datetime.js +729 -0
  245. data/frameworks/sproutcore/frameworks/foundation/system/event.js +57 -21
  246. data/frameworks/sproutcore/frameworks/foundation/system/ready.js +11 -5
  247. data/frameworks/sproutcore/frameworks/foundation/system/render_context.js +55 -16
  248. data/frameworks/sproutcore/frameworks/foundation/system/request.js +152 -27
  249. data/frameworks/sproutcore/frameworks/foundation/system/responder.js +120 -0
  250. data/frameworks/sproutcore/frameworks/foundation/system/responder_context.js +243 -0
  251. data/frameworks/sproutcore/frameworks/foundation/system/root_responder.js +29 -6
  252. data/frameworks/sproutcore/frameworks/foundation/system/routes.js +143 -102
  253. data/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +9 -2
  254. data/frameworks/sproutcore/frameworks/foundation/system/utils.js +104 -9
  255. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/array_case.js +182 -0
  256. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/enum_case.js +193 -0
  257. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/null_case.js +64 -0
  258. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/single_case.js +136 -0
  259. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/empty_case.js +82 -0
  260. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/multiple_case.js +111 -0
  261. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/single_case.js +193 -0
  262. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/single_enumerable_case.js +179 -0
  263. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/tree/outline_case.js +108 -0
  264. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/button/keyEquivalents.js +35 -0
  265. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/staticLayout.js +128 -0
  266. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/string.js +17 -0
  267. data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/flat_case.js +325 -0
  268. data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/group_case.js +718 -0
  269. data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/outline_case.js +484 -0
  270. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_core.js +28 -28
  271. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_selector.js +1 -1
  272. data/frameworks/sproutcore/frameworks/foundation/tests/system/datetime.js +151 -0
  273. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/get.js +2 -2
  274. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_attr.js +1 -1
  275. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_basic.js +1 -1
  276. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_className.js +12 -12
  277. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_style.js +1 -1
  278. data/frameworks/sproutcore/frameworks/foundation/tests/system/request.js +52 -14
  279. data/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/root_responder.js +27 -23
  280. data/frameworks/sproutcore/frameworks/foundation/tests/system/timer/schedule.js +1 -1
  281. data/frameworks/sproutcore/frameworks/foundation/tests/validators/date.js +12 -10
  282. data/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +148 -0
  283. data/frameworks/sproutcore/frameworks/foundation/tests/views/pane/append_remove.js +1 -1
  284. data/frameworks/sproutcore/frameworks/{desktop → foundation}/tests/views/text_field/methods.js +0 -0
  285. data/frameworks/sproutcore/frameworks/{desktop → foundation}/tests/views/text_field/ui.js +53 -1
  286. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/clippingFrame.js +1 -0
  287. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/convertFrames.js +1 -1
  288. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/createChildViews.js +35 -0
  289. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/findLayerInParentLayer.js +1 -1
  290. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisible.js +51 -0
  291. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisibleInWindow.js +12 -1
  292. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/layoutStyle.js +83 -3
  293. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/prepareContext.js +1 -1
  294. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/updateLayer.js +4 -0
  295. data/frameworks/sproutcore/frameworks/foundation/views/container.js +1 -1
  296. data/frameworks/sproutcore/frameworks/foundation/views/field.js +27 -16
  297. data/frameworks/sproutcore/frameworks/foundation/views/image.js +4 -1
  298. data/frameworks/sproutcore/frameworks/foundation/views/label.js +16 -6
  299. data/frameworks/sproutcore/frameworks/{desktop → foundation}/views/text_field.js +39 -15
  300. data/frameworks/sproutcore/frameworks/foundation/views/view.js +328 -83
  301. data/frameworks/sproutcore/frameworks/runtime/README +1 -0
  302. data/frameworks/sproutcore/frameworks/runtime/core.js +110 -31
  303. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/base.js +238 -0
  304. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/indexOf.js +33 -0
  305. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/insertAt.js +121 -0
  306. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/objectAt.js +34 -0
  307. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/popObject.js +50 -0
  308. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/pushObject.js +46 -0
  309. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/rangeObserver.js +371 -0
  310. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeAt.js +100 -0
  311. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeObject.js +49 -0
  312. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +94 -0
  313. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/shiftObject.js +50 -0
  314. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/unshiftObject.js +47 -0
  315. data/frameworks/sproutcore/frameworks/runtime/mixins/array.js +320 -110
  316. data/frameworks/sproutcore/frameworks/runtime/mixins/copyable.js +64 -0
  317. data/frameworks/sproutcore/frameworks/runtime/mixins/delegate_support.js +44 -6
  318. data/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +142 -77
  319. data/frameworks/sproutcore/frameworks/runtime/mixins/freezable.js +104 -0
  320. data/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +298 -142
  321. data/frameworks/sproutcore/frameworks/runtime/private/chain_observer.js +17 -11
  322. data/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +55 -15
  323. data/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +29 -5
  324. data/frameworks/sproutcore/frameworks/runtime/protocols/observable_protocol.js +40 -0
  325. data/frameworks/sproutcore/frameworks/runtime/system/binding.js +39 -15
  326. data/frameworks/sproutcore/frameworks/runtime/system/index_set.js +1166 -0
  327. data/frameworks/sproutcore/frameworks/runtime/system/object.js +33 -15
  328. data/frameworks/sproutcore/frameworks/runtime/system/range_observer.js +201 -35
  329. data/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +42 -15
  330. data/frameworks/sproutcore/frameworks/runtime/system/selection_set.js +649 -0
  331. data/frameworks/sproutcore/frameworks/runtime/system/set.js +183 -54
  332. data/frameworks/sproutcore/frameworks/runtime/system/sparse_array.js +20 -11
  333. data/frameworks/sproutcore/frameworks/runtime/tests/core/clone.js +2 -2
  334. data/frameworks/sproutcore/frameworks/runtime/tests/core/compare.js +44 -0
  335. data/frameworks/sproutcore/frameworks/runtime/tests/core/console.js +16 -0
  336. data/frameworks/sproutcore/frameworks/runtime/tests/core/keys.js +1 -1
  337. data/frameworks/sproutcore/frameworks/runtime/tests/core/makeArray.js +1 -1
  338. data/frameworks/sproutcore/frameworks/runtime/tests/core/objectForPropertyPath.js +5 -5
  339. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/array.js +57 -0
  340. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable.js +21 -2
  341. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +249 -129
  342. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/propertyChanges.js +11 -2
  343. data/frameworks/sproutcore/frameworks/runtime/tests/private/observer_queue/isObservingSuspended.js +55 -0
  344. data/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +81 -6
  345. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/add.js +195 -0
  346. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/clone.js +43 -0
  347. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/contains.js +74 -0
  348. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/create.js +42 -0
  349. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/indexAfter.js +38 -0
  350. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/indexBefore.js +38 -0
  351. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/intersects.js +74 -0
  352. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/max.js +40 -0
  353. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/min.js +40 -0
  354. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/rangeStartForIndex.js +36 -0
  355. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/remove.js +189 -0
  356. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/without.js +89 -0
  357. data/frameworks/sproutcore/frameworks/runtime/tests/system/object/base.js +1 -1
  358. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/create.js +59 -0
  359. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/destroy.js +75 -0
  360. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/objectPropertyDidChange.js +117 -0
  361. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/rangeDidChange.js +110 -0
  362. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/update.js +65 -0
  363. data/frameworks/sproutcore/frameworks/runtime/tests/system/run_loop.js +3 -3
  364. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/add.js +92 -0
  365. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/copy.js +17 -0
  366. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/indexSetForSource.js +85 -0
  367. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/isEqual.js +60 -0
  368. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/remove.js +87 -0
  369. data/frameworks/sproutcore/frameworks/runtime/tests/system/set.js +4 -25
  370. data/frameworks/sproutcore/frameworks/runtime/tests/system/sparse_array.js +39 -1
  371. data/frameworks/sproutcore/frameworks/testing/core.js +183 -0
  372. data/frameworks/sproutcore/frameworks/testing/english.lproj/runner.css +126 -0
  373. data/frameworks/sproutcore/frameworks/testing/extras.js +0 -26
  374. data/frameworks/sproutcore/frameworks/testing/qunit.js +33 -25
  375. data/frameworks/sproutcore/frameworks/testing/system/dump.js +205 -0
  376. data/frameworks/sproutcore/frameworks/testing/system/equiv.js +201 -0
  377. data/frameworks/sproutcore/frameworks/testing/system/plan.js +691 -0
  378. data/frameworks/sproutcore/frameworks/testing/system/runner.js +209 -0
  379. data/frameworks/sproutcore/frameworks/testing/system/suite.js +228 -0
  380. data/frameworks/sproutcore/frameworks/testing/utils.js +8 -1
  381. data/frameworks/sproutcore/lib/index.rhtml +4 -1
  382. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/10.png +0 -0
  383. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/100.png +0 -0
  384. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/102.png +0 -0
  385. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/110.png +0 -0
  386. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/120.png +0 -0
  387. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/127.png +0 -0
  388. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/18.png +0 -0
  389. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/19.png +0 -0
  390. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/2.png +0 -0
  391. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/24.png +0 -0
  392. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/26.png +0 -0
  393. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/27.png +0 -0
  394. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/28.png +0 -0
  395. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/29.png +0 -0
  396. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/30.png +0 -0
  397. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/31.png +0 -0
  398. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/33.png +0 -0
  399. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/37.png +0 -0
  400. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/41.png +0 -0
  401. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/99.png +0 -0
  402. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/10.png +0 -0
  403. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/100.png +0 -0
  404. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/102.png +0 -0
  405. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/110.png +0 -0
  406. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/120.png +0 -0
  407. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/127.png +0 -0
  408. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/18.png +0 -0
  409. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/19.png +0 -0
  410. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/2.png +0 -0
  411. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/24.png +0 -0
  412. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/26.png +0 -0
  413. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/27.png +0 -0
  414. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/28.png +0 -0
  415. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/29.png +0 -0
  416. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/30.png +0 -0
  417. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/31.png +0 -0
  418. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/33.png +0 -0
  419. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/37.png +0 -0
  420. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/41.png +0 -0
  421. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/99.png +0 -0
  422. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/10.png +0 -0
  423. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/100.png +0 -0
  424. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/102.png +0 -0
  425. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/110.png +0 -0
  426. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/120.png +0 -0
  427. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/127.png +0 -0
  428. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/18.png +0 -0
  429. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/19.png +0 -0
  430. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/2.png +0 -0
  431. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/24.png +0 -0
  432. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/26.png +0 -0
  433. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/27.png +0 -0
  434. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/28.png +0 -0
  435. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/29.png +0 -0
  436. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/30.png +0 -0
  437. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/31.png +0 -0
  438. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/33.png +0 -0
  439. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/37.png +0 -0
  440. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/41.png +0 -0
  441. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/99.png +0 -0
  442. data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/10.png +0 -0
  443. data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/18.png +0 -0
  444. data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/19.png +0 -0
  445. data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/2.png +0 -0
  446. data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x-2.psd +0 -0
  447. data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x.psd +0 -0
  448. data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-sprite.psd +0 -0
  449. data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-ysprite.psd +0 -0
  450. data/frameworks/sproutcore/themes/standard_theme/Source/shared-icons.psd +0 -0
  451. data/frameworks/sproutcore/themes/standard_theme/Source/sproutcore-logo.psd +0 -0
  452. data/frameworks/sproutcore/themes/standard_theme/Source/sticky-note.psd +0 -0
  453. data/frameworks/sproutcore/themes/standard_theme/english.lproj/button.css +191 -193
  454. data/frameworks/sproutcore/themes/standard_theme/english.lproj/checkbox.css +11 -10
  455. data/frameworks/sproutcore/themes/standard_theme/english.lproj/collection.css +85 -4
  456. data/frameworks/sproutcore/themes/standard_theme/english.lproj/core.css +15 -2
  457. data/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-theme-repeat-x.png +0 -0
  458. data/frameworks/sproutcore/themes/standard_theme/english.lproj/label.css +0 -26
  459. data/frameworks/sproutcore/themes/standard_theme/english.lproj/list_item.css +30 -0
  460. data/frameworks/sproutcore/themes/standard_theme/english.lproj/progress.css +9 -6
  461. data/frameworks/sproutcore/themes/standard_theme/english.lproj/radio.css +20 -11
  462. data/frameworks/sproutcore/themes/standard_theme/english.lproj/segmented.css +192 -54
  463. data/frameworks/sproutcore/themes/standard_theme/english.lproj/slider.css +56 -24
  464. data/frameworks/sproutcore/themes/standard_theme/english.lproj/tab.css +13 -7
  465. data/frameworks/sproutcore/themes/standard_theme/english.lproj/text_field.css +1 -4
  466. data/frameworks/sproutcore/themes/standard_theme/english.lproj/toolbar.css +4 -1
  467. data/lib/sproutcore/builders/minify.rb +2 -2
  468. data/lib/sproutcore/builders/test.rb +1 -1
  469. data/lib/sproutcore/buildfile.rb +1 -0
  470. data/lib/sproutcore/rack/dev.rb +1 -1
  471. data/lib/sproutcore/rack/filesystem.rb +265 -0
  472. data/lib/sproutcore/rack/proxy.rb +11 -3
  473. data/lib/sproutcore/rack/service.rb +11 -1
  474. data/lib/sproutcore/tools.rb +11 -1
  475. data/lib/sproutcore/tools/server.rb +6 -4
  476. data/vendor/jsdoc/README.txt +151 -0
  477. data/vendor/jsdoc/changes.txt +47 -0
  478. metadata +263 -308
  479. data/frameworks/sproutcore/apps/sc_jsdoc/controllers/docs.js +0 -149
  480. data/frameworks/sproutcore/apps/sc_jsdoc/core.js +0 -16
  481. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.css +0 -17
  482. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.js +0 -99
  483. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/images/sproutcore-logo.png +0 -0
  484. data/frameworks/sproutcore/apps/sc_jsdoc/main.js +0 -27
  485. data/frameworks/sproutcore/apps/sc_jsdoc/models/doc.js +0 -21
  486. data/frameworks/sproutcore/apps/sc_qunit/controllers/runner.js +0 -209
  487. data/frameworks/sproutcore/apps/sc_qunit/core.js +0 -16
  488. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.css +0 -17
  489. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.js +0 -107
  490. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/images/sproutcore-logo.png +0 -0
  491. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/strings.js +0 -15
  492. data/frameworks/sproutcore/apps/sc_qunit/main.js +0 -18
  493. data/frameworks/sproutcore/apps/sc_qunit/models/test.js +0 -24
  494. data/frameworks/sproutcore/apps/sc_qunit/views/test_iframe.js +0 -52
  495. data/frameworks/sproutcore/apps/tests/controllers/test.js +0 -20
  496. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/blank.gif +0 -0
  497. data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu.css +0 -83
  498. data/frameworks/sproutcore/frameworks/desktop/english.lproj/palette.css +0 -3
  499. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/methods.js +0 -10
  500. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/methods.js +0 -10
  501. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui.js +0 -110
  502. data/frameworks/sproutcore/frameworks/foundation/mixins/responder.js +0 -156
  503. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array.js +0 -118
  504. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/controller.js +0 -268
  505. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object.js +0 -433
  506. data/frameworks/sproutcore/frameworks/runtime/tests/system/array.js +0 -263
  507. data/frameworks/sproutcore/frameworks/testing/tests/debug/qunit.js +0 -25
  508. data/spec/buildtasks/manifest/spec_helper.rb +0 -35
  509. data/spec/buildtasks/target_spec.rb +0 -214
  510. data/spec/fixtures/builder_tests/Buildfile +0 -15
  511. data/spec/fixtures/builder_tests/apps/combine_test/a.js +0 -1
  512. data/spec/fixtures/builder_tests/apps/combine_test/b.js +0 -1
  513. data/spec/fixtures/builder_tests/apps/combine_test/c.js +0 -1
  514. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/a.css +0 -1
  515. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/b.css +0 -1
  516. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/c.css +0 -1
  517. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/bar1_sample.rhtml +0 -2
  518. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/erb_sample.html.erb +0 -1
  519. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/icons/image.png +0 -0
  520. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/image.jpg +0 -0
  521. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/rhtml_sample.rhtml +0 -1
  522. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/strings.js +0 -4
  523. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/style.css +0 -0
  524. data/spec/fixtures/builder_tests/apps/html_test/french.lproj/french-icons/fr.png +0 -0
  525. data/spec/fixtures/builder_tests/apps/html_test/french.lproj/strings.js +0 -4
  526. data/spec/fixtures/builder_tests/apps/html_test/lib/layout_template.rhtml +0 -1
  527. data/spec/fixtures/builder_tests/apps/html_test/scripts.js +0 -0
  528. data/spec/fixtures/builder_tests/apps/javascript_test/sc_static.js +0 -15
  529. data/spec/fixtures/builder_tests/apps/javascript_test/sc_super.js +0 -4
  530. data/spec/fixtures/builder_tests/apps/javascript_test/strings.js +0 -7
  531. data/spec/fixtures/builder_tests/apps/sass_test/sample.sass +0 -3
  532. data/spec/fixtures/builder_tests/apps/strings_test/lproj/strings.js +0 -8
  533. data/spec/fixtures/builder_tests/apps/stylesheet_test/build_directives.css +0 -9
  534. data/spec/fixtures/builder_tests/apps/stylesheet_test/sc_static.css +0 -12
  535. data/spec/fixtures/builder_tests/apps/test_test/lib/alt_layout.rhtml +0 -1
  536. data/spec/fixtures/builder_tests/apps/test_test/lib/test_layout.rhtml +0 -3
  537. data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test.js +0 -1
  538. data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test2.js +0 -1
  539. data/spec/fixtures/builder_tests/apps/test_test/tests/rhtml_test.rhtml +0 -4
  540. data/spec/fixtures/builder_tests/frameworks/debug/core.js +0 -0
  541. data/spec/fixtures/builder_tests/frameworks/debug/english.lproj/dummy.css +0 -0
  542. data/spec/fixtures/builder_tests/frameworks/qunit/core.js +0 -0
  543. data/spec/fixtures/builder_tests/frameworks/qunit/english.lproj/dummy.css +0 -0
  544. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/req_style_1.css +0 -0
  545. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/strings.js +0 -4
  546. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/test.rhtml +0 -1
  547. data/spec/fixtures/builder_tests/frameworks/req_target_1/req_js_1.js +0 -0
  548. data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/req_style_2.css +0 -0
  549. data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/test.rhtml +0 -1
  550. data/spec/fixtures/builder_tests/frameworks/req_target_2/javascript.js +0 -1
  551. data/spec/fixtures/builder_tests/frameworks/req_target_2/lib/alt_layout.rhtml +0 -0
  552. data/spec/fixtures/builder_tests/frameworks/req_target_2/req_js_2.js +0 -0
  553. data/spec/fixtures/builder_tests/themes/sample_theme/Buildfile +0 -1
  554. data/spec/fixtures/buildfiles/basic/Buildfile +0 -16
  555. data/spec/fixtures/buildfiles/basic/task_module.rake +0 -6
  556. data/spec/fixtures/buildfiles/installed/Buildfile +0 -7
  557. data/spec/fixtures/buildfiles/installed/Buildfile2 +0 -5
  558. data/spec/fixtures/buildfiles/project_test/Buildfile +0 -4
  559. data/spec/fixtures/buildfiles/project_test/not_project/Buildfile +0 -2
  560. data/spec/fixtures/buildfiles/project_test/not_project/child/PLACEHOLDER +0 -0
  561. data/spec/fixtures/entry_for_project/Buildfile +0 -1
  562. data/spec/fixtures/entry_for_project/apps/test_app/frameworks/nested/PLACEHOLDER +0 -0
  563. data/spec/fixtures/entry_for_project/frameworks/shared/PLACEHOLDER +0 -0
  564. data/spec/fixtures/find_targets/custom/Buildfile +0 -8
  565. data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar1/PLACEHOLDER +0 -0
  566. data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar2/PLACEHOLDER +0 -0
  567. data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo1/PLACEHOLDER +0 -0
  568. data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo2/PLACEHOLDER +0 -0
  569. data/spec/fixtures/find_targets/custom/foos/custom_foos/Buildfile +0 -5
  570. data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo1/PLACEHOLDER +0 -0
  571. data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo2/PLACEHOLDER +0 -0
  572. data/spec/fixtures/find_targets/custom/foos/custom_foos/foos/not_foo1/PLACEHOLDER +0 -0
  573. data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar1/PLACEHOLDER +0 -0
  574. data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar2/PLACEHOLDER +0 -0
  575. data/spec/fixtures/find_targets/nested/Buildfile +0 -8
  576. data/spec/fixtures/find_targets/nested/apps/app1/Buildfile +0 -1
  577. data/spec/fixtures/find_targets/nested/apps/app1/apps/nested_app/PLACEHOLDER +0 -0
  578. data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework1/PLACEHOLDER +0 -0
  579. data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework2/PLACEHOLDER +0 -0
  580. data/spec/fixtures/find_targets/standard/clients/client1/PLACEHOLDER +0 -0
  581. data/spec/fixtures/find_targets/standard/frameworks/framework1/frameworks/framework1/PLACEHOLDER +0 -0
  582. data/spec/fixtures/find_targets/standard/frameworks/framework2/PLACEHOLDER +0 -0
  583. data/spec/fixtures/find_targets/standard/themes/theme1/PLACEHOLDER +0 -0
  584. data/spec/fixtures/find_targets/standard/themes/theme2/PLACEHOLDER +0 -0
  585. data/spec/fixtures/languages/apps/caps_long_names/English.lproj/PLACEHOLDER +0 -0
  586. data/spec/fixtures/languages/apps/caps_long_names/FreNCH.lproj/PLACEHOLDER +0 -0
  587. data/spec/fixtures/languages/apps/caps_long_names/UnknOWN.lproj/PLACEHOLDER +0 -0
  588. data/spec/fixtures/languages/apps/long_names/english.lproj/PLACEHOLDER +0 -0
  589. data/spec/fixtures/languages/apps/long_names/french.lproj/PLACEHOLDER +0 -0
  590. data/spec/fixtures/languages/apps/long_names/german.lproj/PLACEHOLDER +0 -0
  591. data/spec/fixtures/languages/apps/long_names/italian.lproj/PLACEHOLDER +0 -0
  592. data/spec/fixtures/languages/apps/long_names/japanese.lproj/PLACEHOLDER +0 -0
  593. data/spec/fixtures/languages/apps/long_names/spanish.lproj/PLACEHOLDER +0 -0
  594. data/spec/fixtures/languages/apps/long_names/unknown.lproj/PLACEHOLDER +0 -0
  595. data/spec/fixtures/languages/apps/no_names/PLACEHOLDER +0 -0
  596. data/spec/fixtures/languages/apps/short_names/de.lproj/PLACEHOLDER +0 -0
  597. data/spec/fixtures/languages/apps/short_names/en-CA.lproj/PLACEHOLDER +0 -0
  598. data/spec/fixtures/languages/apps/short_names/en-GB.lproj/PLACEHOLDER +0 -0
  599. data/spec/fixtures/languages/apps/short_names/en-US.lproj/PLACEHOLDER +0 -0
  600. data/spec/fixtures/languages/apps/short_names/en.lproj/PLACEHOLDER +0 -0
  601. data/spec/fixtures/languages/apps/short_names/es.lproj/PLACEHOLDER +0 -0
  602. data/spec/fixtures/languages/apps/short_names/foo.lproj/PLACEHOLDER +0 -0
  603. data/spec/fixtures/languages/apps/short_names/fr.lproj/PLACEHOLDER +0 -0
  604. data/spec/fixtures/languages/apps/short_names/it.lproj/PLACEHOLDER +0 -0
  605. data/spec/fixtures/languages/apps/short_names/ja.lproj/PLACEHOLDER +0 -0
  606. data/spec/fixtures/ordered_entries/apps/no_requires/1.js +0 -1
  607. data/spec/fixtures/ordered_entries/apps/no_requires/B.js +0 -1
  608. data/spec/fixtures/ordered_entries/apps/no_requires/a.js +0 -1
  609. data/spec/fixtures/ordered_entries/apps/no_requires/a/a.js +0 -1
  610. data/spec/fixtures/ordered_entries/apps/no_requires/a/b.js +0 -1
  611. data/spec/fixtures/ordered_entries/apps/no_requires/b/a.js +0 -1
  612. data/spec/fixtures/ordered_entries/apps/no_requires/c.js +0 -1
  613. data/spec/fixtures/ordered_entries/apps/no_requires/core.js +0 -1
  614. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/B.css +0 -0
  615. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a.css +0 -0
  616. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/a.css +0 -0
  617. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/b.css +0 -0
  618. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/b/a.css +0 -0
  619. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/c.css +0 -0
  620. data/spec/fixtures/ordered_entries/apps/no_requires/lproj/strings.js +0 -1
  621. data/spec/fixtures/ordered_entries/apps/no_requires/utils.js +0 -1
  622. data/spec/fixtures/ordered_entries/apps/with_requires/a.js +0 -2
  623. data/spec/fixtures/ordered_entries/apps/with_requires/b.js +0 -3
  624. data/spec/fixtures/ordered_entries/apps/with_requires/c.js +0 -2
  625. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/a.css +0 -2
  626. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/b.css +0 -2
  627. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/c.css +0 -2
  628. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/d.js +0 -1
  629. data/spec/fixtures/real_world/Buildfile +0 -12
  630. data/spec/fixtures/real_world/apps/account/README +0 -1
  631. data/spec/fixtures/real_world/apps/calendar/README +0 -1
  632. data/spec/fixtures/real_world/apps/contacts/README_BEFORE_EDITING +0 -1
  633. data/spec/fixtures/real_world/apps/files/README +0 -1
  634. data/spec/fixtures/real_world/apps/mail/README +0 -1
  635. data/spec/fixtures/real_world/apps/mobile_photos/README +0 -1
  636. data/spec/fixtures/real_world/apps/photos/README +0 -1
  637. data/spec/fixtures/real_world/apps/uploader/README +0 -1
  638. data/spec/fixtures/real_world/frameworks/core_files/PLACEHOLDER +0 -0
  639. data/spec/fixtures/real_world/frameworks/core_photos/PLACEHOLDER +0 -0
  640. data/spec/fixtures/real_world/frameworks/shared/PLACEHOLDER +0 -0
  641. data/spec/fixtures/real_world/frameworks/sproutcore/Buildfile +0 -26
  642. data/spec/fixtures/real_world/frameworks/sproutcore/README +0 -1
  643. data/spec/fixtures/real_world/frameworks/sproutcore/apps/docs/PLACEHOLDER +0 -0
  644. data/spec/fixtures/real_world/frameworks/sproutcore/apps/test_runner/PLACEHOLDER +0 -0
  645. data/spec/fixtures/real_world/frameworks/sproutcore/core.js +0 -0
  646. data/spec/fixtures/real_world/frameworks/sproutcore/debug/debug-resource.html +0 -0
  647. data/spec/fixtures/real_world/frameworks/sproutcore/debug/sample_debug.js +0 -0
  648. data/spec/fixtures/real_world/frameworks/sproutcore/demo2.js +0 -0
  649. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/debug/sample_debug-loc.js +0 -0
  650. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.css +0 -4
  651. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.html +0 -1
  652. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo2.sass +0 -0
  653. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.haml +0 -0
  654. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.html.erb +0 -1
  655. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.rhtml +0 -0
  656. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/fixtures/sample_fixtures-loc.js +0 -0
  657. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/has_require.css +0 -4
  658. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_require.css +0 -1
  659. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_sc_resource.rhtml +0 -1
  660. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/protocols/sample-loc.js +0 -0
  661. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.css +0 -6
  662. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.rhtml +0 -3
  663. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/strings.js +0 -1
  664. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/tests/sample-loc.js +0 -0
  665. data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample-json-fixture.json +0 -1
  666. data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample_fixtures.js +0 -0
  667. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/application/PLACEHOLDER +0 -0
  668. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/costello/core.js +0 -0
  669. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/data_store/PLACEHOLDER +0 -0
  670. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/debug/PLACEHOLDER +0 -0
  671. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/desktop/PLACEHOLDER +0 -0
  672. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/empty_theme/PLACEHOLDER +0 -0
  673. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/foundation/PLACEHOLDER +0 -0
  674. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/mobile/PLACEHOLDER +0 -0
  675. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/qunit/PLACEHOLDER +0 -0
  676. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/uploader/PLACEHOLDER +0 -0
  677. data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/french-resource.js +0 -0
  678. data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/strings.js +0 -1
  679. data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/german-resource.js +0 -0
  680. data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/strings.js +0 -0
  681. data/spec/fixtures/real_world/frameworks/sproutcore/has_require.js +0 -4
  682. data/spec/fixtures/real_world/frameworks/sproutcore/lib/index.html +0 -1
  683. data/spec/fixtures/real_world/frameworks/sproutcore/no_require.js +0 -1
  684. data/spec/fixtures/real_world/frameworks/sproutcore/protocols/sample.js +0 -0
  685. data/spec/fixtures/real_world/frameworks/sproutcore/sc_resource.js +0 -6
  686. data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample1.js +0 -0
  687. data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample2.js +0 -0
  688. data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.js +0 -0
  689. data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.rhtml +0 -1
  690. data/spec/fixtures/real_world/frameworks/sproutcore/themes/standard_theme/README +0 -0
  691. data/spec/fixtures/real_world/frameworks/sproutcore/views/view.js +0 -1
  692. data/spec/fixtures/real_world/generators/sample_custom/Buildfile +0 -0
  693. data/spec/fixtures/real_world/generators/sample_custom/templates/{filename}.js +0 -1
  694. data/spec/fixtures/recursive_project/Buildfile +0 -8
  695. data/spec/fixtures/recursive_project/frameworks/sproutcore/frameworks/costello/PLACEHOLDER +0 -0
  696. data/spec/lib/builders/combine_spec.rb +0 -67
  697. data/spec/lib/builders/html_spec.rb +0 -577
  698. data/spec/lib/builders/javascript_spec.rb +0 -81
  699. data/spec/lib/builders/sass_spec.rb +0 -43
  700. data/spec/lib/builders/spec_helper.rb +0 -30
  701. data/spec/lib/builders/strings_spec.rb +0 -52
  702. data/spec/lib/builders/stylesheet_spec.rb +0 -63
  703. data/spec/lib/builders/test_index_spec.rb +0 -44
  704. data/spec/lib/builders/test_spec.rb +0 -135
  705. data/spec/lib/buildfile/config_for_spec.rb +0 -81
  706. data/spec/lib/buildfile/define_spec.rb +0 -59
  707. data/spec/lib/buildfile/dup_spec.rb +0 -65
  708. data/spec/lib/buildfile/invoke_spec.rb +0 -130
  709. data/spec/lib/buildfile/load_spec.rb +0 -49
  710. data/spec/lib/buildfile/task/dup_spec.rb +0 -55
  711. data/spec/lib/buildfile/task_defined_spec.rb +0 -17
  712. data/spec/lib/buildfile_commands/build_task_spec.rb +0 -19
  713. data/spec/lib/buildfile_commands/config_spec.rb +0 -97
  714. data/spec/lib/buildfile_commands/import_spec.rb +0 -17
  715. data/spec/lib/buildfile_commands/namespace_spec.rb +0 -18
  716. data/spec/lib/buildfile_commands/proxies_spec.rb +0 -38
  717. data/spec/lib/buildfile_commands/replace_task_spec.rb +0 -29
  718. data/spec/lib/buildfile_commands/task_spec.rb +0 -36
  719. data/spec/lib/helpers/packing_optimizer/optimize_spec.rb +0 -26
  720. data/spec/lib/models/hash_struct/deep_clone_spec.rb +0 -27
  721. data/spec/lib/models/hash_struct/has_options_spec.rb +0 -32
  722. data/spec/lib/models/hash_struct/hash_spec.rb +0 -64
  723. data/spec/lib/models/hash_struct/merge_spec.rb +0 -26
  724. data/spec/lib/models/hash_struct/method_missing.rb +0 -41
  725. data/spec/lib/models/manifest/add_entry_spec.rb +0 -36
  726. data/spec/lib/models/manifest/add_transform_spec.rb +0 -90
  727. data/spec/lib/models/manifest/build_spec.rb +0 -78
  728. data/spec/lib/models/manifest/entry_for_spec.rb +0 -94
  729. data/spec/lib/models/manifest/find_entry.rb +0 -84
  730. data/spec/lib/models/manifest/prepare_spec.rb +0 -62
  731. data/spec/lib/models/manifest_entry/cacheable_url_spec.rb +0 -31
  732. data/spec/lib/models/manifest_entry/prepare_spec.rb +0 -54
  733. data/spec/lib/models/project/add_target_spec.rb +0 -44
  734. data/spec/lib/models/project/buildfile_spec.rb +0 -35
  735. data/spec/lib/models/project/find_targets_for_spec.rb +0 -77
  736. data/spec/lib/models/project/load_nearest_project_spec.rb +0 -23
  737. data/spec/lib/models/project/target_for_spec.rb +0 -33
  738. data/spec/lib/models/project/targets_spec.rb +0 -62
  739. data/spec/lib/models/target/compute_build_number_spec.rb +0 -125
  740. data/spec/lib/models/target/config_spec.rb +0 -30
  741. data/spec/lib/models/target/expand_required_targets_spec.rb +0 -48
  742. data/spec/lib/models/target/installed_languages_spec.rb +0 -47
  743. data/spec/lib/models/target/lproj_for_spec.rb +0 -38
  744. data/spec/lib/models/target/manifest_for_spec.rb +0 -42
  745. data/spec/lib/models/target/parent_target_spec.rb +0 -21
  746. data/spec/lib/models/target/prepare_spec.rb +0 -53
  747. data/spec/lib/models/target/required_targets_spec.rb +0 -119
  748. data/spec/lib/models/target/target_for_spec.rb +0 -56
  749. data/spec/lib/tools/build_number_spec.rb +0 -28
  750. data/spec/lib/tools/gen_spec.rb +0 -207
  751. data/spec/lib/tools/tools_spec.rb +0 -78
  752. data/spec/spec_helper.rb +0 -138
  753. data/vendor/github_gem_lint.rb +0 -22
  754. data/vendor/yui-compressor/yuicompressor-2.4.2.jar +0 -0
@@ -13,7 +13,7 @@
13
13
  an editing context.
14
14
 
15
15
  In general you will not use this class, but you can use a subclass such
16
- as ObjectController, CollectionController, or ArrayController.
16
+ as ObjectController, TreeController, or ArrayController.
17
17
 
18
18
  h2. EDITING CONTEXTS
19
19
 
@@ -27,291 +27,19 @@
27
27
  provide this capability.
28
28
 
29
29
  @extends SC.Object
30
+ @since SproutCore 1.0
30
31
  */
31
32
  SC.Controller = SC.Object.extend(
32
33
  /** @scope SC.Controller.prototype */ {
33
34
 
34
35
  /**
35
- The controller will set this property to true whenever there are
36
- changes that need to be committed. This property is true whenever
37
- the controller itself has uncommitted changes or when any dependent
38
- editors have uncommitted changes. In your own subclass, call
39
- this.objectDidChange(this) to register changes.
36
+ Makes a controller editable or not editable. The SC.Controller class
37
+ itself does not do anything with this property but subclasses will
38
+ respect it when modifying content.
40
39
 
40
+ @property
41
41
  @type Boolean
42
42
  */
43
- hasChanges: NO,
44
-
45
- /**
46
- This is the controller's parent controller usually. The controller will
47
- notify this controller when its changes are committed or discarded.
48
-
49
- @type SC.Controller
50
- */
51
- context: null,
52
-
53
- /**
54
- If this is NO, then the controller will only commit changes when you
55
- explicitly call commitChanges. Otherwise it will commit them
56
- immediately. You usually want this set to NO. It is initially set to
57
- YES for compatibility.
58
-
59
- @type Boolean
60
- */
61
- commitChangesImmediately: YES,
62
-
63
- /**
64
- If the controller has uncommitted changes, call this method to
65
- commit them. This method will commit the changes for any dependent
66
- editors as well. This will return true if the commit completed and
67
- false or an error object if it failed.
68
- */
69
- commitChanges: function() {
70
- this._commitTimeout = null ; // clear timeout
71
- var ret = this._canCommitChanges() ;
72
- if (!$ok(ret)) return ret ;
73
- return this._performCommitChanges() ;
74
- },
75
-
76
- /**
77
- If this controller has uncommitted changes that you do not want to keep,
78
- call this method to discard them. This method will also discard
79
- changes for any dependent editors as well.
80
- */
81
- discardChanges: function() {
82
- var ret = this._canDiscardChanges() ;
83
- if (!$ok(ret)) return ret ;
84
- return this._performDiscardChanges() ;
85
- },
86
-
87
- /**
88
- This method will return an appropriate controller object for the
89
- value of the property you name. This will return one of:
90
-
91
- <table>
92
- <tr> <th>Value Type</th> <th>Returns</th> </tr>
93
- <tr> <td>Array-compatible</td> <td>SC.ArrayController</td></tr>
94
- <tr> <td>SC.Collection</td> <td>SC.CollectionController</td></tr>
95
- <tr> <td>Kind of SC.Object</td> <td>SC.ObjectController</td></tr>
96
- <tr> <td>other</td> <td>value</td></tr>
97
- </table>
98
-
99
- This is a helper method used by subclasses to create the appropriate
100
- type of controller.
101
- */
102
- controllerForValue: function(value) {
103
- var ret = null ;
104
- switch(SC.typeOf(value)) {
105
- case SC.T_OBJECT:
106
- if (value.kindOf(SC.Collection)) {
107
- ret = SC.CollectionController ;
108
- } else ret = SC.ObjectController ;
109
- break ;
110
- case SC.T_ARRAY:
111
- ret = SC.ArrayController ;
112
- break ;
113
- default:
114
- ret = null ;
115
- }
116
-
117
- return (ret) ? ret.create({ content: value, context: this }) : value ;
118
- },
119
-
120
- /**
121
- Call this method whenever you have uncommitted changes. This will
122
- handle notifying your parent context as well.
123
-
124
- @param {SC.Controller} editor
125
- This is the object that has uncommitted changes. Normally you should
126
- not pass a value. If you do pass an object, then that object will
127
- become a dependent editor of the receiver.
128
- */
129
- editorDidChange: function(editor) {
130
- if (!editor) editor = this ; // set default value
131
-
132
- // if this is another editor, add it to the list of editors that need
133
- // to be notified of a change.
134
- if (editor != this) {
135
- if (!this._dirtyEditors) this._dirtyEditors = SC.Set.create();
136
- this._dirtyEditors.add(editor) ;
137
- } else {
138
- this._hasLocalChanges = YES ;
139
- }
140
- if (!this.get('hasChanges')) {
141
- this.set('hasChanges', YES) ;
142
-
143
- // if we have a parent context notify them
144
- if (this.context) {
145
- this.context.editorDidChange(this) ;
146
-
147
- // otherwise, if commit changes immediately is true, schedule commit.
148
- // commit is only done once per cycle so that at least all the
149
- // changes you might make at one time will be batched.
150
- } else if (this.get('commitChangesImmediately')) {
151
- if (!this._commitTimeout) {
152
- this._commitTimeout = this.commitChanges.invokeLater(this);
153
- }
154
- }
155
- }
156
- },
157
-
158
- /**
159
- Call this method when your object no longer has uncommitted changes.
160
- This will clear your hasChanges property and notify your parent context.
161
- This is called automatically whenever changes are committed or discarded
162
- on your controller.
163
- */
164
- editorDidClearChanges: function(editor) {
165
- if (!editor) editor = this ; // set default value
166
-
167
- if (editor != this) {
168
- // if we are currently clearing changes, then we will clean up the
169
- // hasChanges state and dirtyeditors in bulk when this is all done.
170
- // so do nothing.
171
- if (this._clearingChanges) return ;
172
- if (this._dirtyEditors) this._dirtyEditors.remove(editor) ;
173
- } else {
174
- this._hasLocalChanges = NO ;
175
- }
176
-
177
- // _dirtyEditors may be undefined so use !! to force this to a bool value.
178
- var hasChanges = !!(this._hasLocalChanges || (this._dirtyEditors && this._dirtyEditors.length > 0)) ;
179
-
180
- if (this.get('hasChanges') != hasChanges) {
181
- this.set('hasChanges', hasChanges) ;
182
- if (this.context) this.context.editorDidClearChanges(editor) ;
183
- }
184
- },
185
-
186
- /**
187
- Override this method to determine if your controller can commit the
188
- changes. This should validate your changes. Return false or an error
189
- object if you cannot commit the change. This method will not be called
190
- unless hasChanges is true and all your dependent editors are return
191
- true as well.
192
- */
193
- canCommitChanges: function() {
194
- return YES ;
195
- },
196
-
197
- /**
198
- Override this method to actually commit the changes for your controller.
199
- This will only be called if all controllers indicate that they can
200
- commit. Return true if you succeeded or false or an error if you failed.
201
- */
202
- performCommitChanges: function() {
203
- return SC.$error('performCommitChanges is not implemented') ;
204
- },
205
-
206
- /**
207
- Override this method to determine if your controller can discard the
208
- changes it has built up. This method will not be called unless you
209
- have set hasChanges to true. Return false or an error object if you
210
- cannot discard the change.
211
- */
212
- canDiscardChanges: function() {
213
- return YES ;
214
- },
215
-
216
- /**
217
- Override this method to actually discard the changes for your controller.
218
- This will only be called if all controllers indicate that they can discard
219
- their changes. Return true if you succeed or false or an error if you
220
- failed.
221
- */
222
- performDiscardChanges: function() {
223
- return SC.$error('performDiscardChanges is not implemented');
224
- },
225
-
226
- // ....................................
227
- // PRIVATE
228
-
229
- /** @private */
230
- init: function() {
231
- sc_super() ;
232
- this._contextObserver() ;
233
- },
234
-
235
- /** @private */
236
- _contextObserver: function() {
237
- if (this.context) {
238
- // inherit the parent contexts inherit property
239
- this.commitChangesImmediately = this.context.commitChangesImmediately ;
240
- }
241
- }.observes('context'),
242
-
243
- /** @private */
244
- _canCommitChanges: function() {
245
- if (!this.get('hasChanges')) return NO ;
246
-
247
- // validate editors.
248
- var ret = YES ;
249
- if (this._dirtyEditors) {
250
- ret = this._dirtyEditors.invokeWhile(YES, '_canCommitChanges') ;
251
- if (!$ok(ret)) return ret ;
252
- }
253
-
254
- // then validate receiver
255
- return this.canCommitChanges() ;
256
- },
257
-
258
- /** @private */
259
- _performCommitChanges: function() {
260
- if (!this.get('hasChanges')) return true ;
261
-
262
- // first commit any editors. If not successful, return. otherwise,
263
- // clear editors.
264
- var ret = YES ;
265
- if (this._dirtyEditors) {
266
- this._clearingChanges = YES ;
267
- ret = this._dirtyEditors.invokeWhile(YES, '_performCommitChanges') ;
268
- this._clearingChanges = NO ;
269
-
270
- if ($ok(ret)) {
271
- this._dirtyEditors = null ;
272
- } else return ret ;
273
- }
274
-
275
- // now commit changes for the receiver.
276
- ret = this.performCommitChanges() ;
277
- if ($ok(ret)) this.editorDidClearChanges() ;
278
- return ret ;
279
- },
280
-
281
- /** @private */
282
- _canDiscardChanges: function() {
283
- if (!this.get('hasChanges')) return false ;
284
- // validate editors.
285
- var ret = YES ;
286
- if (this._dirtyEditors) {
287
- ret = this._dirtyEditors.invokeWhile(YES, '_canDiscardChanges') ;
288
- if (!$ok(ret)) return ret ;
289
- }
290
-
291
- // then validate receiver
292
- return this.canDiscardChanges() ;
293
- },
294
-
295
- /** @private */
296
- _performDiscardChanges: function() {
297
- if (!this.get('hasChanges')) return YES ;
298
-
299
- // first discard changes for any editors. If not successful, return.
300
- // otherwise, clear editors.
301
- var ret = YES ;
302
- if (this._dirtyEditors) {
303
- this._clearingChanges = YES ;
304
- ret = this._dirtyEditors.invokeWhile(YES, '_performDiscardChanges') ;
305
- this._clearingChanges = NO ;
306
- if ($ok(ret)) {
307
- this._dirtyEditors = null ;
308
- } else return ret ;
309
- }
310
-
311
- // now discard changes for the receiver.
312
- ret = this.performDiscardChanges() ;
313
- if ($ok(ret)) this.editorDidClearChanges() ;
314
- return ret ;
315
- }
43
+ isEditable: YES
316
44
 
317
45
  });
@@ -47,375 +47,277 @@ require('controllers/controller') ;
47
47
  instead of an array.
48
48
 
49
49
  @extends SC.Controller
50
+ @since SproutCore 1.0
50
51
  */
51
52
  SC.ObjectController = SC.Controller.extend(
52
53
  /** @scope SC.ObjectController.prototype */ {
53
-
54
- // ...............................
54
+
55
+ // ..........................................................
55
56
  // PROPERTIES
56
- //
57
+ //
57
58
 
58
59
  /**
59
- set this to some value and the object controller will project
60
- its properties.
60
+ Set to the object you want this controller to manage. The object should
61
+ usually be a single value; not an array or enumerable. If you do supply
62
+ an array or enumerable with a single item in it, the ObjectController
63
+ will manage that single item.
64
+
65
+ Usually your content object should implement the SC.Observable mixin, but
66
+ this is not required. All SC.Object-based objects support SC.Observable
67
+
68
+ @property
69
+ @type Object
61
70
  */
62
71
  content: null,
63
- contentBindingDefault: SC.Binding.multiple(),
64
72
 
65
73
  /**
66
- This will be set to true if the object currently does not have any
67
- content. You might use this to disable any controls attached to the
68
- controller.
74
+ If YES, then setting the content to an enumerable or an array with more
75
+ than one item will cause the Controller to attempt to treat the array as
76
+ a single object. Use of get(), for example, will get every property on
77
+ the enumerable and return it. set() will set the property on every item
78
+ in the enumerable.
79
+
80
+ If NO, then setting content to an enumerable with multiple items will be
81
+ treated like setting a null value. hasContent will be NO.
69
82
 
70
83
  @type Boolean
71
84
  */
72
- hasNoContent: true,
73
-
85
+ allowsMultipleContent: NO,
86
+
74
87
  /**
75
- This will be set to true if the content is a single object or an array
76
- with a single item. You can use this to disabled your UI.
88
+ Becomes YES whenever this object is managing content. Usually this means
89
+ the content property contains a single object or an array or enumerable
90
+ with a single item. Array's or enumerables with multiple items will
91
+ normally make this property NO unless allowsMultipleContent is YES.
77
92
 
93
+ @property
78
94
  @type Boolean
79
95
  */
80
- hasSingleContent: false,
96
+ hasContent: function() {
97
+ return !SC.none(this.get('observableContent'));
98
+ }.property('observableContent'),
81
99
 
82
100
  /**
83
- This will be set to true if the content is an array with multiple objects
84
- in it.
101
+ Makes a controller editable or not editable. The SC.Controller class
102
+ itself does not do anything with this property but subclasses will
103
+ respect it when modifying content.
85
104
 
105
+ @property
86
106
  @type Boolean
87
107
  */
88
- hasMultipleContent: false,
89
-
90
- /**
91
- Set to true if the controller has any content, even an empty array.
92
- */
93
- hasContent: function() {
94
- return this.get('content') ;
95
- }.property('content'),
96
-
108
+ isEditable: YES,
109
+
97
110
  /**
98
- Set this property to true and multiple content will be treated like a null
99
- value. This will only impact use of get() and set().
111
+ Primarily for internal use. Normally you should not access this property
112
+ directly.
100
113
 
101
- @type Boolean
114
+ Returns the actual observable object proxied by this controller. Usually
115
+ this property will mirror the content property. In some cases - notably
116
+ when setting content to an enumerable, this may return a different object.
117
+
118
+ Note that if you set the content to an enumerable which itself contains
119
+ enumerables and allowsMultipleContent is NO, this will become null.
120
+
121
+ @property
122
+ @type Object
102
123
  */
103
- allowsMultipleContent: true,
104
-
124
+ observableContent: function() {
125
+ var content = this.get('content'),
126
+ len, allowsMultiple;
127
+
128
+ // if enumerable, extract the first item or possibly become null
129
+ if (content && content.isEnumerable) {
130
+ len = content.get('length');
131
+ allowsMultiple = this.get('allowsMultipleContent');
132
+
133
+ if (len === 1) content = content.firstObject();
134
+ else if (len===0 || !allowsMultiple) content = null;
135
+
136
+ // if we got some new content, it better not be enum also...
137
+ if (content && !allowsMultiple && content.isEnumerable) content=null;
138
+ }
139
+
140
+ return content;
141
+ }.property('content', 'allowsMultipleContent').cacheable(),
142
+
143
+ // ..........................................................
144
+ // METHODS
145
+ //
146
+
105
147
  /**
106
- Override this method to destroy the selected object.
148
+ Override this method to destroy the selected object.
107
149
 
108
150
  The default just passes this call onto the content object if it supports
109
- it, and then sets the content to null.
151
+ it, and then sets the content to null.
152
+
153
+ Unlike most calls to destroy() this will not actually destroy the
154
+ controller itself; only the the content. You continue to use the
155
+ controller by setting the content to a new value.
156
+
157
+ @returns {SC.ObjectController} receiver
110
158
  */
111
159
  destroy: function() {
112
- var content = this.get('content') ;
113
- if (content && SC.typeOf(content.destroy) === SC.T_FUNCTION) content.destroy();
160
+ var content = this.get('observableContent') ;
161
+ if (content && SC.typeOf(content.destroy) === SC.T_FUNCTION) {
162
+ content.destroy();
163
+ }
114
164
  this.set('content', null) ;
165
+ return this;
115
166
  },
116
167
 
117
- // ...............................
118
- // INTERNAL SUPPORT
119
- //
120
-
121
168
  /**
122
- When this controller commits changes, it will copy its changed values
123
- to the content object and then call "commitChanges" on the content
124
- object if that object implements the method.
125
- */
126
- performCommitChanges: function() {
169
+ Invoked whenever any property on the content object changes.
170
+
171
+ The default implementation will simply notify any observers that the
172
+ property has changed. You can override this method if you need to do
173
+ some custom work when the content property changes.
127
174
 
128
- var content = this.get('content') ;
129
- var ret = true ;
130
- var key, loc;
175
+ If you have set the content property to an enumerable with multiple
176
+ objects and you set allowsMultipleContent to YES, this method will be
177
+ called anytime any property in the set changes.
131
178
 
132
- // empty arrays are treated like null values, arrays.len=1 treated like
133
- // single objects.
134
- var isArray = false ;
135
- if (SC.isArray(content)) {
136
- var len = this._lengthFor(content) ;
137
- if (len === 0) {
138
- content = null ;
139
- } else if (len === 1) {
140
- content = this._objectAt(0, content) ;
141
- } else if (this.get('allowsMultipleContent')) {
142
- isArray = true ;
143
- } else content = null ;
144
- }
179
+ If all properties have changed on the content or if the content itself
180
+ has changed, this method will be called with a key of "*".
145
181
 
146
- if (!this._changes) this._changes = {} ;
182
+ @param {Object} target the content object
183
+ @param {String} key the property that changes
184
+ @returns {void}
185
+ */
186
+ contentPropertyDidChange: function(target, key) {
187
+ if (key === '*') this.allPropertiesDidChange();
188
+ else this.notifyPropertyChange(key);
189
+ },
190
+
191
+ /**
192
+ Called whenver you try to get/set an unknown property. The default
193
+ implementation will pass through to the underlying content object but
194
+ you can override this method to do some other kind of processing if
195
+ needed.
196
+ */
197
+ unknownProperty: function(key,value) {
198
+
199
+ // avoid circular references
200
+ if (key==='content') {
201
+ if (value !== undefined) this.content = value;
202
+ return this.content;
203
+ }
147
204
 
148
- // cannot commit changes to empty content. Return an error.
149
- if (!content) {
150
- return SC.$error("No Content") ;
205
+ // for all other keys, just pass through to the observable object if
206
+ // there is one. Use getEach() and setEach() on enumerable objects.
207
+ var content = this.get('observableContent'), loc, cur, isSame;
208
+ if (content===null || content===undefined) return undefined; // empty
151
209
 
152
- // if content is an array, then loop through each item in the array and
153
- // get the changed values.
154
- } else if (isArray) {
155
-
156
- loc = this._lengthFor(content) ;
157
- while(--loc >= 0) {
158
- var object = this._objectAt(loc, content) ;
159
- if (!object) continue ;
160
-
161
- if (object.beginPropertyChanges) object.beginPropertyChanges();
162
-
163
- // loop through all the keys in changes and get the values...
164
- for(key in this._changes) {
165
- if (!this._changes.hasOwnProperty(key)) continue ;
166
- var value = this._changes[key];
167
-
168
- // if the value is an array, get the idx matching the content
169
- // object. Otherwise, just use the value of the item.
170
- if(SC.isArray(value)) {
171
- value = this._objectAt(loc, value) ;
210
+ // getter...
211
+ if (value === undefined) {
212
+ if (content.isEnumerable) {
213
+ value = content.getEach(key);
214
+
215
+ // iterate over array to see if all values are the same. if so, then
216
+ // just return that value
217
+ loc = value.get('length');
218
+ if (loc>0) {
219
+ isSame = YES;
220
+ cur = value.objectAt(0);
221
+ while((--loc > 0) && isSame) {
222
+ if (cur !== value.objectAt(loc)) isSame = NO ;
172
223
  }
173
-
174
- if (object.set) {
175
- object.set(key,value) ;
176
- } else object[key] = value ;
177
- }
224
+ if (isSame) value = cur;
225
+ } else value = undefined; // empty array.
178
226
 
179
- if (object.endPropertyChanges) object.endPropertyChanges() ;
180
- if (object.commitChanges) ret = object.commitChanges() ;
181
- }
227
+ } else value = (content.isObservable) ? content.get(key) : content[key];
182
228
 
183
- // if the content is not an array, then just loop through each changed
184
- // value and copy it to the object.
229
+ // setter
185
230
  } else {
186
-
187
- if (content.beginPropertyChanges) content.beginPropertyChanges() ;
188
-
189
- // save the set of changes to apply them. Nothing should clear it but
190
- // just in case.
191
- var changes = this._changes ;
192
- for(key in changes) {
193
- if (!changes.hasOwnProperty(key)) continue;
194
-
195
- var oldValue = content.get ? content.get(key) : content[key];
196
- var newValue = changes[key];
197
-
198
- if (SC.none(oldValue) && newValue === '') newValue = null;
199
- if (newValue != oldValue) {
200
- if (content.set) {
201
- content.set('isDirty', YES);
202
- } else {
203
- content.isDirty=YES;
204
- }
205
- }
206
-
207
- if (content.set) {
208
- content.set(key, newValue);
209
- } else {
210
- content[key] = newValue;
211
- }
231
+ if (!this.get('isEditable')) {
232
+ throw "%@.%@ is not editable".fmt(this,key);
212
233
  }
213
234
 
214
- if (content.endPropertyChanges) content.endPropertyChanges() ;
215
- if (content.commitChanges) ret = content.commitChanges() ;
216
- }
217
-
218
- // if commit was successful, dump changes hash and clear editor.
219
- if (SC.$ok(ret)) {
220
- this._changes = {} ;
221
- //this._valueControllers = {};
222
- this.editorDidClearChanges() ;
235
+ if (content.isEnumerable) content.setEach(key, value);
236
+ else if (content.isObservable) content.set(key, value);
237
+ else content[key] = value;
223
238
  }
224
239
 
225
- return ret ;
226
- },
227
-
228
- /** @private */
229
- performDiscardChanges: function() {
230
- this._changes = {};
231
- this._valueControllers = {};
232
- this.editorDidClearChanges();
233
- this.allPropertiesDidChange();
234
- return true ;
240
+ return value;
235
241
  },
236
242
 
237
- /** @private */
238
- unknownProperty: function(key,value)
239
- {
240
- if (key == "content")
241
- {
242
- // FOR CONTENT KEY:
243
- // avoid circular references. If you try to set content, just save the
244
- // value. The propertyObserver will be triggered below to do the rest of
245
- // the setup as needed.
246
- if (!(value === undefined)) this[key] = value;
247
- return this[key];
248
- }
249
- else
250
- {
251
- // FOR ALL OTHER KEYS:
252
- // Save the value in our temporary hash and note the changes in the
253
- // editor.
243
+ // ...............................
244
+ // INTERNAL SUPPORT
245
+ //
254
246
 
255
- if (!this._changes) this._changes = {} ;
256
- if (!this._valueControllers) this._valueControllers = {};
257
-
258
- if (value !== undefined)
259
- {
260
- // for changes, save in _changes hash and note that a change is required.
261
- this._changes[key] = value;
262
- if (this._valueControllers[key])
263
- {
264
- this._valueControllers[key] = null;
265
- }
266
- // notifying observers regarless if a controller had been created since they're lazy loaded
267
- this.propertyWillChange(key + "Controller");
268
- this.propertyDidChange(key + "Controller");
269
- this.editorDidChange();
270
- }
271
- else
272
- {
273
- // are we requesting the controller for a value?
274
- if (key.slice(key.length-10,key.length) == "Controller")
275
- {
276
- // the actual value...
277
- key = key.slice(0,-10);
278
- if ( !this._valueControllers[key] )
279
- {
280
- this._valueControllers[key] = this.controllerForValue(this._getValueForPropertyKey(key));
281
- }
282
- value = this._valueControllers[key];
283
- }
284
- else
285
- {
286
- // otherwise, get the value.
287
- // first check the _changes hash, then check the content object.
288
- value = this._getValueForPropertyKey(key);
289
- }
290
- }
291
- return value;
292
- }
247
+ /** @private - setup observer on init if needed. */
248
+ init: function() {
249
+ sc_super();
250
+ if (this.get('observableContent')) this._scoc_contentDidChange();
293
251
  },
294
-
295
- _getValueForPropertyKey: function( key )
296
- {
297
- // first check the changes hash for a uncommited value...
298
- var value = this._changes[key];
299
- // sweet, no need to proceed.
300
- if ( value !== undefined ) return value;
301
252
 
302
- // ok, we'll need to get the value from the content object
303
- var obj = this.get('content');
304
- // no content object... return null.
305
- if (!obj) return null;
253
+ /**
254
+ @private
255
+
256
+ Called whenever the observable content property changes. This will setup
257
+ observers on the content if needed.
258
+ */
259
+ _scoc_contentDidChange: function() {
260
+ var last = this._scoc_observableContent,
261
+ cur = this.get('observableContent'),
262
+ func = this.contentPropertyDidChange,
263
+ efunc= this._scoc_enumerableContentDidChange;
306
264
 
307
- if (SC.isArray(obj))
308
- {
309
- value = [];
310
- var len = this._lengthFor(obj);
311
- if (len > 1)
312
- {
313
- // if content is an array with more than one item, collect
314
- // content from array.
315
- if (this.get('allowsMultipleContent')) {
316
- for(var idx=0; idx < len; idx++) {
317
- var item = this._objectAt(idx, obj) ;
318
- value.push(item ? (item.get ? item.get(key) : item[key]) : null) ;
319
- }
320
- } else {
321
- value = null;
322
- }
323
- }
324
- else if (len == 1)
325
- {
326
- // if content is array with one item, collect from first obj.
327
- obj = this._objectAt(0,obj) ;
328
- value = obj.get ? obj.get(key) : obj[key] ;
329
- }
330
- else
331
- {
332
- // if content is empty array, act as if null.
333
- value = null;
334
- }
335
- }
336
- else
337
- {
338
- // content is a single item. Just get the property.
339
- value = obj.get ? obj.get(key) : obj[key] ;
265
+ if (last === cur) return this; // nothing to do
266
+
267
+ this._scoc_observableContent = cur; // save old content
268
+
269
+ // stop observing last item -- if enumerable stop observing set
270
+ if (last) {
271
+ if (last.isEnumerable) last.removeObserver('[]', this, efunc);
272
+ else if (last.isObservable) last.removeObserver('*', this, func);
340
273
  }
341
- return value;
342
- },
343
-
344
- _lastContentPropertyRevision: 0,
345
-
346
- /** @private */
347
- _contentDidChange: function(target,key,value,propertyRevision) {
348
274
 
349
- // handle changes to the content...
350
- if ((value = this.get('content')) != this._content) {
275
+ if (cur) {
276
+ if (cur.isEnumerable) cur.addObserver('[]', this, efunc);
277
+ else if (cur.isObservable) cur.addObserver('*', this, func);
278
+ }
351
279
 
352
- if (this.get('hasChanges')) {
353
- // if we have uncommitted changes, then discard the changes or raise
354
- // an exception.
355
- var er = this.discardChanges() ;
356
- if (!SC.$ok(er)) throw(er) ;
357
- } else {
358
- // no changes, but we want to ensure that we flush the cache
359
- // of any SC.Controllers we have for the content
360
- this._valueControllers = {} ;
361
- }
362
-
363
- // get the handler method
364
- var f = this._contentPropertyDidChange ;
365
-
366
- // stop listening to old content.
367
- if (this._content) {
368
- if (SC.isArray(this._content)) {
369
- this._content.invoke('removeObserver', '*', this, f) ;
370
- } else if (this._content.removeObserver) {
371
- this._content.removeObserver('*', this, f) ;
372
- }
373
- }
374
-
375
- // start listening for changes on the new content object.
376
- this._content = value ;
377
- if (value) {
378
- if (SC.isArray(value)) {
379
- value.invoke('addObserver', '*', this, f) ;
380
- } else if (value.addObserver) {
381
- value.addObserver('*', this, f) ;
382
- }
383
- }
280
+ // notify!
281
+ if ((last && last.isEnumerable) || (cur && cur.isEnumerable)) {
282
+ this._scoc_enumerableContentDidChange();
283
+ } else this.contentPropertyDidChange(cur, '*');
384
284
 
385
- // determine the content type.
386
- var count = !value ? 0 : (SC.isArray(value) ? this._lengthFor(value) : 1) ;
387
-
388
- // New content is configured, update controller stats
389
- this.beginPropertyChanges() ;
390
- this.set('hasNoContent',count === 0) ;
391
- this.set('hasSingleContent',count === 1) ;
392
- this.set('hasMultipleContent',count > 1) ;
393
-
394
- // notify everyone that everything is different now.
395
- this.allPropertiesDidChange() ;
396
- this.endPropertyChanges() ;
397
- }
398
- }.observes('content'),
285
+ }.observes("observableContent"),
399
286
 
400
- // invoked when properties on the content object change. Just forward
401
- // to controller.
402
- _contentPropertyDidChange: function(target,key,value, propertyRevision) {
403
- this._changeFromContent = true ;
404
- if (key === '*') {
405
- this.allPropertiesDidChange() ;
406
- } else {
407
- this.propertyWillChange(key) ;
408
- this.propertyDidChange(key,value) ;
287
+ /** @private
288
+ Called when observed enumerable content has changed. This will teardown
289
+ and setup observers on the enumerable content items and then calls
290
+ contentPropertyDidChange(). This method may be called even if the new
291
+ 'cur' is not enumerable but the last content was enumerable.
292
+ */
293
+ _scoc_enumerableContentDidChange: function() {
294
+ var cur = this.get('observableContent'),
295
+ set = this._scoc_observableContentItems,
296
+ func = this.contentPropertyDidChange;
297
+
298
+ // stop observing each old item
299
+ if (set) {
300
+ set.forEach(function(item) {
301
+ if (item.isObservable) item.removeObserver('*', this, func);
302
+ }, this);
303
+ set.clear();
409
304
  }
410
- this._changeFromContent = false ;
411
- },
412
-
413
- _lengthFor: function(obj) {
414
- return (obj.get ? obj.get('length') : obj.length) || 0;
415
- },
305
+
306
+ // start observing new items if needed
307
+ if (cur && cur.isEnumerable) {
308
+ if (!set) set = SC.Set.create();
309
+ cur.forEach(function(item) {
310
+ if (set.contains(item)) return ; // nothing to do
311
+ set.add(item);
312
+ if (item.isObservable) item.addObserver('*', this, func);
313
+ }, this);
314
+ } else set = null;
315
+
316
+ this._scoc_observableContentItems = set; // save for later cleanup
416
317
 
417
- _objectAt: function(idx, obj) {
418
- return obj.objectAt ? obj.objectAt(idx) : (obj.get ? obj.get(idx) : obj[idx]) ;
318
+ // notify
319
+ this.contentPropertyDidChange(cur, '*');
320
+ return this ;
419
321
  }
420
-
322
+
421
323
  }) ;