sproutcore 1.7.1.beta → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (445) hide show
  1. data/CHANGELOG +44 -0
  2. data/README.rdoc +20 -20
  3. data/VERSION.yml +3 -3
  4. data/lib/Buildfile +1 -1
  5. data/lib/buildtasks/build.rake +5 -0
  6. data/lib/buildtasks/manifest.rake +19 -1
  7. data/lib/frameworks/sproutcore/Buildfile +19 -17
  8. data/lib/frameworks/sproutcore/CHANGELOG.md +163 -29
  9. data/lib/frameworks/sproutcore/README.md +29 -8
  10. data/lib/frameworks/sproutcore/apps/statechart_routing/Buildfile +12 -0
  11. data/lib/frameworks/sproutcore/apps/statechart_routing/controllers/login_controller.js +11 -0
  12. data/lib/frameworks/sproutcore/apps/statechart_routing/controllers/main_controller.js +7 -0
  13. data/lib/frameworks/sproutcore/apps/statechart_routing/controllers/statechart_controller.js +17 -0
  14. data/lib/frameworks/sproutcore/apps/statechart_routing/core.js +25 -0
  15. data/lib/frameworks/sproutcore/apps/statechart_routing/main.js +15 -0
  16. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/_theme.css +18 -0
  17. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/bar_page.js +14 -0
  18. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/foo_page.js +14 -0
  19. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/loading.rhtml +9 -0
  20. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/login_page.js +61 -0
  21. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/main_page.js +46 -0
  22. data/lib/frameworks/sproutcore/apps/statechart_routing/statechart.js +76 -0
  23. data/lib/frameworks/sproutcore/apps/statechart_routing/theme.js +27 -0
  24. data/lib/frameworks/sproutcore/apps/tests/controllers/targets.js +1 -1
  25. data/lib/frameworks/sproutcore/apps/tests/states/no_targets.js +1 -1
  26. data/lib/frameworks/sproutcore/apps/tests/states/ready_detail.js +1 -1
  27. data/lib/frameworks/sproutcore/apps/tests/states/ready_empty.js +1 -1
  28. data/lib/frameworks/sproutcore/apps/tests/states/ready_list.js +1 -1
  29. data/lib/frameworks/sproutcore/apps/tests/states/ready_no_tests.js +1 -1
  30. data/lib/frameworks/sproutcore/apps/welcome/controllers/targets.js +1 -1
  31. data/lib/frameworks/sproutcore/frameworks/ajax/system/request.js +14 -1
  32. data/lib/frameworks/sproutcore/frameworks/ajax/system/response.js +15 -15
  33. data/lib/frameworks/sproutcore/frameworks/ajax/tests/system/request.js +1 -1
  34. data/lib/frameworks/sproutcore/frameworks/animation/core.js +8 -5
  35. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +302 -70
  36. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/loader.js +19 -14
  37. data/lib/frameworks/sproutcore/frameworks/bootstrap/tests/system/browser.js +471 -149
  38. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +3 -3
  39. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/object.js +42 -0
  40. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/run_loop.js +3 -2
  41. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/string.js +7 -0
  42. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/action_support.js +1 -1
  43. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/delegate_support.js +2 -2
  44. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/responder_context.js +3 -3
  45. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/selection_support.js +1 -1
  46. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/body_overflow.js +63 -0
  47. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/keyboard.js +1 -1
  48. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/layout.js +37 -2
  49. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/main.js +28 -6
  50. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +10 -3
  51. data/lib/frameworks/sproutcore/frameworks/core_foundation/protocols/sparse_array_delegate.js +2 -2
  52. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/browser.js +66 -2
  53. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/builder.js +1 -1
  54. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/cursor.js +1 -1
  55. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +58 -57
  56. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js +1 -1
  57. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js.orig +445 -0
  58. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/platform.js +51 -31
  59. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/ready.js +5 -1
  60. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/render_context.js +53 -69
  61. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/responder.js +1 -1
  62. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +98 -72
  63. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/string.js +37 -3
  64. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/timer.js +7 -4
  65. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/array/array_case.js +21 -0
  66. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/object/content_destroyed.js +7 -7
  67. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/string.js +23 -1
  68. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/browser.js +66 -0
  69. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/event.js +22 -0
  70. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/locale.js +11 -11
  71. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/end.js +4 -4
  72. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/escape_html.js +41 -0
  73. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/helpers_className.js +1 -1
  74. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/helpers_style.js +8 -8
  75. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/update.js +17 -16
  76. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/selection_set/remove.js +1 -1
  77. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/build_children.js +1 -1
  78. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/class_name_bindings_test.js +15 -0
  79. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/createChildViews.js +5 -5
  80. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +50 -30
  81. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/acceleration.js +46 -0
  82. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/animation.js +1 -43
  83. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/keyboard.js +8 -34
  84. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout.js +3 -2
  85. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +10 -1
  86. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/manipulation.js +6 -5
  87. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/theming.js +22 -2
  88. data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +2 -2
  89. data/lib/frameworks/sproutcore/frameworks/datastore/mixins/relationship_support.js +1 -1
  90. data/lib/frameworks/sproutcore/frameworks/datastore/models/child_attribute.js +0 -2
  91. data/lib/frameworks/sproutcore/frameworks/datastore/models/children_attribute.js +35 -0
  92. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +46 -19
  93. data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +23 -9
  94. data/lib/frameworks/sproutcore/frameworks/datastore/models/single_attribute.js +2 -3
  95. data/lib/frameworks/sproutcore/frameworks/datastore/system/many_array.js +1 -1
  96. data/lib/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +2 -2
  97. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +294 -302
  98. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js.orig +1531 -0
  99. data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +4 -2
  100. data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +14 -11
  101. data/lib/frameworks/sproutcore/frameworks/datastore/tests/integration/many_array.js +63 -0
  102. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +1 -1
  103. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record.js +4 -4
  104. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array.js +50 -10
  105. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array_complex.js +4 -4
  106. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_complex.js +3 -3
  107. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/destroy.js +1 -1
  108. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/refresh.js +1 -1
  109. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +1 -1
  110. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/single_attribute.js +114 -67
  111. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +1 -1
  112. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readDataHash.js +1 -1
  113. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/compare.js +54 -1
  114. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation.js +29 -9
  115. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/parse.js +1 -1
  116. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/core_methods.js +1 -1
  117. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/flush.js +1 -1
  118. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/cancelRecord.js +1 -1
  119. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitChangesFromNestedStore.js +1 -1
  120. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +37 -45
  121. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/find.js +127 -127
  122. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushChanges.js +16 -0
  123. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushRelationships.js +42 -4
  124. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/readDataHash.js +1 -1
  125. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +13 -7
  126. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/tests/system/datetime.js +8 -0
  127. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/resources/strings.js +2 -1
  128. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/system/datetime.js +1 -0
  129. data/lib/frameworks/sproutcore/frameworks/debug/core.js +3 -3
  130. data/lib/frameworks/sproutcore/frameworks/desktop/core.js +1 -1
  131. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +1 -1
  132. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_view_delegate.js +1 -1
  133. data/lib/frameworks/sproutcore/frameworks/desktop/panes/alert.js +1 -4
  134. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +19 -6
  135. data/lib/frameworks/sproutcore/frameworks/desktop/panes/modal.js +30 -1
  136. data/lib/frameworks/sproutcore/frameworks/desktop/panes/palette.js +1 -1
  137. data/lib/frameworks/sproutcore/frameworks/desktop/panes/panel.js +24 -1
  138. data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +121 -28
  139. data/lib/frameworks/sproutcore/frameworks/desktop/panes/sheet.js +15 -15
  140. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drag_data_source.js +1 -1
  141. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +2 -2
  142. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/responder.js +2 -2
  143. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/button.js +39 -15
  144. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/collection.js +3 -3
  145. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/disclosure.js +2 -2
  146. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/image_button.js +2 -2
  147. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/panel.js +14 -6
  148. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/popup_button.js +3 -3
  149. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/progress.js +11 -11
  150. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/segment.js +4 -3
  151. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/segmented.js +1 -51
  152. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/slider.js +11 -16
  153. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-error-48.png +0 -0
  154. data/lib/frameworks/sproutcore/frameworks/desktop/resources/slider.css +0 -2
  155. data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +3 -3
  156. data/lib/frameworks/sproutcore/frameworks/desktop/system/undo_manager.js +3 -3
  157. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +9 -9
  158. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/content.js +11 -11
  159. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +2 -1
  160. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/reload.js +1 -1
  161. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/date_field/ui.js +107 -81
  162. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowDelegate.js +3 -3
  163. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +68 -60
  164. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/radio/methods.js +57 -12
  165. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/integration.js +21 -19
  166. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroller.js +5 -0
  167. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +2 -2
  168. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select/ui.js +32 -3
  169. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/split/methods.js +12 -0
  170. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/stacked/ui_comments.js +12 -0
  171. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/tab/methods.js +0 -8
  172. data/lib/frameworks/sproutcore/frameworks/desktop/views/button.js +77 -132
  173. data/lib/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +5 -6
  174. data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +16 -15
  175. data/lib/frameworks/sproutcore/frameworks/desktop/views/date_field.js +52 -52
  176. data/lib/frameworks/sproutcore/frameworks/desktop/views/disclosure.js +1 -1
  177. data/lib/frameworks/sproutcore/frameworks/desktop/views/grid.js +1 -1
  178. data/lib/frameworks/sproutcore/frameworks/desktop/views/list.js +147 -147
  179. data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +11 -2
  180. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +2 -2
  181. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +5 -5
  182. data/lib/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +22 -12
  183. data/lib/frameworks/sproutcore/frameworks/desktop/views/radio.js +13 -7
  184. data/lib/frameworks/sproutcore/frameworks/desktop/views/scene.js +2 -2
  185. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +462 -441
  186. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroller.js +48 -62
  187. data/lib/frameworks/sproutcore/frameworks/desktop/views/segment.js +22 -2
  188. data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +150 -32
  189. data/lib/frameworks/sproutcore/frameworks/desktop/views/select.js +104 -45
  190. data/lib/frameworks/sproutcore/frameworks/desktop/views/select_button.js +42 -20
  191. data/lib/frameworks/sproutcore/frameworks/desktop/views/slider.js +24 -24
  192. data/lib/frameworks/sproutcore/frameworks/desktop/views/split.js +148 -154
  193. data/lib/frameworks/sproutcore/frameworks/desktop/views/stacked.js +2 -2
  194. data/lib/frameworks/sproutcore/frameworks/desktop/views/static_content.js +2 -2
  195. data/lib/frameworks/sproutcore/frameworks/desktop/views/tab.js +8 -7
  196. data/lib/frameworks/sproutcore/frameworks/desktop/views/web.js +2 -2
  197. data/lib/frameworks/sproutcore/frameworks/experimental/Buildfile +2 -0
  198. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/files.js +1 -1
  199. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/library.js +1 -1
  200. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/targets.js +1 -1
  201. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/view_configs.js +1 -1
  202. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/mixins/drop_down.js +1 -1
  203. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/states/ready.js +1 -1
  204. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/views/plist_item.js +1 -1
  205. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/views/web.js +1 -1
  206. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/controllers/page_design.js +2 -2
  207. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/css/css_style_sheet.js +2 -2
  208. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/designers/object_designer.js +1 -1
  209. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/designers/view_designer.js +2 -2
  210. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/mixins/snap_lines.js +3 -3
  211. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/views/designer_drop_target.js +1 -1
  212. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/views/drawing.js +21 -21
  213. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/views/page_item_view.js +1 -1
  214. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/views/form.js +59 -53
  215. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroll.js +2 -2
  216. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/polymorphism/tests/models/polymorphism/simple.js +1 -1
  217. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroll.js +6 -6
  218. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroll.js +2 -2
  219. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroll.js +2 -2
  220. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/ext/menu.js +14 -10
  221. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/ext/menu_item.js +17 -6
  222. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/views/popup_button.js +38 -14
  223. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/views/select.js +5 -13
  224. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/mixins/split_child.js +1 -1
  225. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/mixins/split_thumb.js +5 -3
  226. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/tests/children.js +19 -0
  227. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/tests/methods.js +20 -2
  228. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/tests/split_thumb.js +1 -1
  229. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/views/split.js +35 -12
  230. data/lib/frameworks/sproutcore/frameworks/formatters/README +6 -0
  231. data/lib/frameworks/sproutcore/frameworks/formatters/english.lproj/strings.js +174 -0
  232. data/lib/frameworks/sproutcore/frameworks/formatters/formatters/date_formatter.js +351 -0
  233. data/lib/frameworks/sproutcore/frameworks/formatters/tests/date_formatter.js +517 -0
  234. data/lib/frameworks/sproutcore/frameworks/foundation/core.js +1 -1
  235. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_resize.js +345 -138
  236. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/button.js +5 -3
  237. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/content_value_support.js +176 -42
  238. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/editable.js +1 -1
  239. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/flowed_layout.js +137 -105
  240. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/gestureable.js +2 -2
  241. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_editable.js +2 -2
  242. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_editor.js +16 -1
  243. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/static_layout.js +1 -1
  244. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/validatable.js +47 -47
  245. data/lib/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +3 -3
  246. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/helpers/sizing.js +1 -1
  247. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/label.js +28 -6
  248. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/render_delegate.js +1 -1
  249. data/lib/frameworks/sproutcore/frameworks/foundation/resources/benchmark.css +0 -5
  250. data/lib/frameworks/sproutcore/frameworks/foundation/resources/bootstrap.rhtml +34 -19
  251. data/lib/frameworks/sproutcore/frameworks/foundation/resources/button_view.css +0 -2
  252. data/lib/frameworks/sproutcore/frameworks/foundation/resources/label.css +1 -5
  253. data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +8 -9
  254. data/lib/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +2 -2
  255. data/lib/frameworks/sproutcore/frameworks/foundation/system/module.js +179 -47
  256. data/lib/frameworks/sproutcore/frameworks/foundation/system/task_queue.js +34 -1
  257. data/lib/frameworks/sproutcore/frameworks/foundation/system/text_selection.js +1 -1
  258. data/lib/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +26 -12
  259. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/misc.js +7 -7
  260. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/string_measurement.js +12 -4
  261. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/string_metric_optimization.js +202 -0
  262. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/content_value_support/content.js +77 -8
  263. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/flowed_layout/tests.js +1 -0
  264. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editable/beginEditing.js +2 -2
  265. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editable/commitEditing.js +4 -3
  266. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editable/discardEditing.js +4 -2
  267. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editor/beginEditing.js +2 -2
  268. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editor/commitEditing.js +4 -2
  269. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editor/discardEditing.js +4 -2
  270. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/utils/pointInElement.js +2 -2
  271. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +0 -8
  272. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +163 -149
  273. data/lib/frameworks/sproutcore/frameworks/foundation/validators/credit_card.js +1 -1
  274. data/lib/frameworks/sproutcore/frameworks/foundation/validators/date.js +1 -1
  275. data/lib/frameworks/sproutcore/frameworks/foundation/validators/date_time.js +1 -1
  276. data/lib/frameworks/sproutcore/frameworks/foundation/validators/password.js +1 -1
  277. data/lib/frameworks/sproutcore/frameworks/foundation/validators/validator.js +3 -3
  278. data/lib/frameworks/sproutcore/frameworks/foundation/views/field.js +16 -43
  279. data/lib/frameworks/sproutcore/frameworks/foundation/views/image.js +4 -3
  280. data/lib/frameworks/sproutcore/frameworks/foundation/views/inline_text_field.js +67 -54
  281. data/lib/frameworks/sproutcore/frameworks/foundation/views/label.js +49 -38
  282. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +285 -242
  283. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-buffer.js +13 -13
  284. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-buffered.js +19 -22
  285. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-sc.js +9 -3
  286. data/lib/frameworks/sproutcore/frameworks/jquery/jquery.js +231 -186
  287. data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +145 -143
  288. data/lib/frameworks/sproutcore/frameworks/media/views/video.js +156 -154
  289. data/lib/frameworks/sproutcore/frameworks/qunit/qunit/qunit.js +5 -5
  290. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +3 -3
  291. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js.orig +540 -0
  292. data/lib/frameworks/sproutcore/frameworks/routing/tests/system/routes.js +2 -2
  293. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +15 -8
  294. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/base.js +5 -5
  295. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +12 -0
  296. data/lib/frameworks/sproutcore/frameworks/runtime/ext/function.js +2 -2
  297. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/array.js +1 -1
  298. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/copyable.js +1 -1
  299. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +7 -7
  300. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +98 -32
  301. data/lib/frameworks/sproutcore/frameworks/runtime/private/chain_observer.js +7 -2
  302. data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +14 -3
  303. data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +98 -13
  304. data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +8 -14
  305. data/lib/frameworks/sproutcore/frameworks/runtime/system/enumerator.js +1 -1
  306. data/lib/frameworks/sproutcore/frameworks/runtime/system/error.js +2 -2
  307. data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +23 -6
  308. data/lib/frameworks/sproutcore/frameworks/runtime/system/logger.js +69 -18
  309. data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +57 -31
  310. data/lib/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +189 -14
  311. data/lib/frameworks/sproutcore/frameworks/runtime/system/string.js +82 -22
  312. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/chained.js +20 -0
  313. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +125 -4
  314. data/lib/frameworks/sproutcore/frameworks/runtime/tests/private/observer_queue.js +1 -1
  315. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +2 -2
  316. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/rangeStartForIndex.js +37 -0
  317. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/remove.js +2 -2
  318. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/logger.js +16 -0
  319. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/run_loop.js +75 -4
  320. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/string.js +41 -0
  321. data/lib/frameworks/sproutcore/frameworks/statechart/mixins/statechart_delegate.js +113 -0
  322. data/lib/frameworks/sproutcore/frameworks/statechart/private/state_path_matcher.js +312 -0
  323. data/lib/frameworks/sproutcore/frameworks/statechart/system/async.js +18 -22
  324. data/lib/frameworks/sproutcore/frameworks/statechart/system/state.js +508 -131
  325. data/lib/frameworks/sproutcore/frameworks/statechart/system/state_route_handler_context.js +78 -0
  326. data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +265 -44
  327. data/lib/frameworks/sproutcore/frameworks/statechart/tests/event_handling/basic/with_concurrent_states.js +16 -0
  328. data/lib/frameworks/sproutcore/frameworks/statechart/tests/event_handling/responder/responder_chain.js +11 -3
  329. data/lib/frameworks/sproutcore/frameworks/statechart/tests/private/state_path_matcher.js +116 -0
  330. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/add_substate.js +108 -0
  331. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/find_first_relative_current_state/with_concurrent.js +179 -0
  332. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/find_first_relative_current_state/without_concurrent.js +74 -0
  333. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/get_state.js +141 -0
  334. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/get_substate.js +340 -0
  335. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/route_triggered.js +161 -0
  336. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/try_to_handle_event.js +288 -0
  337. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/history_state/standard/without_concurrent_states/context.js +5 -33
  338. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/routing/with_concurrent_states/basic.js +213 -0
  339. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/routing/without_concurrent_states/basic.js +212 -0
  340. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/standard/without_concurrent_states/core.js +8 -0
  341. data/lib/frameworks/sproutcore/frameworks/statechart/tests/{state/namespacing.js → statechart/methods/get_state.js} +3 -41
  342. data/lib/frameworks/sproutcore/frameworks/statechart/tests/statechart/{invoke_state_method.js → methods/invoke_state_method.js} +1 -1
  343. data/lib/frameworks/sproutcore/frameworks/statechart/tests/{event_handling/advanced → statechart}/respond_to_event.js +1 -1
  344. data/lib/frameworks/sproutcore/frameworks/statechart/tests/system/state_route_handler_context/methods/retry.js +64 -0
  345. data/lib/frameworks/sproutcore/frameworks/table/core.js +2 -0
  346. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/controls/button.js +0 -1
  347. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars.js +29 -5
  348. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/bind.js +4 -3
  349. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/collection.js +0 -0
  350. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/localization.js +0 -0
  351. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/view.js +0 -0
  352. data/lib/frameworks/sproutcore/frameworks/{handlebars → template_view}/handlebars.js +493 -357
  353. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/mixins/template_helpers/checkbox_support.js +0 -0
  354. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/mixins/template_helpers/text_field_support.js +13 -2
  355. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/panes/template.js +0 -0
  356. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/controls/button.js +0 -0
  357. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/mixins/template_helpers/checkbox_support.js +0 -0
  358. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/mixins/template_helpers/text_field_support.js +0 -0
  359. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/panes/template.js +0 -0
  360. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/views/template/collection.js +39 -14
  361. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/views/template/core.js +0 -0
  362. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/views/template/handlebars.js +57 -6
  363. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/views/bindable_span.js +21 -6
  364. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/views/template.js +9 -3
  365. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/views/template_collection.js +55 -26
  366. data/lib/frameworks/sproutcore/frameworks/testing/system/equiv.js +1 -1
  367. data/lib/frameworks/sproutcore/frameworks/testing/system/plan.js +122 -122
  368. data/lib/frameworks/sproutcore/frameworks/testing/system/runner.js +2 -2
  369. data/lib/frameworks/sproutcore/frameworks/testing/system/suite.js +4 -4
  370. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/base.css +1 -1
  371. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/reset.css +0 -1
  372. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/view.css +4 -4
  373. data/lib/frameworks/sproutcore/lib/index.rhtml +55 -32
  374. data/lib/frameworks/sproutcore/license.js +2 -4
  375. data/lib/frameworks/sproutcore/themes/ace/resources/body.css +5 -1
  376. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/18px/button.css +2 -2
  377. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/24px/button.css +21 -13
  378. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/30px/button.css +17 -10
  379. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/44px/button.css +4 -3
  380. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/24px/button.css +20 -12
  381. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/30px/button.css +16 -8
  382. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/jumbo/button.css +17 -0
  383. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/small/button.css +17 -0
  384. data/lib/frameworks/sproutcore/themes/ace/resources/disclosure/ace/disclosure.css +2 -2
  385. data/lib/frameworks/sproutcore/themes/ace/resources/master-detail/master-detail.css +2 -2
  386. data/lib/frameworks/sproutcore/themes/ace/resources/picker/popover/popover.css +5 -3
  387. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/core.css +1 -1
  388. data/lib/frameworks/sproutcore/themes/legacy_theme/english.lproj/toolbar.css +1 -1
  389. data/lib/gen/app/USAGE +17 -4
  390. data/lib/gen/language/Buildfile +4 -4
  391. data/lib/gen/language/USAGE +4 -4
  392. data/lib/gen/page/templates/pages/@target_name@/Buildfile +7 -7
  393. data/lib/gen/{html_app → statechart_app}/Buildfile +0 -0
  394. data/lib/gen/{html_app → statechart_app}/README +0 -0
  395. data/lib/gen/statechart_app/USAGE +21 -0
  396. data/lib/gen/statechart_app/templates/apps/@target_name@/Buildfile +9 -0
  397. data/lib/gen/statechart_app/templates/apps/@target_name@/core.js +24 -0
  398. data/lib/gen/statechart_app/templates/apps/@target_name@/main.js +26 -0
  399. data/lib/gen/statechart_app/templates/apps/@target_name@/resources/_theme.css +18 -0
  400. data/lib/gen/statechart_app/templates/apps/@target_name@/resources/loading.rhtml +9 -0
  401. data/lib/gen/statechart_app/templates/apps/@target_name@/resources/main_page.js +21 -0
  402. data/lib/gen/statechart_app/templates/apps/@target_name@/statechart.js +8 -0
  403. data/lib/gen/statechart_app/templates/apps/@target_name@/states/ready_state.js +12 -0
  404. data/lib/gen/statechart_app/templates/apps/@target_name@/theme.js +24 -0
  405. data/lib/sproutcore/builders.rb +1 -0
  406. data/lib/sproutcore/builders/base.rb +19 -1
  407. data/lib/sproutcore/builders/chance_file.rb +6 -1
  408. data/lib/sproutcore/builders/handlebars.rb +1 -9
  409. data/lib/sproutcore/builders/javascript.rb +1 -10
  410. data/lib/sproutcore/builders/json.rb +25 -0
  411. data/lib/sproutcore/builders/less.rb +1 -1
  412. data/lib/sproutcore/builders/sass.rb +1 -1
  413. data/lib/sproutcore/builders/stylesheet.rb +1 -9
  414. data/lib/sproutcore/helpers/html5_manifest.rb +1 -1
  415. data/lib/sproutcore/helpers/static_helper.rb +42 -0
  416. data/lib/sproutcore/rack/proxy.rb +21 -3
  417. data/lib/sproutcore/rack/service.rb +3 -2
  418. data/lib/sproutcore/tools.rb +18 -25
  419. data/lib/sproutcore/tools/gen.rb +10 -3
  420. data/lib/sproutcore/tools/init.rb +11 -10
  421. data/spec/buildtasks/manifest/prepare_build_tasks/json_spec.rb +62 -0
  422. data/spec/fixtures/builder_tests/apps/handlebars_test/Buildfile +1 -1
  423. data/spec/fixtures/builder_tests/apps/json_test/sc_static.json +2 -0
  424. data/spec/lib/builders/json_spec.rb +53 -0
  425. data/sproutcore.gemspec +2 -2
  426. data/vendor/chance/lib/chance/parser.rb +1 -1
  427. metadata +222 -177
  428. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/datetime.js +0 -0
  429. data/lib/frameworks/sproutcore/frameworks/debug/invoke_once_last_debugging.js +0 -259
  430. data/lib/frameworks/sproutcore/frameworks/documentation/core.js +0 -0
  431. data/lib/frameworks/sproutcore/frameworks/foundation/system/chance.js +0 -69
  432. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/editable/ui.js +0 -44
  433. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/ui.js +0 -64
  434. data/lib/frameworks/sproutcore/frameworks/mini/license.js +0 -30
  435. data/lib/gen/html_app/USAGE +0 -15
  436. data/lib/gen/html_app/templates/apps/@target_name@/@target_name@.js +0 -11
  437. data/lib/gen/html_app/templates/apps/@target_name@/resources/images/.gitkeep +0 -0
  438. data/lib/gen/html_app/templates/apps/@target_name@/resources/stylesheets/@target_name@.css +0 -6
  439. data/lib/gen/html_app/templates/apps/@target_name@/resources/templates/@target_name@.handlebars +0 -1
  440. data/lib/gen/html_project/Buildfile +0 -45
  441. data/lib/gen/html_project/INIT +0 -3
  442. data/lib/gen/html_project/README +0 -1
  443. data/lib/gen/html_project/USAGE +0 -2
  444. data/lib/gen/html_project/templates/@filename@/Buildfile +0 -5
  445. data/lib/gen/html_project/templates/@filename@/README +0 -4
