sproutcore 1.6.0.beta.3-java → 1.6.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (633) hide show
  1. data/CHANGELOG +70 -0
  2. data/{History.txt → History.rdoc} +0 -0
  3. data/{README.txt → README.rdoc} +3 -2
  4. data/Rakefile +213 -10
  5. data/{Todo.txt → Todo.rdoc} +0 -0
  6. data/VERSION.yml +1 -1
  7. data/bin/sc-docs +6 -1
  8. data/lib/Buildfile +5 -1
  9. data/lib/buildtasks/manifest.rake +14 -1
  10. data/lib/buildtasks/target.rake +20 -23
  11. data/lib/frameworks/sproutcore/Buildfile +8 -3
  12. data/lib/frameworks/sproutcore/CHANGELOG.md +364 -1
  13. data/lib/frameworks/sproutcore/README.md +1 -1
  14. data/lib/frameworks/sproutcore/apps/test_controls/controllers/select.js +12 -0
  15. data/lib/frameworks/sproutcore/apps/test_controls/resources/select_page.js +19 -5
  16. data/lib/frameworks/sproutcore/apps/welcome/english.lproj/main_page.css +9 -0
  17. data/lib/frameworks/sproutcore/frameworks/ajax/system/request.js +243 -199
  18. data/lib/frameworks/sproutcore/frameworks/ajax/system/response.js +250 -172
  19. data/lib/frameworks/sproutcore/frameworks/ajax/tests/system/request.js +29 -0
  20. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +5 -0
  21. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/controller.js +21 -1
  22. data/lib/frameworks/sproutcore/frameworks/core_foundation/controls/button.js +6 -2
  23. data/lib/frameworks/sproutcore/frameworks/core_foundation/core.js +2 -42
  24. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/handlebars/bind.js +38 -15
  25. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/handlebars/collection.js +6 -4
  26. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/responder_context.js +1 -1
  27. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/template_helpers/checkbox_support.js +11 -6
  28. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/template_helpers/text_field_support.js +55 -20
  29. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/keyboard.js +2 -0
  30. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +26 -20
  31. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/template.js +37 -21
  32. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/application.js +2 -7
  33. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +7 -7
  34. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js +157 -5
  35. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/platform.js +2 -2
  36. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/render_context.js +7 -6
  37. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/responder.js +1 -1
  38. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +29 -15
  39. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/sparse_array.js +8 -8
  40. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/string.js +162 -1
  41. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/theme.js +3 -56
  42. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/utils.js +24 -8
  43. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/array/array_case.js +42 -0
  44. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/object/content_destroyed.js +59 -0
  45. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controls/button.js +39 -57
  46. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/string.js +41 -1
  47. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/template_helpers/text_field_support.js +19 -2
  48. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/panes/template.js +16 -1
  49. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/helpers_style.js +5 -3
  50. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/sparse_array.js +32 -0
  51. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/template/collection.js +135 -0
  52. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/template/handlebars.js +29 -18
  53. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/clippingFrame.js +11 -0
  54. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/didAppendToDocument.js +18 -2
  55. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/insertBefore.js +10 -6
  56. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/keyboard.js +414 -1
  57. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/view.js +1 -1
  58. data/lib/frameworks/sproutcore/frameworks/core_foundation/{system → views}/bindable_span.js +2 -1
  59. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/template_collection.js +112 -40
  60. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +13 -7
  61. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/enabled.js +2 -1
  62. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/keyboard.js +245 -67
  63. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/manipulation.js +17 -9
  64. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/theming.js +8 -18
  65. data/lib/frameworks/sproutcore/frameworks/core_tools/core.js +8 -2
  66. data/lib/frameworks/sproutcore/frameworks/core_tools/data_source.js +1 -1
  67. data/lib/frameworks/sproutcore/frameworks/core_tools/models/target.js +1 -1
  68. data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +15 -8
  69. data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +12 -2
  70. data/lib/frameworks/sproutcore/frameworks/datastore/mixins/relationship_support.js +296 -0
  71. data/lib/frameworks/sproutcore/frameworks/datastore/models/child_record.js +3 -3
  72. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +330 -326
  73. data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +23 -1
  74. data/lib/frameworks/sproutcore/frameworks/datastore/system/child_array.js +26 -5
  75. data/lib/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +1 -1
  76. data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +69 -58
  77. data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +614 -614
  78. data/lib/frameworks/sproutcore/frameworks/datastore/tests/data_sources/data_source.js +203 -0
  79. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record.js +3 -1
  80. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array.js +44 -0
  81. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array_complex.js +2 -0
  82. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_complex.js +2 -0
  83. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/core_methods.js +20 -13
  84. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +76 -47
  85. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +30 -30
  86. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/core_methods.js +74 -53
  87. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/flush.js +0 -1
  88. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitChangesFromNestedStore.js +24 -24
  89. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/connectDataSource.js +31 -0
  90. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushRelationships.js +1177 -0
  91. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +212 -182
  92. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/system/datetime.js +6 -67
  93. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/border.js +1 -1
  94. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +1 -1
  95. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/scrollable.js +1 -1
  96. data/lib/frameworks/sproutcore/frameworks/desktop/panes/alert.js +13 -15
  97. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +41 -12
  98. data/lib/frameworks/sproutcore/frameworks/desktop/panes/panel.js +9 -0
  99. data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +6 -3
  100. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drag_data_source.js +3 -3
  101. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +3 -3
  102. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/button.js +1 -1
  103. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/checkbox.js +1 -1
  104. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/collection.js +1 -1
  105. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/disclosure.js +1 -1
  106. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/image_button.js +1 -1
  107. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/master_detail.js +3 -2
  108. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/menu.js +12 -2
  109. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/panel.js +1 -1
  110. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/picker.js +1 -1
  111. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/progress.js +1 -1
  112. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/radio.js +1 -1
  113. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/radio_group.js +2 -2
  114. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/segment.js +1 -1
  115. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/segmented.js +1 -1
  116. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/slider.js +1 -1
  117. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/toolbar.js +1 -1
  118. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/well.js +1 -1
  119. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/workspace.js +1 -1
  120. data/lib/frameworks/sproutcore/frameworks/desktop/resources/alert.css +49 -0
  121. data/lib/frameworks/sproutcore/frameworks/desktop/{english.lproj → resources}/debug/a_sample_image.jpg +0 -0
  122. data/lib/frameworks/sproutcore/frameworks/desktop/{english.lproj → resources}/debug/apple-logo1.jpeg +0 -0
  123. data/lib/frameworks/sproutcore/frameworks/desktop/{english.lproj → resources}/debug/iframe.html +0 -0
  124. data/lib/frameworks/sproutcore/frameworks/desktop/resources/disclosure.css +20 -0
  125. data/lib/frameworks/sproutcore/frameworks/desktop/{english.lproj → resources}/drag.css +1 -1
  126. data/lib/frameworks/sproutcore/frameworks/desktop/resources/icons.css +214 -0
  127. data/lib/frameworks/sproutcore/frameworks/desktop/{english.lproj → resources}/images/cap.png +0 -0
  128. data/lib/frameworks/sproutcore/frameworks/desktop/{english.lproj → resources}/images/downbutton.png +0 -0
  129. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-alert-16.png +0 -0
  130. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-alert-24.png +0 -0
  131. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-alert-48.png +0 -0
  132. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-bookmark-16.png +0 -0
  133. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-bookmark-24.png +0 -0
  134. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-cancel-24.png +0 -0
  135. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-document-16.png +0 -0
  136. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-document-24.png +0 -0
  137. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-down-24.png +0 -0
  138. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-error-48.png +0 -0
  139. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-favorite-16.png +0 -0
  140. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-favorite-24.png +0 -0
  141. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-folder-16.png +0 -0
  142. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-folder-24.png +0 -0
  143. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-group-16.png +0 -0
  144. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-group-24.png +0 -0
  145. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-help-16.png +0 -0
  146. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-help-24.png +0 -0
  147. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-info-16.png +0 -0
  148. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-info-24.png +0 -0
  149. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-info-48.png +0 -0
  150. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-left-24.png +0 -0
  151. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-options-16.png +0 -0
  152. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-options-24.png +0 -0
  153. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-redo-24.png +0 -0
  154. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-right-24.png +0 -0
  155. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-tools-24.png +0 -0
  156. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-trash-16.png +0 -0
  157. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-trash-24.png +0 -0
  158. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-undo-24.png +0 -0
  159. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-up-24.png +0 -0
  160. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-user-16.png +0 -0
  161. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-user-24.png +0 -0
  162. data/lib/frameworks/sproutcore/frameworks/desktop/{english.lproj → resources}/images/thumb-bottom.png +0 -0
  163. data/lib/frameworks/sproutcore/frameworks/desktop/{english.lproj → resources}/images/thumb-center.png +0 -0
  164. data/lib/frameworks/sproutcore/frameworks/desktop/{english.lproj → resources}/images/thumb-top.png +0 -0
  165. data/lib/frameworks/sproutcore/frameworks/desktop/{english.lproj → resources}/images/track.png +0 -0
  166. data/lib/frameworks/sproutcore/frameworks/desktop/{english.lproj → resources}/images/upbutton.png +0 -0
  167. data/lib/frameworks/sproutcore/frameworks/desktop/resources/list_item.css +145 -0
  168. data/lib/frameworks/sproutcore/frameworks/desktop/resources/menu.css +10 -0
  169. data/lib/frameworks/sproutcore/frameworks/desktop/resources/menu_item_view.css +88 -0
  170. data/lib/frameworks/sproutcore/frameworks/desktop/{english.lproj → resources}/modal.css +3 -4
  171. data/lib/frameworks/sproutcore/frameworks/desktop/resources/panel.css +91 -0
  172. data/lib/frameworks/sproutcore/frameworks/desktop/resources/picker.css +37 -0
  173. data/lib/frameworks/sproutcore/frameworks/desktop/resources/progress.css +29 -0
  174. data/lib/frameworks/sproutcore/frameworks/desktop/resources/radio.css +11 -0
  175. data/lib/frameworks/sproutcore/frameworks/desktop/resources/segmented.css +122 -0
  176. data/lib/frameworks/sproutcore/frameworks/desktop/resources/separator.css +20 -0
  177. data/lib/frameworks/sproutcore/frameworks/desktop/resources/slider.css +34 -0
  178. data/lib/frameworks/sproutcore/frameworks/desktop/{english.lproj → resources}/split.css +0 -0
  179. data/lib/frameworks/sproutcore/frameworks/desktop/{english.lproj → resources}/split_divider.css +0 -0
  180. data/lib/frameworks/sproutcore/frameworks/desktop/{english.lproj → resources}/tab.css +0 -0
  181. data/lib/frameworks/sproutcore/frameworks/desktop/{english.lproj → resources}/toolbar.css +0 -0
  182. data/lib/frameworks/sproutcore/frameworks/desktop/{english.lproj → resources}/touch-scroller.css +13 -13
  183. data/lib/frameworks/sproutcore/frameworks/desktop/resources/well.css +65 -0
  184. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +58 -23
  185. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/methods.js +20 -1
  186. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +121 -103
  187. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/date_field/methods.js +34 -7
  188. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/static_content.js +3 -2
  189. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/tab/methods.js +1 -3
  190. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/tab/ui.js +20 -1
  191. data/lib/frameworks/sproutcore/frameworks/desktop/views/button.js +14 -15
  192. data/lib/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +43 -16
  193. data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +717 -700
  194. data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +2 -2
  195. data/lib/frameworks/sproutcore/frameworks/desktop/views/master_detail.js +11 -1
  196. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +16 -6
  197. data/lib/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +4 -7
  198. data/lib/frameworks/sproutcore/frameworks/desktop/views/progress.js +0 -1
  199. data/lib/frameworks/sproutcore/frameworks/desktop/views/radio.js +49 -7
  200. data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +9 -2
  201. data/lib/frameworks/sproutcore/frameworks/desktop/{panes → views}/select_button.js +52 -0
  202. data/lib/frameworks/sproutcore/frameworks/desktop/views/select_field.js +7 -3
  203. data/lib/frameworks/sproutcore/frameworks/desktop/views/slider.js +4 -26
  204. data/lib/frameworks/sproutcore/frameworks/desktop/views/tab.js +46 -49
  205. data/lib/frameworks/sproutcore/frameworks/desktop/views/web.js +20 -19
  206. data/lib/frameworks/sproutcore/frameworks/experimental/Buildfile +2 -0
  207. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/designers/view_designer.js +249 -249
  208. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/mixins/edit_mode.js +13 -5
  209. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/mixins/emptiness.js +53 -37
  210. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/render_delegates/form.js +2 -1
  211. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/render_delegates/form_row.js +3 -11
  212. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/mixins/edit_mode.js +53 -0
  213. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/mixins/emptiness.js +114 -0
  214. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/views/form.js +174 -6
  215. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/views/form_row.js +86 -6
  216. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/views/form.js +98 -126
  217. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/views/form_row.js +96 -97
  218. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/polymorphism/README.md +2 -1
  219. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/polymorphism/models/record.js +20 -36
  220. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/ext/menu.js +121 -0
  221. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/ext/menu_item.js +90 -0
  222. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/mixins/select_view_menu.js +139 -0
  223. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/render_delegates/select_button.js +14 -0
  224. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/ext/menu_resizing.js +25 -0
  225. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/mixins/select_view_menu/bindings.js +43 -0
  226. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/mixins/select_view_menu/check_selected.js +32 -0
  227. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/views/popup_button/menu_setup.js +40 -0
  228. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/views/popup_button/show_menu.js +45 -0
  229. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/views/select/menu_width.js +49 -0
  230. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/views/select/selected_item.js +191 -0
  231. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/views/popup_button.js +264 -0
  232. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/views/select.js +450 -0
  233. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/mixins/split_child.js +14 -6
  234. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/mixins/split_thumb.js +1 -1
  235. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/render_delegates/split.js +1 -1
  236. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/render_delegates/split_divider.js +1 -1
  237. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/views/split.js +9 -0
  238. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/views/thumb.js +3 -2
  239. data/lib/frameworks/sproutcore/frameworks/foundation/core.js +2 -2
  240. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_resize.js +16 -19
  241. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/button.js +4 -7
  242. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/content_value_support.js +1 -1
  243. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/flowed_layout.js +85 -16
  244. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_editable.js +1 -1
  245. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_editor.js +1 -1
  246. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_editor_delegate.js +1 -1
  247. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inner_frame.js +1 -1
  248. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/canvas_image.js +4 -2
  249. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/helpers/sizing.js +2 -0
  250. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/image.js +1 -1
  251. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/label.js +1 -1
  252. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/render_delegate.js +13 -13
  253. data/lib/frameworks/sproutcore/frameworks/foundation/{english.lproj → resources}/benchmark.css +0 -0
  254. data/lib/frameworks/sproutcore/frameworks/foundation/{english.lproj → resources}/blank.gif +0 -0
  255. data/lib/frameworks/sproutcore/frameworks/foundation/{english.lproj → resources}/bootstrap.rhtml +0 -0
  256. data/lib/frameworks/sproutcore/frameworks/foundation/resources/button_view.css +36 -0
  257. data/lib/frameworks/sproutcore/frameworks/foundation/{english.lproj → resources}/checkbox_view.css +0 -0
  258. data/lib/frameworks/sproutcore/frameworks/foundation/{english.lproj → resources}/debug/control-test-pane.css +0 -0
  259. data/lib/frameworks/sproutcore/frameworks/foundation/resources/images/favicon.ico +0 -0
  260. data/lib/frameworks/sproutcore/frameworks/foundation/{english.lproj → resources}/images/sproutcore-logo.png +0 -0
  261. data/lib/frameworks/sproutcore/frameworks/foundation/{english.lproj → resources}/images/sproutcore-startup-landscape.jpg +0 -0
  262. data/lib/frameworks/sproutcore/frameworks/foundation/{english.lproj → resources}/images/sproutcore-startup-landscape.png +0 -0
  263. data/lib/frameworks/sproutcore/frameworks/foundation/{english.lproj → resources}/images/sproutcore-startup-portrait.jpg +0 -0
  264. data/lib/frameworks/sproutcore/frameworks/foundation/{english.lproj → resources}/images/sproutcore-startup-portrait.png +0 -0
  265. data/lib/frameworks/sproutcore/frameworks/foundation/{english.lproj → resources}/images/sproutcore-startup.png +0 -0
  266. data/lib/frameworks/sproutcore/frameworks/foundation/{english.lproj → resources}/images/sproutcore.png +0 -0
  267. data/lib/frameworks/sproutcore/frameworks/foundation/{english.lproj → resources}/inline_editor.css +0 -0
  268. data/lib/frameworks/sproutcore/frameworks/foundation/resources/label.css +47 -0
  269. data/lib/frameworks/sproutcore/frameworks/foundation/{english.lproj → resources}/radio_view.css +0 -0
  270. data/lib/frameworks/sproutcore/frameworks/foundation/{english.lproj → resources}/static_layout.css +1 -1
  271. data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +125 -0
  272. data/lib/frameworks/sproutcore/frameworks/foundation/system/chance.js +5 -1
  273. data/lib/frameworks/sproutcore/frameworks/foundation/system/exception_handler.js +4 -2
  274. data/lib/frameworks/sproutcore/frameworks/foundation/system/math.js +2 -1
  275. data/lib/frameworks/sproutcore/frameworks/foundation/system/module.js +13 -0
  276. data/lib/frameworks/sproutcore/frameworks/foundation/system/string.js +0 -43
  277. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/string_measurement.js +11 -11
  278. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/flowed_layout/tests.js +912 -0
  279. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/container/ui.js +23 -0
  280. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/methods.js +36 -7
  281. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +58 -4
  282. data/lib/frameworks/sproutcore/frameworks/foundation/validators/date.js +4 -4
  283. data/lib/frameworks/sproutcore/frameworks/foundation/validators/validator.js +1 -3
  284. data/lib/frameworks/sproutcore/frameworks/foundation/views/container.js +17 -6
  285. data/lib/frameworks/sproutcore/frameworks/foundation/views/field.js +0 -15
  286. data/lib/frameworks/sproutcore/frameworks/foundation/views/label.js +3 -3
  287. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +30 -19
  288. data/lib/frameworks/sproutcore/frameworks/handlebars/handlebars.js +1 -1
  289. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-buffered.js +2 -76
  290. data/lib/frameworks/sproutcore/frameworks/jquery/jquery.js +3348 -1591
  291. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +6 -3
  292. data/lib/frameworks/sproutcore/frameworks/routing/tests/system/routes.js +11 -0
  293. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +38 -12
  294. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/flatten.js +24 -0
  295. data/lib/frameworks/sproutcore/frameworks/runtime/ext/array.js +2 -1
  296. data/lib/frameworks/sproutcore/frameworks/runtime/ext/function.js +5 -5
  297. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/array.js +21 -2
  298. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/copyable.js +3 -2
  299. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/freezable.js +1 -1
  300. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +1 -1
  301. data/lib/frameworks/sproutcore/frameworks/runtime/private/property_chain.js +2 -2
  302. data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +14 -14
  303. data/lib/frameworks/sproutcore/frameworks/runtime/system/error.js +4 -1
  304. data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +0 -3
  305. data/lib/frameworks/sproutcore/frameworks/runtime/system/logger.js +4 -4
  306. data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +4 -4
  307. data/lib/frameworks/sproutcore/frameworks/runtime/system/range_observer.js +1 -1
  308. data/lib/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +3 -3
  309. data/lib/frameworks/sproutcore/frameworks/runtime/system/set.js +15 -16
  310. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/itemType.js +6 -2
  311. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/objectForPropertyPath.js +10 -5
  312. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/requiredObjectForPropertyPath.js +29 -0
  313. data/lib/frameworks/sproutcore/frameworks/runtime/tests/private/observer_queue.js +98 -0
  314. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/object/enhance.js +30 -0
  315. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/create.js +17 -0
  316. data/lib/frameworks/sproutcore/frameworks/statechart/debug/monitor.js +4 -73
  317. data/lib/frameworks/sproutcore/frameworks/statechart/debug/sequence_matcher.js +189 -0
  318. data/lib/frameworks/sproutcore/frameworks/statechart/ext/function.js +122 -0
  319. data/lib/frameworks/sproutcore/frameworks/statechart/system/async.js +88 -0
  320. data/lib/frameworks/sproutcore/frameworks/statechart/system/empty_state.js +34 -0
  321. data/lib/frameworks/sproutcore/frameworks/statechart/system/history_state.js +97 -0
  322. data/lib/frameworks/sproutcore/frameworks/statechart/system/state.js +16 -191
  323. data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +17 -79
  324. data/lib/frameworks/sproutcore/frameworks/statechart/tests/debug/sequence_matcher.js +464 -0
  325. data/lib/frameworks/sproutcore/frameworks/statechart/tests/event_handling/basic/with_concurrent_states.js +31 -11
  326. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/async/with_concurrent_states.js +6 -4
  327. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/standard/with_concurrent_states/advanced.js +40 -6
  328. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/standard/with_concurrent_states/basic.js +22 -2
  329. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/standard/with_concurrent_states/intermediate.js +44 -3
  330. data/lib/frameworks/sproutcore/frameworks/testing/core.js +61 -9
  331. data/lib/frameworks/sproutcore/frameworks/testing/{english.lproj → resources}/additions.css +0 -0
  332. data/lib/frameworks/sproutcore/frameworks/testing/{english.lproj → resources}/runner.css +10 -2
  333. data/lib/frameworks/sproutcore/frameworks/testing/{english.lproj → resources}/testsuite.css +0 -0
  334. data/lib/frameworks/sproutcore/frameworks/testing/system/runner.js +66 -27
  335. data/lib/frameworks/sproutcore/frameworks/testing/tests/spy_on.js +41 -0
  336. data/lib/frameworks/sproutcore/frameworks/testing/tests/stub_method.js +9 -0
  337. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/base.css +80 -0
  338. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/core.css +20 -0
  339. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/fonts.css +39 -0
  340. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/reset.css +126 -0
  341. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/view.css +57 -0
  342. data/lib/frameworks/sproutcore/lib/index.rhtml +8 -4
  343. data/lib/frameworks/sproutcore/themes/ace/designs/psds/checkbox/ace/14px/checkbox_checked.psd +0 -0
  344. data/lib/frameworks/sproutcore/themes/ace/designs/psds/checkbox/ace/14px/checkbox_checked_active.psd +0 -0
  345. data/lib/frameworks/sproutcore/themes/ace/designs/psds/checkbox/ace/14px/checkbox_mixed.psd +0 -0
  346. data/lib/frameworks/sproutcore/themes/ace/designs/psds/checkbox/ace/14px/checkbox_mixed_active.psd +0 -0
  347. data/lib/frameworks/sproutcore/themes/ace/designs/psds/checkbox/ace/14px/checkbox_unchecked.psd +0 -0
  348. data/lib/frameworks/sproutcore/themes/ace/designs/psds/checkbox/ace/14px/checkbox_unchecked_active.psd +0 -0
  349. data/lib/frameworks/sproutcore/themes/ace/designs/psds/checkbox/ace/16px/checkbox_checked.psd +0 -0
  350. data/lib/frameworks/sproutcore/themes/ace/designs/psds/checkbox/ace/16px/checkbox_checked_active.psd +0 -0
  351. data/lib/frameworks/sproutcore/themes/ace/designs/psds/checkbox/ace/16px/checkbox_mixed.psd +0 -0
  352. data/lib/frameworks/sproutcore/themes/ace/designs/psds/checkbox/ace/16px/checkbox_mixed_active.psd +0 -0
  353. data/lib/frameworks/sproutcore/themes/ace/designs/psds/checkbox/ace/16px/checkbox_unchecked.psd +0 -0
  354. data/lib/frameworks/sproutcore/themes/ace/designs/psds/checkbox/ace/16px/checkbox_unchecked_active.psd +0 -0
  355. data/lib/frameworks/sproutcore/themes/ace/designs/psds/menu/menu_item.psd +0 -0
  356. data/lib/frameworks/sproutcore/themes/ace/resources/checkbox/ace/14px/checkbox_checked.png +0 -0
  357. data/lib/frameworks/sproutcore/themes/ace/resources/checkbox/ace/14px/checkbox_checked_active.png +0 -0
  358. data/lib/frameworks/sproutcore/themes/ace/resources/checkbox/ace/14px/checkbox_mixed.png +0 -0
  359. data/lib/frameworks/sproutcore/themes/ace/resources/checkbox/ace/14px/checkbox_mixed_active.png +0 -0
  360. data/lib/frameworks/sproutcore/themes/ace/resources/checkbox/ace/14px/checkbox_unchecked.png +0 -0
  361. data/lib/frameworks/sproutcore/themes/ace/resources/checkbox/ace/14px/checkbox_unchecked_active.png +0 -0
  362. data/lib/frameworks/sproutcore/themes/ace/resources/checkbox/ace/16px/checkbox_checked.png +0 -0
  363. data/lib/frameworks/sproutcore/themes/ace/resources/checkbox/ace/16px/checkbox_checked_active.png +0 -0
  364. data/lib/frameworks/sproutcore/themes/ace/resources/checkbox/ace/16px/checkbox_mixed.png +0 -0
  365. data/lib/frameworks/sproutcore/themes/ace/resources/checkbox/ace/16px/checkbox_mixed_active.png +0 -0
  366. data/lib/frameworks/sproutcore/themes/ace/resources/checkbox/ace/16px/checkbox_unchecked.png +0 -0
  367. data/lib/frameworks/sproutcore/themes/ace/resources/checkbox/ace/16px/checkbox_unchecked_active.png +0 -0
  368. data/lib/frameworks/sproutcore/themes/ace/resources/collection/normal/list.css +13 -4
  369. data/lib/frameworks/sproutcore/themes/ace/resources/collection/normal/list_item.css +16 -14
  370. data/lib/frameworks/sproutcore/themes/ace/resources/form/form.css +9 -0
  371. data/lib/frameworks/sproutcore/themes/ace/resources/menu/menu.css +3 -1
  372. data/lib/frameworks/sproutcore/themes/ace/resources/menu/menu_item.png +0 -0
  373. data/lib/frameworks/sproutcore/themes/ace/resources/picker/popover/picker.js +1 -1
  374. data/lib/frameworks/sproutcore/themes/ace/resources/picker/popover/workspace.js +1 -1
  375. data/lib/frameworks/sproutcore/themes/ace/resources/split/split.css +1 -1
  376. data/lib/frameworks/sproutcore/themes/legacy_theme/render_delegates/button.js +1 -1
  377. data/lib/frameworks/sproutcore/themes/legacy_theme/render_delegates/panel.js +1 -1
  378. data/lib/frameworks/sproutcore/themes/legacy_theme/render_delegates/progress.js +2 -0
  379. data/lib/frameworks/sproutcore/themes/legacy_theme/render_delegates/slider.js +1 -1
  380. data/lib/frameworks/sproutcore/themes/legacy_theme/render_delegates/well.js +1 -1
  381. data/lib/gen/app/templates/apps/@target_name@/Buildfile +1 -4
  382. data/lib/gen/app/templates/apps/@target_name@/core.js +1 -4
  383. data/lib/gen/app/templates/apps/@target_name@/main.js +1 -4
  384. data/lib/gen/app/templates/apps/@target_name@/resources/main_page.js +1 -4
  385. data/lib/gen/app/templates/apps/@target_name@/theme.js +1 -4
  386. data/lib/gen/controller/templates/controllers/{@filename@.js → @filename@_controller.js} +1 -4
  387. data/lib/gen/controller/templates/tests/controllers/{@filename@.js → @filename@_test.js} +1 -4
  388. data/lib/gen/data-source/templates/data_sources/{@filename@.js → @filename@_data_source.js} +1 -4
  389. data/lib/gen/design/templates/resources/@filename@.js +1 -4
  390. data/lib/gen/framework/templates/frameworks/@target_name@/core.js +1 -4
  391. data/lib/gen/framework/templates/frameworks/@target_name@/english.lproj/strings.js +1 -4
  392. data/lib/gen/html_app/templates/apps/@target_name@/@target_name@.js +1 -4
  393. data/lib/gen/html_app/templates/apps/@target_name@/resources/stylesheets/@target_name@.css +2 -0
  394. data/lib/gen/html_project/templates/@filename@/Buildfile +1 -4
  395. data/lib/gen/html_project/templates/@filename@/README +1 -4
  396. data/lib/gen/language/Buildfile +1 -1
  397. data/lib/gen/language/templates/@filename@/strings.js +1 -4
  398. data/lib/gen/model/templates/fixtures/{@filename@.js → @filename@_fixtures.js} +2 -5
  399. data/lib/gen/model/templates/models/{@filename@.js → @filename@_model.js} +1 -4
  400. data/lib/gen/model/templates/tests/models/{@filename@.js → @filename@_test.js} +1 -4
  401. data/lib/gen/page/templates/pages/@target_name@/Buildfile +1 -4
  402. data/lib/gen/page/templates/pages/@target_name@/core.js +1 -4
  403. data/lib/gen/page/templates/pages/@target_name@/en.lproj/strings.js +1 -4
  404. data/lib/gen/page/templates/pages/@target_name@/resources/body.css +3 -1
  405. data/lib/gen/project/templates/@filename@/Buildfile +1 -4
  406. data/lib/gen/project/templates/@filename@/README +1 -5
  407. data/lib/gen/responder/templates/states/{@filename@.js → @filename@_state.js} +1 -4
  408. data/lib/gen/test/templates/tests/{@filename@.js → @filename@_test.js} +1 -4
  409. data/lib/gen/theme/templates/themes/@target_name@/resources/theme_styles.css +1 -5
  410. data/lib/gen/theme/templates/themes/@target_name@/theme.js +1 -4
  411. data/lib/gen/view/templates/tests/views/{@filename@.js → @filename@_test.js} +1 -4
  412. data/lib/gen/view/templates/views/{@filename@.js → @filename@_view.js} +1 -4
  413. data/lib/sproutcore.rb +5 -15
  414. data/lib/sproutcore/builders/base.rb +5 -1
  415. data/lib/sproutcore/builders/handlebars.rb +12 -1
  416. data/lib/sproutcore/builders/module.rb +2 -2
  417. data/lib/sproutcore/buildfile/string_ext.rb +0 -4
  418. data/lib/sproutcore/helpers/cssmin.rb +44 -59
  419. data/lib/sproutcore/helpers/static_helper.rb +4 -2
  420. data/lib/sproutcore/helpers/text_helper.rb +11 -13
  421. data/lib/sproutcore/models/generator.rb +22 -0
  422. data/lib/sproutcore/models/manifest.rb +4 -4
  423. data/lib/sproutcore/models/manifest_entry.rb +1 -0
  424. data/lib/sproutcore/models/target.rb +3 -107
  425. data/lib/sproutcore/rack.rb +0 -1
  426. data/lib/sproutcore/rack/builder.rb +3 -0
  427. data/lib/sproutcore/rack/dev.rb +0 -1
  428. data/lib/sproutcore/rack/proxy.rb +240 -93
  429. data/lib/sproutcore/rack/service.rb +1 -1
  430. data/lib/sproutcore/render_engines/haml.rb +2 -5
  431. data/lib/sproutcore/tools.rb +11 -11
  432. data/lib/sproutcore/tools/build.rb +2 -0
  433. data/lib/sproutcore/tools/docs.rb +2 -37
  434. data/lib/sproutcore/tools/init.rb +10 -22
  435. data/lib/sproutcore/tools/manifest.rb +21 -22
  436. data/spec/buildtasks/manifest/prepare_build_tasks/combine_spec.rb +21 -1
  437. data/spec/buildtasks/target_spec.rb +9 -0
  438. data/spec/fixtures/builder_tests/apps/handlebars_test/Buildfile +1 -0
  439. data/spec/fixtures/builder_tests/apps/handlebars_test/{template.handlebars → templates/template.handlebars} +2 -0
  440. data/{lib/doc_templates/sproutcore/allclasses.tmpl → spec/fixtures/ordered_entries/apps/template_style/a.js} +0 -0
  441. data/spec/fixtures/{real_world/frameworks/sproutcore/apps/docs/PLACEHOLDER → ordered_entries/apps/template_style/template_style.js} +0 -0
  442. data/spec/fixtures/real_world/frameworks/sproutcore/Buildfile +1 -1
  443. data/spec/lib/builders/handlebars_spec.rb +10 -4
  444. data/spec/lib/buildfile_commands/build_task_spec.rb +1 -1
  445. data/spec/lib/tools/manifest_spec.rb +11 -0
  446. data/sproutcore.gemspec +8 -7
  447. data/vendor/chance/lib/chance/instance.rb +8 -9
  448. metadata +167 -266
  449. data/lib/doc_templates/jsdoc/allclasses.tmpl +0 -17
  450. data/lib/doc_templates/jsdoc/allfiles.tmpl +0 -56
  451. data/lib/doc_templates/jsdoc/class.tmpl +0 -487
  452. data/lib/doc_templates/jsdoc/index.tmpl +0 -38
  453. data/lib/doc_templates/jsdoc/publish.js +0 -170
  454. data/lib/doc_templates/jsdoc/static/default.css +0 -162
  455. data/lib/doc_templates/jsdoc/static/header.html +0 -2
  456. data/lib/doc_templates/jsdoc/static/index.html +0 -19
  457. data/lib/doc_templates/jsdoc/symbol.tmpl +0 -35
  458. data/lib/doc_templates/sproutcore/allfiles.tmpl +0 -56
  459. data/lib/doc_templates/sproutcore/class.tmpl +0 -674
  460. data/lib/doc_templates/sproutcore/classes-json.tmpl +0 -55
  461. data/lib/doc_templates/sproutcore/index.tmpl +0 -62
  462. data/lib/doc_templates/sproutcore/publish.js +0 -346
  463. data/lib/doc_templates/sproutcore/static/default.css +0 -258
  464. data/lib/doc_templates/sproutcore/static/header.html +0 -2
  465. data/lib/doc_templates/sproutcore/static/index.html +0 -19
  466. data/lib/doc_templates/sproutcore/symbol.tmpl +0 -35
  467. data/lib/frameworks/sproutcore/frameworks/core_foundation/resources/core.css +0 -378
  468. data/lib/frameworks/sproutcore/frameworks/core_foundation/resources/view.css +0 -57
  469. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/alert.css +0 -56
  470. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/disclosure.css +0 -73
  471. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/icons.css +0 -916
  472. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/images/icons/shared.png +0 -0
  473. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/list_item.css +0 -185
  474. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/menu.css +0 -12
  475. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/menu_item_view.css +0 -101
  476. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/panel.css +0 -91
  477. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/picker.css +0 -35
  478. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/progress.css +0 -33
  479. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/radio.css +0 -10
  480. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/segmented.css +0 -132
  481. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/separator.css +0 -19
  482. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/slider.css +0 -69
  483. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/strings.js +0 -14
  484. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/well.css +0 -71
  485. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/english.lproj/default_styles.css +0 -5
  486. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/english.lproj/strings.js +0 -15
  487. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/views/form_checkbox_field.js +0 -17
  488. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/views/form_field.js +0 -17
  489. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/views/form_label.js +0 -17
  490. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/views/form_radio_field.js +0 -17
  491. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/views/form_text_field.js +0 -17
  492. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/button_view.css +0 -40
  493. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/images/favicon.ico +0 -0
  494. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/label.css +0 -47
  495. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/text_field.css +0 -146
  496. data/lib/frameworks/sproutcore/frameworks/runtime/tests/private/observer_queue/isObservingSuspended.js +0 -55
  497. data/lib/frameworks/sproutcore/themes/empty_theme/tests/mini_icons.rhtml +0 -69
  498. data/lib/sproutcore/rack/docs.rb +0 -24
  499. data/vendor/jsdoc/README.txt +0 -151
  500. data/vendor/jsdoc/app/frame.js +0 -33
  501. data/vendor/jsdoc/app/frame/Chain.js +0 -102
  502. data/vendor/jsdoc/app/frame/Dumper.js +0 -144
  503. data/vendor/jsdoc/app/frame/Hash.js +0 -47
  504. data/vendor/jsdoc/app/frame/Link.js +0 -142
  505. data/vendor/jsdoc/app/frame/Namespace.js +0 -10
  506. data/vendor/jsdoc/app/frame/Opt.js +0 -134
  507. data/vendor/jsdoc/app/frame/Reflection.js +0 -26
  508. data/vendor/jsdoc/app/frame/String.js +0 -93
  509. data/vendor/jsdoc/app/frame/Testrun.js +0 -129
  510. data/vendor/jsdoc/app/handlers/FOODOC.js +0 -26
  511. data/vendor/jsdoc/app/handlers/XMLDOC.js +0 -26
  512. data/vendor/jsdoc/app/handlers/XMLDOC/DomReader.js +0 -159
  513. data/vendor/jsdoc/app/handlers/XMLDOC/XMLDoc.js +0 -16
  514. data/vendor/jsdoc/app/handlers/XMLDOC/XMLParse.js +0 -292
  515. data/vendor/jsdoc/app/lib/JSDOC.js +0 -98
  516. data/vendor/jsdoc/app/lib/JSDOC/DocComment.js +0 -200
  517. data/vendor/jsdoc/app/lib/JSDOC/DocTag.js +0 -294
  518. data/vendor/jsdoc/app/lib/JSDOC/JsDoc.js +0 -162
  519. data/vendor/jsdoc/app/lib/JSDOC/JsPlate.js +0 -100
  520. data/vendor/jsdoc/app/lib/JSDOC/Lang.js +0 -144
  521. data/vendor/jsdoc/app/lib/JSDOC/Parser.js +0 -109
  522. data/vendor/jsdoc/app/lib/JSDOC/PluginManager.js +0 -33
  523. data/vendor/jsdoc/app/lib/JSDOC/Symbol.js +0 -681
  524. data/vendor/jsdoc/app/lib/JSDOC/SymbolSet.js +0 -226
  525. data/vendor/jsdoc/app/lib/JSDOC/TextStream.js +0 -41
  526. data/vendor/jsdoc/app/lib/JSDOC/Token.js +0 -18
  527. data/vendor/jsdoc/app/lib/JSDOC/TokenReader.js +0 -332
  528. data/vendor/jsdoc/app/lib/JSDOC/TokenStream.js +0 -133
  529. data/vendor/jsdoc/app/lib/JSDOC/Util.js +0 -32
  530. data/vendor/jsdoc/app/lib/JSDOC/Walker.js +0 -453
  531. data/vendor/jsdoc/app/main.js +0 -74
  532. data/vendor/jsdoc/app/plugins/commentSrcJson.js +0 -19
  533. data/vendor/jsdoc/app/plugins/frameworkPrototype.js +0 -16
  534. data/vendor/jsdoc/app/plugins/functionCall.js +0 -10
  535. data/vendor/jsdoc/app/plugins/publishSrcHilite.js +0 -62
  536. data/vendor/jsdoc/app/plugins/sproutcoreTags.js +0 -26
  537. data/vendor/jsdoc/app/plugins/symbolLink.js +0 -9
  538. data/vendor/jsdoc/app/plugins/tagParamConfig.js +0 -31
  539. data/vendor/jsdoc/app/plugins/tagSynonyms.js +0 -43
  540. data/vendor/jsdoc/app/run.js +0 -346
  541. data/vendor/jsdoc/app/t/TestDoc.js +0 -144
  542. data/vendor/jsdoc/app/t/runner.js +0 -13
  543. data/vendor/jsdoc/app/test.js +0 -304
  544. data/vendor/jsdoc/app/test/addon.js +0 -24
  545. data/vendor/jsdoc/app/test/anon_inner.js +0 -14
  546. data/vendor/jsdoc/app/test/augments.js +0 -31
  547. data/vendor/jsdoc/app/test/augments2.js +0 -26
  548. data/vendor/jsdoc/app/test/borrows.js +0 -41
  549. data/vendor/jsdoc/app/test/borrows2.js +0 -23
  550. data/vendor/jsdoc/app/test/config.js +0 -22
  551. data/vendor/jsdoc/app/test/constructs.js +0 -18
  552. data/vendor/jsdoc/app/test/encoding.js +0 -10
  553. data/vendor/jsdoc/app/test/encoding_other.js +0 -12
  554. data/vendor/jsdoc/app/test/functions_anon.js +0 -39
  555. data/vendor/jsdoc/app/test/functions_nested.js +0 -33
  556. data/vendor/jsdoc/app/test/global.js +0 -13
  557. data/vendor/jsdoc/app/test/globals.js +0 -25
  558. data/vendor/jsdoc/app/test/ignore.js +0 -10
  559. data/vendor/jsdoc/app/test/inner.js +0 -16
  560. data/vendor/jsdoc/app/test/jsdoc_test.js +0 -477
  561. data/vendor/jsdoc/app/test/lend.js +0 -33
  562. data/vendor/jsdoc/app/test/memberof.js +0 -20
  563. data/vendor/jsdoc/app/test/memberof_constructor.js +0 -15
  564. data/vendor/jsdoc/app/test/name.js +0 -19
  565. data/vendor/jsdoc/app/test/namespace_nested.js +0 -23
  566. data/vendor/jsdoc/app/test/nocode.js +0 -13
  567. data/vendor/jsdoc/app/test/oblit_anon.js +0 -20
  568. data/vendor/jsdoc/app/test/overview.js +0 -20
  569. data/vendor/jsdoc/app/test/param_inline.js +0 -37
  570. data/vendor/jsdoc/app/test/params_optional.js +0 -8
  571. data/vendor/jsdoc/app/test/prototype.js +0 -17
  572. data/vendor/jsdoc/app/test/prototype_nested.js +0 -9
  573. data/vendor/jsdoc/app/test/prototype_oblit.js +0 -13
  574. data/vendor/jsdoc/app/test/prototype_oblit_constructor.js +0 -24
  575. data/vendor/jsdoc/app/test/public.js +0 -10
  576. data/vendor/jsdoc/app/test/shared.js +0 -42
  577. data/vendor/jsdoc/app/test/shared2.js +0 -2
  578. data/vendor/jsdoc/app/test/shortcuts.js +0 -22
  579. data/vendor/jsdoc/app/test/static_this.js +0 -13
  580. data/vendor/jsdoc/app/test/synonyms.js +0 -23
  581. data/vendor/jsdoc/app/test/tosource.js +0 -23
  582. data/vendor/jsdoc/app/test/variable_redefine.js +0 -14
  583. data/vendor/jsdoc/changes.txt +0 -47
  584. data/vendor/jsdoc/conf/sample.conf +0 -31
  585. data/vendor/jsdoc/java/build.xml +0 -36
  586. data/vendor/jsdoc/java/build_1.4.xml +0 -36
  587. data/vendor/jsdoc/java/classes/js.jar +0 -0
  588. data/vendor/jsdoc/java/src/JsDebugRun.java +0 -21
  589. data/vendor/jsdoc/java/src/JsRun.java +0 -21
  590. data/vendor/jsdoc/jsdebug.jar +0 -0
  591. data/vendor/jsdoc/jsrun.jar +0 -0
  592. data/vendor/jsdoc/t/TestDoc.js +0 -144
  593. data/vendor/jsdoc/t/runner.js +0 -13
  594. data/vendor/jsdoc/test.js +0 -304
  595. data/vendor/jsdoc/test/addon.js +0 -24
  596. data/vendor/jsdoc/test/anon_inner.js +0 -14
  597. data/vendor/jsdoc/test/augments.js +0 -31
  598. data/vendor/jsdoc/test/augments2.js +0 -26
  599. data/vendor/jsdoc/test/borrows.js +0 -41
  600. data/vendor/jsdoc/test/borrows2.js +0 -23
  601. data/vendor/jsdoc/test/config.js +0 -22
  602. data/vendor/jsdoc/test/constructs.js +0 -18
  603. data/vendor/jsdoc/test/encoding.js +0 -10
  604. data/vendor/jsdoc/test/encoding_other.js +0 -12
  605. data/vendor/jsdoc/test/functions_anon.js +0 -39
  606. data/vendor/jsdoc/test/functions_nested.js +0 -33
  607. data/vendor/jsdoc/test/global.js +0 -13
  608. data/vendor/jsdoc/test/globals.js +0 -25
  609. data/vendor/jsdoc/test/ignore.js +0 -10
  610. data/vendor/jsdoc/test/inner.js +0 -16
  611. data/vendor/jsdoc/test/jsdoc_test.js +0 -477
  612. data/vendor/jsdoc/test/lend.js +0 -33
  613. data/vendor/jsdoc/test/memberof.js +0 -20
  614. data/vendor/jsdoc/test/memberof_constructor.js +0 -15
  615. data/vendor/jsdoc/test/name.js +0 -19
  616. data/vendor/jsdoc/test/namespace_nested.js +0 -23
  617. data/vendor/jsdoc/test/nocode.js +0 -13
  618. data/vendor/jsdoc/test/oblit_anon.js +0 -20
  619. data/vendor/jsdoc/test/overview.js +0 -20
  620. data/vendor/jsdoc/test/param_inline.js +0 -37
  621. data/vendor/jsdoc/test/params_optional.js +0 -8
  622. data/vendor/jsdoc/test/prototype.js +0 -17
  623. data/vendor/jsdoc/test/prototype_nested.js +0 -9
  624. data/vendor/jsdoc/test/prototype_oblit.js +0 -13
  625. data/vendor/jsdoc/test/prototype_oblit_constructor.js +0 -24
  626. data/vendor/jsdoc/test/public.js +0 -10
  627. data/vendor/jsdoc/test/shared.js +0 -42
  628. data/vendor/jsdoc/test/shared2.js +0 -2
  629. data/vendor/jsdoc/test/shortcuts.js +0 -22
  630. data/vendor/jsdoc/test/static_this.js +0 -13
  631. data/vendor/jsdoc/test/synonyms.js +0 -23
  632. data/vendor/jsdoc/test/tosource.js +0 -23
  633. data/vendor/jsdoc/test/variable_redefine.js +0 -14
