sproutit-sproutcore 1.0.0.20090416161445 → 1.0.0.20090720093355

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (754) hide show
  1. data/Buildfile +4 -2
  2. data/frameworks/sproutcore/Buildfile +3 -2
  3. data/frameworks/sproutcore/README +2 -1
  4. data/frameworks/sproutcore/apps/docs/core.js +27 -0
  5. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Preview.pdf +0 -0
  6. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Thumbnail.tiff +0 -0
  7. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/data.plist +14378 -0
  8. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image10.png +0 -0
  9. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image11.png +0 -0
  10. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image13.png +0 -0
  11. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image14.png +0 -0
  12. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image8.png +0 -0
  13. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image9.tiff +0 -0
  14. data/frameworks/sproutcore/apps/docs/english.lproj/loading.rhtml +9 -0
  15. data/frameworks/sproutcore/apps/docs/english.lproj/main_page.js +22 -0
  16. data/frameworks/sproutcore/apps/{sc_jsdoc → docs}/english.lproj/strings.js +7 -7
  17. data/frameworks/sproutcore/apps/docs/main.js +30 -0
  18. data/frameworks/sproutcore/apps/tests/controllers/detail.js +16 -0
  19. data/frameworks/sproutcore/apps/tests/controllers/source.js +29 -0
  20. data/frameworks/sproutcore/apps/tests/controllers/target.js +26 -0
  21. data/frameworks/sproutcore/apps/tests/controllers/targets.js +65 -26
  22. data/frameworks/sproutcore/apps/tests/controllers/tests.js +14 -19
  23. data/frameworks/sproutcore/apps/tests/core.js +114 -16
  24. data/frameworks/sproutcore/apps/tests/data_source.js +96 -0
  25. data/frameworks/sproutcore/apps/tests/english.lproj/main_page.css +22 -2
  26. data/frameworks/sproutcore/apps/tests/english.lproj/main_page.js +168 -22
  27. data/frameworks/sproutcore/apps/tests/english.lproj/strings.js +14 -5
  28. data/frameworks/sproutcore/apps/tests/fixtures/target.js +81 -37
  29. data/frameworks/sproutcore/apps/tests/fixtures/test.js +38 -37
  30. data/frameworks/sproutcore/apps/tests/main.js +9 -20
  31. data/frameworks/sproutcore/apps/tests/models/target.js +74 -31
  32. data/frameworks/sproutcore/apps/tests/models/test.js +30 -2
  33. data/frameworks/sproutcore/{frameworks/desktop/mixins/collection_item.js → apps/tests/states/no_targets.js} +16 -12
  34. data/frameworks/sproutcore/apps/tests/states/ready.js +56 -0
  35. data/frameworks/sproutcore/apps/tests/states/ready_detail.js +41 -0
  36. data/frameworks/sproutcore/apps/tests/states/ready_empty.js +48 -0
  37. data/frameworks/sproutcore/apps/tests/states/ready_list.js +41 -0
  38. data/frameworks/sproutcore/apps/tests/states/ready_loading.js +44 -0
  39. data/frameworks/sproutcore/apps/tests/states/ready_no_tests.js +31 -0
  40. data/frameworks/sproutcore/apps/tests/states/start.js +39 -0
  41. data/frameworks/sproutcore/apps/tests/tests/controllers/{test.js → detail.js} +3 -3
  42. data/frameworks/sproutcore/apps/tests/tests/controllers/source.js +15 -0
  43. data/frameworks/sproutcore/apps/tests/tests/controllers/target.js +15 -0
  44. data/frameworks/sproutcore/apps/tests/tests/controllers/targets.js +3 -3
  45. data/frameworks/sproutcore/apps/tests/tests/views/offset_checkbox.js +15 -0
  46. data/frameworks/sproutcore/apps/tests/views/offset_checkbox.js +26 -0
  47. data/frameworks/sproutcore/design/CollectionView State Charts.graffle +4848 -0
  48. data/frameworks/sproutcore/design/Design Charts.graffle +8788 -6375
  49. data/frameworks/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Preview.pdf +0 -0
  50. data/frameworks/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Thumbnail.tiff +0 -0
  51. data/frameworks/sproutcore/design/SproutCore Design Template.graffle/data.plist +1452 -0
  52. data/frameworks/sproutcore/design/SproutCore Design Template.graffle/image8.png +0 -0
  53. data/frameworks/sproutcore/design/TestRunner Design.graffle/QuickLook/Preview.pdf +0 -0
  54. data/frameworks/sproutcore/design/TestRunner Design.graffle/QuickLook/Thumbnail.tiff +0 -0
  55. data/frameworks/sproutcore/design/TestRunner Design.graffle/data.plist +24187 -0
  56. data/frameworks/sproutcore/design/TestRunner Design.graffle/image10.png +0 -0
  57. data/frameworks/sproutcore/design/TestRunner Design.graffle/image11.png +0 -0
  58. data/frameworks/sproutcore/design/TestRunner Design.graffle/image13.png +0 -0
  59. data/frameworks/sproutcore/design/TestRunner Design.graffle/image15.png +0 -0
  60. data/frameworks/sproutcore/design/TestRunner Design.graffle/image16.png +0 -0
  61. data/frameworks/sproutcore/design/TestRunner Design.graffle/image17.png +0 -0
  62. data/frameworks/sproutcore/design/TestRunner Design.graffle/image18.png +0 -0
  63. data/frameworks/sproutcore/design/TestRunner Design.graffle/image19.png +0 -0
  64. data/frameworks/sproutcore/design/TestRunner Design.graffle/image22.tiff +0 -0
  65. data/frameworks/sproutcore/design/TestRunner Design.graffle/image23.png +0 -0
  66. data/frameworks/sproutcore/design/TestRunner Design.graffle/image24.png +0 -0
  67. data/frameworks/sproutcore/design/TestRunner Design.graffle/image25.png +0 -0
  68. data/frameworks/sproutcore/design/TestRunner Design.graffle/image30.png +0 -0
  69. data/frameworks/sproutcore/design/TestRunner Design.graffle/image31.png +0 -0
  70. data/frameworks/sproutcore/design/TestRunner Design.graffle/image8.png +0 -0
  71. data/frameworks/sproutcore/design/TestRunner Design.graffle/image9.png +0 -0
  72. data/frameworks/sproutcore/frameworks/datastore/data_sources/cascade.js +2 -2
  73. data/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +66 -49
  74. data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +146 -31
  75. data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures_with_queries.js +238 -0
  76. data/frameworks/sproutcore/frameworks/datastore/models/many_attribute.js +27 -11
  77. data/frameworks/sproutcore/frameworks/datastore/models/record.js +163 -32
  78. data/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +67 -5
  79. data/frameworks/sproutcore/frameworks/datastore/system/many_array.js +157 -0
  80. data/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +202 -19
  81. data/frameworks/sproutcore/frameworks/datastore/system/query.js +929 -78
  82. data/frameworks/sproutcore/frameworks/datastore/system/record_array.js +143 -5
  83. data/frameworks/sproutcore/frameworks/datastore/system/store.js +443 -125
  84. data/frameworks/sproutcore/frameworks/datastore/tests/data_sources/fixtures.js +38 -3
  85. data/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +94 -0
  86. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/core_methods.js +30 -0
  87. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/normalize.js +238 -0
  88. data/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +105 -16
  89. data/frameworks/sproutcore/frameworks/datastore/tests/system/many_array/core_methods.js +178 -0
  90. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/chain.js +1 -1
  91. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChanges.js +9 -8
  92. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +6 -6
  93. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/dataHashDidChange.js +6 -6
  94. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/discardChanges.js +3 -3
  95. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readDataHash.js +7 -7
  96. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readEditableDataHash.js +4 -4
  97. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/removeDataHash.js +7 -7
  98. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/writeDataHash.js +7 -7
  99. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/compare_records.js +126 -0
  100. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation.js +165 -0
  101. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation_of_records.js +82 -0
  102. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/find_all.js +362 -0
  103. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/parsing.js +170 -0
  104. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/record_type_is.js +43 -0
  105. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/registered_comparisons.js +60 -0
  106. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/registered_query_extensions.js +67 -0
  107. data/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/core_methods.js +2 -13
  108. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +3 -4
  109. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/core_methods.js +73 -0
  110. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/createRecord.js +15 -0
  111. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/dataSourceCallbacks.js +4 -2
  112. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/destroyRecord.js +1 -1
  113. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushChanges.js +2 -2
  114. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/recordDidChange.js +1 -1
  115. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/retrieveRecord.js +2 -2
  116. data/frameworks/sproutcore/frameworks/debug/core.js +60 -0
  117. data/frameworks/sproutcore/frameworks/deprecated/core.js +0 -2
  118. data/frameworks/sproutcore/frameworks/deprecated/server/server.js +0 -1
  119. data/frameworks/sproutcore/frameworks/deprecated/system/browser.js +0 -2
  120. data/frameworks/sproutcore/frameworks/deprecated/system/classic_responder.js +0 -2
  121. data/frameworks/sproutcore/frameworks/deprecated/system/event.js +0 -2
  122. data/frameworks/sproutcore/frameworks/deprecated/system/misc.js +0 -2
  123. data/frameworks/sproutcore/frameworks/deprecated/system/object.js +0 -2
  124. data/frameworks/sproutcore/frameworks/deprecated/system/path_module.js +0 -1
  125. data/frameworks/sproutcore/frameworks/deprecated/system/string.js +0 -2
  126. data/frameworks/sproutcore/frameworks/designer/coders/design.js +1 -2
  127. data/frameworks/sproutcore/frameworks/designer/coders/localization.js +1 -2
  128. data/frameworks/sproutcore/frameworks/designer/coders/object.js +1 -1
  129. data/frameworks/sproutcore/frameworks/designer/controllers/page_design.js +1 -1
  130. data/frameworks/sproutcore/frameworks/designer/ext/page.js +0 -2
  131. data/frameworks/sproutcore/frameworks/designer/ext/view.js +0 -2
  132. data/frameworks/sproutcore/frameworks/designer/views/controls/button.js +2 -3
  133. data/frameworks/sproutcore/frameworks/designer/views/designer.js +24 -8
  134. data/frameworks/sproutcore/frameworks/designer/views/label.js +1 -2
  135. data/frameworks/sproutcore/frameworks/designer/views/mixins/button.js +0 -2
  136. data/frameworks/sproutcore/frameworks/designer/views/tab.js +1 -2
  137. data/frameworks/sproutcore/frameworks/desktop/english.lproj/alert.css +2 -2
  138. data/frameworks/sproutcore/frameworks/desktop/english.lproj/drag.css +6 -0
  139. data/frameworks/sproutcore/frameworks/desktop/english.lproj/list_item.css +63 -10
  140. data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu_item_view.css +5 -4
  141. data/frameworks/sproutcore/frameworks/desktop/english.lproj/modal.css +5 -0
  142. data/frameworks/sproutcore/frameworks/desktop/english.lproj/panel.css +1 -0
  143. data/frameworks/sproutcore/frameworks/desktop/english.lproj/slider.css +5 -0
  144. data/frameworks/sproutcore/frameworks/desktop/english.lproj/split_divider.css +1 -0
  145. data/frameworks/sproutcore/frameworks/desktop/english.lproj/tab.css +1 -1
  146. data/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +61 -0
  147. data/frameworks/sproutcore/frameworks/desktop/mixins/collection_view_delegate.js +136 -79
  148. data/frameworks/sproutcore/frameworks/desktop/panes/alert.js +55 -24
  149. data/frameworks/sproutcore/frameworks/desktop/panes/menu.js +295 -147
  150. data/frameworks/sproutcore/frameworks/desktop/panes/palette.js +1 -1
  151. data/frameworks/sproutcore/frameworks/desktop/panes/panel.js +1 -1
  152. data/frameworks/sproutcore/frameworks/desktop/panes/picker.js +18 -20
  153. data/frameworks/sproutcore/frameworks/desktop/panes/sheet.js +2 -2
  154. data/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +4 -4
  155. data/frameworks/sproutcore/frameworks/desktop/system/drag.js +337 -231
  156. data/frameworks/sproutcore/frameworks/desktop/system/root_responder.js +3 -3
  157. data/frameworks/sproutcore/frameworks/desktop/tests/integration/dialog.js +1 -1
  158. data/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +2 -2
  159. data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/methods.js +46 -1
  160. data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +4 -2
  161. data/frameworks/sproutcore/frameworks/desktop/tests/panes/palette/ui.js +5 -6
  162. data/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +11 -11
  163. data/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/ui.js +11 -7
  164. data/frameworks/sproutcore/frameworks/desktop/tests/panes/sheet/ui.js +9 -9
  165. data/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +19 -0
  166. data/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +0 -1
  167. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/content.js +249 -0
  168. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/deleteSelection.js +82 -0
  169. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/deselect.js +199 -0
  170. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/itemViewForContentIndex.js +288 -0
  171. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/layerIdFor.js +65 -0
  172. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/length.js +88 -0
  173. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/mouse.js +165 -0
  174. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/nowShowing.js +121 -0
  175. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/reload.js +177 -0
  176. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/select.js +240 -0
  177. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectNextItem.js +191 -0
  178. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectPreviousItem.js +197 -39
  179. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selection.js +141 -0
  180. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/ui_diagram.js +182 -0
  181. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowDelegate.js +183 -0
  182. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowHeightForContentIndex.js +133 -0
  183. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowOffsetForContentIndex.js +132 -0
  184. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_outline.js +56 -0
  185. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_row_heights.js +167 -0
  186. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_simple.js +127 -0
  187. data/frameworks/sproutcore/frameworks/desktop/tests/views/list_item.js +30 -1
  188. data/frameworks/sproutcore/frameworks/desktop/tests/views/menu_item/ui.js +8 -8
  189. data/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +9 -9
  190. data/frameworks/sproutcore/frameworks/desktop/tests/views/scroller/methods.js +45 -6
  191. data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/methods.js +2 -1
  192. data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +17 -1
  193. data/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/ui.js +44 -29
  194. data/frameworks/sproutcore/frameworks/desktop/tests/views/stacked/ui_comments.js +231 -0
  195. data/frameworks/sproutcore/frameworks/desktop/tests/views/web/ui.js +1 -1
  196. data/frameworks/sproutcore/frameworks/desktop/views/button.js +15 -4
  197. data/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +8 -1
  198. data/frameworks/sproutcore/frameworks/desktop/views/collection.js +1739 -1123
  199. data/frameworks/sproutcore/frameworks/desktop/views/form.js +0 -1
  200. data/frameworks/sproutcore/frameworks/desktop/views/grid.js +13 -11
  201. data/frameworks/sproutcore/frameworks/desktop/views/list.js +405 -571
  202. data/frameworks/sproutcore/frameworks/desktop/views/list_item.js +211 -74
  203. data/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +319 -169
  204. data/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +57 -51
  205. data/frameworks/sproutcore/frameworks/desktop/views/progress.js +2 -2
  206. data/frameworks/sproutcore/frameworks/desktop/views/scene.js +150 -2
  207. data/frameworks/sproutcore/frameworks/desktop/views/scroll.js +92 -50
  208. data/frameworks/sproutcore/frameworks/desktop/views/scroller.js +86 -63
  209. data/frameworks/sproutcore/frameworks/desktop/views/segmented.js +38 -22
  210. data/frameworks/sproutcore/frameworks/desktop/views/select_field.js +51 -12
  211. data/frameworks/sproutcore/frameworks/desktop/views/slider.js +2 -0
  212. data/frameworks/sproutcore/frameworks/desktop/views/source_list.js +17 -1087
  213. data/frameworks/sproutcore/frameworks/desktop/views/source_list_group.js +3 -3
  214. data/frameworks/sproutcore/frameworks/desktop/views/split.js +35 -9
  215. data/frameworks/sproutcore/frameworks/desktop/views/stacked.js +101 -0
  216. data/frameworks/sproutcore/frameworks/desktop/views/tab.js +23 -22
  217. data/frameworks/sproutcore/frameworks/desktop/views/toolbar.js +1 -1
  218. data/frameworks/sproutcore/frameworks/foundation/controllers/array.js +382 -363
  219. data/frameworks/sproutcore/frameworks/foundation/controllers/controller.js +7 -279
  220. data/frameworks/sproutcore/frameworks/foundation/controllers/object.js +212 -310
  221. data/frameworks/sproutcore/frameworks/foundation/controllers/tree.js +109 -0
  222. data/frameworks/sproutcore/frameworks/foundation/core.js +25 -0
  223. data/frameworks/sproutcore/frameworks/foundation/debug/control_test_pane.js +30 -8
  224. data/frameworks/sproutcore/frameworks/foundation/english.lproj/bootstrap.rhtml +19 -4
  225. data/frameworks/sproutcore/frameworks/foundation/english.lproj/core.css +219 -3
  226. data/frameworks/sproutcore/frameworks/foundation/english.lproj/debug/control-test-pane.css +1 -0
  227. data/frameworks/sproutcore/frameworks/foundation/english.lproj/label.css +30 -0
  228. data/frameworks/sproutcore/frameworks/foundation/english.lproj/strings.js +15 -0
  229. data/frameworks/sproutcore/frameworks/{desktop → foundation}/english.lproj/text_field.css +19 -3
  230. data/frameworks/sproutcore/frameworks/foundation/english.lproj/view.css +6 -1
  231. data/frameworks/sproutcore/frameworks/foundation/license.js +19 -0
  232. data/frameworks/sproutcore/frameworks/foundation/mixins/button.js +15 -7
  233. data/frameworks/sproutcore/frameworks/foundation/mixins/collection_content.js +171 -0
  234. data/frameworks/sproutcore/frameworks/foundation/mixins/control.js +5 -5
  235. data/frameworks/sproutcore/frameworks/foundation/mixins/inline_text_field.js +462 -0
  236. data/frameworks/sproutcore/frameworks/foundation/mixins/selection_support.js +162 -84
  237. data/frameworks/sproutcore/frameworks/foundation/mixins/static_layout.js +33 -2
  238. data/frameworks/sproutcore/frameworks/foundation/mixins/string.js +17 -3
  239. data/frameworks/sproutcore/frameworks/foundation/mixins/tree_item_content.js +159 -0
  240. data/frameworks/sproutcore/frameworks/foundation/panes/pane.js +49 -20
  241. data/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +887 -0
  242. data/frameworks/sproutcore/frameworks/foundation/system/application.js +36 -0
  243. data/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +310 -62
  244. data/frameworks/sproutcore/frameworks/foundation/system/datetime.js +729 -0
  245. data/frameworks/sproutcore/frameworks/foundation/system/event.js +57 -21
  246. data/frameworks/sproutcore/frameworks/foundation/system/ready.js +11 -5
  247. data/frameworks/sproutcore/frameworks/foundation/system/render_context.js +55 -16
  248. data/frameworks/sproutcore/frameworks/foundation/system/request.js +152 -27
  249. data/frameworks/sproutcore/frameworks/foundation/system/responder.js +120 -0
  250. data/frameworks/sproutcore/frameworks/foundation/system/responder_context.js +243 -0
  251. data/frameworks/sproutcore/frameworks/foundation/system/root_responder.js +29 -6
  252. data/frameworks/sproutcore/frameworks/foundation/system/routes.js +143 -102
  253. data/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +9 -2
  254. data/frameworks/sproutcore/frameworks/foundation/system/utils.js +104 -9
  255. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/array_case.js +182 -0
  256. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/enum_case.js +193 -0
  257. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/null_case.js +64 -0
  258. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/single_case.js +136 -0
  259. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/empty_case.js +82 -0
  260. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/multiple_case.js +111 -0
  261. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/single_case.js +193 -0
  262. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/single_enumerable_case.js +179 -0
  263. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/tree/outline_case.js +108 -0
  264. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/button/keyEquivalents.js +35 -0
  265. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/staticLayout.js +128 -0
  266. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/string.js +17 -0
  267. data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/flat_case.js +325 -0
  268. data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/group_case.js +718 -0
  269. data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/outline_case.js +484 -0
  270. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_core.js +28 -28
  271. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_selector.js +1 -1
  272. data/frameworks/sproutcore/frameworks/foundation/tests/system/datetime.js +151 -0
  273. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/get.js +2 -2
  274. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_attr.js +1 -1
  275. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_basic.js +1 -1
  276. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_className.js +12 -12
  277. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_style.js +1 -1
  278. data/frameworks/sproutcore/frameworks/foundation/tests/system/request.js +52 -14
  279. data/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/root_responder.js +27 -23
  280. data/frameworks/sproutcore/frameworks/foundation/tests/system/timer/schedule.js +1 -1
  281. data/frameworks/sproutcore/frameworks/foundation/tests/validators/date.js +12 -10
  282. data/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +148 -0
  283. data/frameworks/sproutcore/frameworks/foundation/tests/views/pane/append_remove.js +1 -1
  284. data/frameworks/sproutcore/frameworks/{desktop → foundation}/tests/views/text_field/methods.js +0 -0
  285. data/frameworks/sproutcore/frameworks/{desktop → foundation}/tests/views/text_field/ui.js +53 -1
  286. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/clippingFrame.js +1 -0
  287. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/convertFrames.js +1 -1
  288. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/createChildViews.js +35 -0
  289. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/findLayerInParentLayer.js +1 -1
  290. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisible.js +51 -0
  291. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisibleInWindow.js +12 -1
  292. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/layoutStyle.js +83 -3
  293. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/prepareContext.js +1 -1
  294. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/updateLayer.js +4 -0
  295. data/frameworks/sproutcore/frameworks/foundation/views/container.js +1 -1
  296. data/frameworks/sproutcore/frameworks/foundation/views/field.js +27 -16
  297. data/frameworks/sproutcore/frameworks/foundation/views/image.js +4 -1
  298. data/frameworks/sproutcore/frameworks/foundation/views/label.js +16 -6
  299. data/frameworks/sproutcore/frameworks/{desktop → foundation}/views/text_field.js +39 -15
  300. data/frameworks/sproutcore/frameworks/foundation/views/view.js +328 -83
  301. data/frameworks/sproutcore/frameworks/runtime/README +1 -0
  302. data/frameworks/sproutcore/frameworks/runtime/core.js +110 -31
  303. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/base.js +238 -0
  304. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/indexOf.js +33 -0
  305. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/insertAt.js +121 -0
  306. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/objectAt.js +34 -0
  307. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/popObject.js +50 -0
  308. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/pushObject.js +46 -0
  309. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/rangeObserver.js +371 -0
  310. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeAt.js +100 -0
  311. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeObject.js +49 -0
  312. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +94 -0
  313. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/shiftObject.js +50 -0
  314. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/unshiftObject.js +47 -0
  315. data/frameworks/sproutcore/frameworks/runtime/mixins/array.js +320 -110
  316. data/frameworks/sproutcore/frameworks/runtime/mixins/copyable.js +64 -0
  317. data/frameworks/sproutcore/frameworks/runtime/mixins/delegate_support.js +44 -6
  318. data/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +142 -77
  319. data/frameworks/sproutcore/frameworks/runtime/mixins/freezable.js +104 -0
  320. data/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +298 -142
  321. data/frameworks/sproutcore/frameworks/runtime/private/chain_observer.js +17 -11
  322. data/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +55 -15
  323. data/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +29 -5
  324. data/frameworks/sproutcore/frameworks/runtime/protocols/observable_protocol.js +40 -0
  325. data/frameworks/sproutcore/frameworks/runtime/system/binding.js +39 -15
  326. data/frameworks/sproutcore/frameworks/runtime/system/index_set.js +1166 -0
  327. data/frameworks/sproutcore/frameworks/runtime/system/object.js +33 -15
  328. data/frameworks/sproutcore/frameworks/runtime/system/range_observer.js +201 -35
  329. data/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +42 -15
  330. data/frameworks/sproutcore/frameworks/runtime/system/selection_set.js +649 -0
  331. data/frameworks/sproutcore/frameworks/runtime/system/set.js +183 -54
  332. data/frameworks/sproutcore/frameworks/runtime/system/sparse_array.js +20 -11
  333. data/frameworks/sproutcore/frameworks/runtime/tests/core/clone.js +2 -2
  334. data/frameworks/sproutcore/frameworks/runtime/tests/core/compare.js +44 -0
  335. data/frameworks/sproutcore/frameworks/runtime/tests/core/console.js +16 -0
  336. data/frameworks/sproutcore/frameworks/runtime/tests/core/keys.js +1 -1
  337. data/frameworks/sproutcore/frameworks/runtime/tests/core/makeArray.js +1 -1
  338. data/frameworks/sproutcore/frameworks/runtime/tests/core/objectForPropertyPath.js +5 -5
  339. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/array.js +57 -0
  340. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable.js +21 -2
  341. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +249 -129
  342. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/propertyChanges.js +11 -2
  343. data/frameworks/sproutcore/frameworks/runtime/tests/private/observer_queue/isObservingSuspended.js +55 -0
  344. data/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +81 -6
  345. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/add.js +195 -0
  346. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/clone.js +43 -0
  347. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/contains.js +74 -0
  348. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/create.js +42 -0
  349. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/indexAfter.js +38 -0
  350. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/indexBefore.js +38 -0
  351. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/intersects.js +74 -0
  352. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/max.js +40 -0
  353. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/min.js +40 -0
  354. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/rangeStartForIndex.js +36 -0
  355. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/remove.js +189 -0
  356. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/without.js +89 -0
  357. data/frameworks/sproutcore/frameworks/runtime/tests/system/object/base.js +1 -1
  358. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/create.js +59 -0
  359. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/destroy.js +75 -0
  360. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/objectPropertyDidChange.js +117 -0
  361. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/rangeDidChange.js +110 -0
  362. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/update.js +65 -0
  363. data/frameworks/sproutcore/frameworks/runtime/tests/system/run_loop.js +3 -3
  364. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/add.js +92 -0
  365. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/copy.js +17 -0
  366. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/indexSetForSource.js +85 -0
  367. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/isEqual.js +60 -0
  368. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/remove.js +87 -0
  369. data/frameworks/sproutcore/frameworks/runtime/tests/system/set.js +4 -25
  370. data/frameworks/sproutcore/frameworks/runtime/tests/system/sparse_array.js +39 -1
  371. data/frameworks/sproutcore/frameworks/testing/core.js +183 -0
  372. data/frameworks/sproutcore/frameworks/testing/english.lproj/runner.css +126 -0
  373. data/frameworks/sproutcore/frameworks/testing/extras.js +0 -26
  374. data/frameworks/sproutcore/frameworks/testing/qunit.js +33 -25
  375. data/frameworks/sproutcore/frameworks/testing/system/dump.js +205 -0
  376. data/frameworks/sproutcore/frameworks/testing/system/equiv.js +201 -0
  377. data/frameworks/sproutcore/frameworks/testing/system/plan.js +691 -0
  378. data/frameworks/sproutcore/frameworks/testing/system/runner.js +209 -0
  379. data/frameworks/sproutcore/frameworks/testing/system/suite.js +228 -0
  380. data/frameworks/sproutcore/frameworks/testing/utils.js +8 -1
  381. data/frameworks/sproutcore/lib/index.rhtml +4 -1
  382. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/10.png +0 -0
  383. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/100.png +0 -0
  384. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/102.png +0 -0
  385. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/110.png +0 -0
  386. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/120.png +0 -0
  387. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/127.png +0 -0
  388. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/18.png +0 -0
  389. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/19.png +0 -0
  390. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/2.png +0 -0
  391. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/24.png +0 -0
  392. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/26.png +0 -0
  393. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/27.png +0 -0
  394. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/28.png +0 -0
  395. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/29.png +0 -0
  396. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/30.png +0 -0
  397. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/31.png +0 -0
  398. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/33.png +0 -0
  399. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/37.png +0 -0
  400. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/41.png +0 -0
  401. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/99.png +0 -0
  402. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/10.png +0 -0
  403. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/100.png +0 -0
  404. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/102.png +0 -0
  405. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/110.png +0 -0
  406. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/120.png +0 -0
  407. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/127.png +0 -0
  408. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/18.png +0 -0
  409. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/19.png +0 -0
  410. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/2.png +0 -0
  411. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/24.png +0 -0
  412. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/26.png +0 -0
  413. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/27.png +0 -0
  414. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/28.png +0 -0
  415. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/29.png +0 -0
  416. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/30.png +0 -0
  417. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/31.png +0 -0
  418. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/33.png +0 -0
  419. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/37.png +0 -0
  420. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/41.png +0 -0
  421. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/99.png +0 -0
  422. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/10.png +0 -0
  423. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/100.png +0 -0
  424. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/102.png +0 -0
  425. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/110.png +0 -0
  426. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/120.png +0 -0
  427. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/127.png +0 -0
  428. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/18.png +0 -0
  429. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/19.png +0 -0
  430. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/2.png +0 -0
  431. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/24.png +0 -0
  432. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/26.png +0 -0
  433. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/27.png +0 -0
  434. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/28.png +0 -0
  435. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/29.png +0 -0
  436. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/30.png +0 -0
  437. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/31.png +0 -0
  438. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/33.png +0 -0
  439. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/37.png +0 -0
  440. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/41.png +0 -0
  441. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/99.png +0 -0
  442. data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/10.png +0 -0
  443. data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/18.png +0 -0
  444. data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/19.png +0 -0
  445. data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/2.png +0 -0
  446. data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x-2.psd +0 -0
  447. data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x.psd +0 -0
  448. data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-sprite.psd +0 -0
  449. data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-ysprite.psd +0 -0
  450. data/frameworks/sproutcore/themes/standard_theme/Source/shared-icons.psd +0 -0
  451. data/frameworks/sproutcore/themes/standard_theme/Source/sproutcore-logo.psd +0 -0
  452. data/frameworks/sproutcore/themes/standard_theme/Source/sticky-note.psd +0 -0
  453. data/frameworks/sproutcore/themes/standard_theme/english.lproj/button.css +191 -193
  454. data/frameworks/sproutcore/themes/standard_theme/english.lproj/checkbox.css +11 -10
  455. data/frameworks/sproutcore/themes/standard_theme/english.lproj/collection.css +85 -4
  456. data/frameworks/sproutcore/themes/standard_theme/english.lproj/core.css +15 -2
  457. data/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-theme-repeat-x.png +0 -0
  458. data/frameworks/sproutcore/themes/standard_theme/english.lproj/label.css +0 -26
  459. data/frameworks/sproutcore/themes/standard_theme/english.lproj/list_item.css +30 -0
  460. data/frameworks/sproutcore/themes/standard_theme/english.lproj/progress.css +9 -6
  461. data/frameworks/sproutcore/themes/standard_theme/english.lproj/radio.css +20 -11
  462. data/frameworks/sproutcore/themes/standard_theme/english.lproj/segmented.css +192 -54
  463. data/frameworks/sproutcore/themes/standard_theme/english.lproj/slider.css +56 -24
  464. data/frameworks/sproutcore/themes/standard_theme/english.lproj/tab.css +13 -7
  465. data/frameworks/sproutcore/themes/standard_theme/english.lproj/text_field.css +1 -4
  466. data/frameworks/sproutcore/themes/standard_theme/english.lproj/toolbar.css +4 -1
  467. data/lib/sproutcore/builders/minify.rb +2 -2
  468. data/lib/sproutcore/builders/test.rb +1 -1
  469. data/lib/sproutcore/buildfile.rb +1 -0
  470. data/lib/sproutcore/rack/dev.rb +1 -1
  471. data/lib/sproutcore/rack/filesystem.rb +265 -0
  472. data/lib/sproutcore/rack/proxy.rb +11 -3
  473. data/lib/sproutcore/rack/service.rb +11 -1
  474. data/lib/sproutcore/tools.rb +11 -1
  475. data/lib/sproutcore/tools/server.rb +6 -4
  476. data/vendor/jsdoc/README.txt +151 -0
  477. data/vendor/jsdoc/changes.txt +47 -0
  478. metadata +263 -308
  479. data/frameworks/sproutcore/apps/sc_jsdoc/controllers/docs.js +0 -149
  480. data/frameworks/sproutcore/apps/sc_jsdoc/core.js +0 -16
  481. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.css +0 -17
  482. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.js +0 -99
  483. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/images/sproutcore-logo.png +0 -0
  484. data/frameworks/sproutcore/apps/sc_jsdoc/main.js +0 -27
  485. data/frameworks/sproutcore/apps/sc_jsdoc/models/doc.js +0 -21
  486. data/frameworks/sproutcore/apps/sc_qunit/controllers/runner.js +0 -209
  487. data/frameworks/sproutcore/apps/sc_qunit/core.js +0 -16
  488. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.css +0 -17
  489. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.js +0 -107
  490. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/images/sproutcore-logo.png +0 -0
  491. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/strings.js +0 -15
  492. data/frameworks/sproutcore/apps/sc_qunit/main.js +0 -18
  493. data/frameworks/sproutcore/apps/sc_qunit/models/test.js +0 -24
  494. data/frameworks/sproutcore/apps/sc_qunit/views/test_iframe.js +0 -52
  495. data/frameworks/sproutcore/apps/tests/controllers/test.js +0 -20
  496. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/blank.gif +0 -0
  497. data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu.css +0 -83
  498. data/frameworks/sproutcore/frameworks/desktop/english.lproj/palette.css +0 -3
  499. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/methods.js +0 -10
  500. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/methods.js +0 -10
  501. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui.js +0 -110
  502. data/frameworks/sproutcore/frameworks/foundation/mixins/responder.js +0 -156
  503. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array.js +0 -118
  504. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/controller.js +0 -268
  505. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object.js +0 -433
  506. data/frameworks/sproutcore/frameworks/runtime/tests/system/array.js +0 -263
  507. data/frameworks/sproutcore/frameworks/testing/tests/debug/qunit.js +0 -25
  508. data/spec/buildtasks/manifest/spec_helper.rb +0 -35
  509. data/spec/buildtasks/target_spec.rb +0 -214
  510. data/spec/fixtures/builder_tests/Buildfile +0 -15
  511. data/spec/fixtures/builder_tests/apps/combine_test/a.js +0 -1
  512. data/spec/fixtures/builder_tests/apps/combine_test/b.js +0 -1
  513. data/spec/fixtures/builder_tests/apps/combine_test/c.js +0 -1
  514. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/a.css +0 -1
  515. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/b.css +0 -1
  516. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/c.css +0 -1
  517. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/bar1_sample.rhtml +0 -2
  518. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/erb_sample.html.erb +0 -1
  519. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/icons/image.png +0 -0
  520. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/image.jpg +0 -0
  521. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/rhtml_sample.rhtml +0 -1
  522. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/strings.js +0 -4
  523. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/style.css +0 -0
  524. data/spec/fixtures/builder_tests/apps/html_test/french.lproj/french-icons/fr.png +0 -0
  525. data/spec/fixtures/builder_tests/apps/html_test/french.lproj/strings.js +0 -4
  526. data/spec/fixtures/builder_tests/apps/html_test/lib/layout_template.rhtml +0 -1
  527. data/spec/fixtures/builder_tests/apps/html_test/scripts.js +0 -0
  528. data/spec/fixtures/builder_tests/apps/javascript_test/sc_static.js +0 -15
  529. data/spec/fixtures/builder_tests/apps/javascript_test/sc_super.js +0 -4
  530. data/spec/fixtures/builder_tests/apps/javascript_test/strings.js +0 -7
  531. data/spec/fixtures/builder_tests/apps/sass_test/sample.sass +0 -3
  532. data/spec/fixtures/builder_tests/apps/strings_test/lproj/strings.js +0 -8
  533. data/spec/fixtures/builder_tests/apps/stylesheet_test/build_directives.css +0 -9
  534. data/spec/fixtures/builder_tests/apps/stylesheet_test/sc_static.css +0 -12
  535. data/spec/fixtures/builder_tests/apps/test_test/lib/alt_layout.rhtml +0 -1
  536. data/spec/fixtures/builder_tests/apps/test_test/lib/test_layout.rhtml +0 -3
  537. data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test.js +0 -1
  538. data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test2.js +0 -1
  539. data/spec/fixtures/builder_tests/apps/test_test/tests/rhtml_test.rhtml +0 -4
  540. data/spec/fixtures/builder_tests/frameworks/debug/core.js +0 -0
  541. data/spec/fixtures/builder_tests/frameworks/debug/english.lproj/dummy.css +0 -0
  542. data/spec/fixtures/builder_tests/frameworks/qunit/core.js +0 -0
  543. data/spec/fixtures/builder_tests/frameworks/qunit/english.lproj/dummy.css +0 -0
  544. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/req_style_1.css +0 -0
  545. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/strings.js +0 -4
  546. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/test.rhtml +0 -1
  547. data/spec/fixtures/builder_tests/frameworks/req_target_1/req_js_1.js +0 -0
  548. data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/req_style_2.css +0 -0
  549. data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/test.rhtml +0 -1
  550. data/spec/fixtures/builder_tests/frameworks/req_target_2/javascript.js +0 -1
  551. data/spec/fixtures/builder_tests/frameworks/req_target_2/lib/alt_layout.rhtml +0 -0
  552. data/spec/fixtures/builder_tests/frameworks/req_target_2/req_js_2.js +0 -0
  553. data/spec/fixtures/builder_tests/themes/sample_theme/Buildfile +0 -1
  554. data/spec/fixtures/buildfiles/basic/Buildfile +0 -16
  555. data/spec/fixtures/buildfiles/basic/task_module.rake +0 -6
  556. data/spec/fixtures/buildfiles/installed/Buildfile +0 -7
  557. data/spec/fixtures/buildfiles/installed/Buildfile2 +0 -5
  558. data/spec/fixtures/buildfiles/project_test/Buildfile +0 -4
  559. data/spec/fixtures/buildfiles/project_test/not_project/Buildfile +0 -2
  560. data/spec/fixtures/buildfiles/project_test/not_project/child/PLACEHOLDER +0 -0
  561. data/spec/fixtures/entry_for_project/Buildfile +0 -1
  562. data/spec/fixtures/entry_for_project/apps/test_app/frameworks/nested/PLACEHOLDER +0 -0
  563. data/spec/fixtures/entry_for_project/frameworks/shared/PLACEHOLDER +0 -0
  564. data/spec/fixtures/find_targets/custom/Buildfile +0 -8
  565. data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar1/PLACEHOLDER +0 -0
  566. data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar2/PLACEHOLDER +0 -0
  567. data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo1/PLACEHOLDER +0 -0
  568. data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo2/PLACEHOLDER +0 -0
  569. data/spec/fixtures/find_targets/custom/foos/custom_foos/Buildfile +0 -5
  570. data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo1/PLACEHOLDER +0 -0
  571. data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo2/PLACEHOLDER +0 -0
  572. data/spec/fixtures/find_targets/custom/foos/custom_foos/foos/not_foo1/PLACEHOLDER +0 -0
  573. data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar1/PLACEHOLDER +0 -0
  574. data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar2/PLACEHOLDER +0 -0
  575. data/spec/fixtures/find_targets/nested/Buildfile +0 -8
  576. data/spec/fixtures/find_targets/nested/apps/app1/Buildfile +0 -1
  577. data/spec/fixtures/find_targets/nested/apps/app1/apps/nested_app/PLACEHOLDER +0 -0
  578. data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework1/PLACEHOLDER +0 -0
  579. data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework2/PLACEHOLDER +0 -0
  580. data/spec/fixtures/find_targets/standard/clients/client1/PLACEHOLDER +0 -0
  581. data/spec/fixtures/find_targets/standard/frameworks/framework1/frameworks/framework1/PLACEHOLDER +0 -0
  582. data/spec/fixtures/find_targets/standard/frameworks/framework2/PLACEHOLDER +0 -0
  583. data/spec/fixtures/find_targets/standard/themes/theme1/PLACEHOLDER +0 -0
  584. data/spec/fixtures/find_targets/standard/themes/theme2/PLACEHOLDER +0 -0
  585. data/spec/fixtures/languages/apps/caps_long_names/English.lproj/PLACEHOLDER +0 -0
  586. data/spec/fixtures/languages/apps/caps_long_names/FreNCH.lproj/PLACEHOLDER +0 -0
  587. data/spec/fixtures/languages/apps/caps_long_names/UnknOWN.lproj/PLACEHOLDER +0 -0
  588. data/spec/fixtures/languages/apps/long_names/english.lproj/PLACEHOLDER +0 -0
  589. data/spec/fixtures/languages/apps/long_names/french.lproj/PLACEHOLDER +0 -0
  590. data/spec/fixtures/languages/apps/long_names/german.lproj/PLACEHOLDER +0 -0
  591. data/spec/fixtures/languages/apps/long_names/italian.lproj/PLACEHOLDER +0 -0
  592. data/spec/fixtures/languages/apps/long_names/japanese.lproj/PLACEHOLDER +0 -0
  593. data/spec/fixtures/languages/apps/long_names/spanish.lproj/PLACEHOLDER +0 -0
  594. data/spec/fixtures/languages/apps/long_names/unknown.lproj/PLACEHOLDER +0 -0
  595. data/spec/fixtures/languages/apps/no_names/PLACEHOLDER +0 -0
  596. data/spec/fixtures/languages/apps/short_names/de.lproj/PLACEHOLDER +0 -0
  597. data/spec/fixtures/languages/apps/short_names/en-CA.lproj/PLACEHOLDER +0 -0
  598. data/spec/fixtures/languages/apps/short_names/en-GB.lproj/PLACEHOLDER +0 -0
  599. data/spec/fixtures/languages/apps/short_names/en-US.lproj/PLACEHOLDER +0 -0
  600. data/spec/fixtures/languages/apps/short_names/en.lproj/PLACEHOLDER +0 -0
  601. data/spec/fixtures/languages/apps/short_names/es.lproj/PLACEHOLDER +0 -0
  602. data/spec/fixtures/languages/apps/short_names/foo.lproj/PLACEHOLDER +0 -0
  603. data/spec/fixtures/languages/apps/short_names/fr.lproj/PLACEHOLDER +0 -0
  604. data/spec/fixtures/languages/apps/short_names/it.lproj/PLACEHOLDER +0 -0
  605. data/spec/fixtures/languages/apps/short_names/ja.lproj/PLACEHOLDER +0 -0
  606. data/spec/fixtures/ordered_entries/apps/no_requires/1.js +0 -1
  607. data/spec/fixtures/ordered_entries/apps/no_requires/B.js +0 -1
  608. data/spec/fixtures/ordered_entries/apps/no_requires/a.js +0 -1
  609. data/spec/fixtures/ordered_entries/apps/no_requires/a/a.js +0 -1
  610. data/spec/fixtures/ordered_entries/apps/no_requires/a/b.js +0 -1
  611. data/spec/fixtures/ordered_entries/apps/no_requires/b/a.js +0 -1
  612. data/spec/fixtures/ordered_entries/apps/no_requires/c.js +0 -1
  613. data/spec/fixtures/ordered_entries/apps/no_requires/core.js +0 -1
  614. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/B.css +0 -0
  615. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a.css +0 -0
  616. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/a.css +0 -0
  617. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/b.css +0 -0
  618. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/b/a.css +0 -0
  619. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/c.css +0 -0
  620. data/spec/fixtures/ordered_entries/apps/no_requires/lproj/strings.js +0 -1
  621. data/spec/fixtures/ordered_entries/apps/no_requires/utils.js +0 -1
  622. data/spec/fixtures/ordered_entries/apps/with_requires/a.js +0 -2
  623. data/spec/fixtures/ordered_entries/apps/with_requires/b.js +0 -3
  624. data/spec/fixtures/ordered_entries/apps/with_requires/c.js +0 -2
  625. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/a.css +0 -2
  626. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/b.css +0 -2
  627. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/c.css +0 -2
  628. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/d.js +0 -1
  629. data/spec/fixtures/real_world/Buildfile +0 -12
  630. data/spec/fixtures/real_world/apps/account/README +0 -1
  631. data/spec/fixtures/real_world/apps/calendar/README +0 -1
  632. data/spec/fixtures/real_world/apps/contacts/README_BEFORE_EDITING +0 -1
  633. data/spec/fixtures/real_world/apps/files/README +0 -1
  634. data/spec/fixtures/real_world/apps/mail/README +0 -1
  635. data/spec/fixtures/real_world/apps/mobile_photos/README +0 -1
  636. data/spec/fixtures/real_world/apps/photos/README +0 -1
  637. data/spec/fixtures/real_world/apps/uploader/README +0 -1
  638. data/spec/fixtures/real_world/frameworks/core_files/PLACEHOLDER +0 -0
  639. data/spec/fixtures/real_world/frameworks/core_photos/PLACEHOLDER +0 -0
  640. data/spec/fixtures/real_world/frameworks/shared/PLACEHOLDER +0 -0
  641. data/spec/fixtures/real_world/frameworks/sproutcore/Buildfile +0 -26
  642. data/spec/fixtures/real_world/frameworks/sproutcore/README +0 -1
  643. data/spec/fixtures/real_world/frameworks/sproutcore/apps/docs/PLACEHOLDER +0 -0
  644. data/spec/fixtures/real_world/frameworks/sproutcore/apps/test_runner/PLACEHOLDER +0 -0
  645. data/spec/fixtures/real_world/frameworks/sproutcore/core.js +0 -0
  646. data/spec/fixtures/real_world/frameworks/sproutcore/debug/debug-resource.html +0 -0
  647. data/spec/fixtures/real_world/frameworks/sproutcore/debug/sample_debug.js +0 -0
  648. data/spec/fixtures/real_world/frameworks/sproutcore/demo2.js +0 -0
  649. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/debug/sample_debug-loc.js +0 -0
  650. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.css +0 -4
  651. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.html +0 -1
  652. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo2.sass +0 -0
  653. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.haml +0 -0
  654. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.html.erb +0 -1
  655. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.rhtml +0 -0
  656. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/fixtures/sample_fixtures-loc.js +0 -0
  657. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/has_require.css +0 -4
  658. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_require.css +0 -1
  659. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_sc_resource.rhtml +0 -1
  660. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/protocols/sample-loc.js +0 -0
  661. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.css +0 -6
  662. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.rhtml +0 -3
  663. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/strings.js +0 -1
  664. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/tests/sample-loc.js +0 -0
  665. data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample-json-fixture.json +0 -1
  666. data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample_fixtures.js +0 -0
  667. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/application/PLACEHOLDER +0 -0
  668. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/costello/core.js +0 -0
  669. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/data_store/PLACEHOLDER +0 -0
  670. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/debug/PLACEHOLDER +0 -0
  671. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/desktop/PLACEHOLDER +0 -0
  672. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/empty_theme/PLACEHOLDER +0 -0
  673. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/foundation/PLACEHOLDER +0 -0
  674. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/mobile/PLACEHOLDER +0 -0
  675. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/qunit/PLACEHOLDER +0 -0
  676. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/uploader/PLACEHOLDER +0 -0
  677. data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/french-resource.js +0 -0
  678. data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/strings.js +0 -1
  679. data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/german-resource.js +0 -0
  680. data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/strings.js +0 -0
  681. data/spec/fixtures/real_world/frameworks/sproutcore/has_require.js +0 -4
  682. data/spec/fixtures/real_world/frameworks/sproutcore/lib/index.html +0 -1
  683. data/spec/fixtures/real_world/frameworks/sproutcore/no_require.js +0 -1
  684. data/spec/fixtures/real_world/frameworks/sproutcore/protocols/sample.js +0 -0
  685. data/spec/fixtures/real_world/frameworks/sproutcore/sc_resource.js +0 -6
  686. data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample1.js +0 -0
  687. data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample2.js +0 -0
  688. data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.js +0 -0
  689. data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.rhtml +0 -1
  690. data/spec/fixtures/real_world/frameworks/sproutcore/themes/standard_theme/README +0 -0
  691. data/spec/fixtures/real_world/frameworks/sproutcore/views/view.js +0 -1
  692. data/spec/fixtures/real_world/generators/sample_custom/Buildfile +0 -0
  693. data/spec/fixtures/real_world/generators/sample_custom/templates/{filename}.js +0 -1
  694. data/spec/fixtures/recursive_project/Buildfile +0 -8
  695. data/spec/fixtures/recursive_project/frameworks/sproutcore/frameworks/costello/PLACEHOLDER +0 -0
  696. data/spec/lib/builders/combine_spec.rb +0 -67
  697. data/spec/lib/builders/html_spec.rb +0 -577
  698. data/spec/lib/builders/javascript_spec.rb +0 -81
  699. data/spec/lib/builders/sass_spec.rb +0 -43
  700. data/spec/lib/builders/spec_helper.rb +0 -30
  701. data/spec/lib/builders/strings_spec.rb +0 -52
  702. data/spec/lib/builders/stylesheet_spec.rb +0 -63
  703. data/spec/lib/builders/test_index_spec.rb +0 -44
  704. data/spec/lib/builders/test_spec.rb +0 -135
  705. data/spec/lib/buildfile/config_for_spec.rb +0 -81
  706. data/spec/lib/buildfile/define_spec.rb +0 -59
  707. data/spec/lib/buildfile/dup_spec.rb +0 -65
  708. data/spec/lib/buildfile/invoke_spec.rb +0 -130
  709. data/spec/lib/buildfile/load_spec.rb +0 -49
  710. data/spec/lib/buildfile/task/dup_spec.rb +0 -55
  711. data/spec/lib/buildfile/task_defined_spec.rb +0 -17
  712. data/spec/lib/buildfile_commands/build_task_spec.rb +0 -19
  713. data/spec/lib/buildfile_commands/config_spec.rb +0 -97
  714. data/spec/lib/buildfile_commands/import_spec.rb +0 -17
  715. data/spec/lib/buildfile_commands/namespace_spec.rb +0 -18
  716. data/spec/lib/buildfile_commands/proxies_spec.rb +0 -38
  717. data/spec/lib/buildfile_commands/replace_task_spec.rb +0 -29
  718. data/spec/lib/buildfile_commands/task_spec.rb +0 -36
  719. data/spec/lib/helpers/packing_optimizer/optimize_spec.rb +0 -26
  720. data/spec/lib/models/hash_struct/deep_clone_spec.rb +0 -27
  721. data/spec/lib/models/hash_struct/has_options_spec.rb +0 -32
  722. data/spec/lib/models/hash_struct/hash_spec.rb +0 -64
  723. data/spec/lib/models/hash_struct/merge_spec.rb +0 -26
  724. data/spec/lib/models/hash_struct/method_missing.rb +0 -41
  725. data/spec/lib/models/manifest/add_entry_spec.rb +0 -36
  726. data/spec/lib/models/manifest/add_transform_spec.rb +0 -90
  727. data/spec/lib/models/manifest/build_spec.rb +0 -78
  728. data/spec/lib/models/manifest/entry_for_spec.rb +0 -94
  729. data/spec/lib/models/manifest/find_entry.rb +0 -84
  730. data/spec/lib/models/manifest/prepare_spec.rb +0 -62
  731. data/spec/lib/models/manifest_entry/cacheable_url_spec.rb +0 -31
  732. data/spec/lib/models/manifest_entry/prepare_spec.rb +0 -54
  733. data/spec/lib/models/project/add_target_spec.rb +0 -44
  734. data/spec/lib/models/project/buildfile_spec.rb +0 -35
  735. data/spec/lib/models/project/find_targets_for_spec.rb +0 -77
  736. data/spec/lib/models/project/load_nearest_project_spec.rb +0 -23
  737. data/spec/lib/models/project/target_for_spec.rb +0 -33
  738. data/spec/lib/models/project/targets_spec.rb +0 -62
  739. data/spec/lib/models/target/compute_build_number_spec.rb +0 -125
  740. data/spec/lib/models/target/config_spec.rb +0 -30
  741. data/spec/lib/models/target/expand_required_targets_spec.rb +0 -48
  742. data/spec/lib/models/target/installed_languages_spec.rb +0 -47
  743. data/spec/lib/models/target/lproj_for_spec.rb +0 -38
  744. data/spec/lib/models/target/manifest_for_spec.rb +0 -42
  745. data/spec/lib/models/target/parent_target_spec.rb +0 -21
  746. data/spec/lib/models/target/prepare_spec.rb +0 -53
  747. data/spec/lib/models/target/required_targets_spec.rb +0 -119
  748. data/spec/lib/models/target/target_for_spec.rb +0 -56
  749. data/spec/lib/tools/build_number_spec.rb +0 -28
  750. data/spec/lib/tools/gen_spec.rb +0 -207
  751. data/spec/lib/tools/tools_spec.rb +0 -78
  752. data/spec/spec_helper.rb +0 -138
  753. data/vendor/github_gem_lint.rb +0 -22
  754. data/vendor/yui-compressor/yuicompressor-2.4.2.jar +0 -0
