sproutit-sproutcore 1.0.0.20090407205609
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 +115 -0
- data/History.txt +7 -0
- data/README.txt +102 -0
- data/Rakefile +54 -0
- data/Todo.txt +1 -0
- data/bin/sc-build +13 -0
- data/bin/sc-build-number +13 -0
- data/bin/sc-gen +13 -0
- data/bin/sc-init +13 -0
- data/bin/sc-manifest +13 -0
- data/bin/sc-server +13 -0
- data/bin/sproutcore +14 -0
- data/buildtasks/build.rake +73 -0
- data/buildtasks/entry.rake +59 -0
- data/buildtasks/manifest.rake +469 -0
- data/buildtasks/render.rake +21 -0
- data/buildtasks/target.rake +42 -0
- data/gen/Buildfile +16 -0
- data/gen/app/Buildfile +36 -0
- data/gen/app/README +1 -0
- data/gen/app/USAGE +13 -0
- data/gen/app/templates/apps/{target_name}/core.js +27 -0
- data/gen/app/templates/apps/{target_name}/english.lproj/loading.rhtml +9 -0
- data/gen/app/templates/apps/{target_name}/english.lproj/main_page.js +22 -0
- data/gen/app/templates/apps/{target_name}/english.lproj/strings.js +15 -0
- data/gen/app/templates/apps/{target_name}/main.js +30 -0
- data/gen/controller/Buildfile +18 -0
- data/gen/controller/README +1 -0
- data/gen/controller/USAGE +13 -0
- data/gen/controller/templates/controllers/{filename}.js +18 -0
- data/gen/controller/templates/tests/controllers/{filename}.js +15 -0
- data/gen/framework/Buildfile +36 -0
- data/gen/framework/README +1 -0
- data/gen/framework/USAGE +13 -0
- data/gen/framework/templates/frameworks/{target_name}/core.js +21 -0
- data/gen/framework/templates/frameworks/{target_name}/english.lproj/strings.js +15 -0
- data/gen/language/Buildfile +26 -0
- data/gen/language/README +1 -0
- data/gen/language/USAGE +13 -0
- data/gen/language/templates/{filename}/strings.js +14 -0
- data/gen/model/Buildfile +16 -0
- data/gen/model/README +1 -0
- data/gen/model/USAGE +15 -0
- data/gen/model/templates/fixtures/{filename}.js +35 -0
- data/gen/model/templates/models/{filename}.js +19 -0
- data/gen/model/templates/tests/models/{filename}.js +15 -0
- data/gen/project/Buildfile +45 -0
- data/gen/project/INIT +3 -0
- data/gen/project/README +1 -0
- data/gen/project/USAGE +2 -0
- data/gen/project/templates/{filename}/Buildfile +7 -0
- data/gen/project/templates/{filename}/README +7 -0
- data/gen/test/Buildfile +25 -0
- data/gen/test/README +1 -0
- data/gen/test/USAGE +12 -0
- data/gen/test/templates/tests/{filename}.js +15 -0
- data/gen/theme/Buildfile +36 -0
- data/gen/theme/README +1 -0
- data/gen/theme/USAGE +13 -0
- data/gen/theme/templates/themes/{target_name}/english.lproj/strings.js +15 -0
- data/gen/view/Buildfile +18 -0
- data/gen/view/README +1 -0
- data/gen/view/USAGE +13 -0
- data/gen/view/templates/tests/views/{filename}.js +15 -0
- data/gen/view/templates/views/{filename}.js +18 -0
- data/lib/sproutcore.rb +130 -0
- data/lib/sproutcore/builders/base.rb +79 -0
- data/lib/sproutcore/builders/combine.rb +37 -0
- data/lib/sproutcore/builders/html.rb +177 -0
- data/lib/sproutcore/builders/javascript.rb +55 -0
- data/lib/sproutcore/builders/minify.rb +67 -0
- data/lib/sproutcore/builders/sass.rb +55 -0
- data/lib/sproutcore/builders/strings.rb +44 -0
- data/lib/sproutcore/builders/stylesheet.rb +40 -0
- data/lib/sproutcore/builders/test.rb +58 -0
- data/lib/sproutcore/builders/test_index.rb +26 -0
- data/lib/sproutcore/buildfile.rb +483 -0
- data/lib/sproutcore/buildfile/build_task.rb +33 -0
- data/lib/sproutcore/buildfile/buildfile_dsl.rb +162 -0
- data/lib/sproutcore/buildfile/cloneable.rb +34 -0
- data/lib/sproutcore/buildfile/early_time.rb +29 -0
- data/lib/sproutcore/buildfile/invocation_chain.rb +64 -0
- data/lib/sproutcore/buildfile/namespace.rb +33 -0
- data/lib/sproutcore/buildfile/string_ext.rb +198 -0
- data/lib/sproutcore/buildfile/task.rb +304 -0
- data/lib/sproutcore/buildfile/task_arguments.rb +86 -0
- data/lib/sproutcore/buildfile/task_manager.rb +193 -0
- data/lib/sproutcore/deprecated/view_helper.rb +662 -0
- data/lib/sproutcore/helpers/capture_helper.rb +30 -0
- data/lib/sproutcore/helpers/cssmin.rb +202 -0
- data/lib/sproutcore/helpers/dom_id_helper.rb +21 -0
- data/lib/sproutcore/helpers/entry_sorter.rb +105 -0
- data/lib/sproutcore/helpers/packed_optimizer.rb +102 -0
- data/lib/sproutcore/helpers/static_helper.rb +268 -0
- data/lib/sproutcore/helpers/tag_helper.rb +117 -0
- data/lib/sproutcore/helpers/text_helper.rb +303 -0
- data/lib/sproutcore/models/generator.rb +493 -0
- data/lib/sproutcore/models/hash_struct.rb +109 -0
- data/lib/sproutcore/models/manifest.rb +342 -0
- data/lib/sproutcore/models/manifest_entry.rb +232 -0
- data/lib/sproutcore/models/project.rb +270 -0
- data/lib/sproutcore/models/target.rb +403 -0
- data/lib/sproutcore/rack/builder.rb +269 -0
- data/lib/sproutcore/rack/dev.rb +51 -0
- data/lib/sproutcore/rack/docs.rb +24 -0
- data/lib/sproutcore/rack/proxy.rb +92 -0
- data/lib/sproutcore/rack/service.rb +141 -0
- data/lib/sproutcore/rack/test_runner.rb +24 -0
- data/lib/sproutcore/render_engines/erubis.rb +55 -0
- data/lib/sproutcore/render_engines/haml.rb +39 -0
- data/lib/sproutcore/tools.rb +311 -0
- data/lib/sproutcore/tools/build.rb +80 -0
- data/lib/sproutcore/tools/build_number.rb +23 -0
- data/lib/sproutcore/tools/gen.rb +99 -0
- data/lib/sproutcore/tools/init.rb +40 -0
- data/lib/sproutcore/tools/manifest.rb +84 -0
- data/lib/sproutcore/tools/server.rb +45 -0
- data/spec/buildtasks/build/copy_spec.rb +60 -0
- data/spec/buildtasks/build/spec_helper.rb +36 -0
- data/spec/buildtasks/manifest/catalog_spec.rb +48 -0
- data/spec/buildtasks/manifest/hide_buildfiles_spec.rb +125 -0
- data/spec/buildtasks/manifest/localize_spec.rb +97 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/combine_spec.rb +246 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/css_spec.rb +87 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/html_spec.rb +175 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/javascript_spec.rb +65 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/minify_spec.rb +70 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/packed_spec.rb +152 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/sass_spec.rb +98 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/strings_spec.rb +64 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/tests_spec.rb +163 -0
- data/spec/buildtasks/manifest/prepare_spec.rb +43 -0
- data/spec/buildtasks/manifest/spec_helper.rb +35 -0
- data/spec/buildtasks/target_spec.rb +214 -0
- data/spec/fixtures/builder_tests/Buildfile +15 -0
- data/spec/fixtures/builder_tests/apps/combine_test/a.js +1 -0
- data/spec/fixtures/builder_tests/apps/combine_test/b.js +1 -0
- data/spec/fixtures/builder_tests/apps/combine_test/c.js +1 -0
- data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/a.css +1 -0
- data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/b.css +1 -0
- data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/c.css +1 -0
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/bar1_sample.rhtml +2 -0
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/erb_sample.html.erb +1 -0
- 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 +1 -0
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/strings.js +4 -0
- 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 +4 -0
- data/spec/fixtures/builder_tests/apps/html_test/lib/layout_template.rhtml +1 -0
- data/spec/fixtures/builder_tests/apps/html_test/scripts.js +0 -0
- data/spec/fixtures/builder_tests/apps/javascript_test/sc_static.js +15 -0
- data/spec/fixtures/builder_tests/apps/javascript_test/sc_super.js +4 -0
- data/spec/fixtures/builder_tests/apps/javascript_test/strings.js +7 -0
- data/spec/fixtures/builder_tests/apps/sass_test/sample.sass +3 -0
- data/spec/fixtures/builder_tests/apps/strings_test/lproj/strings.js +8 -0
- data/spec/fixtures/builder_tests/apps/stylesheet_test/build_directives.css +9 -0
- data/spec/fixtures/builder_tests/apps/stylesheet_test/sc_static.css +12 -0
- data/spec/fixtures/builder_tests/apps/test_test/lib/alt_layout.rhtml +1 -0
- data/spec/fixtures/builder_tests/apps/test_test/lib/test_layout.rhtml +3 -0
- data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test.js +1 -0
- data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test2.js +1 -0
- data/spec/fixtures/builder_tests/apps/test_test/tests/rhtml_test.rhtml +4 -0
- 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 +4 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/test.rhtml +1 -0
- 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 +1 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_2/javascript.js +1 -0
- 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 +1 -0
- data/spec/fixtures/buildfiles/basic/Buildfile +16 -0
- data/spec/fixtures/buildfiles/basic/task_module.rake +6 -0
- data/spec/fixtures/buildfiles/installed/Buildfile +7 -0
- data/spec/fixtures/buildfiles/installed/Buildfile2 +5 -0
- data/spec/fixtures/buildfiles/project_test/Buildfile +4 -0
- data/spec/fixtures/buildfiles/project_test/not_project/Buildfile +2 -0
- data/spec/fixtures/buildfiles/project_test/not_project/child/PLACEHOLDER +0 -0
- data/spec/fixtures/entry_for_project/Buildfile +1 -0
- data/spec/fixtures/entry_for_project/apps/test_app/entry.txt +0 -0
- 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 +8 -0
- 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 +5 -0
- 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 +8 -0
- data/spec/fixtures/find_targets/nested/apps/app1/Buildfile +1 -0
- 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 +1 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/B.js +1 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/a.js +1 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/a/a.js +1 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/a/b.js +1 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/b/a.js +1 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/c.js +1 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/core.js +1 -0
- 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 +1 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/utils.js +1 -0
- data/spec/fixtures/ordered_entries/apps/with_requires/a.js +2 -0
- data/spec/fixtures/ordered_entries/apps/with_requires/b.js +3 -0
- data/spec/fixtures/ordered_entries/apps/with_requires/c.js +2 -0
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/a.css +2 -0
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/b.css +2 -0
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/c.css +2 -0
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/d.js +1 -0
- data/spec/fixtures/real_world/Buildfile +12 -0
- data/spec/fixtures/real_world/apps/account/README +1 -0
- data/spec/fixtures/real_world/apps/calendar/README +1 -0
- data/spec/fixtures/real_world/apps/contacts/README_BEFORE_EDITING +1 -0
- data/spec/fixtures/real_world/apps/files/README +1 -0
- data/spec/fixtures/real_world/apps/mail/README +1 -0
- data/spec/fixtures/real_world/apps/mobile_photos/README +1 -0
- data/spec/fixtures/real_world/apps/photos/README +1 -0
- data/spec/fixtures/real_world/apps/uploader/README +1 -0
- 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 +26 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/README +1 -0
- 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 +4 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.html +1 -0
- 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 +1 -0
- 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 +4 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_require.css +1 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_sc_resource.rhtml +1 -0
- 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 +6 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.rhtml +3 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/strings.js +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +4 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/lib/index.html +1 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/no_require.js +1 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/protocols/sample.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/sc_resource.js +6 -0
- 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 +1 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/themes/standard_theme/README +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/views/view.js +1 -0
- data/spec/fixtures/real_world/generators/sample_custom/Buildfile +0 -0
- data/spec/fixtures/real_world/generators/sample_custom/templates/{filename}.js +1 -0
- data/spec/fixtures/recursive_project/Buildfile +8 -0
- data/spec/fixtures/recursive_project/frameworks/sproutcore/frameworks/costello/PLACEHOLDER +0 -0
- data/spec/lib/builders/combine_spec.rb +67 -0
- data/spec/lib/builders/html_spec.rb +577 -0
- data/spec/lib/builders/javascript_spec.rb +81 -0
- data/spec/lib/builders/sass_spec.rb +43 -0
- data/spec/lib/builders/spec_helper.rb +30 -0
- data/spec/lib/builders/strings_spec.rb +52 -0
- data/spec/lib/builders/stylesheet_spec.rb +63 -0
- data/spec/lib/builders/test_index_spec.rb +44 -0
- data/spec/lib/builders/test_spec.rb +135 -0
- data/spec/lib/buildfile/config_for_spec.rb +81 -0
- data/spec/lib/buildfile/define_spec.rb +59 -0
- data/spec/lib/buildfile/dup_spec.rb +65 -0
- data/spec/lib/buildfile/invoke_spec.rb +130 -0
- data/spec/lib/buildfile/load_spec.rb +49 -0
- data/spec/lib/buildfile/task/dup_spec.rb +55 -0
- data/spec/lib/buildfile/task_defined_spec.rb +17 -0
- data/spec/lib/buildfile_commands/build_task_spec.rb +19 -0
- data/spec/lib/buildfile_commands/config_spec.rb +97 -0
- data/spec/lib/buildfile_commands/import_spec.rb +17 -0
- data/spec/lib/buildfile_commands/namespace_spec.rb +18 -0
- data/spec/lib/buildfile_commands/proxies_spec.rb +38 -0
- data/spec/lib/buildfile_commands/replace_task_spec.rb +29 -0
- data/spec/lib/buildfile_commands/task_spec.rb +36 -0
- data/spec/lib/helpers/packing_optimizer/optimize_spec.rb +26 -0
- data/spec/lib/models/hash_struct/deep_clone_spec.rb +27 -0
- data/spec/lib/models/hash_struct/has_options_spec.rb +32 -0
- data/spec/lib/models/hash_struct/hash_spec.rb +64 -0
- data/spec/lib/models/hash_struct/merge_spec.rb +26 -0
- data/spec/lib/models/hash_struct/method_missing.rb +41 -0
- data/spec/lib/models/manifest/add_entry_spec.rb +36 -0
- data/spec/lib/models/manifest/add_transform_spec.rb +90 -0
- data/spec/lib/models/manifest/build_spec.rb +78 -0
- data/spec/lib/models/manifest/entry_for_spec.rb +94 -0
- data/spec/lib/models/manifest/find_entry.rb +84 -0
- data/spec/lib/models/manifest/prepare_spec.rb +62 -0
- data/spec/lib/models/manifest_entry/cacheable_url_spec.rb +31 -0
- data/spec/lib/models/manifest_entry/prepare_spec.rb +54 -0
- data/spec/lib/models/project/add_target_spec.rb +44 -0
- data/spec/lib/models/project/buildfile_spec.rb +35 -0
- data/spec/lib/models/project/find_targets_for_spec.rb +77 -0
- data/spec/lib/models/project/load_nearest_project_spec.rb +23 -0
- data/spec/lib/models/project/target_for_spec.rb +33 -0
- data/spec/lib/models/project/targets_spec.rb +62 -0
- data/spec/lib/models/target/compute_build_number_spec.rb +125 -0
- data/spec/lib/models/target/config_spec.rb +30 -0
- data/spec/lib/models/target/expand_required_targets_spec.rb +48 -0
- data/spec/lib/models/target/installed_languages_spec.rb +47 -0
- data/spec/lib/models/target/lproj_for_spec.rb +38 -0
- data/spec/lib/models/target/manifest_for_spec.rb +42 -0
- data/spec/lib/models/target/parent_target_spec.rb +21 -0
- data/spec/lib/models/target/prepare_spec.rb +53 -0
- data/spec/lib/models/target/required_targets_spec.rb +119 -0
- data/spec/lib/models/target/target_for_spec.rb +56 -0
- data/spec/lib/tools/build_number_spec.rb +28 -0
- data/spec/lib/tools/gen_spec.rb +207 -0
- data/spec/lib/tools/tools_spec.rb +78 -0
- data/spec/spec_helper.rb +138 -0
- data/sproutcore.gemspec +47 -0
- data/vendor/github_gem_lint.rb +22 -0
- data/vendor/yui-compressor/yuicompressor-2.4.2.jar +0 -0
- metadata +1084 -0
@@ -0,0 +1,662 @@
|
|
1
|
+
# ===========================================================================
|
2
|
+
# Project: Abbot - SproutCore Build Tools
|
3
|
+
# Copyright: ©2009 Apple, Inc.
|
4
|
+
# portions copyright @2006-2009 Sprout Systems, Inc.
|
5
|
+
# and contributors
|
6
|
+
# ===========================================================================
|
7
|
+
|
8
|
+
module SproutCore
|
9
|
+
|
10
|
+
# The PageHelper is a singleton object that can render the Page javascript
|
11
|
+
# object.
|
12
|
+
module PageHelper
|
13
|
+
@@render_contexts = []
|
14
|
+
@@outlets = []
|
15
|
+
@@styles = []
|
16
|
+
@@defines = []
|
17
|
+
|
18
|
+
# This is the current helper state used when rendering the HTML. When
|
19
|
+
# a view helper is rendered, it may add itself as an outlet to the current
|
20
|
+
# helper state instead of to the page helper.
|
21
|
+
def self.current_render_context
|
22
|
+
@@render_contexts.last
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.push_render_context(state)
|
26
|
+
@@render_contexts.push(state)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.pop_render_context
|
30
|
+
@@render_contexts.pop
|
31
|
+
end
|
32
|
+
|
33
|
+
# reset the page helper.
|
34
|
+
def self.reset!
|
35
|
+
@@render_contexts = []
|
36
|
+
@@outlets = []
|
37
|
+
@@styles = []
|
38
|
+
@@defines = []
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.set_define(key, opts = {})
|
42
|
+
@@defines << [key, opts]
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.set_outlet(key,opts = {})
|
46
|
+
@@outlets << [key, opts]
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.add_styles(styles)
|
50
|
+
@@styles << styles
|
51
|
+
end
|
52
|
+
|
53
|
+
# renders the page object for the current page. If you include a prefix
|
54
|
+
# that will be used to create a separate page object. Otherwise, the
|
55
|
+
# object will live in the SC namespace. If you provide a bundle that
|
56
|
+
# is configured to minify sources the output will be compressed.
|
57
|
+
#
|
58
|
+
# returns the text to insert into the HTML.
|
59
|
+
def self.render_js(prefix = 'SC', bundle = nil)
|
60
|
+
outlets = []
|
61
|
+
@@outlets.each do | key, opts |
|
62
|
+
outlet_path = opts[:outlet_path] || "##{opts[:id] || key}"
|
63
|
+
outlets << %{ #{key}: #{opts[:class] || 'SC.View'}.extend({\n #{ opts[:properties].gsub("\n","\n ") }\n }).outletFor("#{outlet_path}") }
|
64
|
+
end
|
65
|
+
|
66
|
+
# defines let you define classes to include in your UI.
|
67
|
+
ret = @@defines.each do | key, opts |
|
68
|
+
%{#{key} = #{opts[:class] || 'SC.View'}.extend({\n #{ opts[:properties] }\n});}
|
69
|
+
end
|
70
|
+
ret << %{#{prefix}.page = SC.Page.create({\n#{ outlets * ",\n\n" }\n}); }
|
71
|
+
bundle ? SproutCore::BuildTools::JavaScriptResourceBuilder.new(nil, nil, bundle, nil).join(ret) : ret*"\n"
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.render_css
|
75
|
+
if @@styles.size > 0
|
76
|
+
%(<style type="application/css">\n#{ @@styles * "\n" }\n</style>)
|
77
|
+
else
|
78
|
+
''
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
module ViewHelperSupport
|
85
|
+
|
86
|
+
@@helpers = {}
|
87
|
+
def self.find_helper(helper_name)
|
88
|
+
@@helpers[helper_name.to_sym] || @@helpers[:view]
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.set_helper(helper_name,obj)
|
92
|
+
@@helpers[helper_name.to_sym] = obj
|
93
|
+
end
|
94
|
+
|
95
|
+
class RenderContext
|
96
|
+
|
97
|
+
# options passed in from the view helper
|
98
|
+
attr_reader :view_helper_id
|
99
|
+
attr_reader :item_id
|
100
|
+
attr_accessor :outlet
|
101
|
+
attr_accessor :define
|
102
|
+
attr_accessor :current_helper
|
103
|
+
attr_accessor :client_builder
|
104
|
+
attr_reader :render_source
|
105
|
+
attr_reader :parent_context
|
106
|
+
attr_reader :child_contexts
|
107
|
+
|
108
|
+
def initialize(view_helper_id, item_id, opts={}, client_builder = nil, render_source=nil)
|
109
|
+
@_options = opts.dup
|
110
|
+
@bindings = (@_options[:bind] || {}).dup
|
111
|
+
@outlets = []
|
112
|
+
@prototypes = {}
|
113
|
+
@view_helper_id = view_helper_id
|
114
|
+
@item_id = item_id
|
115
|
+
@outlet = opts[:outlet]
|
116
|
+
@define = opts[:define]
|
117
|
+
@client_builder = client_builder
|
118
|
+
@render_source = render_source
|
119
|
+
@parent_context = SproutCore::PageHelper.current_render_context
|
120
|
+
@parent_context.child_contexts << self if @parent_context
|
121
|
+
@child_contexts = []
|
122
|
+
|
123
|
+
@attributes = (@_options[:attributes] || {}).dup
|
124
|
+
|
125
|
+
@_properties = {}
|
126
|
+
if @_options[:properties]
|
127
|
+
@_options[:properties].each do | key, value |
|
128
|
+
@_properties[key.to_s.camelize(:lower)] = prepare_for_javascript(value)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def to_s
|
134
|
+
"RenderContext #{view_helper_id}[#{item_id}]"
|
135
|
+
end
|
136
|
+
|
137
|
+
def options
|
138
|
+
@_options
|
139
|
+
end
|
140
|
+
|
141
|
+
def set_outlet(key,opts = {})
|
142
|
+
@outlets << [key, opts]
|
143
|
+
end
|
144
|
+
|
145
|
+
def prepare_bindings
|
146
|
+
@bindings.each do | k,v |
|
147
|
+
key = k.to_s.camelize(:lower) + 'Binding'
|
148
|
+
@_properties[key] = v.include?('(') ? v : prepare_for_javascript(v)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def prepare_outlets
|
153
|
+
return if @outlets.size == 0
|
154
|
+
outlets = []
|
155
|
+
@outlets.each do | key, opts |
|
156
|
+
outlet_key = key.to_s.camelize(:lower)
|
157
|
+
outlets << outlet_key unless opts[:lazy]
|
158
|
+
|
159
|
+
outlet_path = opts[:outlet_path] || ".#{opts[:id] || key }?"
|
160
|
+
str = %{#{opts[:class] || 'SC.View'}.extend({\n#{ opts[:properties] }\n}).outletFor("#{outlet_path}")}
|
161
|
+
@_properties[outlet_key] = str
|
162
|
+
end
|
163
|
+
|
164
|
+
@_properties['outlets'] = outlets
|
165
|
+
end
|
166
|
+
|
167
|
+
def parent_helper(opts = {})
|
168
|
+
if @current_helper && @current_helper.parent_helper
|
169
|
+
@_options.merge! opts
|
170
|
+
@current_helper.parent_helper.prepare_context(self)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
### RENDER METHODS
|
175
|
+
def render_content
|
176
|
+
@attributes[:id] = @item_id if @item_id && !(@outlet || @define)
|
177
|
+
|
178
|
+
old_client_builder = self.client_builder
|
179
|
+
self.client_builder = @content_render_client_builder unless @content_render_client_builder.nil?
|
180
|
+
ret = _do_render(@content_render)
|
181
|
+
self.client_builder = old_client_builder
|
182
|
+
return ret
|
183
|
+
end
|
184
|
+
|
185
|
+
def render_view
|
186
|
+
prepare_bindings
|
187
|
+
prepare_outlets
|
188
|
+
_do_render(@view_render)
|
189
|
+
end
|
190
|
+
|
191
|
+
def view_class
|
192
|
+
@view_class
|
193
|
+
end
|
194
|
+
|
195
|
+
def render_styles
|
196
|
+
_do_render(@styles_render)
|
197
|
+
end
|
198
|
+
|
199
|
+
### BASIC CONFIG METHODS
|
200
|
+
# These are called in the helper's prepare_context method.
|
201
|
+
|
202
|
+
# This method must be called to configure the view.
|
203
|
+
def view(view_class,text = nil, &block)
|
204
|
+
@view_class = view_class
|
205
|
+
@view_render = text || block if (text || block)
|
206
|
+
end
|
207
|
+
|
208
|
+
# this method must be called to configure the HTML.
|
209
|
+
# also captures the client builder in use at the time it is called.
|
210
|
+
def content(text = nil, &block)
|
211
|
+
@content_render_client_builder = self.client_builder
|
212
|
+
@content_render = text || block if (text || block)
|
213
|
+
end
|
214
|
+
|
215
|
+
# this method may be called to add CSS styles
|
216
|
+
def styles(text = nil, &block)
|
217
|
+
@styles_render = text || block if (text || block)
|
218
|
+
end
|
219
|
+
|
220
|
+
def static_url(resource_name, opts = {})
|
221
|
+
opts[:language] ||= @language
|
222
|
+
entry = @client_builder.find_resource_entry(resource_name, opts)
|
223
|
+
entry.nil? ? '' : entry.cacheable_url
|
224
|
+
end
|
225
|
+
|
226
|
+
def blank_url
|
227
|
+
static_url('blank.gif')
|
228
|
+
end
|
229
|
+
|
230
|
+
### HTML HELPER METHODS
|
231
|
+
|
232
|
+
# This will extract the specified value and put it into an ivar you can
|
233
|
+
# access later during rendering. For example:
|
234
|
+
#
|
235
|
+
# var :label, 'Default label'
|
236
|
+
#
|
237
|
+
# will now be accessible in your code via @label
|
238
|
+
#
|
239
|
+
# Parameters:
|
240
|
+
# option_key: (req) the option to map.
|
241
|
+
# default_value: (opt) if passed, this will be used as the default value
|
242
|
+
# if the option is not passed in.
|
243
|
+
#
|
244
|
+
# :key => (opt) the name of the resulting ivar. defaults to the option
|
245
|
+
# key.
|
246
|
+
#
|
247
|
+
# :optional => (opt) if true, then the attribute will not be included if
|
248
|
+
# it is not explicitly passed in the options. if no default value is
|
249
|
+
# specified, then this will default to true, otherwise defaults to
|
250
|
+
# false.
|
251
|
+
#
|
252
|
+
# :constant => (opt) if true, then any passed in options will be ignored
|
253
|
+
# for this key and the default you specify will be used instead.
|
254
|
+
# Defaults to false
|
255
|
+
#
|
256
|
+
# you may also pass a block that will be used to compute the value at
|
257
|
+
# render time. Expect a single parameter which is the initial value.
|
258
|
+
#
|
259
|
+
def var(option_key, default_value=:__UNDEFINED__, opts={}, &block)
|
260
|
+
ret = _pair(option_key, default_value, opts, &block)
|
261
|
+
return if ret[2] # ignore
|
262
|
+
instance_variable_set("@#{ret[0]}".to_sym, ret[1])
|
263
|
+
ret[1]
|
264
|
+
end
|
265
|
+
|
266
|
+
# returns the standard attributes for the HTML. This will automatically
|
267
|
+
# include the item id. You can also declare added attributes using the
|
268
|
+
# attribute param.
|
269
|
+
def attributes
|
270
|
+
final_class_names = css_class_names
|
271
|
+
final_styles = css_styles
|
272
|
+
|
273
|
+
ret = @attributes.map do |key,value|
|
274
|
+
|
275
|
+
# if the css class or css style is declared, replace the current
|
276
|
+
# set coming from the view_helper
|
277
|
+
if key.to_sym == :class && value
|
278
|
+
final_class_names = value
|
279
|
+
nil
|
280
|
+
elsif key.to_sym == :style && value
|
281
|
+
final_styles = value
|
282
|
+
nil
|
283
|
+
else
|
284
|
+
value ? %(#{key}="#{value}") : nil
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
# add in class names
|
289
|
+
final_class_names = [final_class_names].flatten
|
290
|
+
final_class_names << @item_id
|
291
|
+
final_class_names.compact!
|
292
|
+
unless final_class_names.empty?
|
293
|
+
ret << %(class="#{final_class_names.uniq * ' '}")
|
294
|
+
end
|
295
|
+
|
296
|
+
# add in styles
|
297
|
+
unless final_styles.nil?
|
298
|
+
final_styles = [final_styles].flatten
|
299
|
+
final_styles.compact!
|
300
|
+
ret << %(style="#{final_styles.uniq * ' '}") unless final_styles.empty?
|
301
|
+
end
|
302
|
+
|
303
|
+
ret.compact * ' '
|
304
|
+
end
|
305
|
+
|
306
|
+
# Your view helper can add text to by appended to the styles attribute
|
307
|
+
# by adding to this array.
|
308
|
+
def css_styles
|
309
|
+
@css_styles ||= []
|
310
|
+
end
|
311
|
+
|
312
|
+
def css_styles=(new_ary)
|
313
|
+
@css_styles = new_ary
|
314
|
+
end
|
315
|
+
|
316
|
+
# Your view helper can add css classes to be appended to the classes
|
317
|
+
# attribute by adding to this array.
|
318
|
+
def css_class_names
|
319
|
+
@css_class_names ||= []
|
320
|
+
end
|
321
|
+
|
322
|
+
def css_class_names=(new_ary)
|
323
|
+
@css_class_names = new_ary
|
324
|
+
end
|
325
|
+
|
326
|
+
# This does the standard open tag with the default tag and attributes. Usually
|
327
|
+
# you can use this.
|
328
|
+
def open_tag
|
329
|
+
%{<#{@tag} #{attributes}>}
|
330
|
+
end
|
331
|
+
alias_method :ot, :open_tag
|
332
|
+
|
333
|
+
def close_tag
|
334
|
+
%{</#{@tag}>}
|
335
|
+
end
|
336
|
+
alias_method :ct, :close_tag
|
337
|
+
|
338
|
+
# Call this method in your view helper definition to map an option to
|
339
|
+
# an attribute. This attribute can then be rendered with attributes.
|
340
|
+
# This method takes the same options as var
|
341
|
+
def attribute(option_key, default_value=:__UNDEFINED__, opts={}, &block)
|
342
|
+
ret = _pair(option_key, default_value, opts, &block)
|
343
|
+
return if ret[2] # ignore
|
344
|
+
@attributes[ret[0]] = ret[1]
|
345
|
+
end
|
346
|
+
|
347
|
+
# returns all the JS properties specified by the property method.
|
348
|
+
def properties
|
349
|
+
keys = @_properties.keys
|
350
|
+
ret = []
|
351
|
+
|
352
|
+
# example element, if there is one
|
353
|
+
if @define
|
354
|
+
@_properties['emptyElement'] = %($sel("#resources? .#{@item_id}:1:1"))
|
355
|
+
ret << _partial_properties(['emptyElement'])
|
356
|
+
end
|
357
|
+
|
358
|
+
# outlets first
|
359
|
+
if keys.include?('outlets')
|
360
|
+
outlets = @_properties['outlets']
|
361
|
+
@_properties['outlets'] = '["' + (outlets * '","') + '"]'
|
362
|
+
ret << _partial_properties(['outlets'])
|
363
|
+
ret << _partial_properties(outlets,",\n\n")
|
364
|
+
keys.reject! { |k| outlets.include?(k) || (k == 'outlets') }
|
365
|
+
end
|
366
|
+
|
367
|
+
bindings = keys.reject { |k| !k.match(/Binding$/) }
|
368
|
+
if bindings.size > 0
|
369
|
+
ret << _partial_properties(bindings)
|
370
|
+
keys.reject! { |k| bindings.include?(k) }
|
371
|
+
end
|
372
|
+
|
373
|
+
if keys.size > 0
|
374
|
+
ret << _partial_properties(keys)
|
375
|
+
end
|
376
|
+
|
377
|
+
ret = ret * ",\n\n"
|
378
|
+
' ' + ret.gsub("\n","\n ")
|
379
|
+
end
|
380
|
+
|
381
|
+
def _partial_properties(keys,join = ",\n")
|
382
|
+
ret = keys.map do |key|
|
383
|
+
value = @_properties[key]
|
384
|
+
next if value.nil?
|
385
|
+
%(#{key}: #{value})
|
386
|
+
end
|
387
|
+
ret * join
|
388
|
+
end
|
389
|
+
|
390
|
+
# Call this method to make a binding available or to set a default
|
391
|
+
# binding. You can use this for properties you want to allow a
|
392
|
+
# binding for but don't want to take as a fully property.
|
393
|
+
def bind(option_key, default_value=:__UNDEFINED__, opts={})
|
394
|
+
key, v, ignore = _pair(option_key, default_value, opts, false)
|
395
|
+
|
396
|
+
# always look for the option key in the bindings passed by the user.
|
397
|
+
# if present, this should override whatever we set
|
398
|
+
if found = @bindings[option_key.to_sym] || @bindings[option_key.to_s]
|
399
|
+
v = found
|
400
|
+
ignore = false
|
401
|
+
@bindings.delete option_key.to_sym
|
402
|
+
@bindings.delete option_key.to_s
|
403
|
+
end
|
404
|
+
|
405
|
+
# finally, set the binding value.
|
406
|
+
unless ignore
|
407
|
+
v = v.include?('(') ? v : prepare_for_javascript(v)
|
408
|
+
@_properties["#{key.camelize(:lower)}Binding"] = v
|
409
|
+
end
|
410
|
+
|
411
|
+
end
|
412
|
+
|
413
|
+
# Call this method in your view helper to specify a property you want
|
414
|
+
# added to the javascript declaration. This methos take the same
|
415
|
+
# options as var. Note that normally the type of value returned here
|
416
|
+
# will be marshalled into the proper type for JavaScript. If you
|
417
|
+
# provide a block to compute the property, however, the value will be
|
418
|
+
# inserted directly.
|
419
|
+
def property(option_key, default_value=:__UNDEFINED__, opts={}, &block)
|
420
|
+
ret = _pair(option_key, default_value, opts, &block)
|
421
|
+
key = ret[0].camelize(:lower)
|
422
|
+
|
423
|
+
unless ret[2] # ignore
|
424
|
+
value = ret[1]
|
425
|
+
value = prepare_for_javascript(value) unless block_given?
|
426
|
+
@_properties[key] = value
|
427
|
+
end
|
428
|
+
|
429
|
+
# also look for a matching binding and set it needed.
|
430
|
+
if v = @bindings[option_key.to_sym] || @bindings[option_key.to_s]
|
431
|
+
v = v.include?('(') ? v : prepare_for_javascript(v)
|
432
|
+
@_properties["#{key}Binding"] = v
|
433
|
+
@bindings.delete option_key.to_sym
|
434
|
+
@bindings.delete option_key.to_s
|
435
|
+
end
|
436
|
+
|
437
|
+
end
|
438
|
+
|
439
|
+
def prepare_for_javascript(value)
|
440
|
+
return 'null' if value.nil?
|
441
|
+
case value
|
442
|
+
when Array:
|
443
|
+
"[#{value.map { |v| prepare_for_javascript(v) } * ','}]"
|
444
|
+
when Hash:
|
445
|
+
items = value.map do |k,v|
|
446
|
+
[prepare_for_javascript(k),prepare_for_javascript(v)] * ': '
|
447
|
+
end
|
448
|
+
"{ #{items * ', '} }"
|
449
|
+
when FalseClass:
|
450
|
+
"false"
|
451
|
+
when TrueClass:
|
452
|
+
"true"
|
453
|
+
else
|
454
|
+
%("#{ value.to_s.gsub('"','\"').gsub("\n",'\n') }")
|
455
|
+
end
|
456
|
+
end
|
457
|
+
|
458
|
+
### INTERNAL SUPPORT
|
459
|
+
private
|
460
|
+
|
461
|
+
def _do_render(render_item)
|
462
|
+
if render_item.nil?
|
463
|
+
''
|
464
|
+
elsif render_item.instance_of?(Proc)
|
465
|
+
render_item.call
|
466
|
+
else
|
467
|
+
render_item
|
468
|
+
end
|
469
|
+
end
|
470
|
+
|
471
|
+
def _pair(option_key, default_value, opts, look_for_key = true)
|
472
|
+
if default_value.instance_of?(Hash)
|
473
|
+
opts = default_value
|
474
|
+
default_value = :__UNDEFINED__
|
475
|
+
end
|
476
|
+
|
477
|
+
# get the attribute value. possibly return if no value and optional.
|
478
|
+
optional = opts.has_key?(:optional) ? opts[:optional] : (default_value == :__UNDEFINED__)
|
479
|
+
if opts[:constant] == true
|
480
|
+
value = default_value
|
481
|
+
elsif look_for_key && options.has_key?(option_key.to_sym)
|
482
|
+
value = options[option_key.to_sym]
|
483
|
+
elsif look_for_key && options.has_key?(option_key.to_s)
|
484
|
+
value = options[option_key.to_s]
|
485
|
+
else
|
486
|
+
value = default_value
|
487
|
+
end
|
488
|
+
|
489
|
+
|
490
|
+
if (optional==true) && value == :__UNDEFINED__
|
491
|
+
ignore = true
|
492
|
+
value = nil
|
493
|
+
else
|
494
|
+
ignore = false
|
495
|
+
value = nil if value == :__UNDEFINED__
|
496
|
+
value = yield(value) if block_given?
|
497
|
+
end
|
498
|
+
|
499
|
+
attr_key = (opts[:key] || option_key).to_s
|
500
|
+
[attr_key, value, ignore]
|
501
|
+
end
|
502
|
+
|
503
|
+
end
|
504
|
+
|
505
|
+
class HelperState
|
506
|
+
attr_reader :name
|
507
|
+
attr_reader :parent_helper
|
508
|
+
attr_reader :prepare_block
|
509
|
+
|
510
|
+
def initialize(helper_name, opts={}, &block)
|
511
|
+
@name = helper_name
|
512
|
+
@prepare_block = block
|
513
|
+
unless helper_name == :view
|
514
|
+
@parent_helper = SproutCore::ViewHelperSupport.find_helper(opts[:wraps] || opts[:extends] || :view)
|
515
|
+
end
|
516
|
+
@extends = opts[:wraps].nil?
|
517
|
+
end
|
518
|
+
|
519
|
+
def prepare_context(render_context)
|
520
|
+
# automatically call parent helper if extends was used.
|
521
|
+
if parent_helper && @extends
|
522
|
+
parent_helper.prepare_context(render_context)
|
523
|
+
else
|
524
|
+
render_context.current_helper = self
|
525
|
+
end
|
526
|
+
|
527
|
+
render_context.instance_eval &prepare_block
|
528
|
+
render_context.current_helper = nil
|
529
|
+
end
|
530
|
+
|
531
|
+
end
|
532
|
+
|
533
|
+
extend SproutCore::Helpers::CaptureHelper
|
534
|
+
extend SproutCore::Helpers::TextHelper
|
535
|
+
|
536
|
+
# :outlet => define if you want this to be used as an outlet.
|
537
|
+
# :prototype => define if you want this to be used as a prototype.
|
538
|
+
def self.render_view(view_helper_id, item_id, opts={}, client_builder=nil, render_source=nil, &block)
|
539
|
+
|
540
|
+
# item_id is optional. If it is not a symbol or string, then generate
|
541
|
+
# an item_id
|
542
|
+
if item_id.instance_of?(Hash)
|
543
|
+
opts = item_id; item_id = nil
|
544
|
+
end
|
545
|
+
item_id = render_source.dom_id! if item_id.nil?
|
546
|
+
|
547
|
+
# create the new render context and set it.
|
548
|
+
client_builder = opts[:client] if opts[:client]
|
549
|
+
rc = RenderContext.new(view_helper_id, item_id, opts, client_builder, render_source)
|
550
|
+
hs = find_helper(view_helper_id)
|
551
|
+
|
552
|
+
# render the inner_html using the block, if one is given.
|
553
|
+
SproutCore::PageHelper.push_render_context(rc)
|
554
|
+
rc.options[:inner_html] = render_source.capture(&block) if block_given?
|
555
|
+
|
556
|
+
# now, use the helper state to prepare the render context. This will
|
557
|
+
# extract the properties from the options and setup the render procs.
|
558
|
+
hs.prepare_context(rc) unless hs.nil?
|
559
|
+
|
560
|
+
# now have the render context render the HTML content. This may also
|
561
|
+
# make changes to the other items to render.
|
562
|
+
ret = rc.render_content
|
563
|
+
|
564
|
+
SproutCore::PageHelper.pop_render_context
|
565
|
+
|
566
|
+
# get the JS. Save as an outlet or in the page.
|
567
|
+
cur_rc = opts[:current_context] || SproutCore::PageHelper.current_render_context
|
568
|
+
view_class = opts[:view] || rc.view_class
|
569
|
+
|
570
|
+
unless view_class.nil?
|
571
|
+
view_settings = { :id => item_id, :class => view_class, :properties => rc.render_view, :lazy => opts[:lazy], :outlet_path => opts[:outlet_path] }
|
572
|
+
|
573
|
+
# if an outlet item is passed, then register this as an outlet.
|
574
|
+
outlet = opts[:outlet]
|
575
|
+
if outlet.nil?
|
576
|
+
outlet = opts[:field].nil? ? !cur_rc.nil? : [opts[:field].to_s, 'field'].join('_').to_sym
|
577
|
+
end
|
578
|
+
define = opts[:define]
|
579
|
+
if outlet && cur_rc
|
580
|
+
outlet = item_id if outlet == true
|
581
|
+
cur_rc.set_outlet(outlet, view_settings)
|
582
|
+
|
583
|
+
elsif define
|
584
|
+
define = define.to_s.camelize.gsub('::','.')
|
585
|
+
SproutCore::PageHelper.set_define(define, view_settings)
|
586
|
+
|
587
|
+
# otherwise, add it to the page-wide setting.
|
588
|
+
else
|
589
|
+
prop = item_id.to_s.camelize(:lower)
|
590
|
+
SproutCore::PageHelper.set_outlet(prop, view_settings)
|
591
|
+
end
|
592
|
+
end
|
593
|
+
|
594
|
+
# get the styles, if any
|
595
|
+
styles = rc.render_styles
|
596
|
+
SproutCore::PageHelper.add_styles(styles) if styles && styles.size > 0
|
597
|
+
|
598
|
+
# done. return the generated HTML
|
599
|
+
render_source.concat(ret,block) if block_given?
|
600
|
+
return ret
|
601
|
+
end
|
602
|
+
|
603
|
+
end
|
604
|
+
|
605
|
+
module ViewHelpers
|
606
|
+
|
607
|
+
def view_helper(helper_name,opts={},&prepare_block)
|
608
|
+
hs = SproutCore::ViewHelperSupport::HelperState.new(helper_name,opts,&prepare_block)
|
609
|
+
SproutCore::ViewHelperSupport.set_helper(helper_name, hs)
|
610
|
+
|
611
|
+
## install the helper method
|
612
|
+
eval %{
|
613
|
+
def #{helper_name}(item_id=nil, opts={}, &block)
|
614
|
+
SproutCore::ViewHelperSupport.render_view(:#{helper_name}, item_id, opts, bundle, self, &block)
|
615
|
+
end }
|
616
|
+
|
617
|
+
end
|
618
|
+
|
619
|
+
def render_page_views(prefix = 'SC')
|
620
|
+
ret = %(<script type="text/javascript">\n#{SproutCore::PageHelper.render_js(prefix, self.bundle)}\n</script>)
|
621
|
+
SproutCore::PageHelper.reset!
|
622
|
+
return ret
|
623
|
+
end
|
624
|
+
|
625
|
+
# Call this method to load a helper. This will get the file contents
|
626
|
+
# and eval it.
|
627
|
+
def require_helpers(helper_name, bundle=nil)
|
628
|
+
|
629
|
+
# save bundle for future use
|
630
|
+
unless bundle.nil?
|
631
|
+
old_helper_bundle = @helper_bundle
|
632
|
+
@helper_bundle = bundle
|
633
|
+
end
|
634
|
+
|
635
|
+
# Get all the helper paths we want to load
|
636
|
+
if helper_name.nil?
|
637
|
+
paths = @helper_bundle.helper_paths
|
638
|
+
else
|
639
|
+
paths = [@helper_bundle.helper_for(helper_name)]
|
640
|
+
end
|
641
|
+
paths.compact!
|
642
|
+
|
643
|
+
# Create list of loaded helper paths
|
644
|
+
@loaded_helpers ||= []
|
645
|
+
|
646
|
+
# If a helper path was found, load it. May require other helpers
|
647
|
+
paths.each do |path|
|
648
|
+
next if @loaded_helpers.include?(path)
|
649
|
+
@loaded_helpers << path
|
650
|
+
|
651
|
+
eval(@helper_bundle.helper_contents_for(path))
|
652
|
+
end
|
653
|
+
|
654
|
+
# restore old bundle helper.
|
655
|
+
unless bundle.nil?
|
656
|
+
@helper_bundle = old_helper_bundle
|
657
|
+
end
|
658
|
+
end
|
659
|
+
|
660
|
+
end
|
661
|
+
|
662
|
+
end
|