@@ -0,0 +1,31 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore - JavaScript Application Framework
3
+ // Copyright: ©2006-2011 Apple Inc. and contributors.
4
+ // License: Licensed under MIT license (see license.js)
5
+ // ==========================================================================
6
+
7
+ module("connecting DataSource to a store");
8
+
9
+ test("data source passed as string should be available as after running _getDataSource", function() {
10
+ window.MyTestDataSource = SC.DataSource.extend({
11
+ foo: 'bar'
12
+ });
13
+
14
+ var store = SC.Store.create().from("MyTestDataSource");
15
+ same(store.get("dataSource"), "MyTestDataSource");
16
+
17
+ var dataSource = store._getDataSource();
18
+ same(dataSource.foo, 'bar');
19
+
20
+ same(store.get('dataSource').foo, 'bar');
21
+ });
22
+
23
+ test("data source is required, if it can't be found, error should be thrown", function() {
24
+ expect(1);
25
+
26
+ try {
27
+ SC.Store.create().from("SC.YourTestDataSource")._getDataSource();
28
+ } catch (x) {
29
+ same(x, 'SC.YourTestDataSource could not be found');
30
+ }
31
+ });
@@ -0,0 +1,1177 @@
1
+ /*globals MyApp module test ok equals same stop start */
2
+
3
+ module("Propogating relationships with Store#pushRetrieve and Store#pushDestroy", {
4
+ setup: function () {
5
+ var MyApp = window.MyApp = SC.Object.create({
6
+ store: SC.Store.create(SC.RelationshipSupport)
7
+ });
8
+ }
9
+ });
10
+
11
+ // ..........................................................
12
+ // pushRetrieve BEHAVIOR
13
+ //
14
+
15
+ /**
16
+ [master] --> [slave]
17
+
18
+ precond - master has a slave
19
+ test - slave has a master
20
+ */
21
+ test("Master updates a slave [one(master) to one(slave)].", function () {
22
+ MyApp.Master = SC.Record.extend({
23
+ slave: SC.Record.toOne('MyApp.Slave', {
24
+ inverse: 'master',
25
+ isMaster: YES
26
+ })
27
+ });
28
+
29
+ MyApp.Slave = SC.Record.extend({
30
+ master: SC.Record.toOne('MyApp.Master', {
31
+ inverse: 'slave',
32
+ isMaster: NO
33
+ })
34
+ });
35
+
36
+ SC.RunLoop.begin();
37
+ MyApp.store.loadRecords(MyApp.Slave, [
38
+ { guid: 's1' }
39
+ ]);
40
+
41
+ MyApp.store.loadRecords(MyApp.Master, [
42
+ { guid: 'm1', slave: 's1' }
43
+ ]);
44
+ SC.RunLoop.end();
45
+
46
+ var s1 = MyApp.store.find(MyApp.Slave, 's1'),
47
+ m1 = MyApp.store.find(MyApp.Master, 'm1');
48
+
49
+ equals(m1.get('slave'), s1, 'precond - m1 should have a slave');
50
+ equals(s1.get('master'), m1, 's1 should have a master');
51
+ });
52
+
53
+ /**
54
+ [master]
55
+ v
56
+ |
57
+ +--> [slave1]
58
+ |
59
+ ...
60
+ |
61
+ +--> [slaveN]
62
+
63
+ precond - master has slaves
64
+ test - slaves have a master
65
+ */
66
+ test("A master updates many slave [one(master) to many(slave)].", function () {
67
+ MyApp.Slave = SC.Record.extend({
68
+ master: SC.Record.toOne('MyApp.Master', {
69
+ inverse: 'slaves',
70
+ isMaster: NO
71
+ })
72
+ });
73
+
74
+ MyApp.Master = SC.Record.extend({
75
+ slaves: SC.Record.toMany('MyApp.Slave', {
76
+ inverse: 'master',
77
+ isMaster: YES
78
+ })
79
+ });
80
+
81
+ SC.RunLoop.begin();
82
+ MyApp.store.loadRecords(MyApp.Slave, [
83
+ { guid: 's1' },
84
+ { guid: 's2' }
85
+ ]);
86
+
87
+ MyApp.store.loadRecords(MyApp.Master, [
88
+ { guid: 'm1', slaves: ['s1', 's2'] }
89
+ ]);
90
+ SC.RunLoop.end();
91
+
92
+ var s1 = MyApp.store.find(MyApp.Slave, 's1'),
93
+ s2 = MyApp.store.find(MyApp.Slave, 's2'),
94
+ m1 = MyApp.store.find(MyApp.Master, 'm1');
95
+
96
+ equals(m1.get('slaves').length(), 2, 'precond - m1 has 2 slaves');
97
+ equals(s1.get('master'), m1, 's1 should have master m1');
98
+ equals(s2.get('master'), m1, 's2 should have master m1');
99
+ });
100
+
101
+ /**
102
+ [slave]
103
+ ^
104
+ |
105
+ +--< [master1]
106
+ |
107
+ ...
108
+ |
109
+ +--< [masterN]
110
+
111
+ precond - master has a slave
112
+ test - slave has many masters
113
+ */
114
+ test("Many parent master updates a slave [many(master) to one(slave)]", function () {
115
+ MyApp.Slave = SC.Record.extend({
116
+ masters: SC.Record.toMany('MyApp.Master', {
117
+ inverse: 'slave',
118
+ isMaster: NO
119
+ })
120
+ });
121
+
122
+ MyApp.Master = SC.Record.extend({
123
+ slave: SC.Record.toOne('MyApp.Slave', {
124
+ inverse: 'masters',
125
+ isMaster: YES
126
+ })
127
+ });
128
+
129
+ SC.RunLoop.begin();
130
+ MyApp.store.loadRecords(MyApp.Slave, [
131
+ { guid: 's1' }
132
+ ]);
133
+
134
+ MyApp.store.loadRecords(MyApp.Master, [
135
+ { guid: 'm1', slave: 's1' },
136
+ { guid: 'm2', slave: 's1' }
137
+ ]);
138
+ SC.RunLoop.end();
139
+
140
+ var m1 = MyApp.store.find(MyApp.Master, 'm1'),
141
+ m2 = MyApp.store.find(MyApp.Master, 'm2'),
142
+ s1 = MyApp.store.find(MyApp.Slave, 's1');
143
+
144
+ equals(m1.get('slave'), s1, 'precond - m1 should have slave s1');
145
+ equals(m2.get('slave'), s1, 'precond - m2 should have slave s1');
146
+
147
+ equals(s1.get('masters').length(), 2, 'slave has 2 masters');
148
+ ok(s1.get('masters').indexOf(m1) !== -1, 'slave has master m1');
149
+ ok(s1.get('masters').indexOf(m2) !== -1, 'slave has master m2');
150
+ });
151
+
152
+ /**
153
+ [master1] ... [masterN]
154
+ v v
155
+ | |
156
+ >------- ... -> [slave1]
157
+ | |
158
+ ... ...
159
+ | |
160
+ >------- ... -> [slaveN]
161
+
162
+ precond - masters have many slaves
163
+ test - slaves have many masters
164
+ */
165
+ test("Many masters update many slaves [many(master) to many(slave)]", function () {
166
+ MyApp.Master = SC.Record.extend({
167
+ slaves: SC.Record.toMany('MyApp.Slave', {
168
+ inverse: 'masters',
169
+ isMaster: YES
170
+ })
171
+ });
172
+
173
+ MyApp.Slave = SC.Record.extend({
174
+ masters: SC.Record.toMany('MyApp.Master', {
175
+ inverse: 'slaves',
176
+ isMaster: NO
177
+ })
178
+ });
179
+
180
+ SC.RunLoop.begin();
181
+ MyApp.store.loadRecords(MyApp.Slave, [
182
+ { guid: 's1' },
183
+ { guid: 's2' }
184
+ ]);
185
+
186
+ MyApp.store.loadRecords(MyApp.Master, [
187
+ { guid: 'm1', slaves: ['s1', 's2'] },
188
+ { guid: 'm2', slaves: ['s1', 's2'] }
189
+ ]);
190
+ SC.RunLoop.end();
191
+
192
+ var m1 = MyApp.store.find(MyApp.Master, 'm1'),
193
+ m2 = MyApp.store.find(MyApp.Master, 'm2'),
194
+ s1 = MyApp.store.find(MyApp.Slave, 's1'),
195
+ s2 = MyApp.store.find(MyApp.Slave, 's2');
196
+
197
+ equals(m1.get('slaves').length(), 2, 'precond - m1 should have 2 slaves');
198
+ equals(m2.get('slaves').length(), 2, 'precond - m2 should have 2 slaves');
199
+
200
+ equals(s1.get('masters').length(), 2, 's1 should have 2 masters');
201
+ ok(s1.get('masters').indexOf(m1) !== -1, 's1 should have m1 as a master');
202
+ ok(s1.get('masters').indexOf(m2) !== -1, 's1 should have m2 as a master');
203
+
204
+ equals(s2.get('masters').length(), 2, 's2 should have 2 masters');
205
+ ok(s2.get('masters').indexOf(m1) !== -1, 's2 should have m1 as a master');
206
+ ok(s2.get('masters').indexOf(m2) !== -1, 's2 should have m2 as a master');
207
+ });
208
+
209
+ /**
210
+ [slave] >--- X ---> [*]
211
+
212
+ precond - * is related to slave
213
+ test - after update to slave, * is related to slave
214
+ */
215
+ test("A slave does NOT update a relationship [one(slave) to *]", function () {
216
+ MyApp.Slave = SC.Record.extend({
217
+ relative: SC.Record.toOne('MyApp.Relative', {
218
+ inverse: 'slave',
219
+ isMaster: NO
220
+ })
221
+ });
222
+
223
+ MyApp.Relative = SC.Record.extend({
224
+ slave: SC.Record.toOne('MyApp.Slave', {
225
+ inverse: 'relative',
226
+ isMaster: YES
227
+ })
228
+ });
229
+
230
+ // case create slave WITHOUT relationship
231
+ SC.RunLoop.begin();
232
+ MyApp.store.loadRecords(MyApp.Slave, [
233
+ { guid: 's1' }
234
+ ]);
235
+
236
+ MyApp.store.loadRecords(MyApp.Relative, [
237
+ { guid: 'r1', slave: 's1' }
238
+ ]);
239
+ SC.RunLoop.end();
240
+
241
+ var s1 = MyApp.store.find(MyApp.Slave, 's1'),
242
+ r1 = MyApp.store.find(MyApp.Relative, 'r1');
243
+
244
+ equals(s1.get('relative'), r1, 'precond1 - s1 has relative r1');
245
+
246
+ SC.RunLoop.begin();
247
+ MyApp.store.loadRecords(MyApp.Slave, [
248
+ { guid: 's1' }
249
+ ]);
250
+ SC.RunLoop.end();
251
+
252
+ ok(SC.none(s1.get('relative')), 'precond2 - s1 has no relative');
253
+ equals(r1.get('slave'), s1, 'test1- r1 is related to s1');
254
+
255
+ // case - create slave WITH releationship
256
+ SC.RunLoop.begin();
257
+ MyApp.store.loadRecords(MyApp.Relative, [
258
+ { guid: 'r2'}
259
+ ]);
260
+
261
+ MyApp.store.loadRecords(MyApp.Slave, [
262
+ { guid: 's2', relative: 'r2' }
263
+ ]);
264
+ SC.RunLoop.end();
265
+
266
+ var s2 = MyApp.store.find(MyApp.Slave, 's2'),
267
+ r2 = MyApp.store.find(MyApp.Relative, 'r2');
268
+
269
+ equals(s2.get('relative'), r2, 'precond3 - s2 is related to r2');
270
+ ok(SC.none(r2.get('slave')), 'test2 - r2 should NOT have a slave');
271
+ });
272
+
273
+ /**
274
+ [master1] <----> [master2]
275
+
276
+ precond - master1 has master2
277
+ test - master2 has master1
278
+ */
279
+ test("A master will mutually update a master [one(master) to one(master)].", function () {
280
+ MyApp.Master = SC.Record.extend({
281
+ relative: SC.Record.toOne('MyApp.Master', {
282
+ inverse: 'relative',
283
+ isMaster: YES
284
+ })
285
+ });
286
+
287
+ SC.RunLoop.begin();
288
+ MyApp.store.loadRecords(MyApp.Master, [
289
+ { guid: 'm1' }
290
+ ]);
291
+
292
+ MyApp.store.loadRecords(MyApp.Master, [
293
+ { guid: 'm2', relative: 'm1' }
294
+ ]);
295
+ SC.RunLoop.end();
296
+
297
+ var m1 = MyApp.store.find(MyApp.Master, 'm1'),
298
+ m2 = MyApp.store.find(MyApp.Master, 'm2');
299
+
300
+ equals(m1.get('relative'), m2, 'precond - m1 should have a relative "m2"');
301
+ equals(m2.get('relative'), m1, 'm2 should have a relative "m1"');
302
+ });
303
+
304
+ // ..........................................................
305
+ // REPLACING RELATIONSHIPS
306
+ //
307
+
308
+ /**
309
+ [master1] <--> [slave]
310
+
311
+ precond - master1 has slave
312
+ precond - slave has master1
313
+
314
+ ...relate master2 to slave...
315
+
316
+ [master1] --> [slave]
317
+ ^
318
+ |
319
+ [master2] <----+
320
+
321
+ precond - master2 has slave
322
+ precond - slave has master2
323
+ test - master1 has slave
324
+ */
325
+ test("Stealing relationship does NOT propagate to other masters [one(master) to one(slave)]", function () {
326
+ MyApp.Slave = SC.Record.extend({
327
+ master: SC.Record.toOne('MyApp.Master', {
328
+ inverse: 'slave',
329
+ isMaster: NO
330
+ })
331
+ });
332
+
333
+ MyApp.Master = SC.Record.extend({
334
+ slave: SC.Record.toOne('MyApp.Slave', {
335
+ inverse: 'master',
336
+ isMaster: YES
337
+ })
338
+ });
339
+
340
+ SC.RunLoop.begin();
341
+ MyApp.store.loadRecords(MyApp.Slave, [
342
+ { guid: 's1' }
343
+ ]);
344
+
345
+ MyApp.store.loadRecords(MyApp.Master, [
346
+ { guid: 'm1', slave: 's1' }
347
+ ]);
348
+ SC.RunLoop.end();
349
+
350
+ var s1 = MyApp.store.find(MyApp.Slave, 's1'),
351
+ m1 = MyApp.store.find(MyApp.Master, 'm1');
352
+
353
+ equals(m1.get('slave'), s1, 'precond - m1 should have s1');
354
+ equals(s1.get('master'), m1, 'precond - s1 should relate to m1');
355
+
356
+ SC.RunLoop.begin();
357
+ MyApp.store.loadRecords(MyApp.Master, [
358
+ { guid: 'm2', slave: 's1' }
359
+ ]);
360
+ SC.RunLoop.end();
361
+
362
+ var m2 = MyApp.store.find(MyApp.Master, 'm2');
363
+
364
+ equals(m2.get('slave'), s1, 'precond - m2 should have s1');
365
+ equals(s1.get('master'), m2, 'precond - s1 should relate to m2');
366
+
367
+ equals(m1.get('slave'), s1, 'm1 should have child s1');
368
+ });
369
+
370
+
371
+ // ..........................................................
372
+ // RELINQUISHING RELATIONSHIPS
373
+ //
374
+
375
+ /**
376
+ [master] <----> [slave1]
377
+
378
+ precond - master has slave1
379
+ precond - slave1 has master
380
+
381
+ [master] <----> [slave2]
382
+
383
+ X--- [slave1]
384
+
385
+ precond - master has slave2
386
+ precond - slave2 has master
387
+
388
+ test - slave1 does NOT have master
389
+ */
390
+ test("Relinquishing relationship on master<->* does propagate [one(master) to one(*)]", function () {
391
+ MyApp.Slave = SC.Record.extend({
392
+ master: SC.Record.toOne('MyApp.Master', {
393
+ inverse: 'slave',
394
+ isMaster: NO
395
+ })
396
+ });
397
+
398
+ MyApp.Master = SC.Record.extend({
399
+ slave: SC.Record.toOne('MyApp.Slave', {
400
+ inverse: 'master',
401
+ isMaster: YES
402
+ })
403
+ });
404
+
405
+ SC.RunLoop.begin();
406
+ MyApp.store.loadRecords(MyApp.Slave, [
407
+ { guid: 's1' },
408
+ { guid: 's2' }
409
+ ]);
410
+
411
+ MyApp.store.loadRecords(MyApp.Master, [
412
+ { guid: 'm1', slave: 's1' }
413
+ ]);
414
+ SC.RunLoop.end();
415
+
416
+ var s1 = MyApp.store.find(MyApp.Slave, 's1'),
417
+ s2 = MyApp.store.find(MyApp.Slave, 's2'),
418
+ m1 = MyApp.store.find(MyApp.Master, 'm1');
419
+
420
+ equals(m1.get('slave'), s1, 'precond - m1 should have s1');
421
+ equals(s1.get('master'), m1, 'precond - s1 should relate to m1');
422
+ ok(SC.none(s2.get('master')), 'precond - s2 has NO master');
423
+
424
+ SC.RunLoop.begin();
425
+ MyApp.store.loadRecords(MyApp.Master, [
426
+ { guid: 'm1', slave: 's2' }
427
+ ]);
428
+ SC.RunLoop.end();
429
+
430
+ equals(m1.get('slave'), s2, 'precond - m1 should have s2');
431
+ equals(s2.get('master'), m1, 'precond - s2 should relate to m1');
432
+
433
+ ok(SC.none(s1.get('master')), 'test1 - s1 should have NO master');
434
+ });
435
+
436
+ /**
437
+ [master] <----> [slave1, ..., slaveN]
438
+
439
+ precond - master has slaves
440
+ precond - slaves have master
441
+
442
+ [master] ---X [slave1]
443
+
444
+ precond - master does NOT have slave1
445
+ test - slave1 does NOT have master
446
+ */
447
+ test("Relinquishing a toMany relationship does propagate from master [one(master) to many(*)]", function () {
448
+ MyApp.Slave = SC.Record.extend({
449
+ master: SC.Record.toOne('MyApp.Master', {
450
+ inverse: 'slaves',
451
+ isMaster: NO
452
+ })
453
+ });
454
+
455
+ MyApp.Master = SC.Record.extend({
456
+ slaves: SC.Record.toMany('MyApp.Slave', {
457
+ inverse: 'master',
458
+ isMaster: YES
459
+ })
460
+ });
461
+
462
+ SC.RunLoop.begin();
463
+ MyApp.store.loadRecords(MyApp.Slave, [
464
+ { guid: 's1' },
465
+ { guid: 's2' }
466
+ ]);
467
+
468
+ MyApp.store.loadRecords(MyApp.Master, [
469
+ { guid: 'm1', slaves: ['s1', 's2'] }
470
+ ]);
471
+ SC.RunLoop.end();
472
+
473
+ var s1 = MyApp.store.find(MyApp.Slave, 's1'),
474
+ s2 = MyApp.store.find(MyApp.Slave, 's2'),
475
+ m1 = MyApp.store.find(MyApp.Master, 'm1');
476
+
477
+ equals(m1.get('slaves').length(), 2, 'precond1 - m1 should have 2 slaves');
478
+ equals(s1.get('master'), m1, 'precond2 - s1 should relate to m1');
479
+ equals(s2.get('master'), m1, 'precond3 - s2 should relate to m1');
480
+
481
+ SC.RunLoop.begin();
482
+ MyApp.store.loadRecords(MyApp.Master, [
483
+ { guid: 'm1', slaves: ['s1'] }
484
+ ]);
485
+ SC.RunLoop.end();
486
+
487
+ equals(m1.get('slaves').length(), 1, 'precond4 - m1 should have 1 slave');
488
+ equals(m1.get('slaves').objectAt(0), s1, 'precond5 - m1 should have slave s1');
489
+ equals(s1.get('master'), m1, 'precond6 - s1 should relate to m1');
490
+
491
+ ok(SC.none(s2.get('master')), 's2 should NOT have master');
492
+ });
493
+
494
+ /**
495
+ [slave]
496
+ ^
497
+ |
498
+ +--< [master1]
499
+ |
500
+ ...
501
+ |
502
+ +--< [masterN]
503
+
504
+ precond - master1 has relationship to slave
505
+ precond - slave has relationship many masters
506
+ precond - slave has relationship to master1
507
+
508
+ ...master1 relinquishes relationship to slave...
509
+
510
+ [slave]
511
+ ^
512
+ |
513
+ ...
514
+ |
515
+ +--< [masterN]
516
+
517
+ precond - master1 has no slave
518
+ test - slave has many masters, none of which is master1
519
+
520
+ */
521
+ test("Relinquish propagates from many master to one slave [many(master) to one(slave)]", function () {
522
+ MyApp.Master = SC.Record.extend({
523
+ slave: SC.Record.toOne('MyApp.Slave', {
524
+ inverse: 'masters',
525
+ isMaster: YES
526
+ })
527
+ });
528
+
529
+ MyApp.Slave = SC.Record.extend({
530
+ masters: SC.Record.toMany('MyApp.Master', {
531
+ inverse: 'slave',
532
+ isMaster: NO
533
+ })
534
+ });
535
+
536
+ SC.RunLoop.begin();
537
+ MyApp.store.loadRecords(MyApp.Slave, [
538
+ { guid: 's1' }
539
+ ]);
540
+
541
+ MyApp.store.loadRecords(MyApp.Master, [
542
+ { guid: 'm1', slave: 's1' },
543
+ { guid: 'm2', slave: 's1' }
544
+ ]);
545
+ SC.RunLoop.end();
546
+
547
+ var m1 = MyApp.store.find(MyApp.Master, 'm1'),
548
+ m2 = MyApp.store.find(MyApp.Master, 'm2'),
549
+ s1 = MyApp.store.find(MyApp.Slave, 's1');
550
+
551
+ equals(s1.get('masters').length(), 2, 'precond - s1 should have 2 masters');
552
+ equals(m1.get('slave'), s1, 'precond - m1 should have slave s1');
553
+ equals(m2.get('slave'), s1, 'precond - m2 should have slave s1');
554
+
555
+ SC.RunLoop.begin();
556
+ MyApp.store.loadRecords(MyApp.Master, [
557
+ { guid: 'm1' }
558
+ ]);
559
+ SC.RunLoop.end();
560
+
561
+ ok(SC.none(m1.get('slave')), 'precond - m1 should NOT have relationship with s1');
562
+ equals(s1.get('masters').length(), 1, 's1 should have 1 master');
563
+ equals(s1.get('masters').indexOf(m1), -1, 'm1 should NOT be that master');
564
+ });
565
+
566
+ /**
567
+ [master1] ... [masterN]
568
+ v v
569
+ | |
570
+ >------- ... -> [slave1]
571
+ | |
572
+ ... ...
573
+ | |
574
+ >------- ... -> [slaveN]
575
+
576
+ precond - masters have many slaves
577
+ precond - slaves have many masters
578
+
579
+ ... master1 relinquishes relationship to slave1 ...
580
+
581
+ [master1] ... [masterN]
582
+ v v
583
+ | |
584
+ >-- X > [slave1]
585
+ | |
586
+ ... ...
587
+ | |
588
+ >------- ... -> [slaveM]
589
+
590
+ precond - master1 has M-1 slaves (& not slave 1)
591
+
592
+ test - slave1 has N-1 masters
593
+ test - slave does NOT have relationship to master1
594
+ */
595
+ test("Removing a relationship propagates from many master to many slave [many(master) to many(slave)]", function () {
596
+ MyApp.Master = SC.Record.extend({
597
+ slaves: SC.Record.toMany('MyApp.Slave', {
598
+ inverse: 'masters',
599
+ isMaster: YES
600
+ })
601
+ });
602
+
603
+ MyApp.Slave = SC.Record.extend({
604
+ masters: SC.Record.toMany('MyApp.Master', {
605
+ inverse: 'slaves',
606
+ isMaster: NO
607
+ })
608
+ });
609
+
610
+ SC.RunLoop.begin();
611
+ MyApp.store.loadRecords(MyApp.Slave, [
612
+ { guid: 's1' },
613
+ { guid: 's2' }
614
+ ]);
615
+
616
+ MyApp.store.loadRecords(MyApp.Master, [
617
+ { guid: 'm1', slaves: ['s1', 's2'] },
618
+ { guid: 'm2', slaves: ['s1', 's2'] }
619
+ ]);
620
+ SC.RunLoop.end();
621
+
622
+ var m1 = MyApp.store.find(MyApp.Master, 'm1'),
623
+ m2 = MyApp.store.find(MyApp.Master, 'm2'),
624
+ s1 = MyApp.store.find(MyApp.Slave, 's1'),
625
+ s2 = MyApp.store.find(MyApp.Slave, 's2');
626
+
627
+ equals(m1.get('slaves').length(), 2, 'precond - m1 should have 2 slaves');
628
+ equals(m2.get('slaves').length(), 2, 'precond - m2 should have 2 slaves');
629
+ ok(s1.get('masters').indexOf(m1) !== -1, 'precond - s1 should have m1 as a master');
630
+ ok(s1.get('masters').indexOf(m2) !== -1, 'precond - s1 should have m2 as a master');
631
+ ok(s2.get('masters').indexOf(m1) !== -1, 'precond - s2 should have m1 as a master');
632
+ ok(s2.get('masters').indexOf(m2) !== -1, 'precond - s2 should have m2 as a master');
633
+
634
+ SC.RunLoop.begin();
635
+ MyApp.store.loadRecords(MyApp.Master, [
636
+ { guid: 'm1', slaves: ['s2'] }
637
+ ]);
638
+ SC.RunLoop.end();
639
+
640
+ equals(m1.get('slaves').length(), 1, 'precond - m1 should have 1 slave');
641
+ equals(m1.get('slaves').objectAt(0), s2, 'precond - m1 should have relationship to s2');
642
+
643
+ ok(s1.get('masters').indexOf(m1) === -1, 's1 should NOT have m1 as a master');
644
+ ok(s1.get('masters').indexOf(m2) !== -1, 's1 should have m2 as a master');
645
+ });
646
+
647
+ // ..........................................................
648
+ // pushDestroy BEHAVIOR
649
+ //
650
+
651
+ /**
652
+ [master] --> [slave]
653
+
654
+ precond - master has slave
655
+ precond - slave has master
656
+
657
+ ... pushDestroy master ...
658
+
659
+ test - slave has NO master
660
+ */
661
+ test("pushDestroy record propagates from master to slave [*(master) to one(slave)]", function () {
662
+ MyApp.Master = SC.Record.extend({
663
+ slave: SC.Record.toOne('MyApp.Slave', {
664
+ inverse: 'master',
665
+ isMaster: YES
666
+ })
667
+ });
668
+
669
+ MyApp.Slave = SC.Record.extend({
670
+ master: SC.Record.toOne('MyApp.Master', {
671
+ inverse: 'slave',
672
+ isMaster: NO
673
+ })
674
+ });
675
+
676
+ SC.RunLoop.begin();
677
+ MyApp.store.loadRecords(MyApp.Slave, [
678
+ { guid: 's1' }
679
+ ]);
680
+
681
+ MyApp.store.loadRecords(MyApp.Master, [
682
+ { guid: 'm1', slave: 's1' }
683
+ ]);
684
+ SC.RunLoop.end();
685
+
686
+ var m1 = MyApp.store.find(MyApp.Master, 'm1'),
687
+ s1 = MyApp.store.find(MyApp.Slave, 's1');
688
+
689
+ equals(m1.get('slave'), s1, 'precond - m1 should have s1 as slave');
690
+ equals(s1.get('master'), m1, 'precond - s1 should have m1 as slave');
691
+
692
+ SC.RunLoop.begin();
693
+ MyApp.store.pushDestroy(MyApp.Master, 'm1');
694
+ SC.RunLoop.end();
695
+
696
+ equals(m1.get('status'), SC.Record.DESTROYED_CLEAN, 'precond - m1 was destroyed');
697
+ ok(SC.none(s1.get('master')), 's1 should NOT have a master');
698
+ });
699
+
700
+ /**
701
+ [master] --> [slave]
702
+
703
+ precond - master has slave
704
+ precond - slave has master
705
+
706
+ ... pushDestroy master ...
707
+
708
+ test - slave has NO master
709
+ */
710
+ test("pushDestroy record propagates from master to many slaves [*(master) to many(slave)]", function () {
711
+ MyApp.Master = SC.Record.extend({
712
+ slaves: SC.Record.toMany('MyApp.Slave', {
713
+ inverse: 'masters',
714
+ isMaster: YES
715
+ })
716
+ });
717
+
718
+ MyApp.Slave = SC.Record.extend({
719
+ masters: SC.Record.toMany('MyApp.Master', {
720
+ inverse: 'slaves',
721
+ isMaster: NO
722
+ })
723
+ });
724
+
725
+ SC.RunLoop.begin();
726
+ MyApp.store.loadRecords(MyApp.Slave, [
727
+ { guid: 's1' },
728
+ { guid: 's2' }
729
+ ]);
730
+
731
+ MyApp.store.loadRecords(MyApp.Master, [
732
+ { guid: 'm1', slaves: ['s1', 's2'] }
733
+ ]);
734
+ SC.RunLoop.end();
735
+
736
+ var m1 = MyApp.store.find(MyApp.Master, 'm1'),
737
+ s1 = MyApp.store.find(MyApp.Slave, 's1'),
738
+ s2 = MyApp.store.find(MyApp.Slave, 's2');
739
+
740
+ equals(m1.get('slaves').length(), 2, 'precond - m1 should have 2 slaves');
741
+ ok(s1.get('masters').indexOf(m1) !== -1, 'precond - s1 should have m1 as a master');
742
+ ok(s2.get('masters').indexOf(m1) !== -1, 'precond - s2 should have m1 as a master');
743
+
744
+ SC.RunLoop.begin();
745
+ MyApp.store.pushDestroy(MyApp.Master, 'm1');
746
+ SC.RunLoop.end();
747
+
748
+ equals(m1.get('status'), SC.Record.DESTROYED_CLEAN, 'precond - m1 was destroyed');
749
+ equals(s1.get('masters').length(), 0, 's1 should NOT have a master');
750
+ equals(s2.get('masters').length(), 0, 's2 should NOT have a master');
751
+ });
752
+
753
+ /**
754
+ [master] --> [slave]
755
+
756
+ precond - slave has a master
757
+ precond - master has a slave
758
+
759
+ slave.destroy();
760
+
761
+ precond - slave is destroyed
762
+
763
+ ... pushDestroy master ...
764
+
765
+ test - slave does NOT exist
766
+ test - master does NOT exist
767
+ */
768
+ test("pushDestroy record doesn't create a slave when it's been destroyed [*(master) to one(slave)]", function () {
769
+ MyApp.Master = SC.Record.extend({
770
+ slave: SC.Record.toOne('MyApp.Slave', {
771
+ inverse: 'master',
772
+ isMaster: YES
773
+ })
774
+ });
775
+
776
+ MyApp.Slave = SC.Record.extend({
777
+ master: SC.Record.toOne('MyApp.Master', {
778
+ inverse: 'slave',
779
+ isMaster: NO
780
+ })
781
+ });
782
+
783
+ SC.RunLoop.begin();
784
+ MyApp.store.loadRecords(MyApp.Slave, [
785
+ { guid: 's1' }
786
+ ]);
787
+
788
+ MyApp.store.loadRecords(MyApp.Master, [
789
+ { guid: 'm1', slave: 's1' }
790
+ ]);
791
+ SC.RunLoop.end();
792
+
793
+ var m1 = MyApp.store.find(MyApp.Master, 'm1'),
794
+ s1 = MyApp.store.find(MyApp.Slave, 's1');
795
+
796
+ equals(m1.get('slave'), s1, 'precond - m1 should have 2 slaves');
797
+ equals(s1.get('master'), m1, 'precond - s1 should have m1 as a master');
798
+
799
+ SC.RunLoop.begin();
800
+ s1.destroy();
801
+ MyApp.store.commitRecords();
802
+ MyApp.store.dataSourceDidDestroy(s1.storeKey);
803
+ SC.RunLoop.end();
804
+
805
+ ok(s1.isDestroyed(), 'precond - s1 should be destroyed');
806
+
807
+ SC.RunLoop.begin();
808
+ MyApp.store.pushDestroy(MyApp.Master, 'm1');
809
+ SC.RunLoop.end();
810
+
811
+ ok(s1.isDestroyed(), 'test - s1 should be destroyed');
812
+ ok(m1.isDestroyed(), 'test - m1 should be destroyed');
813
+ });
814
+
815
+ /**
816
+ Standard Sproutcore Behaviors
817
+
818
+ This is data showing up from the server- after pushing in changes,
819
+ all records should have status READY_CLEAN.
820
+ */
821
+ test("Record status for master and slave should be READY_CLEAN", function () {
822
+ MyApp.Master = SC.Record.extend({
823
+ master: SC.Record.toOne('MyApp.Slave', {
824
+ inverse: 'slave',
825
+ isMaster: YES
826
+ })
827
+ });
828
+
829
+ MyApp.Slave = SC.Record.extend({
830
+ slave: SC.Record.toOne('MyApp.Master', {
831
+ inverse: 'master',
832
+ isMaster: NO
833
+ })
834
+ });
835
+
836
+ // link one -> one
837
+ SC.RunLoop.begin();
838
+ MyApp.store.loadRecords(MyApp.Slave, [
839
+ { guid: 's1' }
840
+ ]);
841
+ SC.RunLoop.end();
842
+
843
+ var s1 = MyApp.store.find(MyApp.Slave, 's1');
844
+ ok(s1.get('status') & SC.Record.READY_CLEAN, 'precond - s1 should be ready clean');
845
+
846
+ SC.RunLoop.begin();
847
+ MyApp.store.loadRecords(MyApp.Master, [
848
+ { guid: 'm1', slave: 's1' }
849
+ ]);
850
+ SC.RunLoop.end();
851
+
852
+ var m1 = MyApp.store.find(MyApp.Master, 'm1');
853
+
854
+ ok(m1.get('status') & SC.Record.READY_CLEAN, 'm1 should be ready clean after linkage');
855
+ ok(s1.get('status') & SC.Record.READY_CLEAN, 's1 should be ready clean after linkage');
856
+
857
+ // unlink
858
+ SC.RunLoop.begin();
859
+ MyApp.store.loadRecords(MyApp.Master, [
860
+ { guid: 'm1' }
861
+ ]);
862
+ SC.RunLoop.end();
863
+
864
+ ok(m1.get('status') & SC.Record.READY_CLEAN, 'm1 should be ready clean after unlink');
865
+ ok(s1.get('status') & SC.Record.READY_CLEAN, 's1 should be ready clean after unlink');
866
+ });
867
+
868
+ test("Record relationships are NOT propagated if related store item does NOT exist at load time", function () {
869
+ MyApp.Generic = SC.Record.extend({
870
+ relative: SC.Record.toOne('MyApp.Generic', {
871
+ inverse: 'relative',
872
+ isMaster: YES
873
+ })
874
+ });
875
+
876
+ SC.RunLoop.begin();
877
+ MyApp.store.loadRecords(MyApp.Generic, [
878
+ { guid: 'g2', relative: 'g1' },
879
+ { guid: 'g1' }
880
+ ]);
881
+ SC.RunLoop.end();
882
+
883
+ var g1 = MyApp.store.find(MyApp.Generic, 'g1'),
884
+ g2 = MyApp.store.find(MyApp.Generic, 'g2');
885
+
886
+ equals(g2.get('relative'), g1, 'precond - g2 should be relative of g1');
887
+ ok(SC.none(g1.get('relative')), 'g1 should not be related to g2');
888
+ });
889
+
890
+ test("Record Attribute can reference renamed attribute key", function () {
891
+ MyApp.Master = SC.Record.extend({
892
+ slave: SC.Record.toOne('MyApp.Slave', {
893
+ inverse: 'master',
894
+ isMaster: YES,
895
+ key: 'alice'
896
+ })
897
+ });
898
+
899
+ MyApp.Slave = SC.Record.extend({
900
+ master: SC.Record.toOne('MyApp.Master', {
901
+ inverse: 'slave',
902
+ isMaster: NO
903
+ })
904
+ });
905
+
906
+ // link one -> one
907
+ SC.RunLoop.begin();
908
+ MyApp.store.loadRecords(MyApp.Slave, [
909
+ { guid: 's1' }
910
+ ]);
911
+ SC.RunLoop.end();
912
+
913
+
914
+ var s1 = MyApp.store.find(MyApp.Slave, 's1');
915
+ ok(s1.get('status') & SC.Record.READY_CLEAN, 'precond - s1 should be ready clean');
916
+
917
+ SC.RunLoop.begin();
918
+ MyApp.store.loadRecords(MyApp.Master, [
919
+ { guid: 'm1', alice: 's1' }
920
+ ]);
921
+ SC.RunLoop.end();
922
+
923
+ var m1 = MyApp.store.find(MyApp.Master, 'm1');
924
+
925
+ equals(m1.get('slave'), s1, 'm1 should be master of s1');
926
+ equals(s1.get('master'), m1, 's1 should have master of m1');
927
+ });
928
+
929
+
930
+ test("Record Attribute can reference renamed attribute key (on remote side)", function () {
931
+ MyApp.Master = SC.Record.extend({
932
+ slave: SC.Record.toOne('MyApp.Slave', {
933
+ inverse: 'master',
934
+ isMaster: YES
935
+ })
936
+ });
937
+
938
+ MyApp.Slave = SC.Record.extend({
939
+ master: SC.Record.toOne('MyApp.Master', {
940
+ inverse: 'slave',
941
+ isMaster: NO,
942
+ key: 'bob'
943
+ })
944
+ });
945
+
946
+ // link one -> one
947
+ SC.RunLoop.begin();
948
+ MyApp.store.loadRecords(MyApp.Slave, [
949
+ { guid: 's1' }
950
+ ]);
951
+ SC.RunLoop.end();
952
+
953
+
954
+ var s1 = MyApp.store.find(MyApp.Slave, 's1');
955
+ ok(s1.get('status') & SC.Record.READY_CLEAN, 'precond - s1 should be ready clean');
956
+
957
+ SC.RunLoop.begin();
958
+ MyApp.store.loadRecords(MyApp.Master, [
959
+ { guid: 'm1', slave: 's1' }
960
+ ]);
961
+ SC.RunLoop.end();
962
+
963
+ var m1 = MyApp.store.find(MyApp.Master, 'm1');
964
+
965
+ equals(m1.get('slave'), s1, 'm1 should be master of s1');
966
+ equals(s1.get('master'), m1, 's1 should have master of m1');
967
+ });
968
+
969
+ test("Record property does change on linkage", function () {
970
+ MyApp.Generic = SC.Record.extend({
971
+ relative: SC.Record.toOne('MyApp.Generic', {
972
+ inverse: 'relative',
973
+ isMaster: YES
974
+ }),
975
+
976
+ callCount: 0,
977
+
978
+ _relativeObserver: function () {
979
+ this.incrementProperty('callCount');
980
+ }.observes('relative')
981
+ });
982
+
983
+ SC.RunLoop.begin();
984
+ MyApp.store.loadRecords(MyApp.Generic, [
985
+ { guid: 'g1' },
986
+ { guid: 'g2' }
987
+ ]);
988
+ SC.RunLoop.end();
989
+
990
+ var g1 = MyApp.store.find(MyApp.Generic, 'g1'),
991
+ g2 = MyApp.store.find(MyApp.Generic, 'g2');
992
+
993
+ equals(g1.get('callCount'), 0, 'precond - g1._relativeObserver should NOT have fired yet');
994
+ equals(g2.get('callCount'), 0, 'precond - g2._relativeObserver should NOT have fired yet');
995
+
996
+ SC.RunLoop.begin();
997
+ MyApp.store.loadRecords(MyApp.Generic, [
998
+ { guid: 'g2', relative: 'g1' }
999
+ ]);
1000
+ SC.RunLoop.end();
1001
+
1002
+ equals(g1.get('relative'), g2, 'precond - g1 should be relative of g2');
1003
+ equals(g2.get('relative'), g1, 'precond - g2 should be relative of g1');
1004
+
1005
+ equals(g1.get('callCount'), 1, 'g1._relativeObserver should fire once');
1006
+ equals(g2.get('callCount'), 1, 'g2._relativeObserver should fire once');
1007
+ });
1008
+
1009
+ // ..........................................................
1010
+ // RECORD ATTRIBUTE
1011
+ //
1012
+
1013
+ /**
1014
+ lazilyInstantiate RecordAttribute flag tests.
1015
+ */
1016
+ test("RecordAttribute flag 'lazilyInstantiate' tests", function () {
1017
+ MyApp.Master = SC.Record.extend({
1018
+ slave: SC.Record.toOne('MyApp.Slave', {
1019
+ inverse: 'master',
1020
+ isMaster: YES,
1021
+ lazilyInstantiate: YES
1022
+ })
1023
+ });
1024
+
1025
+ MyApp.Slave = SC.Record.extend({
1026
+ master: SC.Record.toOne('MyApp.Master', {
1027
+ inverse: 'slave',
1028
+ isMaster: NO,
1029
+ lazilyInstantiate: YES // should be a noop
1030
+ })
1031
+ });
1032
+
1033
+ SC.RunLoop.begin();
1034
+ MyApp.store.loadRecords(MyApp.Master, [
1035
+ { guid: 'm1', slave: 's1' }
1036
+ ]);
1037
+
1038
+ MyApp.store.loadRecords(MyApp.Slave, [
1039
+ { guid: 's2', master: 'm2' }
1040
+ ]);
1041
+ SC.RunLoop.end();
1042
+
1043
+ var m1 = MyApp.store.find(MyApp.Master, 'm1'),
1044
+ m2 = MyApp.store.find(MyApp.Master, 'm2'),
1045
+ s1 = MyApp.store.find(MyApp.Slave, 's1'),
1046
+ s2 = MyApp.store.find(MyApp.Slave, 's2');
1047
+
1048
+ // test lazy creation on isMaster => YES
1049
+ ok(s1, 's1 should be created lazily');
1050
+ equals(m1.get('slave'), s1, 'm1 should be master of s1');
1051
+
1052
+ // test lazy creation fails on isMaster => NO
1053
+ ok(SC.none(m2), 'm2 should NOT have been creaetd');
1054
+ ok(!s2.get('master') ||
1055
+ s2.get('master').get('status') & SC.Record.ERROR, 's2 should have no master record');
1056
+ });
1057
+
1058
+ /**
1059
+ lazilyInstantiate RecordAttribute flag can be a function.
1060
+ */
1061
+ test("RecordAttribute flag 'lazilyInstantiate' can be a function", function () {
1062
+ MyApp.Master = SC.Record.extend({
1063
+ slave: SC.Record.toOne('MyApp.Slave', {
1064
+ inverse: 'master',
1065
+ isMaster: YES,
1066
+ lazilyInstantiate: function () {
1067
+ return NO;
1068
+ }
1069
+ })
1070
+ });
1071
+
1072
+ MyApp.Slave = SC.Record.extend({
1073
+ master: SC.Record.toOne('MyApp.Master', {
1074
+ inverse: 'slave',
1075
+ isMaster: NO,
1076
+ lazilyInstantiate: YES // should be a noop
1077
+ })
1078
+ });
1079
+
1080
+ SC.RunLoop.begin();
1081
+ MyApp.store.loadRecords(MyApp.Master, [
1082
+ { guid: 'm1', slave: 's1' }
1083
+ ]);
1084
+
1085
+ MyApp.store.loadRecords(MyApp.Slave, [
1086
+ { guid: 's2', master: 'm2' }
1087
+ ]);
1088
+ SC.RunLoop.end();
1089
+
1090
+ var m1 = MyApp.store.find(MyApp.Master, 'm1'),
1091
+ m2 = MyApp.store.find(MyApp.Master, 'm2'),
1092
+ s1 = MyApp.store.find(MyApp.Slave, 's1'),
1093
+ s2 = MyApp.store.find(MyApp.Slave, 's2');
1094
+
1095
+ // test lazy creation on isMaster => NO
1096
+ ok(!s1, 's1 should NOT be created lazily');
1097
+
1098
+ // test lazy creation fails on isMaster => NO
1099
+ ok(SC.none(m2), 'm2 should NOT have been creaetd');
1100
+ ok(!s2.get('master') ||
1101
+ s2.get('master').get('status') & SC.Record.ERROR, 's2 should have no master record');
1102
+ });
1103
+
1104
+
1105
+ /**
1106
+ lazilyInstantiate should ride the chain all the way to the top.
1107
+
1108
+ That is, if a record's primaryKey is a record that has the
1109
+ flag 'lazilyInstantiate' on it, it should lazily create that one,
1110
+ and so on.
1111
+ */
1112
+ test("RecordAttribute flag 'lazilyInstantiate' will create chains of records properly", function () {
1113
+ MyApp.SuperMaster = SC.Record.extend({
1114
+ master: SC.Record.toOne('MyApp.Master', {
1115
+ inverse: 'superMaster',
1116
+ isMaster: YES,
1117
+ lazilyInstantiate: YES
1118
+ })
1119
+ });
1120
+
1121
+ MyApp.Master = SC.Record.extend({
1122
+ primaryKey: 'slave',
1123
+
1124
+ superMaster: SC.Record.toOne('MyApp.SuperMaster', {
1125
+ inverse: 'master',
1126
+ isMaster: NO
1127
+ }),
1128
+
1129
+ slave: SC.Record.toOne('MyApp.Slave', {
1130
+ inverse: 'master',
1131
+ isMaster: YES,
1132
+ lazilyInstantiate: YES
1133
+ })
1134
+ });
1135
+
1136
+ MyApp.Slave = SC.Record.extend({
1137
+ primaryKey: 'subSlave',
1138
+
1139
+ master: SC.Record.toOne('MyApp.Master', {
1140
+ inverse: 'slave',
1141
+ isMaster: NO
1142
+ }),
1143
+
1144
+ subSlave: SC.Record.toOne('MyApp.SubSlave', {
1145
+ inverse: 'slave',
1146
+ isMaster: YES,
1147
+ lazilyInstantiate: YES
1148
+ })
1149
+ });
1150
+
1151
+ MyApp.SubSlave = SC.Record.extend({
1152
+ slave: SC.Record.toOne('MyApp.Slave', {
1153
+ inverse: 'subSlave',
1154
+ isMaster: NO
1155
+ })
1156
+ });
1157
+
1158
+ SC.RunLoop.begin();
1159
+ MyApp.store.loadRecords(MyApp.SuperMaster, [
1160
+ { guid: 'sm', master: 's' }
1161
+ ]);
1162
+ SC.RunLoop.end();
1163
+
1164
+ var sm = MyApp.store.find(MyApp.SuperMaster, 'sm'),
1165
+ m = MyApp.store.find(MyApp.Master, 's'),
1166
+ s = MyApp.store.find(MyApp.Slave, 's'),
1167
+ ss = MyApp.store.find(MyApp.SubSlave, 's');
1168
+
1169
+ ok(m, 'm should be created lazily');
1170
+ equals(m.get('superMaster'), sm, 'sm should be master of m');
1171
+
1172
+ ok(s, 's should be created lazily');
1173
+ equals(s.get('master'), m, 'm should be master of s');
1174
+
1175
+ ok(ss, 'ss should be created lazily');
1176
+ equals(ss.get('slave'), s, 's should be master of ss');
1177
+ });