@@ -279,7 +279,7 @@ SC.RecordArray = SC.Object.extend(SC.Enumerable, SC.Array,
279
279
 
280
280
  /**
281
281
  Adds the specified record to the record array if it is not already part
282
- of the array. Provided for compatibilty with `SC.Set`.
282
+ of the array. Provided for compatibility with `SC.Set`.
283
283
 
284
284
  @param {SC.Record} record
285
285
  @returns {SC.RecordArray} receiver
@@ -551,7 +551,9 @@ SC.RecordArray = SC.Object.extend(SC.Enumerable, SC.Array,
551
551
  // otherwise, lookup all storeKeys for the named recordType...
552
552
  } else if (recordType = query.get('expandedRecordTypes')) {
553
553
  sourceKeys = SC.IndexSet.create();
554
- sourceKeys.addEach(store.storeKeysFor(recordType));
554
+ recordType.forEach(function(cur) {
555
+ sourceKeys.addEach(store.storeKeysFor(cur));
556
+ });
555
557
  }
556
558
 
557
559
  // loop through storeKeys to determine if it belongs in this query or
@@ -487,7 +487,7 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
487
487
  dataHashDidChange: function(storeKeys, rev, statusOnly, key) {
488
488
 
489
489
  // update the revision for storeKey. Use generateStoreKey() because that
490
- // gaurantees a universally (to this store hierarchy anyway) unique
490
+ // guarantees a universally (to this store hierarchy anyway) unique
491
491
  // key value.
492
492
  if (!rev) rev = SC.Store.generateStoreKey();
493
493
  var isArray, len, idx, storeKey;
@@ -678,7 +678,7 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
678
678
 
679
679
  /** @private
680
680
  Called by a nested store on a parent store to commit any changes from the
681
- store. This will copy any changed dataHashes as well as any persistant
681
+ store. This will copy any changed dataHashes as well as any persistent
682
682
  change logs.
683
683
 
684
684
  If the parentStore detects a conflict with the optimistic locking, it will
@@ -1120,7 +1120,7 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1120
1120
 
1121
1121
  // add dataHash and setup initial status -- also save recordType
1122
1122
  this.writeDataHash(storeKey, (dataHash ? dataHash : {}), K.READY_NEW);
1123
-
1123
+
1124
1124
  SC.Store.replaceRecordTypeFor(storeKey, recordType);
1125
1125
  this.dataHashDidChange(storeKey);
1126
1126
 
@@ -1136,7 +1136,7 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1136
1136
  }
1137
1137
 
1138
1138
  // Finally return materialized record, after we propagate the status to
1139
- // any aggregrate records.
1139
+ // any aggregate records.
1140
1140
  ret = this.materializeRecord(storeKey);
1141
1141
  if (ret) ret.propagateToAggregates();
1142
1142
  return ret;
@@ -1416,7 +1416,9 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1416
1416
  var children = this.parentRecords[storeKey] || {};
1417
1417
  if (SC.none(func)) return;
1418
1418
  for (var key in children) {
1419
- if (children.hasOwnProperty(key)) func(key);
1419
+ // for .. in makes the key a String, but be sure to pass a Number to the
1420
+ // function.
1421
+ if (children.hasOwnProperty(key)) func(parseInt(key, 10));
1420
1422
  }
1421
1423
  },
1422
1424
 
@@ -1714,7 +1716,7 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1714
1716
  @param {String} id to id of the record to load
1715
1717
  @param {SC.Record} recordType the expected record type
1716
1718
  @param {Number} storeKey (optional) optional store key
1717
- @param {Function} callback (optional) when refresh complets
1719
+ @param {Function} callback (optional) when refresh completes
1718
1720
  @returns {Boolean} YES if the retrieval was a success.
1719
1721
  */
1720
1722
  refreshRecord: function(recordType, id, storeKey, callback) {
@@ -1729,7 +1731,7 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1729
1731
  @param {SC.Record|Array} recordTypes class or array of classes
1730
1732
  @param {Array} ids ids to destroy
1731
1733
  @param {Array} storeKeys (optional) store keys to destroy
1732
- @param {Function} callback (optional) when refresh complets
1734
+ @param {Function} callback (optional) when refresh completes
1733
1735
  @returns {Boolean} YES if the retrieval was a success.
1734
1736
  */
1735
1737
  refreshRecords: function(recordTypes, ids, storeKeys, callback) {
@@ -1789,7 +1791,7 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1789
1791
  // collect status and process
1790
1792
  status = this.readStatus(storeKey);
1791
1793
 
1792
- if ((status == K.EMPTY) || (status == K.ERROR)) {
1794
+ if (status == K.ERROR) {
1793
1795
  throw K.NOT_FOUND_ERROR ;
1794
1796
  }
1795
1797
  else {
@@ -1811,7 +1813,7 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1811
1813
  } else if (status==K.DESTROYED_CLEAN) {
1812
1814
  this.dataHashDidChange(storeKey, rev, YES);
1813
1815
  }
1814
- // ignore K.READY_CLEAN, K.BUSY_LOADING, K.BUSY_CREATING, K.BUSY_COMMITTING,
1816
+ // ignore K.EMPTY, K.READY_CLEAN, K.BUSY_LOADING, K.BUSY_CREATING, K.BUSY_COMMITTING,
1815
1817
  // K.BUSY_REFRESH_CLEAN, K_BUSY_REFRESH_DIRTY, KBUSY_DESTROYING
1816
1818
  }
1817
1819
  }
@@ -1821,7 +1823,7 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1821
1823
  ret = source.commitRecords.call(source, this, retCreate, retUpdate, retDestroy, params);
1822
1824
  }
1823
1825
 
1824
- //remove all commited changes from changelog
1826
+ //remove all committed changes from changelog
1825
1827
  if (ret && !recordTypes && !ids) {
1826
1828
  if (storeKeys === this.changelog) {
1827
1829
  this.changelog = null;
@@ -1844,7 +1846,7 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
1844
1846
  @param {SC.Record} recordType the expected record type
1845
1847
  @param {String} id the id of the record to commit
1846
1848
  @param {Number} storeKey the storeKey of the record to commit
1847
- @param {Hash} params optional additonal params that will passed down
1849
+ @param {Hash} params optional additional params that will passed down
1848
1850
  to the data source
1849
1851
  @param {Function|Array} callback function or array of functions
1850
1852
  @returns {Boolean} if the action was successful.
@@ -2258,6 +2260,7 @@ SC.Store = SC.Object.extend( /** @scope SC.Store.prototype */ {
2258
2260
  if(dataHash===undefined) this.writeStatus(storeKey, status) ;
2259
2261
  else this.writeDataHash(storeKey, dataHash, status) ;
2260
2262
 
2263
+ if (id && this.idFor(storeKey) !== id) SC.Store.replaceIdFor(storeKey, id);
2261
2264
  this.dataHashDidChange(storeKey);
2262
2265
 
2263
2266
  return storeKey;
@@ -0,0 +1,63 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore - JavaScript Application Framework
3
+ // Copyright: ©2006-2011 Strobe Inc. and contributors.
4
+ // Portions ©2008-2011 Apple Inc. All rights reserved.
5
+ // License: Licensed under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ var MyDataSource = SC.DataSource.extend({
9
+ retrieveRecordsArguments: [],
10
+
11
+ retrieveRecords: function(store, storeKeys) {
12
+ this.get('retrieveRecordsArguments').push(storeKeys);
13
+ sc_super();
14
+ }
15
+ });
16
+
17
+ var MyApp = {};
18
+
19
+ MyApp.Todo = SC.Record.extend({
20
+ title: SC.Record.attr(String),
21
+ project: SC.Record.toOne("MyApp.Project", {
22
+ inverse: "todos", isMaster: NO
23
+ })
24
+ });
25
+
26
+ MyApp.Project = SC.Record.extend({
27
+ name: SC.Record.attr(String),
28
+ todos: SC.Record.toMany("MyApp.Todo", {
29
+ inverse: "project", isMaster: YES
30
+ })
31
+ });
32
+
33
+ module("SC.Record.toMany array with data source", {
34
+ setup: function() {
35
+ window.MyApp = MyApp;
36
+ window.MyDataSource = MyDataSource;
37
+ },
38
+ teardown: function() {
39
+ window.MyApp = null;
40
+ window.MyDataSource = null;
41
+ }
42
+ });
43
+
44
+ test("when retrieving records with toMany association, it should call retrieveRecords once instead of calling retrieveRecord multiple times", function() {
45
+ var store = SC.Store.create().from("MyDataSource");
46
+ SC.RunLoop.begin();
47
+ store.loadRecords(MyApp.Project, [
48
+ {
49
+ guid: 1,
50
+ name: 'SproutCore',
51
+ todos: [1, 2, 3]
52
+ }
53
+ ]);
54
+ SC.RunLoop.end();
55
+
56
+ SC.RunLoop.begin();
57
+ var todos = store.find(MyApp.Project, 1).get('todos').toArray();
58
+ SC.RunLoop.end();
59
+
60
+ same(todos.length, 3);
61
+ // retrieveRecords should be called only once
62
+ same(store.get('dataSource').get('retrieveRecordsArguments').length, 1);
63
+ });
@@ -332,7 +332,7 @@ test("adding a record to a many-to-many; bar side", function() {
332
332
 
333
333
  bar3.get('fooToMany').pushObject(foo2);
334
334
 
335
- // v-- since bar3 is added throught inverse, it should follow orderBy
335
+ // v-- since bar3 is added through inverse, it should follow orderBy
336
336
  equals(foo2.get('barToMany').indexOf(bar3), 1, 'foo1.barToMany should contain bar1');
337
337
  ok(bar3.get('fooToMany').indexOf(foo2) >= 0, 'bar1.fooToMany should contain foo1');
338
338
 
@@ -80,7 +80,7 @@ module("Basic SC.Record Functions w/ Parent > Child", {
80
80
  store = null;
81
81
  childData1 = null;
82
82
  NestedRecord = null;
83
- delete(window.NestedRecord);
83
+ //delete(window.NestedRecord);
84
84
  }
85
85
  });
86
86
 
@@ -164,7 +164,7 @@ test("Basic Read", function() {
164
164
  ok(storeRef, 'checking that the store has the instance of the child record with proper primary key');
165
165
  equals(cr, storeRef, "checking the parent reference is the same as the direct store reference");
166
166
 
167
- // Check to see if the attributes of a Child Record match the refrence of the parent
167
+ // Check to see if the attributes of a Child Record match the reference of the parent
168
168
  same(storeRef.get('attributes'), testParent.readAttribute('info'), "check that the ChildRecord's attributes are the same as the ParentRecord's readAttribute for the reference");
169
169
 
170
170
  // Duplication check
@@ -211,7 +211,7 @@ test("Basic Write As a Hash", function() {
211
211
  ok(cr.get('status') & SC.Record.DIRTY, 'check that the child record is dirty');
212
212
  ok(testParent.get('status') & SC.Record.DIRTY, 'check that the parent record is dirty');
213
213
  var newCR = testParent.get('info');
214
- same(newCR, cr, "after a set('name', <new>) on child, checking to see that the parent has recieved the changes from the child record");
214
+ same(newCR, cr, "after a set('name', <new>) on child, checking to see that the parent has received the changes from the child record");
215
215
  same(testParent.readAttribute('info'), cr.get('attributes'), "after a set('name', <new>) on child, readAttribute on the parent should be correct for info child attributes");
216
216
  });
217
217
 
@@ -248,7 +248,7 @@ test("Basic Write As a Child Record", function() {
248
248
  ok(cr.get('status') & SC.Record.DIRTY, 'check that the child record is dirty');
249
249
  ok(testParent.get('status') & SC.Record.DIRTY, 'check that the parent record is dirty');
250
250
  var newCR = testParent.get('info');
251
- same(newCR, cr, "after a set('name', <new>) on child, checking to see that the parent has recieved the changes from the child record");
251
+ same(newCR, cr, "after a set('name', <new>) on child, checking to see that the parent has received the changes from the child record");
252
252
  same(testParent.readAttribute('info'), cr.get('attributes'), "after a set('name', <new>) on child, readAttribute on the parent should be correct for info child attributes");
253
253
 
254
254
  // Make sure you can set the child to null.
@@ -10,13 +10,6 @@
10
10
  var NestedRecord, store, testParent, testParent2;
11
11
 
12
12
  var initModels = function(){
13
- NestedRecord.ParentRecordTest = SC.Record.extend({
14
- /** Child Record Namespace */
15
- nestedRecordNamespace: NestedRecord,
16
-
17
- name: SC.Record.attr(String),
18
- elements: SC.Record.toMany('SC.Record', { nested: true })
19
- });
20
13
 
21
14
  NestedRecord.ChildRecordTest1 = SC.Record.extend({
22
15
  name: SC.Record.attr(String),
@@ -28,8 +21,39 @@ var initModels = function(){
28
21
  info: SC.Record.attr(String),
29
22
  value: SC.Record.attr(String)
30
23
  });
24
+
25
+ NestedRecord.ParentRecordTest = SC.Record.extend({
26
+ /** Child Record Namespace */
27
+ nestedRecordNamespace: NestedRecord,
28
+
29
+ name: SC.Record.attr(String),
30
+ elements: SC.Record.toMany('SC.Record', { nested: true }),
31
+
32
+ defaultElements: SC.Record.toMany(NestedRecord.ChildRecordTest1, {
33
+ isNested: true,
34
+ defaultValue: function(record, key) {
35
+ var array = [];
36
+ array.pushObject(record.createNestedRecord(NestedRecord.ChildRecordTest1));
37
+ return array;
38
+ }
39
+ }),
40
+
41
+ defaultPolymorphicElements: SC.Record.toMany('SC.Record', {
42
+ isNested: true,
43
+ defaultValue: function(record, key) {
44
+ var array = [];
45
+ array.pushObject(record.createNestedRecord(SC.Record, {
46
+ type: 'ChildRecordTest1',
47
+ name: 'Default Child 1',
48
+ value: 'burninate'
49
+ }));
50
+ return array;
51
+ }
52
+ })
53
+ });
31
54
  };
32
55
 
56
+
33
57
  // ..........................................................
34
58
  // Basic SC.Record with an Array of Children
35
59
  //
@@ -162,7 +186,23 @@ test("Basic Read", function() {
162
186
  var cr = arrayOfCRs.objectAt(0);
163
187
  ok(SC.kindOf(cr, SC.Record), "check that first ChildRecord from the get() creates an actual instance that is a kind of a SC.Record Object");
164
188
  ok(SC.instanceOf(cr, NestedRecord.ChildRecordTest1), "check that first ChildRecord from the get() creates an actual instance of a ChildRecordTest1 Object");
165
-
189
+
190
+ // Test Default Child Record creation
191
+ var arrayOfDRs = testParent.get('defaultElements');
192
+ ok(SC.instanceOf(arrayOfDRs, SC.ChildArray), "check that get() creates an actual instance of a SC.ChildArray");
193
+ equals(arrayOfDRs.get('length'), 1, "check that the length of the array of default records is 1");
194
+ var dr = arrayOfDRs.objectAt(0);
195
+ ok(SC.kindOf(dr, SC.Record), "check that first default ChildRecord from the get() creates an actual instance that is a kind of a SC.Record Object");
196
+ ok(SC.instanceOf(dr, NestedRecord.ChildRecordTest1), "check that first default ChildRecord from the get() creates an actual instance of a ChildRecordTest1 Object");
197
+
198
+ // Test Default Polymorphic Child Record creation
199
+ var arrayOfDPRs = testParent.get('defaultPolymorphicElements');
200
+ ok(SC.instanceOf(arrayOfDPRs, SC.ChildArray), "check that get() creates an actual instance of a SC.ChildArray");
201
+ equals(arrayOfDPRs.get('length'), 1, "check that the length of the array of default records is 1");
202
+ var dpr = arrayOfDPRs.objectAt(0);
203
+ ok(SC.kindOf(dpr, SC.Record), "check that first default polymorphic ChildRecord from the get() creates an actual instance that is a kind of a SC.Record Object");
204
+ ok(SC.instanceOf(dpr, NestedRecord.ChildRecordTest1), "check that first default polymorphic ChildRecord from the get() creates an actual instance of a ChildRecordTest1 Object");
205
+
166
206
  // Check reference information
167
207
  var pm = cr.get('primaryKey');
168
208
  var key = cr.get(pm);
@@ -170,7 +210,7 @@ test("Basic Read", function() {
170
210
  ok(storeRef, 'check that first ChildRecord that the store has the instance of the child record with proper primary key');
171
211
  equals(cr, storeRef, "check the parent reference to the first child is the same as the direct store reference");
172
212
 
173
- // Check to see if the attributes of a Child Record match the refrence of the parent
213
+ // Check to see if the attributes of a Child Record match the reference of the parent
174
214
  var parentArray = testParent.readAttribute('elements');
175
215
  ok(!SC.instanceOf(parentArray, SC.ChildArray), "check that get() creates an actual instance of a SC.ChildArray");
176
216
  same(parentArray[0], storeRef.get('attributes'), "check that the ChildRecord's attributes are the same as the ParentRecord's readAttribute for the reference");
@@ -234,7 +274,7 @@ test("Basic Write: reference tests", function() {
234
274
  ok(testParent.get('status') & SC.Record.DIRTY, 'check that the parent record is dirty');
235
275
  newElems = testParent.get('elements');
236
276
  var newCR = newElems.objectAt(0);
237
- same(newCR, cr, "after a set('name', <new>) on child, checking to see that the parent has recieved the changes from the child record");
277
+ same(newCR, cr, "after a set('name', <new>) on child, checking to see that the parent has received the changes from the child record");
238
278
  var readAttrsArray = testParent.readAttribute('elements');
239
279
  ok(readAttrsArray, "checks to make sure the readAttibute works with a change to the name in the first child.");
240
280
  equals(readAttrsArray.length, 4, "after set() on parent, check that the length of the attribute array of child records is 4");
@@ -118,7 +118,7 @@ module("Complex SC.Record: Parent > Array of Children > Array of Children", {
118
118
  delete NestedRecord.Group;
119
119
  delete NestedRecord.Person;
120
120
  delete NestedRecord.Address;
121
- delete window.NestedRecord;
121
+ //delete window.NestedRecord;
122
122
  NestedRecord = null;
123
123
  testParent = null;
124
124
  peopleData1 = null;
@@ -196,7 +196,7 @@ test("Basic Read, Testing the First Child Array", function() {
196
196
  ok(pStore, 'check that first ChildRecord that the store has the instance of the child record with proper primary key');
197
197
  equals(p, pStore, "check the parent reference to the first child is the same as the direct store reference");
198
198
 
199
- // Check to see if the attributes of a Child Record match the refrence of the parent
199
+ // Check to see if the attributes of a Child Record match the reference of the parent
200
200
  pplAttr = testParent.readAttribute('people');
201
201
  ok(!SC.instanceOf(pplAttr, SC.ChildArray), "check that readAttribute() does not create an actual instance of a SC.ChildArray");
202
202
  same(pplAttr[0], pStore.get('attributes'), "check that the ChildRecord's attributes are the same as the ParentRecord's readAttribute for the reference");
@@ -237,7 +237,7 @@ test("Basic Read, Testing the Second Child Array", function() {
237
237
  ok(aStore, 'check that first ChildRecord that the store has the instance of the child record with proper primary key');
238
238
  equals(a, aStore, "check the parent reference to the first child is the same as the direct store reference");
239
239
 
240
- // Check to see if the attributes of a Child Record match the refrence of the parent
240
+ // Check to see if the attributes of a Child Record match the reference of the parent
241
241
  addrsAttr = p.readAttribute('addresses');
242
242
  ok(!SC.instanceOf(addrsAttr, SC.ChildArray), "check that readAttribute() does not create an actual instance of a SC.ChildArray");
243
243
  same(addrsAttr[0], aStore.get('attributes'), "check that the ChildRecord's attributes are the same as the ParentRecord's readAttribute for the reference");
@@ -274,7 +274,7 @@ test("Basic Write: Testing the First Child Array", function() {
274
274
  ok(SC.kindOf(p, SC.Record), "check that first ChildRecord from the get() creates an actual instance that is a kind of a SC.Record Object");
275
275
  ok(SC.instanceOf(p, NestedRecord.Person), "check that first ChildRecord from the get() creates an actual instance of a Person Object");
276
276
 
277
- // TODO: [EG] Add test to make sure the number of ChildRecords in store is correct when we add store recored clearing
277
+ // TODO: [EG] Add test to make sure the number of ChildRecords in store is correct when we add store record clearing
278
278
 
279
279
  // Check reference information
280
280
  pm = p.get('primaryKey');
@@ -66,7 +66,7 @@ module("Basic SC.Record Functions w/ a Parent > Child > Child", {
66
66
  delete NestedRecord.ParentRecordTest;
67
67
  delete NestedRecord.Person;
68
68
  delete NestedRecord.Address;
69
- delete window.NestedRecord;
69
+ //delete window.NestedRecord;
70
70
  NestedRecord = null;
71
71
  testParent = null;
72
72
  store = null;
@@ -278,14 +278,14 @@ function() {
278
278
  ok(testParent.get('status') & SC.Record.DIRTY, 'check that the parent record is dirty');
279
279
  oldP = p;
280
280
  p = testParent.get('person');
281
- same(p, oldP, "after a set('name', <new>) on child, checking to see that the parent has recieved the changes from the child record");
281
+ same(p, oldP, "after a set('name', <new>) on child, checking to see that the parent has received the changes from the child record");
282
282
  same(testParent.readAttribute('person'), p.get('attributes'), "after a set('name', <new>) on child, readAttribute on the parent should be correct for info child attributes");
283
283
 
284
284
  // Check changes on the address
285
285
  a = testParent.getPath('person.address');
286
286
  a.set('street', '321 Nutty Professor Lane');
287
287
  parentAttrs = testParent.readAttribute('person');
288
- same(a.get('attributes'), parentAttrs.address, "after a set('street', <new>) on address child, checking to see that the parent has recieved the changes from the child record");
288
+ same(a.get('attributes'), parentAttrs.address, "after a set('street', <new>) on address child, checking to see that the parent has received the changes from the child record");
289
289
  });
290
290
 
291
291
  test("Basic normalize()", function() {
@@ -23,7 +23,7 @@ module("SC.Record#destroy", {
23
23
 
24
24
  MyApp.foo = MyApp.store.createRecord(MyApp.Foo, MyApp.json);
25
25
 
26
- // modify store so that everytime refreshRecords() is called it updates
26
+ // modify store so that every time refreshRecords() is called it updates
27
27
  // callInfo
28
28
  callInfo = null ;
29
29
  MyApp.store.__orig = MyApp.store.destroyRecord;
@@ -23,7 +23,7 @@ module("SC.Record#refresh", {
23
23
 
24
24
  MyApp.foo = MyApp.store.createRecord(MyApp.Foo, MyApp.json);
25
25
 
26
- // modify store so that everytime refreshRecords() is called it updates
26
+ // modify store so that every time refreshRecords() is called it updates
27
27
  // callInfo
28
28
  callInfo = null ;
29
29
  MyApp.store.refreshRecord = function(records) {
@@ -138,7 +138,7 @@ test("pass-through should return builtin value" ,function() {
138
138
  equals(rec.get('firstName'), 'John', 'reading prop should get attr value');
139
139
  });
140
140
 
141
- test("returns default value if underyling value is empty", function() {
141
+ test("returns default value if underlying value is empty", function() {
142
142
  equals(rec.get('defaultValue'), 'default', 'reading prop should return default value');
143
143
  });
144
144
 
@@ -14,9 +14,9 @@ module("SC.RecordAttribute core methods", {
14
14
  MyApp = SC.Object.create({
15
15
  store: SC.Store.create()
16
16
  });
17
-
17
+
18
18
  MyApp.Foo = SC.Record.extend({
19
-
19
+
20
20
  // test toOne relationships
21
21
  relatedTo: SC.Record.toOne('MyApp.Foo'),
22
22
 
@@ -24,93 +24,93 @@ module("SC.RecordAttribute core methods", {
24
24
  readOnlyRelatedTo: SC.Record.toOne('MyApp.Bar', {
25
25
  isEditable: NO
26
26
  }),
27
-
27
+
28
28
  // test toOne relationship with computed type
29
29
  relatedToComputed: SC.Record.toOne(function() {
30
- // not using .get() to avoid another transform which will
30
+ // not using .get() to avoid another transform which will
31
31
  // trigger an infinite loop
32
32
  return (this.readAttribute('relatedToComputed').indexOf("foo")===0) ? MyApp.Foo : MyApp.Bar;
33
33
  }),
34
-
34
+
35
35
  bar: SC.Record.toOne('MyApp.Bar', { inverse: 'foo' }),
36
-
36
+
37
37
  barKeyed: SC.Record.toOne('MyApp.Bar', { key: 'barId' })
38
-
38
+
39
39
  });
40
-
40
+
41
41
  MyApp.Bar = SC.Record.extend({
42
42
  foo: SC.Record.toOne('MyApp.Foo', { inverse: 'bar', isMaster: NO })
43
43
  });
44
-
44
+
45
45
  SC.RunLoop.begin();
46
46
  storeKeys = MyApp.store.loadRecords(MyApp.Foo, [
47
- {
48
- guid: 'foo1',
49
- firstName: "John",
50
- lastName: "Doe",
47
+ {
48
+ guid: 'foo1',
49
+ firstName: "John",
50
+ lastName: "Doe",
51
51
  date: "2009-03-01T20:30-08:00",
52
52
  anArray: ['one', 'two', 'three'],
53
53
  anObject: { 'key1': 'value1', 'key2': 'value2' },
54
54
  bar: "bar1"
55
55
  },
56
-
57
- {
58
- guid: 'foo2',
59
- firstName: "Jane",
60
- lastName: "Doe",
56
+
57
+ {
58
+ guid: 'foo2',
59
+ firstName: "Jane",
60
+ lastName: "Doe",
61
61
  relatedTo: 'foo1',
62
62
  anArray: 'notAnArray',
63
63
  anObject: 'notAnObject',
64
64
  nonIsoDate: "2009/06/10 8:55:50 +0000"
65
65
  },
66
-
67
- {
68
- guid: 'foo3',
69
- firstName: "Alex",
70
- lastName: "Doe",
66
+
67
+ {
68
+ guid: 'foo3',
69
+ firstName: "Alex",
70
+ lastName: "Doe",
71
71
  relatedToComputed: 'bar1',
72
72
  anArray: ['one', 'two', 'three'],
73
73
  anObject: { 'key1': 'value1', 'key2': 'value2' },
74
74
  bar: "bar2"
75
75
  },
76
-
76
+
77
77
  {
78
78
  guid: 'foo4',
79
79
  firstName: 'Joe',
80
80
  lastName: 'Schmo',
81
81
  barId: 'bar1'
82
82
  },
83
-
84
- {
85
- guid: 'foo5',
86
- firstName: "Jane",
87
- lastName: "Doe",
83
+
84
+ {
85
+ guid: 'foo5',
86
+ firstName: "Jane",
87
+ lastName: "Doe",
88
88
  readOnlyRelatedTo: 'bar1'
89
89
  }
90
-
90
+
91
91
  ]);
92
-
92
+
93
93
  MyApp.store.loadRecords(MyApp.Bar, [
94
94
  { guid: 'bar1', city: "Chicago", foo: "foo1" },
95
95
  { guid: "bar2", city: "New York", foo: 'foo3' }
96
96
  ]);
97
-
97
+
98
98
  SC.RunLoop.end();
99
-
99
+
100
100
  rec = MyApp.store.find(MyApp.Foo, 'foo1');
101
101
  rec2 = MyApp.store.find(MyApp.Foo, 'foo2');
102
-
102
+
103
103
  bar = MyApp.store.find(MyApp.Bar, 'bar1');
104
104
  bar2 = MyApp.store.find(MyApp.Bar, 'bar2');
105
-
105
+
106
106
  equals(rec.storeKey, storeKeys[0], 'should find record');
107
-
107
+
108
108
  }
109
109
  });
110
110
 
111
111
  // ..........................................................
112
112
  // READING
113
- //
113
+ //
114
114
 
115
115
  test("getting toOne relationship should map guid to a real record", function() {
116
116
  var rec2 = MyApp.store.find(MyApp.Foo, 'foo2');
@@ -126,7 +126,7 @@ test("getting toOne relationship from computed attribute should map guid to a re
126
126
 
127
127
  test("reading an inverse relationship", function() {
128
128
  equals(rec.get('bar'), bar, 'foo1.bar should == bar');
129
- equals(bar.get('foo'), rec, 'bar.foo should == foo1');
129
+ equals(bar.get('foo'), rec, 'bar.foo should == foo1');
130
130
  });
131
131
 
132
132
  test("reading a keyed relationship", function(){
@@ -136,7 +136,7 @@ test("reading a keyed relationship", function(){
136
136
 
137
137
  // ..........................................................
138
138
  // WRITING
139
- //
139
+ //
140
140
 
141
141
  test("writing to a to-one relationship should update set guid", function() {
142
142
  var rec2 = MyApp.store.find(MyApp.Foo, 'foo2');
@@ -147,7 +147,7 @@ test("writing to a to-one relationship should update set guid", function() {
147
147
  rec2.set('relatedTo', rec2);
148
148
 
149
149
  equals(rec2.readAttribute('relatedTo'), 'foo2', 'should write ID for set record to relatedTo attribute');
150
-
150
+
151
151
  equals(rec2.get('relatedTo'), rec2, 'should get foo record that was just set');
152
152
 
153
153
  });
@@ -156,14 +156,14 @@ test("writing to a to-one computed relationship should update set guid", functio
156
156
  var rec3 = MyApp.store.find(MyApp.Foo, 'foo3');
157
157
  equals(rec3.get('id'), 'foo3', 'precond - should find record 2');
158
158
  equals(rec3.get('relatedToComputed'), bar, 'precond - should get bar1 instance for rec3.relatedToComputed');
159
-
159
+
160
160
  rec3.set('relatedToComputed', rec);
161
161
  equals(rec3.readAttribute('relatedToComputed'), 'foo1', 'should write ID for set record to relatedTo attribute');
162
162
  });
163
163
 
164
164
  test("clearing a toOne relationship", function() {
165
165
  ok(rec2.get('relatedTo') !== null, 'precond - rec.relatedTo should have a value');
166
-
166
+
167
167
  rec2.set('relatedTo', null);
168
168
  equals(rec2.get('relatedTo'), null, 'rec.relatedTo should be null');
169
169
  equals(rec2.readAttribute('relatedTo'), null, 'rec.relatedTo attribute should be null');
@@ -175,69 +175,69 @@ test("clearing a toOne relationship with an inverse - foo isMaster", function()
175
175
 
176
176
  equals(rec.get('status'), SC.Record.READY_CLEAN, 'precond - foo1.status should be READY_CLEAN');
177
177
  equals(bar.get('status'), SC.Record.READY_CLEAN, 'precond - bar1.status should be READY_CLEAN');
178
-
178
+
179
179
  rec.set('bar', null);
180
-
180
+
181
181
  equals(rec.get('bar'), null, 'foo1.bar should be null after change');
182
182
  equals(bar.get('foo'), null, 'bar.foo should also be null after change');
183
-
183
+
184
184
  equals(rec.get('status'), SC.Record.READY_DIRTY, 'foo1.status should be READY_DIRTY');
185
185
  equals(bar.get('status'), SC.Record.READY_CLEAN, 'bar1.status should be READY_CLEAN');
186
-
186
+
187
187
  });
188
188
 
189
189
  test("modifying a toOne relationship with an inverse from null", function() {
190
190
  equals(rec.get('bar'), bar, 'precond - foo1.bar should eq bar');
191
191
  equals(bar.get('foo'), rec, 'precond - bar.foo should eq foo1');
192
192
  equals(rec2.get('bar'), null, 'precond - foo2.bar should eq null');
193
-
193
+
194
194
  [rec, rec2, bar].forEach(function(r) {
195
195
  equals(r.get('status'), SC.Record.READY_CLEAN, 'precond - %@.status should be READY_CLEAN'.fmt(r.get('id')));
196
196
  }, this);
197
-
197
+
198
198
  bar.set('foo', rec2);
199
-
199
+
200
200
  equals(rec.get('bar'), null, 'foo1.bar should be null after change');
201
201
  equals(bar.get('foo'), rec2, 'bar.foo should eq foo2 after change');
202
202
  equals(rec2.get('bar'), bar, 'foo2.bar should eq bar after change');
203
-
203
+
204
204
  equals(rec.get('status'), SC.Record.READY_DIRTY, 'foo1.status should be READY_DIRTY');
205
205
  equals(rec2.get('status'), SC.Record.READY_DIRTY, 'foo1.status should be READY_DIRTY');
206
206
  equals(bar.get('status'), SC.Record.READY_CLEAN, 'bar1.status should be READY_CLEAN');
207
-
207
+
208
208
  });
209
209
 
210
210
  test("modifying a toOne relationship with an inverse from other", function() {
211
-
212
- var foo1 = rec,
211
+
212
+ var foo1 = rec,
213
213
  foo3 = MyApp.store.find(MyApp.Foo, 'foo3'),
214
214
  bar1 = bar;
215
-
215
+
216
216
  equals(foo1.get('bar'), bar1, 'precond - foo1.bar should eq bar1');
217
217
  equals(bar1.get('foo'), foo1, 'precond - bar.foo should eq foo1');
218
-
218
+
219
219
  equals(foo3.get('bar'), bar2, 'precond - foo3.bar should eq null');
220
220
  equals(bar2.get('foo'), foo3, 'precond - bar2.foo should eq foo3');
221
-
222
-
221
+
222
+
223
223
  [foo1, foo3, bar1, bar2].forEach(function(r) {
224
224
  equals(r.get('status'), SC.Record.READY_CLEAN, 'precond - %@.status should be READY_CLEAN'.fmt(r.get('id')));
225
225
  }, this);
226
-
226
+
227
227
  bar1.set('foo', foo3);
228
-
228
+
229
229
  equals(foo1.get('bar'), null, 'foo1.bar should be null after change');
230
230
  equals(bar1.get('foo'), foo3, 'bar.foo should eq foo3 after change');
231
231
 
232
232
  equals(foo3.get('bar'), bar1, 'foo3.bar should be bar after change');
233
233
  equals(bar2.get('foo'), null, 'bar2.foo should eq null after change');
234
-
234
+
235
235
  equals(foo1.get('status'), SC.Record.READY_DIRTY, 'foo1.status should be READY_DIRTY');
236
236
  equals(foo1.get('status'), SC.Record.READY_DIRTY, 'foo1.status should be READY_DIRTY');
237
237
 
238
238
  equals(bar1.get('status'), SC.Record.READY_CLEAN, 'bar1.status should be READY_CLEAN');
239
239
  equals(bar2.get('status'), SC.Record.READY_CLEAN, 'bar1.status should be READY_CLEAN');
240
-
240
+
241
241
  });
242
242
 
243
243
  test("modifying a keyed toOne relationship", function(){
@@ -255,9 +255,9 @@ test("isEditable NO should not allow editing", function() {
255
255
 
256
256
  equals(rec5.get('readOnlyRelatedTo'), bar1, 'precond - should find bar1');
257
257
  equals(rec5.get('status'), SC.Record.READY_CLEAN, 'precond - foo5 should be READY_CLEAN');
258
-
258
+
259
259
  rec5.set('readOnlyRelatedTo', bar2);
260
-
260
+
261
261
  equals(rec5.get('readOnlyRelatedTo'), bar1, 'should still find bar1 after setting');
262
262
  equals(rec5.get('status'), SC.Record.READY_CLEAN, 'foo5 status is still READY_CLEAN');
263
263
  });
@@ -268,17 +268,17 @@ test("isEditable NO should not fire property change observer", function() {
268
268
  var rec5 = MyApp.store.find(MyApp.Foo, 'foo5');
269
269
 
270
270
  equals(rec5.get('readOnlyRelatedTo'), bar1, 'precond - should find bar1');
271
-
271
+
272
272
  var readOnlyWasModified = NO;
273
273
  var modifierListener = function() {
274
274
  readOnlyWasModified = YES;
275
275
  };
276
276
  rec5.addObserver('readOnlyRelatedTo', modifierListener);
277
-
277
+
278
278
  rec5.set('readOnlyRelatedTo', bar2);
279
-
279
+
280
280
  equals(readOnlyWasModified, NO, 'property change observer should not have fired');
281
-
281
+
282
282
  rec5.removeObserver('readOnlyRelatedTo', modifierListener);
283
283
  });
284
284
 
@@ -308,3 +308,50 @@ test("adding toMany pointing to non existing class should throw error", function
308
308
  same(message, 'Attempted to create toMany attribute with undefined recordType. Did you forget to sc_require a dependency?');
309
309
  });
310
310
 
311
+ module("modifying a keyed toOne relationship via the inverse", {
312
+ setup: function() {
313
+ MyApp = SC.Object.create({ store: SC.Store.create() });
314
+
315
+ MyApp.Foo = SC.Record.extend({
316
+ bar: SC.Record.toOne('MyApp.Bar', {
317
+ isMaster: YES, inverse: 'foo'
318
+ })
319
+ });
320
+
321
+ MyApp.Bar = SC.Record.extend({
322
+ foo: SC.Record.toOne('MyApp.Foo', {
323
+ isMaster: NO, key: 'foo_id', inverse: 'bar'
324
+ })
325
+ });
326
+ }
327
+ });
328
+
329
+ test("creating an association", function() {
330
+ var foo1, bar1;
331
+
332
+ MyApp.store.loadRecords(MyApp.Foo, [{guid: 'foo1', bar: null}]);
333
+
334
+ foo1 = MyApp.store.find(MyApp.Foo, 'foo1');
335
+ bar1 = MyApp.store.createRecord(MyApp.Bar, {guid: 'bar1'});
336
+
337
+ foo1.set('bar', bar1);
338
+
339
+ equals(bar1.get('foo'), foo1, 'bar1.foo relationship should be established');
340
+ equals(bar1.get('attributes').foo_id, 'foo1', 'correct key should be set in attributes');
341
+ });
342
+
343
+ test("destroying an association", function() {
344
+ var foo1, bar1;
345
+
346
+ MyApp.store.loadRecords(MyApp.Foo, [{guid: 'foo1', bar: 'bar1'}]);
347
+ MyApp.store.loadRecords(MyApp.Bar, [{guid: 'bar1', foo_id: 'foo1'}]);
348
+
349
+ foo1 = MyApp.store.find(MyApp.Foo, 'foo1');
350
+ bar1 = MyApp.store.find(MyApp.Bar, 'bar1');
351
+
352
+ equals(foo1.get('bar'), bar1, 'foo1.bar relationship should be established');
353
+ foo1.set('bar', null);
354
+ equals(bar1.get('foo'), null, 'bar.foo relationship should be destroyed');
355
+ equals(bar1.get('attributes').foo_id, null, 'correct key should be set in attributes');
356
+ });
357
+