@@ -9,120 +9,971 @@ require('core') ;
9
9
  /**
10
10
  @class
11
11
 
12
- Description
12
+ This permits you to perform queries on your data store,
13
+ written in a SQL-like language. Here is a simple example:
14
+
15
+ q = SC.Query.create({
16
+ conditions: "firstName = 'Jonny' AND lastName = 'Cash'"
17
+ })
18
+
19
+ You can check if a certain record matches the query by calling:
20
+
21
+ q.contains(record)
22
+
23
+ To find all records of your store, that match query q, use findAll with
24
+ query q as argument:
25
+
26
+ r = MyApp.store.findAll(q)
27
+
28
+ r will be a record array containing all matching records.
29
+ To limit the query to a record type of MyApp.MyModel,
30
+ you can specify the type as a property of the query like this:
31
+
32
+ q = SC.Query.create({
33
+ conditions: "firstName = 'Jonny' AND lastName = 'Cash'",
34
+ recordType: MyApp.MyModel
35
+ })
36
+
37
+ Calling findAll() like above will now return only records of type t.
38
+ It is recommended to limit your query to a record type, since the query will
39
+ have to look for matching records in the whole store, if no record type
40
+ is given.
41
+
42
+ You can give an order, which the resulting records should follow, like this:
43
+
44
+ q = SC.Query.create({
45
+ conditions: "firstName = 'Jonny' AND lastName = 'Cash'",
46
+ recordType: MyApp.MyModel,
47
+ orderBy: "lastName, year DESC"
48
+ })
49
+
50
+ The default order direction is ascending. You can change it to descending
51
+ by writing DESC behind the property name like in the example above.
52
+ If no order is given, or records are equal in respect to a given order,
53
+ records will be ordered by guid.
54
+
55
+
56
+ Features of the query language:
57
+
58
+ Primitives:
59
+ - record properties
60
+ - null, undefined
61
+ - true, false
62
+ - numbers (integers and floats)
63
+ - strings (double or single quoted)
64
+
65
+ Parameters:
66
+ - %@ (wild card)
67
+ - {parameterName} (named parameter)
68
+ Wild cards are used to identify parameters by the order in
69
+ which they appear in the query string. Named parameters can be
70
+ used when tracking the order becomes difficult.
71
+ Both types of parameters can be used by giving the parameters
72
+ as a property to your query object:
73
+ yourQuery.parameters = yourParameters
74
+ where yourParameters should have one of the following formats:
75
+ for wild cards: [firstParam, secondParam, thirdParam]
76
+ for named params: {name1: param1, mane2: parma2}
77
+ You cannot use both types of parameters in a single query!
78
+
79
+ Operators:
80
+ - =
81
+ - !=
82
+ - <
83
+ - <=
84
+ - >
85
+ - >=
86
+ - BEGINS_WITH (checks if a string starts with another one)
87
+ - ENDS_WITH (checks if a string ends with another one)
88
+ - MATCHES (checks if a string is matched by a regexp,
89
+ you will have to use a parameter to insert the regexp)
90
+ - ANY (checks if the thing on its left is contained in the array
91
+ on its right, you will have to use a parameter
92
+ to insert the array)
93
+ - TYPE_IS (unary operator expecting a string containing the name
94
+ of a Model class on its right side, only records of this type
95
+ will match)
96
+
97
+ Boolean Operators:
98
+ - AND
99
+ - OR
100
+ - NOT
101
+
102
+ Parenthesis for grouping:
103
+ - ( and )
104
+
105
+
106
+ Some example queries:
107
+
108
+ TODO add examples
109
+
110
+
111
+ You can extend the query language with your own operators by calling:
112
+
113
+ SC.Query.registerQueryExtension('your_operator', your_operator_definition)
114
+
115
+ See details below. As well you can provide your own comparison functions
116
+ to control ordering of specific record properties like this:
117
+
118
+ SC.Query.registerComparison(property_name, comparison_for_this_property)
119
+
120
+ Again see below for details.
13
121
 
14
122
  @extends SC.Object
15
- @extends SC.SparseArray
16
123
  @static
17
124
  @since SproutCore 1.0
18
125
  */
