sproutit-sproutcore 1.0.0.20090416161445 → 1.0.0.20090720093355

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -18,7 +18,7 @@
18
18
  @since SproutCore 1.0
19
19
  */
20
20
 
21
- SC.RecordArray = SC.Object.extend(SC.Enumerable, SC.Array,
21
+ SC.RecordArray = SC.Object.extend(SC.Enumerable, SC.Array,
22
22
  /** @scope SC.RecordArray.prototype */ {
23
23
 
24
24
  /**
@@ -36,6 +36,35 @@ SC.RecordArray = SC.Object.extend(SC.Enumerable, SC.Array,
36
36
  @property {SC.Array}
37
37
  */
38
38
  storeKeys: null,
39
+
40
+ /**
41
+ SC.Query object that is set if record array is based on a query.
42
+ Whenever the store keys content change, the SC.Query will be
43
+ reapplied so that only matching storeKeys are set on the record
44
+ array.
45
+
46
+ @property {SC.Query}
47
+ */
48
+ queryKey: null,
49
+
50
+ /**
51
+ The current load state of the RecordArray. If the storeKeys has a state
52
+ property, then this property will return that value. Otherwise it returns
53
+ SC.Record.READY.
54
+ */
55
+ state: function() {
56
+ var storeKeys = this.get('storeKeys'),
57
+ ret = (storeKeys && !SC.none(storeKeys.state)) ? storeKeys.get('state') : null;
58
+ return ret ? ret : SC.Record.READY;
59
+ }.property().cacheable(),
60
+
61
+ /** @private
62
+ Cache of records returned from objectAt() so they don't need to
63
+ be unneccesarily materialized.
64
+
65
+ @property {SC.Query}
66
+ */
67
+ _records: null,
39
68
 
40
69
  // ..........................................................
41
70
  // ARRAY PRIMITIVES
@@ -52,6 +81,9 @@ SC.RecordArray = SC.Object.extend(SC.Enumerable, SC.Array,
52
81
  /**
53
82
  Looks up the store key in the store keys array and materializes a
54
83
  records.
84
+
85
+ @param {Number} idx index of the object
86
+ @return {SC.Record} materialized record
55
87
  */
56
88
  objectAt: function(idx) {
57
89
  var recs = this._records,
@@ -65,8 +97,8 @@ SC.RecordArray = SC.Object.extend(SC.Enumerable, SC.Array,
65
97
  // not in cache, materialize
66
98
  if (!recs) this._records = recs = [] ; // create cache
67
99
  storeKey = storeKeys.objectAt(idx);
100
+
68
101
  if (storeKey) {
69
-
70
102
  // if record is not loaded already, then ask the data source to
71
103
  // retrieve it
72
104
  if (store.readStatus(storeKey) === SC.Record.EMPTY) {
@@ -80,6 +112,11 @@ SC.RecordArray = SC.Object.extend(SC.Enumerable, SC.Array,
80
112
  /**
81
113
  Pass through to the underlying array. The passed in objects must be
82
114
  records, which can be converted to storeKeys.
115
+
116
+ @param {Number} idx start index
117
+ @param {Number} amt end index
118
+ @param {SC.RecordArray} recs to replace with records
119
+ @return {SC.RecordArray} 'this' after replace
83
120
  */
84
121
  replace: function(idx, amt, recs) {
85
122
  var storeKeys = this.get('storeKeys'),
@@ -97,6 +134,87 @@ SC.RecordArray = SC.Object.extend(SC.Enumerable, SC.Array,
97
134
  return this;
98
135
  },
99
136
 
137
+ /**
138
+ Called to refresh the query that is attached to this record array.
139
+ This will force the query to evaluated again against the store.
140
+ */
141
+ refreshQuery: function() {
142
+ var query = this.get('queryKey');
143
+
144
+ if(query) {
145
+ var recordType = query.get('recordType');
146
+ var storeKeys = this.get('store').storeKeysFor(recordType);
147
+
148
+ var recordTypes = SC.Set.create();
149
+ recordTypes.push(recordType);
150
+
151
+ // clear existing storeKeys, start over by applying all storekeys for
152
+ // this recordType
153
+ this.storeKeys = [];
154
+ this.applyQuery(storeKeys, recordTypes);
155
+ }
156
+
157
+ },
158
+
159
+ /**
160
+ Apply the SC.Query again. This is invoked when new records are loaded
161
+ or changed in the store (or directly on the array with .replace() ) and
162
+ and when we need to refresh all SC.Query 'based' record arrays accordingly.
163
+
164
+ @param {Array} storeKeys to evaluate against the query
165
+ @param {SC.Set} recordTypes set of record types that changed
166
+ @param {Boolean} notify to send length notifyPropertyChange()
167
+ */
168
+ applyQuery: function(changedStoreKeys, recordTypes, notify) {
169
+ var newStoreKeys = this.get('storeKeys'), inChangedStoreKeys,
170
+ inMatchingStoreKeys, idx, len, storeKey, queryKey = this.get('queryKey'),
171
+ store = this.get('store');
172
+
173
+ // first check if these changes include any of the record types
174
+ if(recordTypes && queryKey.recordType && !recordTypes.contains(queryKey.recordType)) return;
175
+
176
+ var matchingStoreKeys = SC.Query.containsStoreKeys(queryKey,
177
+ changedStoreKeys, store);
178
+
179
+ // Will iterate through all changed store keys and make sure they:
180
+ // 1. Are added if they are new AND match the query
181
+ // 2. Are removed if they exist and do NOT match the query
182
+ for(idx=0,len=changedStoreKeys.length;idx<len;idx++) {
183
+ storeKey = changedStoreKeys[idx];
184
+ inMatchingStoreKeys = (matchingStoreKeys &&
185
+ matchingStoreKeys.indexOf(storeKey)!==-1) ? YES: NO;
186
+ var inRecArray = this.storeKeys.indexOf(storeKey)!==-1 ? YES : NO;
187
+
188
+ if(inMatchingStoreKeys && !inRecArray) {
189
+ newStoreKeys.push(storeKey);
190
+ }
191
+ else if(!inMatchingStoreKeys && inRecArray) {
192
+ newStoreKeys.removeObject(storeKey);
193
+ }
194
+
195
+ }
196
+
197
+ SC.Query.orderStoreKeys(newStoreKeys, queryKey, store);
198
+ // clear cache
199
+ this._records = null;
200
+
201
+ this.storeKeys = newStoreKeys.addObserver('[]', this, this._storeKeysContentDidChange);
202
+ if(notify) this.notifyPropertyChange('length');
203
+ },
204
+
205
+ /**
206
+ Will call findAll() on the store, which allows for chaining findAll
207
+ statements. Note that chaining findAll() will not notify the data
208
+ source (only the initial findAll will).
209
+
210
+ @param {SC.Query} queryKey a SC.Query object
211
+ @returns {SC.RecordArray}
212
+ */
213
+
214
+ findAll: function(queryKey) {
215
+ return this.get('store').findAll(queryKey, null, this);
216
+ },
217
+
100
218
  // ..........................................................
101
219
  // INTERNAL SUPPORT
102
220
  //
@@ -105,19 +223,25 @@ SC.RecordArray = SC.Object.extend(SC.Enumerable, SC.Array,
105
223
  Invoked whenever the storeKeys array changes. Observes changes.
106
224
  */
107
225
  _storeKeysDidChange: function() {
226
+
108
227
  var storeKeys = this.get('storeKeys');
109
- var prev = this._prevStoreKeys, f = this._storeKeysContentDidChange;
110
-
228
+
229
+ var prev = this._prevStoreKeys,
230
+ f = this._storeKeysContentDidChange,
231
+ fs = this._storeKeysStateDidChange;
232
+
111
233
  if (storeKeys === prev) return this; // nothing to do
112
234
 
113
235
  if (prev) {
114
236
  prev.removeObserver('[]', this, f);
237
+ prev.removeObserver('state', this, fs);
115
238
  }
116
239
 
117
240
  this._prevStoreKeys = storeKeys;
118
-
241
+
119
242
  if (storeKeys) {
120
243
  storeKeys.addObserver('[]', this, f);
244
+ storeKeys.addObserver('state', this, fs);
121
245
  }
122
246
 
123
247
  var rev = (storeKeys) ? storeKeys.propertyRevision : -1 ;
@@ -125,6 +249,13 @@ SC.RecordArray = SC.Object.extend(SC.Enumerable, SC.Array,
125
249
 
126
250
  }.observes('storeKeys'),
127
251
 
252
+ /** @private
253
+ Invoked whenever the state property of the storeKeys change.
254
+ */
255
+ _storeKeysStateDidChange: function() {
256
+ this.notifyPropertyChange('state');
257
+ },
258
+
128
259
  /** @private
129
260
  Invoked whenever the content of the storeKeys array changes. This will
130
261
  dump any cached record lookup and then notify that the enumerable content
@@ -132,6 +263,13 @@ SC.RecordArray = SC.Object.extend(SC.Enumerable, SC.Array,
132
263
  */
133
264
  _storeKeysContentDidChange: function(target, key, value, rev) {
134
265
  this._records = null ; // clear cache
266
+ // if this record array is based on a queryKey reapply the
267
+ // the query before setting the storeKeys to ensure it always conforms
268
+
269
+ if(SC.instanceOf(this.queryKey, SC.Query)) {
270
+ this.storeKeys = SC.Query.containsStoreKeys(this.queryKey, value, this.store);
271
+ this.notifyPropertyChange('length');
272
+ }
135
273
 
136
274
  this.beginPropertyChanges()
137
275
  .notifyPropertyChange('length')
@@ -48,6 +48,11 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
48
48
  */
49
49
  isNested: NO,
50
50
 
51
+ /**
52
+ This type of store is not nested.
53
+ */
54
+ commitRecordsAutomatically: NO,
55
+
51
56
  // ..........................................................
52
57
  // DATA SOURCE SUPPORT
53
58
  //
@@ -56,6 +61,11 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
56
61
  Convenience method. Sets the current data source to the passed property.
57
62
  This will also set the store property on the dataSource to the receiver.
58
63
 
64
+ If you are using this from the core.js method of your app, you may need to
65
+ just pass a string naming your data source class. If this is the case,
66
+ then your data source will be instantiated the first time it is requested.
67
+
68
+ @param {SC.DataSource|String} dataSource the data source
59
69
  @returns {SC.Store} receiver
60
70
  */
61
71
  from: function(dataSource) {
@@ -63,6 +73,17 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
63
73
  return this ;
64
74
  },
65
75
 
76
+ // lazily convert data source to real object
77
+ _getDataSource: function() {
78
+ var ret = this.get('dataSource');
79
+ if (typeof ret === SC.T_STRING) {
80
+ ret = SC.objectForPropertyPath(ret);
81
+ if (ret) ret = ret.create();
82
+ if (ret) this.set('dataSource', ret);
83
+ }
84
+ return ret;
85
+ },
86
+
66
87
  /**
67
88
  Convenience method. Creates a CascadeDataSource with the passed
68
89
  data source arguments and sets the CascadeDataSource as the data source
@@ -95,12 +116,17 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
95
116
  store.commitChanges().destroy();
96
117
  }}}
97
118
 
119
+ @param {Hash} attrs optional attributes to set on new store
98
120
  @returns {SC.NestedStore} new nested store chained to receiver
99
121
  */
100
- chain: function() {
101
- var ret = SC.NestedStore.create({ parentStore: this }) ;
102
- var nested = this.nestedStores;
103
- if (!nested) nested =this.nestedStores = [];
122
+ chain: function(attrs) {
123
+ if (!attrs) attrs = {};
124
+ attrs.parentStore = this;
125
+
126
+ var ret = SC.NestedStore.create(attrs),
127
+ nested = this.nestedStores;
128
+
129
+ if (!nested) nested = this.nestedStores = [];
104
130
  nested.push(ret);
105
131
  return ret ;
106
132
  },
@@ -119,6 +145,18 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
119
145
  return this ;
120
146
  },
121
147
 
148
+ /**
149
+ Used to determine if a nested store belongs directly or indirectly to the
150
+ receiver.
151
+
152
+ @param {SC.Store} store store instance
153
+ @returns {Boolean} YES if belongs
154
+ */
155
+ hasNestedStore: function(store) {
156
+ while(store && (store !== this)) store = store.get('parentStore');
157
+ return store === this ;
158
+ },
159
+
122
160
  // ..........................................................
123
161
  // SHARED DATA STRUCTURES
124
162
  //
@@ -159,6 +197,20 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
159
197
  */
160
198
  revisions: null,
161
199
 
200
+ /** @private
201
+ Stores three sets of record property changes (storeKeys, statuses
202
+ and recordTypes) which is used when _notifyRecordPropertyChange is
203
+ called. Makes it possible to only execute once at the end of
204
+ the runloop.
205
+
206
+ @property {Hash}
207
+ */
208
+ recordPropertyChanges: {
209
+ storeKeys: [],
210
+ records: [],
211
+ statusOnly: []
212
+ },
213
+
162
214
  /**
163
215
  Array indicates whether a data hash is possibly in use by an external
164
216
  record for editing. If a data hash is editable then it may be modified
@@ -181,6 +233,15 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
181
233
  */
182
234
  changelog: null,
183
235
 
236
+ /**
237
+ A set of SC.RecordArray that have been returned from findAll with an
238
+ SC.Query. These will all be notified with _notifyRecordArraysWithQuery()
239
+ whenever the store changes.
240
+
241
+ @property {Array}
242
+ */
243
+ recordArraysWithQuery: null,
244
+
184
245
  // ..........................................................
185
246
  // CORE ATTRIBUTE API
186
247
  //
@@ -316,6 +377,10 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
316
377
 
317
378
  /**
318
379
  Writes the current status for a storeKey.
380
+
381
+ @param {Number} storeKey the store key
382
+ @param {String} newStatus the new status
383
+ @returns {SC.Store} receiver
319
384
  */
320
385
  writeStatus: function(storeKey, newStatus) {
321
386
  // use writeDataHash for now to handle optimistic lock. maximize code
@@ -350,41 +415,122 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
350
415
  storeKey = storeKeys;
351
416
  }
352
417
 
418
+ SC.RunLoop.begin();
353
419
  for(idx=0;idx<len;idx++) {
354
420
  if (isArray) storeKey = storeKeys[idx];
355
421
  this.revisions[storeKey] = rev;
356
422
  this._notifyRecordPropertyChange(storeKey, statusOnly);
357
423
  }
358
424
 
425
+ SC.RunLoop.end();
426
+
359
427
  return this ;
360
428
  },
361
429
 
362
- /**
363
- Will notify any record instances of the property change at the end of
364
- the run loop. Also notifies any inherited record instances as well.
430
+ /** @private
431
+ Will push all changes to a the recordPropertyChanges property
432
+ and execute flushRecordChanges() once at the end of the runloop.
365
433
  */
366
434
  _notifyRecordPropertyChange: function(storeKey, statusOnly) {
367
-
368
- var records = this.records, rec ;
369
435
 
370
- // schedule
371
- if (records && (rec=records[storeKey])) {
372
- rec.storeDidChangeProperties(statusOnly);
373
- }
374
-
436
+ var records = this.records, rec, editState;
437
+
375
438
  // pass along to nested stores
376
- var nestedStores = this.get('nestedStores'), len, idx, store;
439
+ var nestedStores = this.get('nestedStores'), len, idx, store, status;
377
440
  var K = SC.Store;
378
441
  len = nestedStores ? nestedStores.length : 0 ;
379
442
  for(idx=0;idx<len;idx++) {
380
443
  store = nestedStores[idx];
381
- if (store.storeKeyEditState(storeKey) === K.INHERITED) {
444
+ status = store.readStatus(storeKey);
445
+ editState = store.storeKeyEditState(storeKey);
446
+
447
+ // when store needs to propagate out changes in the parent store
448
+ // to nested stores
449
+ if(editState!==K.INHERITED && (status & SC.Record.BUSY)) {
450
+ // make sure nested store does not have any changes before resetting
451
+ if(store.get('hasChanges')) throw K.CHAIN_CONFLICT_ERROR;
452
+ store.reset();
453
+ }
454
+
455
+ if(store.storeKeyEditState(storeKey) === K.INHERITED) {
382
456
  store._notifyRecordPropertyChange(storeKey, statusOnly);
383
457
  }
384
458
  }
459
+
460
+ // schedule
461
+ this.recordPropertyChanges.storeKeys.push(storeKey);
462
+
463
+ if (records && (rec=records[storeKey])) {
464
+ this.recordPropertyChanges.records.push(storeKey);
465
+ if(statusOnly) {
466
+ this.recordPropertyChanges.statusOnly.push(storeKey);
467
+ }
468
+ }
469
+
470
+ this._flushRecordChanges();
471
+
385
472
  return this;
386
473
  },
387
474
 
475
+ /** @private
476
+ Will notify any record instances of the property change at the end of
477
+ the run loop. Also notifies any inherited record instances as well.
478
+
479
+ Will also notify any record arrays with queries to refresh based on
480
+ the new/changed store keys.
481
+ */
482
+
483
+ _flushRecordChanges: function() {
484
+ var storeKeys = this.recordPropertyChanges.storeKeys,
485
+ statusOnly = this.recordPropertyChanges.statusOnly,
486
+ records = this.recordPropertyChanges.records, rec,
487
+ recordType, recordTypes = SC.Set.create(), status, idx, len, storeKey;
488
+
489
+ for(idx=0,len=storeKeys.length;idx<len;idx++) {
490
+ storeKey = storeKeys[idx];
491
+
492
+ if(records.indexOf(storeKey)!==-1) {
493
+ status = statusOnly.indexOf(storeKey)!==-1 ? YES: NO;
494
+ rec = this.records[storeKey];
495
+ rec.storeDidChangeProperties(status);
496
+ // remove it so we don't trigger this twice
497
+ records.removeObject(storeKey);
498
+ }
499
+
500
+ recordType = SC.Store.recordTypeFor(storeKey);
501
+ if(!recordTypes.contains(recordType)) {
502
+ recordTypes.push(recordType);
503
+ }
504
+
505
+ }
506
+
507
+ this._notifyRecordArraysWithQuery(storeKeys, recordTypes);
508
+
509
+ // reset for next run loop
510
+ this.recordPropertyChanges.storeKeys = [];
511
+ this.recordPropertyChanges.records = [];
512
+ this.recordPropertyChanges.statusOnly = [];
513
+ },
514
+
515
+ /** @private
516
+ Will ask all record arrays that have been returned from findAll
517
+ with an SC.Query to reapply their query with the new storeKeys
518
+
519
+ @param {SC.IndexSet} storeKeys set of storeKeys that changed
520
+ @param {SC.Set} recordTypes
521
+ */
522
+
523
+ _notifyRecordArraysWithQuery: function(storeKeys, recordTypes) {
524
+ var recordArrays = this.recordArraysWithQuery;
525
+ if(!recordArrays) return;
526
+
527
+ for(var idx=0, len=recordArrays.length;idx<len;idx++) {
528
+ var recArray = recordArrays[idx];
529
+ // if this record array still exists, reapply the query
530
+ if(recArray) recArray.applyQuery(storeKeys, recordTypes, YES);
531
+ }
532
+ },
533
+
388
534
  /**
389
535
  Resets the store content. This will clear all internal data for all
390
536
  records, resetting them to an EMPTY state. You generally do not want
@@ -405,13 +551,15 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
405
551
 
406
552
  var records = this.records, storeKey;
407
553
  if (records) {
554
+ SC.RunLoop.begin();
408
555
  for(storeKey in records) {
409
556
  if (!records.hasOwnProperty(storeKey)) continue ;
410
557
  this._notifyRecordPropertyChange(storeKey, NO);
411
558
  }
559
+ SC.RunLoop.end();
412
560
  }
413
561
 
414
- this.set('hasChanges', NO);
562
+ this.set('hasChanges', NO);
415
563
  },
416
564
 
417
565
  /** @private
@@ -430,49 +578,49 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
430
578
  @param {Boolean} force
431
579
  @returns {SC.Store} receiver
432
580
  */
433
- commitChangesFromNestedStore: function(nestedStore, changes, force)
434
- {
581
+ commitChangesFromNestedStore: function(nestedStore, changes, force) {
435
582
  // first, check for optimistic locking problems
436
583
  if (!force) this._verifyLockRevisions(changes, nestedStore.locks);
437
584
 
438
585
  // OK, no locking issues. So let's just copy them changes.
439
586
  // get local reference to values.
440
- var len = changes.length, i, storeKey ;
441
- var my_dataHashes, my_statuses, my_editables, my_revisions;
442
- var ch_dataHashes, ch_statuses, ch_revisions;
587
+ var len = changes.length, i, storeKey, myDataHashes, myStatuses,
588
+ myEditables, myRevisions, chDataHashes, chStatuses, chRevisions;
589
+
590
+ myRevisions = this.revisions ;
591
+ myDataHashes = this.dataHashes;
592
+ myStatuses = this.statuses;
593
+ myEditables = this.editables ;
443
594
 
444
- my_revisions = this.revisions ;
445
- my_dataHashes = this.dataHashes;
446
- my_statuses = this.statuses;
447
- my_editables = this.editables ;
448
-
449
595
  // setup some arrays if needed
450
- if (!my_editables) my_editables = this.editables = [] ;
596
+ if (!myEditables) myEditables = this.editables = [] ;
451
597
 
452
- ch_dataHashes = nestedStore.dataHashes;
453
- ch_revisions = nestedStore.revisions ;
454
- ch_statuses = nestedStore.statuses;
598
+ chDataHashes = nestedStore.dataHashes;
599
+ chRevisions = nestedStore.revisions ;
600
+ chStatuses = nestedStore.statuses;
455
601
 
602
+ SC.RunLoop.begin();
456
603
  for(i=0;i<len;i++) {
457
604
  storeKey = changes[i];
458
605
 
459
606
  // now copy changes
460
- my_dataHashes[storeKey] = ch_dataHashes[storeKey];
461
- my_statuses[storeKey] = ch_statuses[storeKey];
462
- my_revisions[storeKey] = ch_revisions[storeKey];
607
+ myDataHashes[storeKey] = chDataHashes[storeKey];
608
+ myStatuses[storeKey] = chStatuses[storeKey];
609
+ myRevisions[storeKey] = chRevisions[storeKey];
463
610
 
464
- my_editables[storeKey] = 0 ; // always make dataHash no longer editable
611
+ myEditables[storeKey] = 0 ; // always make dataHash no longer editable
465
612
 
466
613
  this._notifyRecordPropertyChange(storeKey, NO);
467
614
  }
468
-
615
+ SC.RunLoop.end();
616
+
469
617
  // add any records to the changelog for commit handling
470
- var my_changelog = this.changelog, ch_changelog = nestedStore.changelog;
471
- if (ch_changelog) {
472
- if (!my_changelog) my_changelog = this.changelog = SC.Set.create();
473
- my_changelog.addEach(ch_changelog);
618
+ var myChangelog = this.changelog, chChangelog = nestedStore.changelog;
619
+ if (chChangelog) {
620
+ if (!myChangelog) myChangelog = this.changelog = SC.Set.create();
621
+ myChangelog.addEach(chChangelog);
474
622
  }
475
- this.changelog=my_changelog;
623
+ this.changelog = myChangelog;
476
624
 
477
625
  return this ;
478
626
  },
@@ -507,7 +655,6 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
507
655
  // HIGH-LEVEL RECORD API
508
656
  //
509
657
 
510
-
511
658
  /**
512
659
  Finds a record instance with the specified recordType and id, returning
513
660
  the record instance. If no matching record could be found, asks the
@@ -515,21 +662,40 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
515
662
  the record, returns null.
516
663
 
517
664
  Note that if you try to find a record id that does not exist in memory,
518
- a dataSource may load it from ths server. In this case, this method will
665
+ a dataSource may load it from the server. In this case, this method will
519
666
  return a record instance with a status of SC.Record.BUSY_LOADING to indicate
520
667
  that it is still fetching the data from the server.
521
668
 
522
- @param {SC.Record} recordType the expected record type
669
+ You can also pass YES to the isRefresh parameter which will make sure to
670
+ always go back to the data source so that you can go back to refresh the
671
+ record that is currently in the store. In that case, the record will
672
+ get the SC.Record.BUSY_REFRESH status until server has responded and
673
+ store is refreshed.
674
+
675
+ @param {SC.Record|String} recordType the expected record type
523
676
  @param {String} id the id to load
677
+ @param {Boolean} isRefresh
524
678
  @returns {SC.Record} record instance or null
525
679
  */
526
- find: function(recordType, id) {
680
+ find: function(recordType, id, isRefresh) {
681
+ // if recordType is passed as string, find object
682
+ if(SC.typeOf(recordType)===SC.T_STRING) {
683
+ recordType = SC.objectForPropertyPath(recordType);
684
+ }
685
+
527
686
  // first attempt to find the record in the local store
528
687
  var storeKey = recordType.storeKeyFor(id);
688
+
529
689
  if (this.readStatus(storeKey) === SC.Record.EMPTY) {
530
690
  storeKey = this.retrieveRecord(recordType, id);
531
691
  }
532
692
 
693
+ // also make sure to reach to the data source to actually
694
+ // retrieveRecord if isRefresh is YES, even if it already exists in store
695
+ if(isRefresh) {
696
+ this.retrieveRecord(recordType, id, null, isRefresh);
697
+ }
698
+
533
699
  // now we have the storeKey, materialize the record and return it.
534
700
  return storeKey ? this.materializeRecord(storeKey) : null ;
535
701
  },
@@ -545,43 +711,94 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
545
711
 
546
712
  h2. Query Keys
547
713
 
548
- The kind of query key you pass is generally determined by the type of
549
- persistent stores you hook up for your application. Most stores, however,
550
- will accept an SC.Record subclass as the query key. This will return
714
+ The kind of fetchKey you pass is generally determined by the type of
715
+ persistent stores you hook up for your application. Most stores, however,
716
+ will accept an SC.Record subclass as the fetchKey. It is up to your data source
717
+ to figure out which storeKeys to return based on the fetchKey. This will return
551
718
  a RecordArray matching all instances of that class as is relevant to your
552
- application.
719
+ application, for instance: findAll(MyApp.MyModel)
720
+
721
+ You can also pass an SC.Query object as your fetchKey, for instance:
722
+ var q = SC.Query.create({ recordType: MyApp.MyModel,
723
+ conditions: "firstName = 'John'", orderBy: "lastName ASC"});
724
+ var records = MyApp.store.findAll(q);
725
+
726
+ If an SC.Query is given as fetchKey, the record array created in
727
+ findAll() will automatically update when records are added, changed,
728
+ or removed from the store. When a fetchKey is given, you do not have to
729
+ return anything from the data source as you are from then on delegating
730
+ the responsibility to keep the record array updated to the store.
553
731
 
554
732
  Once you retrieve a RecordArray, you can filter the results even further
555
733
  by using the filter() method, which may issue even more specific requests.
556
734
 
557
- @param {Object} queryKey key describing the type of records to fetch
558
- @param {Hash} params optional additional parameters to pass along
559
- @param {SC.Store} _store this is a private param. Do not pass
735
+ @param {Object|SC.Query} fetchKey key describing the type of records to
736
+ fetch or a predefined SC.Query object
737
+ @param {Hash} params optional additional parameters to pass along to the
738
+ data source
739
+ @param {SC.RecordArray} recordArray optional if you want to find just
740
+ within a given record array
560
741
  @returns {SC.RecordArray} matching set or null if no server handled it
561
742
  */
562
- findAll: function(queryKey, params, _store) {
563
- if (!_store) _store = this;
564
-
565
- var source = this.get('dataSource'), ret, storeKeys, cacheKey ;
566
- if (source) {
567
-
568
- // ask the dataSource to provide a storeKey array
569
- storeKeys = source.fetchRecords.call(source, this, queryKey, params);
570
- if (storeKeys) {
571
-
572
- // if an array was provided, see if a wrapper already exists for
573
- // this store. Otherwise create it
574
- cacheKey = SC.keyFor('__records__', SC.guidFor(storeKeys));
575
- ret = this[cacheKey];
576
- if (!ret) {
577
- ret = SC.RecordArray.create({store: _store, storeKeys: storeKeys});
578
- this[cacheKey] = ret ; // save for future reuse.
579
- }
743
+ findAll: function(fetchKey, params, recordArray) {
744
+ var _store = this, source = this._getDataSource(), ret = [], storeKeys,
745
+ sourceRet, cacheKey;
746
+
747
+ if(recordArray) {
748
+ // giving a recordArray will circumvent the data source
749
+ // typically happens when chaining findAll statements
750
+ storeKeys = SC.Query.containsRecords(fetchKey, recordArray, _store);
751
+ }
752
+ else if (source) {
753
+ // call fetch() on the data source.
754
+ sourceRet = source.fetch.call(source, this, fetchKey, params);
755
+ if(SC.typeOf(sourceRet)===SC.T_ARRAY) {
756
+ storeKeys = sourceRet;
580
757
  }
581
758
  }
759
+
760
+ // if SC.Query returned from data source or no data source was given
761
+ if(!storeKeys && SC.instanceOf(fetchKey, SC.Query)) {
762
+ storeKeys = SC.Query.containsStoreKeys(fetchKey, null, _store);
763
+ }
764
+
765
+ ret = this.recordArrayFromStoreKeys(storeKeys, fetchKey, _store);
582
766
  return ret ;
583
767
  },
584
-
768
+
769
+ /**
770
+ Creates a record array based on passed storeKeys. Will return
771
+ cache if records are already cached, if not store them for reuse.
772
+
773
+ @param {Array} storeKeys added to returned record array
774
+ @param {Object|SC.Query} fetchKey
775
+ @param {SC.Store} _store
776
+ @returns {SC.RecordArray} matching set or null if no server handled it
777
+ */
778
+
779
+ recordArrayFromStoreKeys: function(storeKeys, fetchKey, _store) {
780
+ var ret, isQuery = SC.instanceOf(fetchKey, SC.Query), cacheKey, queryKey;
781
+
782
+ // if an array was provided, see if a wrapper already exists for
783
+ // this store. Otherwise create it
784
+ cacheKey = SC.keyFor('__records__', [SC.guidFor(storeKeys), SC.guidFor(fetchKey)].join('_'));
785
+ ret = this[cacheKey];
786
+ if (!ret) {
787
+ if(isQuery) queryKey = fetchKey;
788
+ ret = SC.RecordArray.create({store: _store, storeKeys: storeKeys, queryKey: queryKey});
789
+
790
+ // store reference to record array if SC.Query so we can notify it
791
+ // when store changes
792
+ if(isQuery) {
793
+ if (!this.recordArraysWithQuery) this.recordArraysWithQuery = [];
794
+ this.recordArraysWithQuery.push(ret);
795
+ }
796
+
797
+ this[cacheKey] = ret ; // save for future reuse.
798
+ }
799
+ return ret;
800
+ },
801
+
585
802
  /**
586
803
  Array of all records currently in the store with the specified
587
804
  type. This method only reflects the actual records loaded into memory and
@@ -592,16 +809,15 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
592
809
  @returns {SC.Array} array instance - usually SC.RecordArray
593
810
  */
594
811
  recordsFor: function(recordType) {
595
- var storeKeys = [], storeKeysById = recordType.prototype.storeKeysById;
596
- var id, storeKey, ret;
812
+ var storeKeys = [],
813
+ storeKeysById = recordType.storeKeysById(),
814
+ id, storeKey, ret;
597
815
 
598
816
  // collect all non-empty store keys
599
- if (storeKeysById) {
600
- for(id in storeKeysById) {
601
- storeKey = storeKeysById[id]; // get the storeKey
602
- if (this.readStatus(storeKey) !== SC.RECORD_EMPTY) {
603
- storeKeys.push(storeKey);
604
- }
817
+ for(id in storeKeysById) {
818
+ storeKey = storeKeysById[id]; // get the storeKey
819
+ if (this.readStatus(storeKey) !== SC.RECORD_EMPTY) {
820
+ storeKeys.push(storeKey);
605
821
  }
606
822
  }
607
823
 
@@ -667,18 +883,24 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
667
883
  @returns {SC.Record} Returns the created record
668
884
  */
669
885
  createRecord: function(recordType, dataHash, id) {
670
-
671
- var primaryKey, storeKey, status, K = SC.Record, changelog;
886
+
887
+ var primaryKey, storeKey, status, K = SC.Record, changelog, defaultVal;
672
888
 
673
889
  // First, try to get an id. If no id is passed, look it up in the
674
890
  // dataHash.
675
891
  if (!id && (primaryKey = recordType.prototype.primaryKey)) {
676
892
  id = dataHash[primaryKey];
893
+ // if still no id, check if there is a defaultValue function for
894
+ // the primaryKey attribute and assign that
895
+ defaultVal = recordType.prototype[primaryKey] ? recordType.prototype[primaryKey].defaultValue : null;
896
+ if(!id && SC.typeOf(defaultVal)===SC.T_FUNCTION) {
897
+ id = dataHash[primaryKey] = defaultVal();
898
+ }
677
899
  }
678
900
 
679
901
  // Next get the storeKey - base on id if available
680
902
  storeKey = id ? recordType.storeKeyFor(id) : SC.Store.generateStoreKey();
681
-
903
+
682
904
  // now, check the state and do the right thing.
683
905
  status = this.readStatus(storeKey);
684
906
 
@@ -695,15 +917,21 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
695
917
  }
696
918
 
697
919
  // add dataHash and setup initial status -- also save recordType
698
- this.writeDataHash(storeKey, dataHash, K.READY_NEW);
920
+ this.writeDataHash(storeKey, (dataHash ? dataHash : {}), K.READY_NEW);
921
+
699
922
  SC.Store.replaceRecordTypeFor(storeKey, recordType);
700
923
  this.dataHashDidChange(storeKey);
701
-
924
+
702
925
  // Record is now in a committable state -- add storeKey to changelog
703
926
  changelog = this.changelog;
704
927
  if (!changelog) changelog = SC.Set.create();
705
928
  changelog.add(storeKey);
706
- this.changelog=changelog;
929
+ this.changelog = changelog;
930
+
931
+ // if commit records is enabled
932
+ if(this.get('commitRecordsAutomatically')){
933
+ this.invokeLast(this.commitRecords);
934
+ }
707
935
 
708
936
  // finally return materialized record
709
937
  return this.materializeRecord(storeKey) ;
@@ -769,15 +997,21 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
769
997
  } else status = K.DESTROYED_DIRTY ;
770
998
 
771
999
  // remove the data hash, set new status
772
- this.removeDataHash(storeKey, status);
1000
+ this.writeStatus(storeKey, status);
773
1001
  this.dataHashDidChange(storeKey);
774
1002
 
775
1003
  // add/remove change log
776
1004
  changelog = this.changelog;
777
1005
  if (!changelog) changelog = this.changelog = SC.Set.create();
1006
+
778
1007
  ((status & K.DIRTY) ? changelog.add(storeKey) : changelog.remove(storeKey));
779
1008
  this.changelog=changelog;
780
-
1009
+
1010
+ // if commit records is enabled
1011
+ if(this.get('commitRecordsAutomatically')){
1012
+ this.invokeLast(this.commitRecords);
1013
+ }
1014
+
781
1015
  return this ;
782
1016
  },
783
1017
 
@@ -854,13 +1088,17 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
854
1088
 
855
1089
  // record data hash change
856
1090
  this.dataHashDidChange(storeKey, null);
857
-
858
1091
  // record in changelog
859
1092
  changelog = this.changelog ;
860
1093
  if (!changelog) changelog = this.changelog = SC.Set.create() ;
861
1094
  changelog.add(storeKey);
862
1095
  this.changelog=changelog;
863
1096
 
1097
+ // if commit records is enabled
1098
+ if(this.get('commitRecordsAutomatically')){
1099
+ this.invokeLast(this.commitRecords);
1100
+ }
1101
+
864
1102
  return this ;
865
1103
  },
866
1104
 
@@ -918,22 +1156,23 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
918
1156
  instance itself using materializeRecord()
919
1157
 
920
1158
  @param {SC.Record|Array} recordTypes class or array of classes
921
- @param {Array} ids ids to destroy
922
- @param {Array} storeKeys (optional) store keys to destroy
1159
+ @param {Array} ids ids to retrieve
1160
+ @param {Array} storeKeys (optional) store keys to retrieve
1161
+ @param {Boolean} isRefresh
923
1162
  @returns {Array} storeKeys to be retrieved
924
1163
  */
925
- retrieveRecords: function(recordTypes, ids, storeKeys, _isRefresh) {
926
-
927
- var source = this.get('dataSource'),
1164
+ retrieveRecords: function(recordTypes, ids, storeKeys, isRefresh) {
1165
+
1166
+ var source = this._getDataSource(),
928
1167
  isArray = SC.typeOf(recordTypes) === SC.T_ARRAY,
929
- len = (storeKeys === undefined) ? ids.length : storeKeys.length,
1168
+ len = (!storeKeys) ? ids.length : storeKeys.length,
930
1169
  ret = [],
931
1170
  rev = SC.Store.generateStoreKey(),
932
1171
  K = SC.Record,
933
1172
  recordType, idx, storeKey, status;
934
1173
 
935
1174
  if (!isArray) recordType = recordTypes;
936
-
1175
+
937
1176
  // if no storeKeys were passed, map recordTypes + ids
938
1177
  for(idx=0;idx<len;idx++) {
939
1178
 
@@ -950,14 +1189,12 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
950
1189
 
951
1190
  // K.EMPTY, K.ERROR, K.DESTROYED_CLEAN - initial retrieval
952
1191
  if ((status == K.EMPTY) || (status == K.ERROR) || (status == K.DESTROYED_CLEAN)) {
953
-
954
1192
  this.writeStatus(storeKey, K.BUSY_LOADING);
955
1193
  this.dataHashDidChange(storeKey, rev, YES);
956
1194
  ret.push(storeKey);
957
1195
 
958
1196
  // otherwise, ignore record unless isRefresh is YES.
959
- } else if (_isRefresh) {
960
-
1197
+ } else if (isRefresh) {
961
1198
  // K.READY_CLEAN, K.READY_DIRTY, ignore K.READY_NEW
962
1199
  if (status & K.READY) {
963
1200
  this.writeStatus(storeKey, K.BUSY_REFRESH | (status & 0x03)) ;
@@ -977,14 +1214,14 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
977
1214
  }
978
1215
  }
979
1216
 
980
- // now commit storekeys to dataSource
1217
+ // now retrieve storekeys from dataSource
981
1218
  if (source) {
982
- var ok = source.retrieveRecords.call(source, this, ret);
1219
+ var ok = source.retrieveRecords.call(source, this, ret, ids);
983
1220
  if (ok === NO) ret.length = 0; // could not find.
984
1221
  }
985
1222
  return ret ;
986
1223
  },
987
-
1224
+
988
1225
  _TMP_RETRIEVE_ARRAY: [],
989
1226
 
990
1227
  /**
@@ -1001,13 +1238,14 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1001
1238
  @param {SC.Record} recordType class
1002
1239
  @param {String} id id to retrieve
1003
1240
  @param {Number} storeKey (optional) store key
1241
+ @param {Boolean} isRefresh
1004
1242
  @returns {Number} storeKey that was retrieved
1005
1243
  */
1006
- retrieveRecord: function(recordType, id, storeKey, _isRefresh) {
1244
+ retrieveRecord: function(recordType, id, storeKey, isRefresh) {
1007
1245
  var array = this._TMP_RETRIEVE_ARRAY,
1008
1246
  ret;
1009
-
1010
- if (storeKey !== undefined) {
1247
+
1248
+ if (storeKey) {
1011
1249
  array[0] = storeKey;
1012
1250
  storeKey = array;
1013
1251
  id = null ;
@@ -1016,7 +1254,7 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1016
1254
  id = array;
1017
1255
  }
1018
1256
 
1019
- ret = this.retrieveRecords(recordType, id, storeKey, _isRefresh);
1257
+ ret = this.retrieveRecords(recordType, id, storeKey, isRefresh);
1020
1258
  array.length = 0 ;
1021
1259
  return ret[0];
1022
1260
  },
@@ -1060,7 +1298,7 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1060
1298
  @returns {SC.Bool} if the action was succesful.
1061
1299
  */
1062
1300
  commitRecords: function(recordTypes, ids, storeKeys) {
1063
- var source = this.get('dataSource'),
1301
+ var source = this._getDataSource(),
1064
1302
  isArray = SC.typeOf(recordTypes) === SC.T_ARRAY,
1065
1303
  retCreate= [], retUpdate= [], retDestroy = [],
1066
1304
  rev = SC.Store.generateStoreKey(),
@@ -1073,6 +1311,10 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1073
1311
  if(recordTypes===undefined && ids===undefined && storeKeys===undefined){
1074
1312
  storeKeys=this.changelog;
1075
1313
  }
1314
+
1315
+ // if no storeKeys or ids at this point, return
1316
+ if(!storeKeys && !ids) return;
1317
+
1076
1318
  len = (storeKeys === undefined) ? ids.length : storeKeys.length;
1077
1319
 
1078
1320
  for(idx=0;idx<len;idx++) {
@@ -1089,7 +1331,7 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1089
1331
  // collect status and process
1090
1332
  status = this.readStatus(storeKey);
1091
1333
 
1092
- if ((status == K.EMPTY) || (status == K.ERROR) || (status == K.DESTROYED_CLEAN)) {
1334
+ if ((status == K.EMPTY) || (status == K.ERROR)) {
1093
1335
  throw K.NOT_FOUND_ERROR ;
1094
1336
  }else{
1095
1337
  if(status==K.READY_NEW){
@@ -1104,6 +1346,9 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1104
1346
  this.writeStatus(storeKey, K.BUSY_DESTROYING);
1105
1347
  this.dataHashDidChange(storeKey, rev, YES);
1106
1348
  retDestroy.push(storeKey);
1349
+ } else if (status==K.DESTROYED_CLEAN) {
1350
+ this.dataHashDidChange(storeKey, rev, YES);
1351
+ retDestroy.push(storeKey);
1107
1352
  }
1108
1353
  // ignore K.READY_CLEAN, K.BUSY_LOADING, K.BUSY_CREATING, K.BUSY_COMMITTING,
1109
1354
  // K.BUSY_REFRESH_CLEAN, K_BUSY_REFRESH_DIRTY, KBUSY_DESTROYING
@@ -1160,7 +1405,7 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1160
1405
  @returns {SC.Store} the store.
1161
1406
  */
1162
1407
  cancelRecords: function(recordTypes, ids, storeKeys) {
1163
- var source = this.get('dataSource'),
1408
+ var source = this._getDataSource(),
1164
1409
  isArray = SC.typeOf(recordTypes) === SC.T_ARRAY,
1165
1410
  K = SC.Record,
1166
1411
  ret = [],
@@ -1260,12 +1505,11 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1260
1505
  if (isArray) {
1261
1506
  recordType = recordTypes.objectAt(idx) || SC.Record;
1262
1507
  primaryKey = recordType.prototype.primaryKey ;
1263
- }
1508
+ }
1264
1509
  id = (ids) ? ids.objectAt(idx) : dataHash[primaryKey];
1265
1510
  ret[idx] = storeKey = recordType.storeKeyFor(id); // needed to cache
1266
1511
  this.pushRetrieve(recordType, id, dataHash, storeKey);
1267
1512
  }
1268
-
1269
1513
  // return storeKeys
1270
1514
  return ret ;
1271
1515
  },
@@ -1337,24 +1581,25 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1337
1581
  @returns {SC.Store} reciever
1338
1582
  */
1339
1583
  dataSourceDidComplete: function(storeKey, dataHash, newId) {
1340
- var status = this.readStatus(storeKey), K = SC.Record;
1584
+ var status = this.readStatus(storeKey), K = SC.Record, statusOnly;
1341
1585
 
1342
1586
  // EMPTY, ERROR, READY_CLEAN, READY_NEW, READY_DIRTY, DESTROYED_CLEAN,
1343
1587
  // DESTROYED_DIRTY
1344
1588
  if (!(status & K.BUSY)) {
1345
1589
  throw K.BAD_STATE_ERROR; // should never be called in this state
1346
-
1347
1590
  }
1348
1591
 
1349
1592
  // otherwise, determine proper state transition
1350
- if(status==K.BUSY_DESTROYING) {
1593
+ if(status===K.BUSY_DESTROYING) {
1351
1594
  throw K.BAD_STATE_ERROR ;
1352
1595
  } else status = K.READY_CLEAN ;
1353
1596
 
1354
1597
  this.writeStatus(storeKey, status) ;
1355
1598
  if (dataHash) this.writeDataHash(storeKey, dataHash, status) ;
1356
1599
  if (newId) SC.Store.replaceIdFor(storeKey, newId);
1357
- this.dataHashDidChange(storeKey);
1600
+
1601
+ statusOnly = dataHash || newId ? NO : YES;
1602
+ this.dataHashDidChange(storeKey, null, statusOnly);
1358
1603
 
1359
1604
  return this ;
1360
1605
  },
@@ -1419,10 +1664,15 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1419
1664
  storeKey = recordType.storeKeyFor(id);
1420
1665
  }
1421
1666
  status = this.readStatus(storeKey);
1422
- if(status==K.EMPTY || status==K.ERROR || status==K.READY_CLEAN || status==K.DESTROY_CLEAN){
1667
+ if(status==K.EMPTY || status==K.ERROR || status==K.READY_CLEAN || status==K.DESTROY_CLEAN) {
1668
+
1423
1669
  status = K.READY_CLEAN;
1424
- if(dataHash===undefined) this.writeStatus(storeKey, status) ;
1425
- else this.writeDataHash(storeKey, dataHash, status) ;
1670
+ if(dataHash===undefined) {
1671
+ this.writeStatus(storeKey, status) ;
1672
+ }
1673
+ else {
1674
+ this.writeDataHash(storeKey, dataHash, status) ;
1675
+ }
1426
1676
  this.dataHashDidChange(storeKey);
1427
1677
 
1428
1678
  return YES;
@@ -1432,7 +1682,7 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1432
1682
  },
1433
1683
 
1434
1684
  pushDestroy: function(recordType, id, storeKey) {
1435
- var K = SC.Record;
1685
+ var K = SC.Record, status;
1436
1686
 
1437
1687
  if(storeKey===undefined){
1438
1688
  storeKey = recordType.storeKeyFor(id);
@@ -1449,7 +1699,7 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1449
1699
  },
1450
1700
 
1451
1701
  pushError: function(recordType, id, error, storeKey) {
1452
- var K = SC.Record;
1702
+ var K = SC.Record, status;
1453
1703
 
1454
1704
  if(storeKey===undefined){
1455
1705
  storeKey = recordType.storeKeyFor(id);
@@ -1500,7 +1750,8 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1500
1750
  },
1501
1751
 
1502
1752
  /**
1503
- Given a recordType and primaryKey, find the storeKey.
1753
+ Given a recordType and primaryKey, find the storeKey. If the primaryKey
1754
+ has not been assigned a storeKey yet, it will be added.
1504
1755
 
1505
1756
  @param {SC.Record} recordType the record type
1506
1757
  @param {String} primaryKey the primary key
@@ -1508,6 +1759,71 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1508
1759
  */
1509
1760
  storeKeyFor: function(recordType, primaryKey) {
1510
1761
  return recordType.storeKeyFor(primaryKey);
1762
+ },
1763
+
1764
+ /**
1765
+ Given a primaryKey value for the record, returns the associated
1766
+ storeKey. As opposed to storeKeyFor() however, this method
1767
+ will NOT generate a new storeKey but returned undefined.
1768
+
1769
+ @param {String} id a record id
1770
+ @returns {Number} a storeKey.
1771
+ */
1772
+ storeKeyExists: function(recordType, primaryKey) {
1773
+ return recordType.storeKeyExists(primaryKey);
1774
+ },
1775
+
1776
+ /**
1777
+ Finds all storeKeys of a certain record type in this store
1778
+ and returns an array.
1779
+
1780
+ @param {SC.Record} recordType
1781
+ @returns {Array} set of storeKeys
1782
+ */
1783
+ storeKeysFor: function(recordType) {
1784
+ var recType, ret = [], storeKey;
1785
+ if(!this.statuses) return;
1786
+
1787
+ for(storeKey in SC.Store.recordTypesByStoreKey) {
1788
+ recType = SC.Store.recordTypesByStoreKey[storeKey];
1789
+ // if same record type and this store has it
1790
+ if(recType===recordType && this.statuses[storeKey]) {
1791
+ ret.push(parseInt(storeKey,0));
1792
+ }
1793
+ }
1794
+
1795
+ return ret;
1796
+ },
1797
+
1798
+ /**
1799
+ Finds all storeKeys in this store
1800
+ and returns an array.
1801
+
1802
+ @returns {Array} set of storeKeys
1803
+ */
1804
+ storeKeys: function() {
1805
+ var ret = [], storeKey;
1806
+ if(!this.statuses) return;
1807
+
1808
+ for(storeKey in this.statuses) {
1809
+ // if status is not empty
1810
+ if(this.statuses[storeKey] != SC.Record.EMPTY) {
1811
+ ret.push(parseInt(storeKey,0));
1812
+ }
1813
+ }
1814
+
1815
+ return ret;
1816
+ },
1817
+
1818
+ /**
1819
+ Returns string representation of a storeKey, with status.
1820
+
1821
+ @param {Number} storeKey
1822
+ @returns {String}
1823
+ */
1824
+ statusString: function(storeKey) {
1825
+ var rec = this.materializeRecord(storeKey);
1826
+ return rec.statusString();
1511
1827
  }
1512
1828
 
1513
1829
  }) ;
@@ -1534,7 +1850,7 @@ SC.Store.mixin({
1534
1850
  a primaryKey and recordType that remains constant throughout the lifetime
1535
1851
  of the application.
1536
1852
  */
1537
- recordTypesByStoreKey: [],
1853
+ recordTypesByStoreKey: {},
1538
1854
 
1539
1855
  /** @private
1540
1856
  The next store key to allocate. A storeKey must always be greater than 0
@@ -1558,8 +1874,11 @@ SC.Store.mixin({
1558
1874
  Given a storeKey returns the SC.Record class associated with the key.
1559
1875
  If no record type is associated with the store key, returns null.
1560
1876
 
1877
+ The SC.Record class will only be found if you have already called
1878
+ storeKeyFor() on the record.
1879
+
1561
1880
  @param {Number} storeKey the store key
1562
- @returns {String} the primary key or null
1881
+ @returns {SC.Record} the record type
1563
1882
  */
1564
1883
  recordTypeFor: function(storeKey) {
1565
1884
  return this.recordTypesByStoreKey[storeKey];
@@ -1585,8 +1904,7 @@ SC.Store.mixin({
1585
1904
  this.idsByStoreKey[storeKey] = primaryKey ;
1586
1905
 
1587
1906
  // then the other...
1588
- var storeKeys = recordType.storeKeysById ;
1589
- if (!storeKeys) storeKeys = recordType.storeKeysById = {};
1907
+ var storeKeys = recordType.storeKeysById() ;
1590
1908
  delete storeKeys[oldPrimaryKey];
1591
1909
  storeKeys[primaryKey] = storeKey;
1592
1910
 
@@ -1607,7 +1925,7 @@ SC.Store.mixin({
1607
1925
  this.recordTypesByStoreKey[storeKey] = recordType;
1608
1926
  return this ;
1609
1927
  }
1610
-
1928
+
1611
1929
  });
1612
1930
 
1613
1931