sproutcore 1.7.1.beta → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -12,35 +12,95 @@
12
12
  applications.
13
13
  */
14
14
  SC.String = /** @scope SC.String.prototype */ {
15
+
16
+ /**
17
+ This finds the value for a key in a formatting string.
18
+
19
+ Keys take the form:
20
+
21
+ key[:argument to formatter]
22
+ */
23
+ _scs_valueForKey: function(key, data, /* for debugging purposes: */ string) {
24
+ var arg, value, formatter, argsplit = key.indexOf(':');
25
+ if (argsplit > -1) {
26
+ arg = key.substr(argsplit + 1);
27
+ key = key.substr(0, argsplit);
28
+ }
29
+
30
+ value = data[key];
31
+ formatter = data[key + 'Formatter'];
32
+
33
+ // formatters are optional
34
+ if (formatter) value = formatter(value, arg);
35
+ else if (arg) {
36
+ throw "String.fmt was given a formatting string, but key `" + key + "` has no formatter! String: " + string;
37
+ }
38
+
39
+ return value;
40
+ },
15
41
 
16
- // Interpolate string. looks for %@ or %@1; to control the order of params.
17
42
  /**
18
- Apply formatting options to the string. This will look for occurrences
19
- of %@ in your string and substitute them with the arguments you pass into
20
- this method. If you want to control the specific order of replacement,
21
- you can add a number after the key as well to indicate which argument
22
- you want to insert.
43
+ Formats a string. You can format either with named parameters or
44
+ indexed, but not both.
45
+
46
+ Indexed Parameters
47
+ --------------------
48
+ Indexed parameters are just arguments you pass into format.
23
49
 
24
- Ordered insertions are most useful when building loc strings where values
25
- you need to insert may appear in different orders.
50
+ For example, if you call fmt("%@1 %3 %2", 1, 2, 3), you'll get "1 3 2" as output.
51
+
52
+ If you don't supply a number, it will use them in the order you supplied. For instance:
53
+
54
+ "abc".fmt("%@, %@", "Iskander", "Alex") would return "Iskander, Alex".
26
55
 
27
- Examples
28
- -----
56
+ Named Paramters
57
+ --------------------
58
+ You can use named parameters like this:
29
59
 
30
- "Hello %@ %@".fmt('John', 'Doe') => "Hello John Doe"
31
- "Hello %@2, %@1".fmt('John', 'Doe') => "Hello Doe, John"
60
+ "Value: %{key_name}".fmt({ key_name: "A Value" })
61
+
62
+ // -> "Value: A Value"
63
+
64
+ You can supply formatters for each field. A formatter is a method to get applied
65
+ to the parameter:
66
+
67
+ Currency = function(v) { return "$" + v; };
68
+ "Value: %{val}".fmt({ val: 12.00, valFormatter: Currency })
69
+
70
+ // -> $12.00
71
+
72
+ Formatters can also use arguments:
73
+
74
+ Currency = function(v, sign) { return sign + v; };
75
+ "Value: %{val:£}".fmt({ val: 12.00, valFormatter: Currency })
76
+
77
+ // -> £12.00
32
78
 
33
- @param {Object...} args optional arguments
34
- @returns {String} formatted string
79
+ You can supply a different formatter for each named parameter. Formatters can ONLY be
80
+ used with named parameters (not indexed parameters).
81
+
35
82
  */
36
- fmt: function(str, formats) {
37
- // first, replace any ORDERED replacements.
38
- var idx = 0; // the current index for non-numerical replacements
39
- return str.replace(/%@([0-9]+)?/g, function(s, argIndex) {
40
- argIndex = (argIndex) ? parseInt(argIndex,0) - 1 : idx++ ;
41
- s = formats[argIndex];
42
- return ((s === null) ? '(null)' : (s === undefined) ? '' : s).toString();
43
- }) ;
83
+ fmt: function(string, args) {
84
+ var i = 0, data = undefined, hasHadNamedArguments;
85
+ if (args) {
86
+ data = args[0];
87
+ }
88
+
89
+ return string.replace(/%\{(.*?)\}/g, function(match, propertyPath) {
90
+ hasHadNamedArguments = YES;
91
+ if (!data) {
92
+ throw "Cannot use named parameters with `fmt` without a data hash. String: '" + string + "'";
93
+ }
94
+
95
+ return SC.String._scs_valueForKey(propertyPath, data, string);
96
+ }).replace(/%@([0-9]+)?/g, function(match, index) {
97
+ if (hasHadNamedArguments) {
98
+ throw "Invalid attempt to use both named parameters and indexed parameters. String: '" + string + "'";
99
+ }
100
+ index = index ? parseInt(index, 10) - 1 : i++;
101
+ if(args[index]!==undefined) return args[index];
102
+ else return "";
103
+ });
44
104
  },
45
105
 
46
106
  /**
@@ -42,3 +42,23 @@ test("chained observers on enumerable properties are triggered when the observed
42
42
  equals(observerFiredCount, 0, "observer did not fire after removing changing property on a removed object");
43
43
  });
44
44
 
45
+ test("content observers are removed correctly", function() {
46
+ var child1 = SC.Object.create({ name: "Bartholomew", age: 15 });
47
+ var child2 = SC.Object.create({ name: "Agnes", age: 12 });
48
+ var children = [child1, child2];
49
+
50
+ var observerFiredCount = 0;
51
+ var observerFunc = function() { observerFiredCount++; }
52
+
53
+ children.addObserver('@each.name', this, observerFunc);
54
+ children.removeObserver('@each.name', this, observerFunc);
55
+ observerFiredCount = 0;
56
+ SC.run(function() { children.setEach('name', "Hanna"); });
57
+ equals(observerFiredCount, 0, "name observer did not fire after it was removed");
58
+
59
+ children.addObserver('@each.age', this, observerFunc);
60
+ children.removeObserver('@each.age', this, observerFunc);
61
+ observerFiredCount = 0;
62
+ SC.run(function() { children.setEach('age', 14); });
63
+ equals(observerFiredCount, 0, "age observer did not fire after it was removed");
64
+ });
@@ -307,7 +307,7 @@ module("Computed properties", {
307
307
  return 'dependentCached';
308
308
  }.property('changer').cacheable(),
309
309
 
310
- // everytime it is recomputed, increments call
310
+ // every time it is recomputed, increments call
311
311
  incCallCount: 0,
312
312
  inc: function() {
313
313
  return this.incCallCount++;
@@ -587,10 +587,14 @@ test("cacheable nested dependent keys should clear after their dependencies upda
587
587
  module("Observable objects & object properties ", {
588
588
 
589
589
  setup: function() {
590
+ window.NormalArray = [1,2,3,4,5];
591
+
590
592
  object = SC.Object.create({
591
593
 
592
594
  normal: 'value',
593
595
  abnormal: 'zeroValue',
596
+ abnormal2: 'zeroValue',
597
+ abnormal3: 'zeroValue',
594
598
  numberVal: 24,
595
599
  toggleVal: true,
596
600
  observedProperty: 'beingWatched',
@@ -620,9 +624,21 @@ module("Observable objects & object properties ", {
620
624
 
621
625
  testArrayObserver:function(){
622
626
  this.abnormal = 'notifiedObserver';
623
- }.observes('*normalArray.[]')
627
+ }.observes('*normalArray.[]'),
628
+
629
+ testArrayObserver2:function(){
630
+ this.abnormal2 = 'notifiedObserver';
631
+ }.observes('normalArray.[]'),
632
+
633
+ testArrayObserver3:function(){
634
+ this.abnormal3 = 'notifiedObserver';
635
+ }.observes('NormalArray.[]')
624
636
 
625
637
  });
638
+ },
639
+
640
+ teardown: function() {
641
+ window.NormalArray = null;
626
642
  }
627
643
 
628
644
  });
@@ -652,9 +668,18 @@ test('should not notify the observers of a property automatically',function(){
652
668
  equals(object.abnormal,'zeroValue') ;
653
669
  });
654
670
 
655
- test('should notify array observer when array changes',function(){
671
+ test('should notify array observer when object\'s array changes',function(){
656
672
  object.normalArray.replace(0,0,6);
657
- equals(object.abnormal, 'notifiedObserver', 'observer should be notified');
673
+ equals(object.abnormal, 'notifiedObserver', 'testArrayObserver should be notified');
674
+ equals(object.abnormal2, 'notifiedObserver', 'testArrayObserver2 should be notified');
675
+ equals(object.abnormal3, 'zeroValue', 'testArrayObserver3 should not be notified');
676
+ });
677
+
678
+ test('should notify array observer when NormalArray array changes',function(){
679
+ window.NormalArray.replace(0,0,6);
680
+ equals(object.abnormal, 'zeroValue', 'testArrayObserver should not be notified');
681
+ equals(object.abnormal2, 'zeroValue', 'testArrayObserver2 should not be notified');
682
+ equals(object.abnormal3, 'notifiedObserver', 'testArrayObserver3 should be notified');
658
683
  });
659
684
 
660
685
 
@@ -866,3 +891,99 @@ test("changing chained observer object to null should not raise exception", func
866
891
  equals(callCount, 1, 'changing bar should trigger observer');
867
892
  expect(3);
868
893
  });
894
+
895
+ module("addObservesHandler and removeObservesHandler functions", {
896
+
897
+ setup: function() {
898
+ window.TestNS = SC.Object.create({
899
+ value: 0
900
+ });
901
+
902
+ objectA = SC.Object.create({
903
+
904
+ value: 0,
905
+ arrayValue: [],
906
+
907
+ handler1NotifiedCount: 0,
908
+ handler2NotifiedCount: 0,
909
+ arrayHandlerNotifiedCount: 0,
910
+
911
+ handler1: function() {
912
+ this.handler1NotifiedCount++;
913
+ },
914
+
915
+ handler2: function() {
916
+ this.handler2NotifiedCount++;
917
+ },
918
+
919
+ arrayHandler: function() {
920
+ this.arrayHandlerNotifiedCount++;
921
+ }
922
+
923
+ });
924
+ },
925
+
926
+ teardown: function() {
927
+ objectA = null;
928
+ window.TestNS = null;
929
+ }
930
+
931
+ });
932
+
933
+ test("add and remove observer handler1", function() {
934
+ objectA.addObservesHandler(objectA.handler1, 'value');
935
+ objectA.set('value', 100);
936
+ equals(objectA.handler1NotifiedCount, 1, "observes handler1 should be notified");
937
+
938
+ objectA.removeObservesHandler(objectA.handler1, 'value');
939
+ objectA.set('value', 200);
940
+ equals(objectA.handler1NotifiedCount, 1, "observes handler1 should not be notified");
941
+ });
942
+
943
+ test("add and remove observer handler2", function() {
944
+ objectA.addObservesHandler(objectA.handler2, 'TestNS.value');
945
+ window.TestNS.set('value', 1000);
946
+ equals(objectA.handler2NotifiedCount, 1, "observes handler2 should be notified");
947
+
948
+ objectA.removeObservesHandler(objectA.handler2, 'TestNS.value');
949
+ window.TestNS.set('value', 2000);
950
+ equals(objectA.handler2NotifiedCount, 1, "observes handler1 should not be notified");
951
+ });
952
+
953
+ test("add and remove observer array handler without chain observes", function() {
954
+ objectA.addObservesHandler(objectA.arrayHandler, 'arrayValue.[]');
955
+ objectA.arrayValue.pushObject(SC.Object.create());
956
+ ok(objectA.arrayHandlerNotifiedCount > 0, "observes array handler should be notified aftering pushing object to array");
957
+
958
+ objectA.arrayHandlerNotifiedCount = 0;
959
+
960
+ objectA.removeObservesHandler(objectA.arrayHandler, 'arrayValue.[]');
961
+ objectA.arrayValue.pushObject(SC.Object.create());
962
+ equals(objectA.arrayHandlerNotifiedCount, 0, "observes array handler should not be notified after removing observes handler");
963
+
964
+ objectA.addObservesHandler(objectA.arrayHandler, 'arrayValue.[]');
965
+ objectA.set('arrayValue', []);
966
+ equals(objectA.arrayHandlerNotifiedCount, 0, "observes array handler should not be notified after assigning new array");
967
+ objectA.arrayValue.pushObject(SC.Object.create());
968
+ equals(objectA.arrayHandlerNotifiedCount, 0, "observes array handler should not be notified after pushing object to new array");
969
+ });
970
+
971
+ test("add and remove observer array handler with chain observes", function() {
972
+ objectA.addObservesHandler(objectA.arrayHandler, '*arrayValue.[]');
973
+ objectA.arrayValue.pushObject(SC.Object.create());
974
+ ok(objectA.arrayHandlerNotifiedCount > 0, "observes array handler should be notified aftering pushing object to array");
975
+
976
+ objectA.arrayHandlerNotifiedCount = 0;
977
+
978
+ objectA.removeObservesHandler(objectA.arrayHandler, '*arrayValue.[]');
979
+ objectA.arrayValue.pushObject(SC.Object.create());
980
+ equals(objectA.arrayHandlerNotifiedCount, 0, "observes array handler should not be notified of push after removing observes handler");
981
+ objectA.set('arrayValue', []);
982
+ equals(objectA.arrayHandlerNotifiedCount, 0, "observes array handler should not be notified of new array after removing observes handler");
983
+
984
+ objectA.addObservesHandler(objectA.arrayHandler, '*arrayValue.[]');
985
+ objectA.set('arrayValue', []);
986
+ ok(objectA.arrayHandlerNotifiedCount > 0, "observes array handler should be notified after assigning new array");
987
+ objectA.arrayValue.pushObject(SC.Object.create());
988
+ ok(objectA.arrayHandlerNotifiedCount > 0, "observes array handler should be notified after pushing object to new array");
989
+ });
@@ -85,7 +85,7 @@ test("Object not yet instantiated", function() {
85
85
  SC.Observers.flush(garage);
86
86
  ok(SC.Observers.queue.some(function(el) { return el[1] === observer; }), "The observer should still be in the queue.");
87
87
 
88
- // 3. After we instantiate the class, a call to SC.Observers.flush shoud remove the object from the queue...
88
+ // 3. After we instantiate the class, a call to SC.Observers.flush should remove the object from the queue...
89
89
  car = garage.car = car.create({ make: 'Renault' });
90
90
  SC.Observers.flush(garage);
91
91
  ok(!SC.Observers.queue.some(function(el) { return el[1] === observer; }), "The observer should have been removed from the queue.");
@@ -186,7 +186,7 @@ module("chained binding", {
186
186
 
187
187
  });
188
188
 
189
- test("changing first output should propograte to third after flush", function() {
189
+ test("changing first output should propagate to third after flush", function() {
190
190
  first.set("output", "change") ;
191
191
  equals("change", first.get("output"), "first.output") ;
192
192
  ok("change" !== third.get("input"), "third.input") ;
@@ -230,7 +230,7 @@ module("Custom Binding", {
230
230
  }
231
231
  });
232
232
 
233
- test("Binding value1 such that it will recieve only single values", function() {
233
+ test("Binding value1 such that it will receive only single values", function() {
234
234
  var bon1 = Bon1.create({
235
235
  value1Binding: SC.Binding.single("TestNamespace.bon2.val1"),
236
236
  array1Binding: SC.Binding.single("TestNamespace.bon2.arr")
@@ -33,4 +33,41 @@ test("index past last index", function() {
33
33
  equals(set.rangeStartForIndex(start+len+20), start+len, 'should return end of range');
34
34
  });
35
35
 
36
+ test("creating holes by appending to an existing range should not affect the range start", function () {
37
+ var hintSize = SC.IndexSet.HINT_SIZE,
38
+ start, set;
36
39
 
40
+ set = SC.IndexSet.create();
41
+
42
+ set.add(1);
43
+ set.add(hintSize + 1);
44
+
45
+ // Before adding 2,
46
+ // the internal data structure looks like:
47
+ // {
48
+ // 0 : - 1, // Hole until 1
49
+ // 1 : 2, // End of range is 2
50
+ // 2 : -257, // Hole until 257
51
+ // 256: 2, // Hint points at index 2, which is ok.
52
+ // 257: 258, // End of range is 258
53
+ // 258: 0 // End of index set
54
+ // }
55
+ equals(set.rangeStartForIndex(hintSize),
56
+ set.rangeStartForIndex(hintSize - 1));
57
+
58
+ set.add(2);
59
+
60
+ // Assuming SC.IndexSet.HINT_SIZE is 256,
61
+ // the internal data structure looks like:
62
+ // {
63
+ // 0 : - 1, // Hole until 1
64
+ // 1 : 3, // End of range is 3
65
+ // 3 : -257, // Hole until 257
66
+ // 256: 2, // Hint points at index 2, which is invalid.
67
+ // 257: 258, // End of range is 258
68
+ // 258: 0 // End of index set
69
+ // }
70
+
71
+ equals(set.rangeStartForIndex(hintSize),
72
+ set.rangeStartForIndex(hintSize - 1));
73
+ });
@@ -156,7 +156,7 @@ test("remove a range should trigger an observer notification", function() {
156
156
  equals(callCnt, 1, 'should have called observer once');
157
157
  });
158
158
 
159
- test("removing a non-existant range should not trigger observer notification", function() {
159
+ test("removing a non-existent range should not trigger observer notification", function() {
160
160
  var callCnt = 0;
161
161
 
162
162
  set.addObserver('[]', function() { callCnt++; });
@@ -176,7 +176,7 @@ test("removing an index range outside of target range (specific bug)", function(
176
176
  var set = SC.IndexSet.create(10,3);
177
177
  var set2 = SC.IndexSet.create(0,3);
178
178
 
179
- // removing set2 from set should not changed set at all beceause it is
179
+ // removing set2 from set should not changed set at all because it is
180
180
  // before the first range, but it causes a problem with the length.
181
181
  set.remove(set2);
182
182
  equals(set.get('length'), 3, 'length should not change');
@@ -263,3 +263,19 @@ test("Ensure that log messages via the “will not format” methods don’t for
263
263
  equals(SC.Logger.getPath('recordedLogMessages.3').originalArguments[1], null, "errorWithoutFmt() should record all the arguments (1)");
264
264
  equals(SC.Logger.getPath('recordedLogMessages.3').originalArguments[2], 1, "errorWithoutFmt() should record all the arguments (2)");
265
265
  });
266
+
267
+
268
+
269
+ // ..........................................................
270
+ // LOG MESSAGE PREFIX
271
+ //
272
+ test("Ensure that the log message prefix is respected", function() {
273
+ SC.Logger.set('recordedLogMessages', null);
274
+
275
+ SC.Logger.set('logRecordingLevel', SC.LOGGER_LEVEL_DEBUG);
276
+
277
+ SC.Logger.set('messagePrefix', "prefix: ");
278
+ SC.Logger.debug("message");
279
+
280
+ equals(SC.Logger.getPath('recordedLogMessages.0').message, "prefix: message", "The message should have the specified prefix");
281
+ });
@@ -26,7 +26,7 @@ module("System:run_loop() - chained binding", {
26
26
  }
27
27
  });
28
28
 
29
- test("Should propograte bindings after the RunLoop completes (using SC.RunLoop)", function() {
29
+ test("Should propagate bindings after the RunLoop completes (using SC.RunLoop)", function() {
30
30
  SC.RunLoop.begin();
31
31
  //Binding of output of first object to input of second object
32
32
  binding1 = SC.Binding.from("output", first).to("input", second).connect() ;
@@ -54,7 +54,7 @@ test("Should propograte bindings after the RunLoop completes (using SC.RunLoop)"
54
54
  equals(second.get("output"), "change") ;
55
55
  });
56
56
 
57
- test("Should propograte bindings after the RunLoop completes (using SC.beginRunLoop)", function() {
57
+ test("Should propagate bindings after the RunLoop completes (using SC.beginRunLoop)", function() {
58
58
  SC.beginRunLoop;
59
59
  //Binding of output of first object to input of second object
60
60
  binding1 = SC.Binding.from("output", first).to("input", second).connect() ;
@@ -83,7 +83,7 @@ test("Should propograte bindings after the RunLoop completes (using SC.beginRunL
83
83
  equals(second.get("output"), "change") ;
84
84
  });
85
85
 
86
- test("Should propograte bindings after the RunLoop completes (checking invokeOnce() function)", function() {
86
+ test("Should propagate bindings after the RunLoop completes (checking invokeOnce() function)", function() {
87
87
  SC.RunLoop.begin();
88
88
  //Binding of output of first object to input of second object
89
89
  binding1 = SC.Binding.from("output", first).to("input", second).connect() ;
@@ -123,4 +123,75 @@ test("Should propograte bindings after the RunLoop completes (checking invokeOnc
123
123
  //Since the invoker function is called only once the value of output did not change.
124
124
  equals(second.get("output"), "change") ;
125
125
 
126
- });
126
+ });
127
+
128
+ test("Should flush the invoke last queue at the end of the current run loop", function () {
129
+ var iCalled = 0;
130
+ SC.RunLoop.begin();
131
+
132
+ SC.RunLoop.currentRunLoop.invokeLast(function () {
133
+ iCalled++;
134
+ });
135
+
136
+ ok(!iCalled, "should not have flushed the invokeLast queue");
137
+ SC.RunLoop.end();
138
+ ok(iCalled, "should have flushed the invokeLast queue");
139
+
140
+ SC.RunLoop.begin();
141
+ SC.RunLoop.end();
142
+ equals(iCalled, 1, "should have flushed the invokeLast queue only once");
143
+ });
144
+
145
+ test("Should repeatedly flush the invoke last queue until there are no more items", function () {
146
+ var iCalled = 0;
147
+ SC.RunLoop.begin();
148
+
149
+ SC.RunLoop.currentRunLoop.invokeLast(function () {
150
+ iCalled++;
151
+ if (iCalled < 5) {
152
+ SC.RunLoop.currentRunLoop.invokeLast(arguments.callee);
153
+ }
154
+ });
155
+
156
+ ok(!iCalled, "should not have flushed the invokeLast queue");
157
+ SC.RunLoop.end();
158
+ ok(iCalled, "should have flushed the invokeLast queue");
159
+ equals(iCalled, 5, "should have flushed the invokeLast queue 5 times");
160
+ });
161
+
162
+ test("Should flush the invoke next queue at the beginning of the next run loop", function () {
163
+ var iCalled = 0;
164
+ SC.RunLoop.begin();
165
+
166
+ SC.RunLoop.currentRunLoop.invokeNext(function () {
167
+ iCalled++;
168
+ });
169
+
170
+ SC.RunLoop.end();
171
+ ok(!iCalled, "should not have flushed the invokeNext queue");
172
+
173
+ SC.RunLoop.begin();
174
+ ok(iCalled, "should have flushed the invokeNext queue");
175
+
176
+ SC.RunLoop.end();
177
+ equals(iCalled, 1, "should have flushed the invokeNext queue only once");
178
+ });
179
+
180
+ test("Calling invokeNext inside an invokeNext invocation will schedule for the function to run in the next run loop", function () {
181
+ var iCalled = 0;
182
+ SC.RunLoop.begin();
183
+
184
+ SC.RunLoop.currentRunLoop.invokeNext(function () {
185
+ if (iCalled < 5) {
186
+ SC.RunLoop.currentRunLoop.invokeNext(arguments.callee);
187
+ }
188
+ iCalled++;
189
+ });
190
+
191
+ for (var i = 0; i < 5; i++) {
192
+ equals(iCalled, i, "should have flushed the invokeNext queue " + i + " time" + (i !== 1 ? 's' : ''));
193
+ SC.RunLoop.end();
194
+ SC.RunLoop.begin();
195
+ }
196
+ equals(iCalled, 5, "should have flushed the invokeNext queue 5 times");
197
+ });