19
126
 
20
- SC.Query = SC.SparseArray.extend(
21
- /** @scope SC.Query.prototype */ {
127
+ SC.Query = SC.Object.extend({
128
+
129
+
130
+ conditions: null,
131
+ orderBy: null,
132
+ recordType: null,
133
+ parameters: null,
134
+
135
+ /**
136
+ Returns YES if record is matched by the query, NO otherwise.
137
+
138
+ @param {SC.Record} record the record to check
139
+ @returns {Boolean} YES if record belongs, NO otherwise
140
+ */
141
+ contains: function(record, wildCardValues) {
142
+ // if called for the first time we have to parse the query
143
+ if (!this.isReady) this.parseQuery();
144
+
145
+ // if wildCardValues were not provided, use parameters instead
146
+ if (wildCardValues === undefined) wildCardValues = this.parameters;
147
+
148
+ // if parsing worked we check if record is contained
149
+ // if parsing failed no record will be contained
150
+ return this.isReady && this.tokenTree.evaluate(record, wildCardValues);
151
+ },
152
+
153
+ /**
154
+ This will tell you which of the two passed records is greater
155
+ than the other, in respect to the orderBy property of your SC.Query object.
156
+
157
+ @param {SC.Record} record1 the first record
158
+ @param {SC.Record} record2 the second record
159
+ @returns {Number} -1 if record1 < record2,
160
+ +1 if record1 > record2,
161
+ 0 if equal
162
+ */
163
+ compare: function(record1, record2) {
164
+ var result;
165
+ var propertyName;
22
166
 
23
- queryString: '',
24
- truthFunction: null,
25
- conditions: null,
26
- store: null,
27
- // delegate: null,
28
- recordType: null,
29
- needRecord: false,
167
+ // if called for the first time we have to build the order array
168
+ if (!this.isReady) this.parseQuery();
169
+ // if parsing failed we say everything is equal
170
+ if (!this.isReady) return 0;
171
+
172
+ // for every property specified in orderBy
173
+ for (var i=0, orderLength=this.order.length ; i < orderLength; i++) {
174
+ propertyName = this.order[i].propertyName;
175
+ // if this property has a registered comparison use that
176
+ // if not use default SC.compare()
177
+ if (SC.Query.comparisons[propertyName]) {
178
+ result = SC.Query.comparisons[propertyName](
179
+ record1.get(propertyName),record2.get(propertyName));
180
+ }
181
+ else {
182
+ result = SC.compare(
183
+ record1.get(propertyName),record2.get(propertyName));
184
+ }
185
+ if (result !== 0) {
186
+ // if order is descending we invert the sign of the result
187
+ if (this.order[i].descending) result = (-1) * result;
188
+ return result;
189
+ }
190
+ }
191
+
192
+ // all properties are equal now
193
+ // get order by guid
194
+ return SC.compare(record1.get('guid'),record2.get('guid'));
195
+ },
196
+
197
+
198
+
199
+ /** @private
200
+ Some internal properties
201
+ */
202
+ isReady: false,
203
+ tokenList: null,
204
+ usedProperties: null,
205
+ needsRecord: false,
206
+ tokenTree: null,
207
+ order: [],
30
208
 
31
- length: 0,
32
209
 
33
- createTruthFunction: function(queryString) {
34
- this.set('queryString', queryString);
210
+
211
+ /**
212
+ This method has to be called before the query object can be used.
213
+ You will normaly not have to do this, it will be called automatically
214
+ if you try to evaluate a query.
215
+ You can however use this function for testing your queries.
216
+
217
+ @returns {Boolean} true if parsing succeeded, false otherwise
218
+ */
219
+ parseQuery: function() {
220
+ this.tokenList = this.tokenizeString(this.conditions, this.queryLanguage);
221
+ this.tokenTree = this.buildTokenTree(this.tokenList, this.queryLanguage);
222
+ this.order = this.buildOrder(this.orderBy);
35
223
 
36
- /* Need parsing here from Thomas.. curently hacked. */
37
- var hackComponents = [queryString.split('=')[0]];
224
+ // maybe we need this later
225
+ // this.usedProperties = this.propertiesUsedInQuery(this.tokenList);
38
226
 
39
- var components = queryString.split('=');
227
+ if ( !this.tokenTree || this.tokenTree.error ) {
228
+ return false;
229
+ }
230
+ else {
231
+ this.isReady = true;
232
+ return true;
233
+ }
234
+ },
235
+
236
+
237
+
238
+ // ..........................................................
239
+ // QUERY LANGUAGE DEFINITION
240
+ //
241
+
242
+
243
+ /**
244
+ This is the definition of the query language. You can extend it
245
+ by using SC.Query.registerQueryExtension().
246
+ */
247
+ queryLanguage: {
248
+ 'UNKNOWN': {
249
+ firstCharacter: /[^\s'"\w\d\(\)\{\}]/,
250
+ notAllowed: /[\s'"\w\d\(\)\{\}]/
251
+ },
252
+ 'PROPERTY': {
253
+ firstCharacter: /[a-zA-Z_]/,
254
+ notAllowed: /[^a-zA-Z_0-9]/,
255
+ evalType: 'PRIMITIVE',
256
+ evaluate: function (r,w) { return r.get(this.tokenValue); }
257
+ },
258
+ 'NUMBER': {
259
+ firstCharacter: /\d/,
260
+ notAllowed: /[^\d\.]/,
261
+ format: /^\d+$|^\d+\.\d+$/,
262
+ evalType: 'PRIMITIVE',
263
+ evaluate: function (r,w) { return parseFloat(this.tokenValue); }
264
+ },
265
+ 'STRING': {
266
+ firstCharacter: /['"]/,
267
+ delimeted: true,
268
+ evalType: 'PRIMITIVE',
269
+ evaluate: function (r,w) { return this.tokenValue; }
270
+ },
271
+ 'PARAMETER': {
272
+ firstCharacter: /\{/,
273
+ lastCharacter: '}',
274
+ delimeted: true,
275
+ evalType: 'PRIMITIVE',
276
+ evaluate: function (r,w) { return w[this.tokenValue]; }
277
+ },
278
+ '%@': {
279
+ rememberCount: true,
280
+ reservedWord: true,
281
+ evalType: 'PRIMITIVE',
282
+ evaluate: function (r,w) { return w[this.tokenValue]; }
283
+ },
284
+ 'OPEN_PAREN': {
285
+ firstCharacter: /\(/,
286
+ singleCharacter: true
287
+ },
288
+ 'CLOSE_PAREN': {
289
+ firstCharacter: /\)/,
290
+ singleCharacter: true
291
+ },
292
+ 'AND': {
293
+ reservedWord: true,
294
+ leftType: 'BOOLEAN',
295
+ rightType: 'BOOLEAN',
296
+ evalType: 'BOOLEAN',
297
+ evaluate: function (r,w) {
298
+ var left = this.leftSide.evaluate(r,w);
299
+ var right = this.rightSide.evaluate(r,w);
300
+ return left && right;
301
+ }
302
+ },
303
+ 'OR': {
304
+ reservedWord: true,
305
+ leftType: 'BOOLEAN',
306
+ rightType: 'BOOLEAN',
307
+ evalType: 'BOOLEAN',
308
+ evaluate: function (r,w) {
309
+ var left = this.leftSide.evaluate(r,w);
310
+ var right = this.rightSide.evaluate(r,w);
311
+ return left || right;
312
+ }
313
+ },
314
+ 'NOT': {
315
+ reservedWord: true,
316
+ rightType: 'BOOLEAN',
317
+ evalType: 'BOOLEAN',
318
+ evaluate: function (r,w) {
319
+ var right = this.rightSide.evaluate(r,w);
320
+ return !right;
321
+ }
322
+ },
323
+ '=': {
324
+ reservedWord: true,
325
+ leftType: 'PRIMITIVE',
326
+ rightType: 'PRIMITIVE',
327
+ evalType: 'BOOLEAN',
328
+ evaluate: function (r,w) {
329
+ var left = this.leftSide.evaluate(r,w);
330
+ var right = this.rightSide.evaluate(r,w);
331
+ return left == right;
332
+ }
333
+ },
334
+ '!=': {
335
+ reservedWord: true,
336
+ leftType: 'PRIMITIVE',
337
+ rightType: 'PRIMITIVE',
338
+ evalType: 'BOOLEAN',
339
+ evaluate: function (r,w) {
340
+ var left = this.leftSide.evaluate(r,w);
341
+ var right = this.rightSide.evaluate(r,w);
342
+ return left != right;
343
+ }
344
+ },
345
+ '<': {
346
+ reservedWord: true,
347
+ leftType: 'PRIMITIVE',
348
+ rightType: 'PRIMITIVE',
349
+ evalType: 'BOOLEAN',
350
+ evaluate: function (r,w) {
351
+ var left = this.leftSide.evaluate(r,w);
352
+ var right = this.rightSide.evaluate(r,w);
353
+ return left < right;
354
+ }
355
+ },
356
+ '<=': {
357
+ reservedWord: true,
358
+ leftType: 'PRIMITIVE',
359
+ rightType: 'PRIMITIVE',
360
+ evalType: 'BOOLEAN',
361
+ evaluate: function (r,w) {
362
+ var left = this.leftSide.evaluate(r,w);
363
+ var right = this.rightSide.evaluate(r,w);
364
+ return left <= right;
365
+ }
366
+ },
367
+ '>': {
368
+ reservedWord: true,
369
+ leftType: 'PRIMITIVE',
370
+ rightType: 'PRIMITIVE',
371
+ evalType: 'BOOLEAN',
372
+ evaluate: function (r,w) {
373
+ var left = this.leftSide.evaluate(r,w);
374
+ var right = this.rightSide.evaluate(r,w);
375
+ return left > right;
376
+ }
377
+ },
378
+ '>=': {
379
+ reservedWord: true,
380
+ leftType: 'PRIMITIVE',
381
+ rightType: 'PRIMITIVE',
382
+ evalType: 'BOOLEAN',
383
+ evaluate: function (r,w) {
384
+ var left = this.leftSide.evaluate(r,w);
385
+ var right = this.rightSide.evaluate(r,w);
386
+ return left >= right;
387
+ }
388
+ },
389
+ 'BEGINS_WITH': {
390
+ reservedWord: true,
391
+ leftType: 'PRIMITIVE',
392
+ rightType: 'PRIMITIVE',
393
+ evalType: 'BOOLEAN',
394
+ evaluate: function (r,w) {
395
+ var all = this.leftSide.evaluate(r,w);
396
+ var start = this.rightSide.evaluate(r,w);
397
+ return ( all.substr(0,start.length) == start );
398
+ }
399
+ },
400
+ 'ENDS_WITH': {
401
+ reservedWord: true,
402
+ leftType: 'PRIMITIVE',
403
+ rightType: 'PRIMITIVE',
404
+ evalType: 'BOOLEAN',
405
+ evaluate: function (r,w) {
406
+ var all = this.leftSide.evaluate(r,w);
407
+ var end = this.rightSide.evaluate(r,w);
408
+ var suf = all.substring(all.length-end.length,all.length);
409
+ return suf == end;
410
+ }
411
+ },
412
+ 'ANY': {
413
+ reservedWord: true,
414
+ leftType: 'PRIMITIVE',
415
+ rightType: 'PRIMITIVE',
416
+ evalType: 'BOOLEAN',
417
+ evaluate: function (r,w) {
418
+ var prop = this.leftSide.evaluate(r,w);
419
+ var values = this.rightSide.evaluate(r,w);
420
+ var found = false;
421
+ var i = 0;
422
+ while ( found===false && i<values.length ) {
423
+ if ( prop == values[i] ) found = true;
424
+ i++;
425
+ }
426
+ return found;
427
+ }
428
+ },
429
+ 'MATCHES': {
430
+ reservedWord: true,
431
+ leftType: 'PRIMITIVE',
432
+ rightType: 'PRIMITIVE',
433
+ evalType: 'BOOLEAN',
434
+ evaluate: function (r,w) {
435
+ var toMatch = this.leftSide.evaluate(r,w);
436
+ var matchWith = this.rightSide.evaluate(r,w);
437
+ return matchWith.test(toMatch);
438
+ }
439
+ },
440
+ 'TYPE_IS': {
441
+ reservedWord: true,
442
+ rightType: 'PRIMITIVE',
443
+ evalType: 'BOOLEAN',
444
+ evaluate: function (r,w) {
445
+ var actualType = SC.Store.recordTypeFor(r.storeKey);
446
+ var right = this.rightSide.evaluate(r,w);
447
+ var expectType = SC.objectForPropertyPath(right);
448
+ return actualType == expectType;
449
+ }
450
+ },
451
+ 'null': {
452
+ reservedWord: true,
453
+ evalType: 'PRIMITIVE',
454
+ evaluate: function (r,w) { return null; }
455
+ },
456
+ 'undefined': {
457
+ reservedWord: true,
458
+ evalType: 'PRIMITIVE',
459
+ evaluate: function (r,w) { return undefined; }
460
+ },
461
+ 'false': {
462
+ reservedWord: true,
463
+ evalType: 'PRIMITIVE',
464
+ evaluate: function (r,w) { return false; }
465
+ },
466
+ 'true': {
467
+ reservedWord: true,
468
+ evalType: 'PRIMITIVE',
469
+ evaluate: function (r,w) { return true; }
470
+ }
471
+ },
472
+
473
+
474
+ // ..........................................................
475
+ // TOKENIZER
476
+ //
477
+
478
+
479
+ /**
480
+ Takes a string and tokenizes it based on the grammar definition
481
+ provided. Called by parseQuery().
40
482
 
41
- var needRecord = this.willNeedRecord(hackComponents);
42
- this.set('needRecord', needRecord);
483
+ @param {String} inputString the string to tokenize
484
+ @param {Object} grammar the grammar definition (normally queryLanguage)
485
+ @returns {Array} list of tokens
486
+ */
487
+ tokenizeString: function (inputString, grammar) {
488
+
489
+
490
+ var tokenList = [];
491
+ var c = null;
492
+ var t = null;
493
+ var token = null;
494
+ var tokenType = null;
495
+ var currentToken = null;
496
+ var currentTokenType = null;
497
+ var currentTokenValue = null;
498
+ var currentDelimeter = null;
499
+ var endOfString = false;
500
+ var endOfToken = false;
501
+ var belongsToToken = false;
502
+ var skipThisCharacter = false;
503
+ var rememberCount = {};
504
+
505
+
506
+ // helper function that adds tokens to the tokenList
507
+
508
+ function addToken (tokenType, tokenValue) {
509
+ t = grammar[tokenType];
510
+ //tokenType = t.tokenType;
511
+
512
+ // handling of special cases
513
+ // check format
514
+ if (t.format && !t.format.test(tokenValue)) tokenType = "UNKNOWN";
515
+ // delimeted token (e.g. by ")
516
+ if (t.delimeted) skipThisCharacter = true;
517
+
518
+ // reserved words
519
+ if ( !t.delimeted ) {
520
+ for ( var anotherToken in grammar ) {
521
+ if ( grammar[anotherToken].reservedWord
522
+ && anotherToken == tokenValue ) {
523
+ tokenType = anotherToken;
524
+ }
525
+ }
526
+ }
527
+
528
+ // reset t
529
+ t = grammar[tokenType];
530
+ // remembering count type
531
+ if ( t && t.rememberCount ) {
532
+ if (!rememberCount[tokenType]) rememberCount[tokenType] = 0;
533
+ tokenValue = rememberCount[tokenType];
534
+ rememberCount[tokenType] += 1;
535
+ }
43
536
 
44
- if(needRecord) {
45
- this.truthFunction = function(rec, conditions) {
46
- if(!rec) return NO;
47
- return (rec.get(components[0]) == conditions[0]);
48
- };
49
- } else {
50
- this.truthFunction = function(rec, conditions) {
51
- if(!rec) return NO;
52
- return (rec[components[0]] == conditions[0]);
53
- };
537
+ // push token to list
538
+ tokenList.push( {tokenType: tokenType, tokenValue: tokenValue} );
539
+
540
+ // and clean up currentToken
541
+ currentToken = null;
542
+ currentTokenType = null;
543
+ currentTokenValue = null;
54
544
  }
55
- },
56
545
 
57
- willNeedRecord: function(components) {
546
+
547
+ // stepping through the string:
548
+
549
+ if (!inputString) return [];
550
+
551
+ for (var i=0; i < inputString.length; i++) {
552
+
553
+ // end reached?
554
+ endOfString = (i==inputString.length-1);
555
+
556
+ // current character
557
+ c = inputString[i];
58
558
 
59
- var rec = this.get('delegate').createCompRecord(this.get('recordType'));
60
- var needRecord = NO;
61
- for(var i=0, iLen=components.length; i<iLen; i++) {
62
- if(rec[components[i]]) {
63
- needRecord = YES;
559
+ // set true after end of delimeted token so that
560
+ // final delimeter is not catched again
561
+ skipThisCharacter = false;
562
+
563
+
564
+ // if currently inside a token
565
+
566
+ if ( currentToken ) {
567
+
568
+ // some helpers
569
+ t = grammar[currentToken];
570
+ endOfToken = t.delimeted ? c==currentDelimeter : t.notAllowed.test(c);
571
+
572
+ // if still in token
573
+ if ( !endOfToken ) currentTokenValue += c;
574
+
575
+ // if end of token reached
576
+ if (endOfToken || endOfString) {
577
+ addToken(currentToken, currentTokenValue);
578
+ }
579
+
580
+ // if end of string don't check again
581
+ if ( endOfString && !endOfToken ) skipThisCharacter = true;
582
+ }
583
+
584
+ // if not inside a token, look for next one
585
+
586
+ if ( !currentToken && !skipThisCharacter ) {
587
+ // look for matching tokenType
588
+ for ( token in grammar ) {
589
+ t = grammar[token];
590
+ if (t.firstCharacter && t.firstCharacter.test(c)) {
591
+ currentToken = token;
592
+ }
593
+ }
594
+
595
+ // if tokenType found
596
+ if ( currentToken ) {
597
+ t = grammar[currentToken];
598
+ currentTokenValue = c;
599
+ // handling of special cases
600
+ if ( t.delimeted ) {
601
+ currentTokenValue = "";
602
+ if ( t.lastCharacter ) currentDelimeter = t.lastCharacter;
603
+ else currentDelimeter = c;
604
+ }
605
+
606
+ if ( t.singleCharacter || endOfString ) {
607
+ addToken(currentToken, currentTokenValue);
608
+ }
609
+ }
64
610
  }
65
611
  }
66
- console.log('needRecord: ' + needRecord);
67
- return needRecord;
612
+
613
+ return tokenList;
68
614
  },
615
+
616
+
617
+
618
+ // ..........................................................
619
+ // BUILD TOKEN TREE
620
+ //
621
+
622
+ /**
623
+ Takes an array of tokens and returns a tree, depending on the
624
+ specified tree logic. The returned object will have an error property
625
+ if building of the tree failed. Check it to get some information
626
+ about what happend.
627
+ If everything worked the tree can be evaluated by calling:
628
+
629
+ tree.evaluate(record, parameters)
630
+
631
+ If tokenList is empty, a single token will be returned which will
632
+ evaluate to true for all records.
633
+
634
+ @param {Array} tokenList the list of tokens
635
+ @param {Object} treeLogic the logic definition (normally queryLanguage)
636
+ @returns {Object} token tree
637
+ */
638
+ buildTokenTree: function (tokenList, treeLogic) {
639
+
640
+ var l = tokenList.slice();
641
+ var i = 0;
642
+ var openParenthesisStack = [];
643
+ var shouldCheckAgain = false;
644
+ var error = [];
645
+
646
+
647
+ // empty tokenList is a special case
648
+ if (!tokenList || tokenList.length === 0) {
649
+ return { evaluate: function(){ return true; } };
650
+ }
651
+
652
+
653
+ // some helper functions
654
+
655
+ function tokenLogic (position) {
656
+ var p = position;
657
+ if ( p < 0 ) return false;
658
+
659
+ var tl = treeLogic[l[p].tokenType];
660
+
661
+ if ( ! tl ) {
662
+ error.push("logic for token '"+l[p].tokenType+"' is not defined");
663
+ return false;
664
+ }
69
665
 
666
+ // save evaluate in token, so that we don't have
667
+ // to look it up again when evaluating the tree
668
+ l[p].evaluate = tl.evaluate;
669
+ return tl;
670
+ }
70
671
 
71
- parse: function(recordType, queryString, conditions) {
72
- this.set('recordType', recordType);
73
- this.createTruthFunction(queryString);
74
- this.loadConditions(conditions);
75
- },
672
+ function expectedType (side, position) {
673
+ var p = position;
674
+ var tl = tokenLogic(p);
675
+ if ( !tl ) return false;
676
+ if (side == 'left') return tl.leftType;
677
+ if (side == 'right') return tl.rightType;
678
+ }
679
+
680
+ function evalType (position) {
681
+ var p = position;
682
+ var tl = tokenLogic(p);
683
+ if ( !tl ) return false;
684
+ else return tl.evalType;
685
+ }
686
+
687
+ function removeToken (position) {
688
+ l.splice(position, 1);
689
+ if ( position <= i ) i--;
690
+ }
691
+
692
+ function preceedingTokenExists (position) {
693
+ var p = position || i;
694
+ if ( p > 0 ) return true;
695
+ else return false;
696
+ }
697
+
698
+ function tokenIsMissingChilds (position) {
699
+ var p = position;
700
+ if ( p < 0 ) return true;
701
+ return (expectedType('left',p) && !l[p].leftSide)
702
+ || (expectedType('right',p) && !l[p].rightSide);
703
+ }
704
+
705
+ function typesAreMatching (parent, child) {
706
+ var side = (child < parent) ? 'left' : 'right';
707
+ if ( parent < 0 || child < 0 ) return false;
708
+ if ( !expectedType(side,parent) ) return false;
709
+ if ( !evalType(child) ) return false;
710
+ if ( expectedType(side,parent) == evalType(child) ) return true;
711
+ else return false;
712
+ }
713
+
714
+ function preceedingTokenCanBeMadeChild (position) {
715
+ var p = position;
716
+ if ( !tokenIsMissingChilds(p) ) return false;
717
+ if ( !preceedingTokenExists(p) ) return false;
718
+ if ( typesAreMatching(p,p-1) ) return true;
719
+ else return false;
720
+ }
721
+
722
+ function preceedingTokenCanBeMadeParent (position) {
723
+ var p = position;
724
+ if ( tokenIsMissingChilds(p) ) return false;
725
+ if ( !preceedingTokenExists(p) ) return false;
726
+ if ( !tokenIsMissingChilds(p-1) ) return false;
727
+ if ( typesAreMatching(p-1,p) ) return true;
728
+ else return false;
729
+ }
730
+
731
+ function makeChild (position) {
732
+ var p = position;
733
+ if (p<1) return false;
734
+ l[p].leftSide = l[p-1];
735
+ removeToken(p-1);
736
+ }
76
737
 
77
- loadConditions: function(conditions) {
78
- if(!conditions) {
79
- conditions = null;
738
+ function makeParent (position) {
739
+ var p = position;
740
+ if (p<1) return false;
741
+ l[p-1].rightSide = l[p];
742
+ removeToken(p);
743
+ }
744
+
745
+ function removeParenthesesPair (position) {
746
+ removeToken(position);
747
+ removeToken(openParenthesisStack.pop());
748
+ }
749
+
750
+ // step through the tokenList
751
+
752
+ for (i=0; i < l.length; i++) {
753
+ shouldCheckAgain = false;
754
+
755
+ if ( l[i].tokenType == 'UNKNOWN' ) {
756
+ error.push('found unknown token: '+l[i].tokenValue);
757
+ }
758
+
759
+ if ( l[i].tokenType == 'OPEN_PAREN' ) openParenthesisStack.push(i);
760
+ if ( l[i].tokenType == 'CLOSE_PAREN' ) removeParenthesesPair(i);
761
+
762
+ if ( preceedingTokenCanBeMadeChild(i) ) makeChild(i);
763
+
764
+ if ( preceedingTokenCanBeMadeParent(i) ){
765
+ makeParent(i);
766
+ shouldCheckAgain = true;
767
+ }
768
+
769
+ if ( shouldCheckAgain ) i--;
770
+
80
771
  }
81
- this.set('conditions', conditions);
772
+
773
+ // error if tokenList l is not a single token now
774
+ if (l.length == 1) l = l[0];
775
+ else error.push('string did not resolve to a single tree');
776
+
777
+ // error?
778
+ if (error.length > 0) return {error: error.join(',\n'), tree: l};
779
+ // everything fine - token list is now a tree and can be returned
780
+ else return l;
781
+
82
782
  },
83
783
 
84
- performQuery: function() {
85
- var store = this.get('delegate');
86
-
87
- if(!store) return null;
784
+
785
+ // ..........................................................
786
+ // ORDERING
787
+ //
788
+
789
+ /**
790
+ Takes a string containing an order statement and returns an array
791
+ describing this order for easier processing.
792
+ Called by parseQuery().
88
793
 
89
- this.beginPropertyChanges();
794
+ @param {String} orderString the string containing the order statement
795
+ @returns {Array} array of order statement
796
+ */
797
+ buildOrder: function (orderString) {
798
+ if (!orderString) {
799
+ return [];
800
+ }
801
+ else {
802
+ var o = orderString.split(',');
803
+ for (var i=0; i < o.length; i++) {
804
+ var p = o[i];
805
+ p = p.replace(/^\s+|\s+$/,'');
806
+ p = p.replace(/\s+/,',');
807
+ p = p.split(',');
808
+ o[i] = {propertyName: p[0]};
809
+ if (p[1] && p[1] == 'DESC') o[i].descending = true;
810
+ }
811
+
812
+ return o;
813
+ }
90
814
 
91
- this._storeKeysForQuery = store.performQuery(this);
92
- this.set('length', this._storeKeysForQuery.length);
815
+ }
816
+
817
+
818
+ // ..........................................................
819
+ // OTHER HELPERS
820
+ // not used right now
821
+
822
+ // propertiesUsedInQuery: function (tokenList) {
823
+ // var propertyList = [];
824
+ // for (var i=0; i < tokenList.length; i++) {
825
+ // if (tokenList[i].tokenType == 'PROPERTY') propertyList.push(tokenList[i].tokenValue);
826
+ // };
827
+ // return propertyList;
828
+ // }
829
+
93
830
 
94
- // this.enumerableContentDidChange() ;
95
- this.endPropertyChanges();
96
- return this;
97
- },
831
+ });
98
832
 
99
- recordsDidChange: function() {
100
- this.invokeOnce(this.performQuery);
101
- },
833
+
834
+ // Class Methods
835
+ SC.Query.mixin( /** @scope SC.Query */ {
836
+ /**
837
+ Will find which records match a given SC.Query and return the storeKeys.
838
+ This will also apply the sorting for the query
839
+
840
+ @param {SC.Query} query to apply
841
+ @param {Array} storeKeys to search within
842
+ @param {SC.Store} store to materialize record from during sort
843
+ @returns {Array} array instance of store keys matching the SC.Query (sorted)
844
+ */
102
845
 
103
- objectAt: function(idx)
104
- {
105
- if (idx < 0) return undefined ;
106
- if (idx >= this.get('length')) return undefined;
107
- return this.fetchContentAtIndex(idx);
846
+ containsStoreKeys: function(query, storeKeys, store) {
847
+ var ret = [], idx, len, rec, status, K = SC.Record;
848
+ var recType = query.get('recordType');
849
+ // if storeKeys is not set, just get all storeKeys for this record type,
850
+ // or all storeKeys in store if no record type is given
851
+ if(!storeKeys) {
852
+ if(recType) {
853
+ storeKeys = store.storeKeysFor(recType);
854
+ }
855
+ else {
856
+ storeKeys = store.storeKeys();
857
+ }
858
+ }
859
+
860
+ for(idx=0,len=storeKeys.length;idx<len;idx++) {
861
+ rec = store.materializeRecord(storeKeys[idx]);
862
+ status = rec.get('status');
863
+ // do not include EMPTY or DESTROYED records
864
+ if(rec && !(status & K.EMPTY) && !(status & K.DESTROYED) && query.contains(rec)) {
865
+ ret.push(storeKeys[idx]);
866
+ }
867
+ }
868
+
869
+ SC.Query.orderStoreKeys(ret, query, store);
870
+
871
+ return ret;
108
872
  },
109
-
110
- fetchContentAtIndex: function(idx) {
111
- var store = this.get('delegate') ;
112
- var storeKey = this._storeKeysForQuery[idx];
113
- var ret = null;
114
- if(store && storeKey) {
115
- ret = store.materializeRecord(storeKey);
873
+
874
+ /**
875
+ Will find which records match a give SC.Query and return an array of
876
+ store keys. This will also apply the sorting for the query.
877
+
878
+ @param {SC.Query} query to apply
879
+ @param {SC.RecordArray} records to search within
880
+ @param {SC.Store} store to materialize record from
881
+ @returns {Array} array instance of store keys matching the SC.Query (sorted)
882
+ */
883
+
884
+ containsRecords: function(query, records, store) {
885
+ var ret = [];
886
+ for(var idx=0,len=records.get('length');idx<len;idx++) {
887
+ var record = records.objectAt(idx);
888
+ if(record && query.contains(record)) {
889
+ ret.push(record.get('storeKey'));
890
+ }
116
891
  }
892
+
893
+ ret = SC.Query.orderStoreKeys(ret, query, store);
894
+
117
895
  return ret;
118
896
  },
897
+
898
+ /**
899
+ Sorts a set of store keys according to the orderBy property
900
+ of the SC.Query.
119
901
 
120
- _storeKeysForQuery: null,
902
+ @param {Array} storeKeys to sort
903
+ @param {SC.Query} query to use for sorting
904
+ @param {SC.Store} store to materialize records from
905
+ @returns {Array} sorted store keys. may be same instance as passed value
906
+ */
121
907
 
122
- init: function() {
123
- sc_super();
124
- this._storeKeysForQuery = [];
908
+ orderStoreKeys: function(storeKeys, query, store) {
909
+ // apply the sort if there is one
910
+ if(query.get('orderBy') && storeKeys) {
911
+
912
+ // Set tmp variable because we can't pass variables to sort function.
913
+ // Do this instead of generating a temporary closure function for perf
914
+ SC.Query._TMP_STORE = store;
915
+ SC.Query._TMP_QUERY_KEY = query;
916
+ storeKeys.sort(SC.Query.compareStoreKeys);
917
+ SC.Query._TMP_STORE = SC.Query._TMP_QUERY_KEY = null;
918
+ }
919
+
920
+ return storeKeys;
921
+ },
922
+
923
+ /**
924
+ Default sort method that is used when calling containsStoreKeys()
925
+ or containsRecords() on this query. Simply materializes two records based
926
+ on storekeys before passing on to compare() .
927
+
928
+ @param {Number} storeKey1 a store key
929
+ @param {Number} storeKey2 a store key
930
+ @returns {Number} -1 if record1 < record2, +1 if record1 > record2, 0 if equal
931
+ */
932
+
933
+ compareStoreKeys: function(storeKey1, storeKey2) {
934
+ var store = SC.Query._TMP_STORE,
935
+ queryKey = SC.Query._TMP_QUERY_KEY,
936
+ record1 = store.materializeRecord(storeKey1),
937
+ record2 = store.materializeRecord(storeKey2);
938
+ return queryKey.compare(record1, record2);
125
939
  }
126
940
 
941
+ });
942
+
943
+
944
+ /** @private
945
+ Hash of registered comparisons by propery name.
946
+ */
947
+ SC.Query.comparisons = {};
127
948
 
128
- }) ;
949
+ /**
950
+ Call to register a comparison for a specific property name.
951
+ The function you pass should accept two values of this property
952
+ and return -1 if the first is smaller than the second,
953
+ 0 if they are equal and 1 if the first is greater than the second.
954
+
955
+ @param {String} name of the record property
956
+ @param {Function} custom comparison function
957
+ @returns {SC.Query} receiver
958
+ */
959
+ SC.Query.registerComparison = function(propertyName, comparison) {
960
+ SC.Query.comparisons[propertyName] = comparison;
961
+ };
962
+
963
+
964
+ /**
965
+ Call to register an extension for the query language.
966
+ You shoud provide a name for your extension and a definition
967
+ specifying how it should be parsed and evaluated.
968
+
969
+ Have a look at queryLanguage for examples of definitions.
970
+
971
+ TODO add better documentation here
972
+
973
+ @param {String} tokenName name of the operator
974
+ @param {Object} token extension definition
975
+ @returns {SC.Query} receiver
976
+ */
977
+ SC.Query.registerQueryExtension = function(tokenName, token) {
978
+ SC.Query.prototype.queryLanguage[tokenName] = token;
979
+ };