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.
- data/Buildfile +4 -2
- data/frameworks/sproutcore/Buildfile +3 -2
- data/frameworks/sproutcore/README +2 -1
- data/frameworks/sproutcore/apps/docs/core.js +27 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Preview.pdf +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Thumbnail.tiff +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/data.plist +14378 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image10.png +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image11.png +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image13.png +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image14.png +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image8.png +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image9.tiff +0 -0
- data/frameworks/sproutcore/apps/docs/english.lproj/loading.rhtml +9 -0
- data/frameworks/sproutcore/apps/docs/english.lproj/main_page.js +22 -0
- data/frameworks/sproutcore/apps/{sc_jsdoc → docs}/english.lproj/strings.js +7 -7
- data/frameworks/sproutcore/apps/docs/main.js +30 -0
- data/frameworks/sproutcore/apps/tests/controllers/detail.js +16 -0
- data/frameworks/sproutcore/apps/tests/controllers/source.js +29 -0
- data/frameworks/sproutcore/apps/tests/controllers/target.js +26 -0
- data/frameworks/sproutcore/apps/tests/controllers/targets.js +65 -26
- data/frameworks/sproutcore/apps/tests/controllers/tests.js +14 -19
- data/frameworks/sproutcore/apps/tests/core.js +114 -16
- data/frameworks/sproutcore/apps/tests/data_source.js +96 -0
- data/frameworks/sproutcore/apps/tests/english.lproj/main_page.css +22 -2
- data/frameworks/sproutcore/apps/tests/english.lproj/main_page.js +168 -22
- data/frameworks/sproutcore/apps/tests/english.lproj/strings.js +14 -5
- data/frameworks/sproutcore/apps/tests/fixtures/target.js +81 -37
- data/frameworks/sproutcore/apps/tests/fixtures/test.js +38 -37
- data/frameworks/sproutcore/apps/tests/main.js +9 -20
- data/frameworks/sproutcore/apps/tests/models/target.js +74 -31
- data/frameworks/sproutcore/apps/tests/models/test.js +30 -2
- data/frameworks/sproutcore/{frameworks/desktop/mixins/collection_item.js → apps/tests/states/no_targets.js} +16 -12
- data/frameworks/sproutcore/apps/tests/states/ready.js +56 -0
- data/frameworks/sproutcore/apps/tests/states/ready_detail.js +41 -0
- data/frameworks/sproutcore/apps/tests/states/ready_empty.js +48 -0
- data/frameworks/sproutcore/apps/tests/states/ready_list.js +41 -0
- data/frameworks/sproutcore/apps/tests/states/ready_loading.js +44 -0
- data/frameworks/sproutcore/apps/tests/states/ready_no_tests.js +31 -0
- data/frameworks/sproutcore/apps/tests/states/start.js +39 -0
- data/frameworks/sproutcore/apps/tests/tests/controllers/{test.js → detail.js} +3 -3
- data/frameworks/sproutcore/apps/tests/tests/controllers/source.js +15 -0
- data/frameworks/sproutcore/apps/tests/tests/controllers/target.js +15 -0
- data/frameworks/sproutcore/apps/tests/tests/controllers/targets.js +3 -3
- data/frameworks/sproutcore/apps/tests/tests/views/offset_checkbox.js +15 -0
- data/frameworks/sproutcore/apps/tests/views/offset_checkbox.js +26 -0
- data/frameworks/sproutcore/design/CollectionView State Charts.graffle +4848 -0
- data/frameworks/sproutcore/design/Design Charts.graffle +8788 -6375
- data/frameworks/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Preview.pdf +0 -0
- data/frameworks/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Thumbnail.tiff +0 -0
- data/frameworks/sproutcore/design/SproutCore Design Template.graffle/data.plist +1452 -0
- data/frameworks/sproutcore/design/SproutCore Design Template.graffle/image8.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/QuickLook/Preview.pdf +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/QuickLook/Thumbnail.tiff +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/data.plist +24187 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image10.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image11.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image13.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image15.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image16.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image17.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image18.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image19.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image22.tiff +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image23.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image24.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image25.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image30.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image31.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image8.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image9.png +0 -0
- data/frameworks/sproutcore/frameworks/datastore/data_sources/cascade.js +2 -2
- data/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +66 -49
- data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +146 -31
- data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures_with_queries.js +238 -0
- data/frameworks/sproutcore/frameworks/datastore/models/many_attribute.js +27 -11
- data/frameworks/sproutcore/frameworks/datastore/models/record.js +163 -32
- data/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +67 -5
- data/frameworks/sproutcore/frameworks/datastore/system/many_array.js +157 -0
- data/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +202 -19
- data/frameworks/sproutcore/frameworks/datastore/system/query.js +929 -78
- data/frameworks/sproutcore/frameworks/datastore/system/record_array.js +143 -5
- data/frameworks/sproutcore/frameworks/datastore/system/store.js +443 -125
- data/frameworks/sproutcore/frameworks/datastore/tests/data_sources/fixtures.js +38 -3
- data/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +94 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/models/record/core_methods.js +30 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/models/record/normalize.js +238 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +105 -16
- data/frameworks/sproutcore/frameworks/datastore/tests/system/many_array/core_methods.js +178 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/chain.js +1 -1
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChanges.js +9 -8
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +6 -6
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/dataHashDidChange.js +6 -6
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/discardChanges.js +3 -3
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readDataHash.js +7 -7
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readEditableDataHash.js +4 -4
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/removeDataHash.js +7 -7
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/writeDataHash.js +7 -7
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/compare_records.js +126 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation.js +165 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation_of_records.js +82 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/find_all.js +362 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/parsing.js +170 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/record_type_is.js +43 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/registered_comparisons.js +60 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/registered_query_extensions.js +67 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/core_methods.js +2 -13
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +3 -4
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/core_methods.js +73 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/createRecord.js +15 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/dataSourceCallbacks.js +4 -2
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/destroyRecord.js +1 -1
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushChanges.js +2 -2
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/recordDidChange.js +1 -1
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/retrieveRecord.js +2 -2
- data/frameworks/sproutcore/frameworks/debug/core.js +60 -0
- data/frameworks/sproutcore/frameworks/deprecated/core.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/server/server.js +0 -1
- data/frameworks/sproutcore/frameworks/deprecated/system/browser.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/system/classic_responder.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/system/event.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/system/misc.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/system/object.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/system/path_module.js +0 -1
- data/frameworks/sproutcore/frameworks/deprecated/system/string.js +0 -2
- data/frameworks/sproutcore/frameworks/designer/coders/design.js +1 -2
- data/frameworks/sproutcore/frameworks/designer/coders/localization.js +1 -2
- data/frameworks/sproutcore/frameworks/designer/coders/object.js +1 -1
- data/frameworks/sproutcore/frameworks/designer/controllers/page_design.js +1 -1
- data/frameworks/sproutcore/frameworks/designer/ext/page.js +0 -2
- data/frameworks/sproutcore/frameworks/designer/ext/view.js +0 -2
- data/frameworks/sproutcore/frameworks/designer/views/controls/button.js +2 -3
- data/frameworks/sproutcore/frameworks/designer/views/designer.js +24 -8
- data/frameworks/sproutcore/frameworks/designer/views/label.js +1 -2
- data/frameworks/sproutcore/frameworks/designer/views/mixins/button.js +0 -2
- data/frameworks/sproutcore/frameworks/designer/views/tab.js +1 -2
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/alert.css +2 -2
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/drag.css +6 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/list_item.css +63 -10
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu_item_view.css +5 -4
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/modal.css +5 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/panel.css +1 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/slider.css +5 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/split_divider.css +1 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/tab.css +1 -1
- data/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +61 -0
- data/frameworks/sproutcore/frameworks/desktop/mixins/collection_view_delegate.js +136 -79
- data/frameworks/sproutcore/frameworks/desktop/panes/alert.js +55 -24
- data/frameworks/sproutcore/frameworks/desktop/panes/menu.js +295 -147
- data/frameworks/sproutcore/frameworks/desktop/panes/palette.js +1 -1
- data/frameworks/sproutcore/frameworks/desktop/panes/panel.js +1 -1
- data/frameworks/sproutcore/frameworks/desktop/panes/picker.js +18 -20
- data/frameworks/sproutcore/frameworks/desktop/panes/sheet.js +2 -2
- data/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +4 -4
- data/frameworks/sproutcore/frameworks/desktop/system/drag.js +337 -231
- data/frameworks/sproutcore/frameworks/desktop/system/root_responder.js +3 -3
- data/frameworks/sproutcore/frameworks/desktop/tests/integration/dialog.js +1 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +2 -2
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/methods.js +46 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +4 -2
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/palette/ui.js +5 -6
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +11 -11
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/ui.js +11 -7
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/sheet/ui.js +9 -9
- data/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +19 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +0 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/content.js +249 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/deleteSelection.js +82 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/deselect.js +199 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/itemViewForContentIndex.js +288 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/layerIdFor.js +65 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/length.js +88 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/mouse.js +165 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/nowShowing.js +121 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/reload.js +177 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/select.js +240 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectNextItem.js +191 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectPreviousItem.js +197 -39
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selection.js +141 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/ui_diagram.js +182 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowDelegate.js +183 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowHeightForContentIndex.js +133 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowOffsetForContentIndex.js +132 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_outline.js +56 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_row_heights.js +167 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_simple.js +127 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list_item.js +30 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/views/menu_item/ui.js +8 -8
- data/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +9 -9
- data/frameworks/sproutcore/frameworks/desktop/tests/views/scroller/methods.js +45 -6
- data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/methods.js +2 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +17 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/ui.js +44 -29
- data/frameworks/sproutcore/frameworks/desktop/tests/views/stacked/ui_comments.js +231 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/web/ui.js +1 -1
- data/frameworks/sproutcore/frameworks/desktop/views/button.js +15 -4
- data/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +8 -1
- data/frameworks/sproutcore/frameworks/desktop/views/collection.js +1739 -1123
- data/frameworks/sproutcore/frameworks/desktop/views/form.js +0 -1
- data/frameworks/sproutcore/frameworks/desktop/views/grid.js +13 -11
- data/frameworks/sproutcore/frameworks/desktop/views/list.js +405 -571
- data/frameworks/sproutcore/frameworks/desktop/views/list_item.js +211 -74
- data/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +319 -169
- data/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +57 -51
- data/frameworks/sproutcore/frameworks/desktop/views/progress.js +2 -2
- data/frameworks/sproutcore/frameworks/desktop/views/scene.js +150 -2
- data/frameworks/sproutcore/frameworks/desktop/views/scroll.js +92 -50
- data/frameworks/sproutcore/frameworks/desktop/views/scroller.js +86 -63
- data/frameworks/sproutcore/frameworks/desktop/views/segmented.js +38 -22
- data/frameworks/sproutcore/frameworks/desktop/views/select_field.js +51 -12
- data/frameworks/sproutcore/frameworks/desktop/views/slider.js +2 -0
- data/frameworks/sproutcore/frameworks/desktop/views/source_list.js +17 -1087
- data/frameworks/sproutcore/frameworks/desktop/views/source_list_group.js +3 -3
- data/frameworks/sproutcore/frameworks/desktop/views/split.js +35 -9
- data/frameworks/sproutcore/frameworks/desktop/views/stacked.js +101 -0
- data/frameworks/sproutcore/frameworks/desktop/views/tab.js +23 -22
- data/frameworks/sproutcore/frameworks/desktop/views/toolbar.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/controllers/array.js +382 -363
- data/frameworks/sproutcore/frameworks/foundation/controllers/controller.js +7 -279
- data/frameworks/sproutcore/frameworks/foundation/controllers/object.js +212 -310
- data/frameworks/sproutcore/frameworks/foundation/controllers/tree.js +109 -0
- data/frameworks/sproutcore/frameworks/foundation/core.js +25 -0
- data/frameworks/sproutcore/frameworks/foundation/debug/control_test_pane.js +30 -8
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/bootstrap.rhtml +19 -4
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/core.css +219 -3
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/debug/control-test-pane.css +1 -0
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/label.css +30 -0
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/strings.js +15 -0
- data/frameworks/sproutcore/frameworks/{desktop → foundation}/english.lproj/text_field.css +19 -3
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/view.css +6 -1
- data/frameworks/sproutcore/frameworks/foundation/license.js +19 -0
- data/frameworks/sproutcore/frameworks/foundation/mixins/button.js +15 -7
- data/frameworks/sproutcore/frameworks/foundation/mixins/collection_content.js +171 -0
- data/frameworks/sproutcore/frameworks/foundation/mixins/control.js +5 -5
- data/frameworks/sproutcore/frameworks/foundation/mixins/inline_text_field.js +462 -0
- data/frameworks/sproutcore/frameworks/foundation/mixins/selection_support.js +162 -84
- data/frameworks/sproutcore/frameworks/foundation/mixins/static_layout.js +33 -2
- data/frameworks/sproutcore/frameworks/foundation/mixins/string.js +17 -3
- data/frameworks/sproutcore/frameworks/foundation/mixins/tree_item_content.js +159 -0
- data/frameworks/sproutcore/frameworks/foundation/panes/pane.js +49 -20
- data/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +887 -0
- data/frameworks/sproutcore/frameworks/foundation/system/application.js +36 -0
- data/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +310 -62
- data/frameworks/sproutcore/frameworks/foundation/system/datetime.js +729 -0
- data/frameworks/sproutcore/frameworks/foundation/system/event.js +57 -21
- data/frameworks/sproutcore/frameworks/foundation/system/ready.js +11 -5
- data/frameworks/sproutcore/frameworks/foundation/system/render_context.js +55 -16
- data/frameworks/sproutcore/frameworks/foundation/system/request.js +152 -27
- data/frameworks/sproutcore/frameworks/foundation/system/responder.js +120 -0
- data/frameworks/sproutcore/frameworks/foundation/system/responder_context.js +243 -0
- data/frameworks/sproutcore/frameworks/foundation/system/root_responder.js +29 -6
- data/frameworks/sproutcore/frameworks/foundation/system/routes.js +143 -102
- data/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +9 -2
- data/frameworks/sproutcore/frameworks/foundation/system/utils.js +104 -9
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/array_case.js +182 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/enum_case.js +193 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/null_case.js +64 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/single_case.js +136 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/empty_case.js +82 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/multiple_case.js +111 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/single_case.js +193 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/single_enumerable_case.js +179 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/tree/outline_case.js +108 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/mixins/button/keyEquivalents.js +35 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/mixins/staticLayout.js +128 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/mixins/string.js +17 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/flat_case.js +325 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/group_case.js +718 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/outline_case.js +484 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_core.js +28 -28
- data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_selector.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/system/datetime.js +151 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/get.js +2 -2
- data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_attr.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_basic.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_className.js +12 -12
- data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_style.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/system/request.js +52 -14
- data/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/root_responder.js +27 -23
- data/frameworks/sproutcore/frameworks/foundation/tests/system/timer/schedule.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/validators/date.js +12 -10
- data/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +148 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/views/pane/append_remove.js +1 -1
- data/frameworks/sproutcore/frameworks/{desktop → foundation}/tests/views/text_field/methods.js +0 -0
- data/frameworks/sproutcore/frameworks/{desktop → foundation}/tests/views/text_field/ui.js +53 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/clippingFrame.js +1 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/convertFrames.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/createChildViews.js +35 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/findLayerInParentLayer.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisible.js +51 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisibleInWindow.js +12 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/layoutStyle.js +83 -3
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/prepareContext.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/updateLayer.js +4 -0
- data/frameworks/sproutcore/frameworks/foundation/views/container.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/views/field.js +27 -16
- data/frameworks/sproutcore/frameworks/foundation/views/image.js +4 -1
- data/frameworks/sproutcore/frameworks/foundation/views/label.js +16 -6
- data/frameworks/sproutcore/frameworks/{desktop → foundation}/views/text_field.js +39 -15
- data/frameworks/sproutcore/frameworks/foundation/views/view.js +328 -83
- data/frameworks/sproutcore/frameworks/runtime/README +1 -0
- data/frameworks/sproutcore/frameworks/runtime/core.js +110 -31
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/base.js +238 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/indexOf.js +33 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/insertAt.js +121 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/objectAt.js +34 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/popObject.js +50 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/pushObject.js +46 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/rangeObserver.js +371 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeAt.js +100 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeObject.js +49 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +94 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/shiftObject.js +50 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/unshiftObject.js +47 -0
- data/frameworks/sproutcore/frameworks/runtime/mixins/array.js +320 -110
- data/frameworks/sproutcore/frameworks/runtime/mixins/copyable.js +64 -0
- data/frameworks/sproutcore/frameworks/runtime/mixins/delegate_support.js +44 -6
- data/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +142 -77
- data/frameworks/sproutcore/frameworks/runtime/mixins/freezable.js +104 -0
- data/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +298 -142
- data/frameworks/sproutcore/frameworks/runtime/private/chain_observer.js +17 -11
- data/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +55 -15
- data/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +29 -5
- data/frameworks/sproutcore/frameworks/runtime/protocols/observable_protocol.js +40 -0
- data/frameworks/sproutcore/frameworks/runtime/system/binding.js +39 -15
- data/frameworks/sproutcore/frameworks/runtime/system/index_set.js +1166 -0
- data/frameworks/sproutcore/frameworks/runtime/system/object.js +33 -15
- data/frameworks/sproutcore/frameworks/runtime/system/range_observer.js +201 -35
- data/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +42 -15
- data/frameworks/sproutcore/frameworks/runtime/system/selection_set.js +649 -0
- data/frameworks/sproutcore/frameworks/runtime/system/set.js +183 -54
- data/frameworks/sproutcore/frameworks/runtime/system/sparse_array.js +20 -11
- data/frameworks/sproutcore/frameworks/runtime/tests/core/clone.js +2 -2
- data/frameworks/sproutcore/frameworks/runtime/tests/core/compare.js +44 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/core/console.js +16 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/core/keys.js +1 -1
- data/frameworks/sproutcore/frameworks/runtime/tests/core/makeArray.js +1 -1
- data/frameworks/sproutcore/frameworks/runtime/tests/core/objectForPropertyPath.js +5 -5
- data/frameworks/sproutcore/frameworks/runtime/tests/mixins/array.js +57 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable.js +21 -2
- data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +249 -129
- data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/propertyChanges.js +11 -2
- data/frameworks/sproutcore/frameworks/runtime/tests/private/observer_queue/isObservingSuspended.js +55 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +81 -6
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/add.js +195 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/clone.js +43 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/contains.js +74 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/create.js +42 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/indexAfter.js +38 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/indexBefore.js +38 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/intersects.js +74 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/max.js +40 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/min.js +40 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/rangeStartForIndex.js +36 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/remove.js +189 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/without.js +89 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/object/base.js +1 -1
- data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/create.js +59 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/destroy.js +75 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/objectPropertyDidChange.js +117 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/rangeDidChange.js +110 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/update.js +65 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/run_loop.js +3 -3
- data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/add.js +92 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/copy.js +17 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/indexSetForSource.js +85 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/isEqual.js +60 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/remove.js +87 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/set.js +4 -25
- data/frameworks/sproutcore/frameworks/runtime/tests/system/sparse_array.js +39 -1
- data/frameworks/sproutcore/frameworks/testing/core.js +183 -0
- data/frameworks/sproutcore/frameworks/testing/english.lproj/runner.css +126 -0
- data/frameworks/sproutcore/frameworks/testing/extras.js +0 -26
- data/frameworks/sproutcore/frameworks/testing/qunit.js +33 -25
- data/frameworks/sproutcore/frameworks/testing/system/dump.js +205 -0
- data/frameworks/sproutcore/frameworks/testing/system/equiv.js +201 -0
- data/frameworks/sproutcore/frameworks/testing/system/plan.js +691 -0
- data/frameworks/sproutcore/frameworks/testing/system/runner.js +209 -0
- data/frameworks/sproutcore/frameworks/testing/system/suite.js +228 -0
- data/frameworks/sproutcore/frameworks/testing/utils.js +8 -1
- data/frameworks/sproutcore/lib/index.rhtml +4 -1
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/10.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/100.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/102.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/110.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/120.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/127.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/18.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/19.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/2.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/24.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/26.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/27.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/28.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/29.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/30.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/31.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/33.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/37.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/41.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/99.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/10.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/100.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/102.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/110.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/120.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/127.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/18.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/19.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/2.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/24.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/26.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/27.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/28.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/29.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/30.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/31.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/33.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/37.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/41.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/99.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/10.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/100.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/102.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/110.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/120.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/127.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/18.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/19.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/2.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/24.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/26.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/27.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/28.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/29.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/30.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/31.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/33.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/37.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/41.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/99.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/10.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/18.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/19.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/2.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x-2.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-sprite.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-ysprite.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/shared-icons.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sproutcore-logo.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sticky-note.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/button.css +191 -193
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/checkbox.css +11 -10
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/collection.css +85 -4
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/core.css +15 -2
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-theme-repeat-x.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/label.css +0 -26
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/list_item.css +30 -0
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/progress.css +9 -6
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/radio.css +20 -11
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/segmented.css +192 -54
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/slider.css +56 -24
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/tab.css +13 -7
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/text_field.css +1 -4
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/toolbar.css +4 -1
- data/lib/sproutcore/builders/minify.rb +2 -2
- data/lib/sproutcore/builders/test.rb +1 -1
- data/lib/sproutcore/buildfile.rb +1 -0
- data/lib/sproutcore/rack/dev.rb +1 -1
- data/lib/sproutcore/rack/filesystem.rb +265 -0
- data/lib/sproutcore/rack/proxy.rb +11 -3
- data/lib/sproutcore/rack/service.rb +11 -1
- data/lib/sproutcore/tools.rb +11 -1
- data/lib/sproutcore/tools/server.rb +6 -4
- data/vendor/jsdoc/README.txt +151 -0
- data/vendor/jsdoc/changes.txt +47 -0
- metadata +263 -308
- data/frameworks/sproutcore/apps/sc_jsdoc/controllers/docs.js +0 -149
- data/frameworks/sproutcore/apps/sc_jsdoc/core.js +0 -16
- data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.css +0 -17
- data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.js +0 -99
- data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/images/sproutcore-logo.png +0 -0
- data/frameworks/sproutcore/apps/sc_jsdoc/main.js +0 -27
- data/frameworks/sproutcore/apps/sc_jsdoc/models/doc.js +0 -21
- data/frameworks/sproutcore/apps/sc_qunit/controllers/runner.js +0 -209
- data/frameworks/sproutcore/apps/sc_qunit/core.js +0 -16
- data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.css +0 -17
- data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.js +0 -107
- data/frameworks/sproutcore/apps/sc_qunit/english.lproj/images/sproutcore-logo.png +0 -0
- data/frameworks/sproutcore/apps/sc_qunit/english.lproj/strings.js +0 -15
- data/frameworks/sproutcore/apps/sc_qunit/main.js +0 -18
- data/frameworks/sproutcore/apps/sc_qunit/models/test.js +0 -24
- data/frameworks/sproutcore/apps/sc_qunit/views/test_iframe.js +0 -52
- data/frameworks/sproutcore/apps/tests/controllers/test.js +0 -20
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/blank.gif +0 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu.css +0 -83
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/palette.css +0 -3
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/methods.js +0 -10
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/methods.js +0 -10
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui.js +0 -110
- data/frameworks/sproutcore/frameworks/foundation/mixins/responder.js +0 -156
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array.js +0 -118
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/controller.js +0 -268
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object.js +0 -433
- data/frameworks/sproutcore/frameworks/runtime/tests/system/array.js +0 -263
- data/frameworks/sproutcore/frameworks/testing/tests/debug/qunit.js +0 -25
- data/spec/buildtasks/manifest/spec_helper.rb +0 -35
- data/spec/buildtasks/target_spec.rb +0 -214
- data/spec/fixtures/builder_tests/Buildfile +0 -15
- data/spec/fixtures/builder_tests/apps/combine_test/a.js +0 -1
- data/spec/fixtures/builder_tests/apps/combine_test/b.js +0 -1
- data/spec/fixtures/builder_tests/apps/combine_test/c.js +0 -1
- data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/a.css +0 -1
- data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/b.css +0 -1
- data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/c.css +0 -1
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/bar1_sample.rhtml +0 -2
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/erb_sample.html.erb +0 -1
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/icons/image.png +0 -0
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/image.jpg +0 -0
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/rhtml_sample.rhtml +0 -1
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/strings.js +0 -4
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/style.css +0 -0
- data/spec/fixtures/builder_tests/apps/html_test/french.lproj/french-icons/fr.png +0 -0
- data/spec/fixtures/builder_tests/apps/html_test/french.lproj/strings.js +0 -4
- data/spec/fixtures/builder_tests/apps/html_test/lib/layout_template.rhtml +0 -1
- data/spec/fixtures/builder_tests/apps/html_test/scripts.js +0 -0
- data/spec/fixtures/builder_tests/apps/javascript_test/sc_static.js +0 -15
- data/spec/fixtures/builder_tests/apps/javascript_test/sc_super.js +0 -4
- data/spec/fixtures/builder_tests/apps/javascript_test/strings.js +0 -7
- data/spec/fixtures/builder_tests/apps/sass_test/sample.sass +0 -3
- data/spec/fixtures/builder_tests/apps/strings_test/lproj/strings.js +0 -8
- data/spec/fixtures/builder_tests/apps/stylesheet_test/build_directives.css +0 -9
- data/spec/fixtures/builder_tests/apps/stylesheet_test/sc_static.css +0 -12
- data/spec/fixtures/builder_tests/apps/test_test/lib/alt_layout.rhtml +0 -1
- data/spec/fixtures/builder_tests/apps/test_test/lib/test_layout.rhtml +0 -3
- data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test.js +0 -1
- data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test2.js +0 -1
- data/spec/fixtures/builder_tests/apps/test_test/tests/rhtml_test.rhtml +0 -4
- data/spec/fixtures/builder_tests/frameworks/debug/core.js +0 -0
- data/spec/fixtures/builder_tests/frameworks/debug/english.lproj/dummy.css +0 -0
- data/spec/fixtures/builder_tests/frameworks/qunit/core.js +0 -0
- data/spec/fixtures/builder_tests/frameworks/qunit/english.lproj/dummy.css +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/req_style_1.css +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/strings.js +0 -4
- data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/test.rhtml +0 -1
- data/spec/fixtures/builder_tests/frameworks/req_target_1/req_js_1.js +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/req_style_2.css +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/test.rhtml +0 -1
- data/spec/fixtures/builder_tests/frameworks/req_target_2/javascript.js +0 -1
- data/spec/fixtures/builder_tests/frameworks/req_target_2/lib/alt_layout.rhtml +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_2/req_js_2.js +0 -0
- data/spec/fixtures/builder_tests/themes/sample_theme/Buildfile +0 -1
- data/spec/fixtures/buildfiles/basic/Buildfile +0 -16
- data/spec/fixtures/buildfiles/basic/task_module.rake +0 -6
- data/spec/fixtures/buildfiles/installed/Buildfile +0 -7
- data/spec/fixtures/buildfiles/installed/Buildfile2 +0 -5
- data/spec/fixtures/buildfiles/project_test/Buildfile +0 -4
- data/spec/fixtures/buildfiles/project_test/not_project/Buildfile +0 -2
- data/spec/fixtures/buildfiles/project_test/not_project/child/PLACEHOLDER +0 -0
- data/spec/fixtures/entry_for_project/Buildfile +0 -1
- data/spec/fixtures/entry_for_project/apps/test_app/frameworks/nested/PLACEHOLDER +0 -0
- data/spec/fixtures/entry_for_project/frameworks/shared/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/Buildfile +0 -8
- data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/custom_foos/Buildfile +0 -5
- data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/custom_foos/foos/not_foo1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/nested/Buildfile +0 -8
- data/spec/fixtures/find_targets/nested/apps/app1/Buildfile +0 -1
- data/spec/fixtures/find_targets/nested/apps/app1/apps/nested_app/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/clients/client1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/frameworks/framework1/frameworks/framework1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/frameworks/framework2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/themes/theme1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/themes/theme2/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/caps_long_names/English.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/caps_long_names/FreNCH.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/caps_long_names/UnknOWN.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/english.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/french.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/german.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/italian.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/japanese.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/spanish.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/unknown.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/no_names/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/de.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/en-CA.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/en-GB.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/en-US.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/en.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/es.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/foo.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/fr.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/it.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/ja.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/1.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/B.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/a.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/a/a.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/a/b.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/b/a.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/c.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/core.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/B.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/a.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/b.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/b/a.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/c.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/lproj/strings.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/utils.js +0 -1
- data/spec/fixtures/ordered_entries/apps/with_requires/a.js +0 -2
- data/spec/fixtures/ordered_entries/apps/with_requires/b.js +0 -3
- data/spec/fixtures/ordered_entries/apps/with_requires/c.js +0 -2
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/a.css +0 -2
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/b.css +0 -2
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/c.css +0 -2
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/d.js +0 -1
- data/spec/fixtures/real_world/Buildfile +0 -12
- data/spec/fixtures/real_world/apps/account/README +0 -1
- data/spec/fixtures/real_world/apps/calendar/README +0 -1
- data/spec/fixtures/real_world/apps/contacts/README_BEFORE_EDITING +0 -1
- data/spec/fixtures/real_world/apps/files/README +0 -1
- data/spec/fixtures/real_world/apps/mail/README +0 -1
- data/spec/fixtures/real_world/apps/mobile_photos/README +0 -1
- data/spec/fixtures/real_world/apps/photos/README +0 -1
- data/spec/fixtures/real_world/apps/uploader/README +0 -1
- data/spec/fixtures/real_world/frameworks/core_files/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/core_photos/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/shared/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/Buildfile +0 -26
- data/spec/fixtures/real_world/frameworks/sproutcore/README +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/apps/docs/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/apps/test_runner/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/core.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/debug/debug-resource.html +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/debug/sample_debug.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/demo2.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/debug/sample_debug-loc.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.css +0 -4
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.html +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo2.sass +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.haml +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.html.erb +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.rhtml +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/fixtures/sample_fixtures-loc.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/has_require.css +0 -4
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_require.css +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_sc_resource.rhtml +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/protocols/sample-loc.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.css +0 -6
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.rhtml +0 -3
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/strings.js +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/tests/sample-loc.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample-json-fixture.json +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample_fixtures.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/application/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/costello/core.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/data_store/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/debug/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/desktop/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/empty_theme/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/foundation/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/mobile/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/qunit/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/uploader/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/french-resource.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/strings.js +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/german-resource.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/strings.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/has_require.js +0 -4
- data/spec/fixtures/real_world/frameworks/sproutcore/lib/index.html +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/no_require.js +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/protocols/sample.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/sc_resource.js +0 -6
- data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample1.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample2.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.rhtml +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/themes/standard_theme/README +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/views/view.js +0 -1
- data/spec/fixtures/real_world/generators/sample_custom/Buildfile +0 -0
- data/spec/fixtures/real_world/generators/sample_custom/templates/{filename}.js +0 -1
- data/spec/fixtures/recursive_project/Buildfile +0 -8
- data/spec/fixtures/recursive_project/frameworks/sproutcore/frameworks/costello/PLACEHOLDER +0 -0
- data/spec/lib/builders/combine_spec.rb +0 -67
- data/spec/lib/builders/html_spec.rb +0 -577
- data/spec/lib/builders/javascript_spec.rb +0 -81
- data/spec/lib/builders/sass_spec.rb +0 -43
- data/spec/lib/builders/spec_helper.rb +0 -30
- data/spec/lib/builders/strings_spec.rb +0 -52
- data/spec/lib/builders/stylesheet_spec.rb +0 -63
- data/spec/lib/builders/test_index_spec.rb +0 -44
- data/spec/lib/builders/test_spec.rb +0 -135
- data/spec/lib/buildfile/config_for_spec.rb +0 -81
- data/spec/lib/buildfile/define_spec.rb +0 -59
- data/spec/lib/buildfile/dup_spec.rb +0 -65
- data/spec/lib/buildfile/invoke_spec.rb +0 -130
- data/spec/lib/buildfile/load_spec.rb +0 -49
- data/spec/lib/buildfile/task/dup_spec.rb +0 -55
- data/spec/lib/buildfile/task_defined_spec.rb +0 -17
- data/spec/lib/buildfile_commands/build_task_spec.rb +0 -19
- data/spec/lib/buildfile_commands/config_spec.rb +0 -97
- data/spec/lib/buildfile_commands/import_spec.rb +0 -17
- data/spec/lib/buildfile_commands/namespace_spec.rb +0 -18
- data/spec/lib/buildfile_commands/proxies_spec.rb +0 -38
- data/spec/lib/buildfile_commands/replace_task_spec.rb +0 -29
- data/spec/lib/buildfile_commands/task_spec.rb +0 -36
- data/spec/lib/helpers/packing_optimizer/optimize_spec.rb +0 -26
- data/spec/lib/models/hash_struct/deep_clone_spec.rb +0 -27
- data/spec/lib/models/hash_struct/has_options_spec.rb +0 -32
- data/spec/lib/models/hash_struct/hash_spec.rb +0 -64
- data/spec/lib/models/hash_struct/merge_spec.rb +0 -26
- data/spec/lib/models/hash_struct/method_missing.rb +0 -41
- data/spec/lib/models/manifest/add_entry_spec.rb +0 -36
- data/spec/lib/models/manifest/add_transform_spec.rb +0 -90
- data/spec/lib/models/manifest/build_spec.rb +0 -78
- data/spec/lib/models/manifest/entry_for_spec.rb +0 -94
- data/spec/lib/models/manifest/find_entry.rb +0 -84
- data/spec/lib/models/manifest/prepare_spec.rb +0 -62
- data/spec/lib/models/manifest_entry/cacheable_url_spec.rb +0 -31
- data/spec/lib/models/manifest_entry/prepare_spec.rb +0 -54
- data/spec/lib/models/project/add_target_spec.rb +0 -44
- data/spec/lib/models/project/buildfile_spec.rb +0 -35
- data/spec/lib/models/project/find_targets_for_spec.rb +0 -77
- data/spec/lib/models/project/load_nearest_project_spec.rb +0 -23
- data/spec/lib/models/project/target_for_spec.rb +0 -33
- data/spec/lib/models/project/targets_spec.rb +0 -62
- data/spec/lib/models/target/compute_build_number_spec.rb +0 -125
- data/spec/lib/models/target/config_spec.rb +0 -30
- data/spec/lib/models/target/expand_required_targets_spec.rb +0 -48
- data/spec/lib/models/target/installed_languages_spec.rb +0 -47
- data/spec/lib/models/target/lproj_for_spec.rb +0 -38
- data/spec/lib/models/target/manifest_for_spec.rb +0 -42
- data/spec/lib/models/target/parent_target_spec.rb +0 -21
- data/spec/lib/models/target/prepare_spec.rb +0 -53
- data/spec/lib/models/target/required_targets_spec.rb +0 -119
- data/spec/lib/models/target/target_for_spec.rb +0 -56
- data/spec/lib/tools/build_number_spec.rb +0 -28
- data/spec/lib/tools/gen_spec.rb +0 -207
- data/spec/lib/tools/tools_spec.rb +0 -78
- data/spec/spec_helper.rb +0 -138
- data/vendor/github_gem_lint.rb +0 -22
- 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
|
-
|
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.
|
21
|
-
|
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
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
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
|
-
|
34
|
-
|
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
|
-
|
37
|
-
|
224
|
+
// maybe we need this later
|
225
|
+
// this.usedProperties = this.propertiesUsedInQuery(this.tokenList);
|
38
226
|
|
39
|
-
|
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
|
-
|
42
|
-
|
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
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
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
|
-
|
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
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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
|
-
|
67
|
-
return
|
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
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
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
|
-
|
78
|
-
|
79
|
-
|
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
|
-
|
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
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
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
|
-
|
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
|
-
|
92
|
-
|
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
|
-
|
95
|
-
this.endPropertyChanges();
|
96
|
-
return this;
|
97
|
-
},
|
831
|
+
});
|
98
832
|
|
99
|
-
|
100
|
-
|
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
|
-
|
104
|
-
|
105
|
-
|
106
|
-
if
|
107
|
-
|
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
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
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
|
-
|
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
|
-
|
123
|
-
|
124
|
-
|
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
|
+
};
|