spontaneous 0.1.0.alpha1 → 0.2.0.alpha1
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/Gemfile +40 -35
- data/LICENSE +20 -0
- data/Rakefile +39 -42
- data/Readme.markdown +155 -0
- data/application/css/definitions.scss +3 -0
- data/application/css/editing.scss +9 -4
- data/application/css/min/565d4c25e82148acb01c45c8d675b37a08676d77.css +1 -0
- data/application/css/min/84dbe894ea96eafd321c30823d630817bfc4b03b.css +1 -0
- data/application/css/min/d1b54ff4847c613618267ca1c15658e2aee0a4e5.css +1 -0
- data/application/css/v2.scss +144 -50
- data/application/js/add_alias_dialogue.js +18 -8
- data/application/js/ajax.js +1 -1
- data/application/js/authentication.js +8 -1
- data/application/js/box.js +37 -7
- data/application/js/box_container.js +1 -1
- data/application/js/compatibility.js +7 -0
- data/application/js/content.js +7 -0
- data/application/js/content_area.js +4 -0
- data/application/js/edit_panel.js +44 -18
- data/application/js/editing.js +12 -0
- data/application/js/event_source.js +17 -0
- data/application/js/extensions.js +2 -0
- data/application/js/field_types/file_field.js +2 -1
- data/application/js/field_types/image_field.js +35 -48
- data/application/js/field_types/long_string_field.js +12 -0
- data/application/js/field_types/markdown_field.js +2 -5
- data/application/js/field_types/string_field.js +5 -1
- data/application/js/field_types/webvideo_field.js +15 -0
- data/application/js/init.js +1 -0
- data/application/js/location.js +30 -19
- data/application/js/login.js +1 -2
- data/application/js/min/2a0c2962537a3181fedfff5c92596ba6d3122dc9.js +3 -0
- data/application/js/min/4cf1c493d3379ecba5287758c61238034c0893f9.js +2 -0
- data/application/js/min/78ac6b99d96750bb6b9f9aad4cb9cd91cd03f391.js +3 -0
- data/application/js/min/c8efb9b9f7c3f6613fcebc6be60f605b6570a382.js +90 -0
- data/application/js/page.js +1 -0
- data/application/js/page_entry.js +6 -40
- data/application/js/preview.js +2 -3
- data/application/js/top_bar.js +76 -31
- data/application/js/upload.js +5 -2
- data/application/js/upload_manager.js +2 -81
- data/application/js/vendor/jquery-1.7.1.min.js +4 -0
- data/application/js/vendor/jquery-ui-1.8.16.custom.min.js +791 -0
- data/application/js/views.js +3 -3
- data/application/js/views/box_view.js +164 -83
- data/application/js/views/page_piece_view.js +2 -2
- data/application/js/views/page_view.js +46 -15
- data/application/js/views/piece_view.js +29 -8
- data/application/static/diagonal-texture.png +0 -0
- data/application/static/item-buttons-highlight.png +0 -0
- data/application/static/plus-box.png +0 -0
- data/application/static/plus_alt.svg +8 -0
- data/application/static/slot-up-arrow.png +0 -0
- data/application/views/{index.erubis → index.erb} +9 -5
- data/application/views/{login.erubis → login.erb} +14 -10
- data/application/views/schema_modification_error.html.erb +18 -6
- data/application/views/{unsupported.erubis → unsupported.erb} +0 -0
- data/bin/spot +15 -2
- data/db/migrations/20100610142136_init.rb +2 -2
- data/db/migrations/20101130104334_timestamps.rb +2 -2
- data/db/migrations/20110209152710_users_and_groups.rb +11 -11
- data/db/migrations/20120106171423_visibility_path.rb +19 -0
- data/db/migrations/20120107124541_owner_id.rb +19 -0
- data/docs/recipe-interface-screenshot.png +0 -0
- data/lib/cutaneous.rb +11 -10
- data/lib/cutaneous/context_helper.rb +119 -14
- data/lib/cutaneous/preview_context.rb +4 -3
- data/lib/cutaneous/preview_renderer.rb +1 -6
- data/lib/cutaneous/publish_context.rb +1 -0
- data/lib/cutaneous/{first_pass_renderer.rb → publish_renderer.rb} +2 -6
- data/lib/cutaneous/publish_template.rb +62 -0
- data/lib/cutaneous/publish_token_parser.rb +8 -0
- data/lib/cutaneous/renderer.rb +4 -2
- data/lib/cutaneous/request_context.rb +1 -0
- data/lib/cutaneous/{second_pass_renderer.rb → request_renderer.rb} +2 -5
- data/lib/cutaneous/request_template.rb +11 -0
- data/lib/cutaneous/request_token_parser.rb +9 -0
- data/lib/cutaneous/token_parser.rb +125 -0
- data/lib/sequel/plugins/content_table_inheritance.rb +19 -12
- data/lib/sequel/plugins/scoped_table_name.rb +45 -0
- data/lib/spontaneous.rb +123 -126
- data/lib/spontaneous/box.rb +127 -47
- data/lib/spontaneous/box_style.rb +39 -22
- data/lib/spontaneous/change.rb +2 -2
- data/lib/spontaneous/cli.rb +1 -0
- data/lib/spontaneous/cli/base.rb +12 -4
- data/lib/spontaneous/cli/console.rb +72 -0
- data/lib/spontaneous/cli/server.rb +36 -12
- data/lib/spontaneous/cli/site.rb +175 -1
- data/lib/spontaneous/collections/box_set.rb +19 -1
- data/lib/spontaneous/collections/entry_set.rb +70 -22
- data/lib/spontaneous/collections/field_set.rb +3 -3
- data/lib/spontaneous/collections/prototype_set.rb +28 -0
- data/lib/spontaneous/config.rb +14 -5
- data/lib/spontaneous/content.rb +23 -24
- data/lib/spontaneous/errors.rb +20 -4
- data/lib/spontaneous/extensions/array.rb +2 -2
- data/lib/spontaneous/extensions/json.rb +1 -1
- data/lib/spontaneous/extensions/nil.rb +13 -0
- data/lib/spontaneous/facet.rb +61 -7
- data/lib/spontaneous/field_types.rb +1 -3
- data/lib/spontaneous/field_types/date_field.rb +1 -0
- data/lib/spontaneous/field_types/field.rb +32 -15
- data/lib/spontaneous/field_types/image_field.rb +138 -69
- data/lib/spontaneous/field_types/location_field.rb +59 -0
- data/lib/spontaneous/field_types/long_string_field.rb +13 -0
- data/lib/spontaneous/field_types/markdown_field.rb +2 -1
- data/lib/spontaneous/field_types/string_field.rb +2 -2
- data/lib/spontaneous/field_types/webvideo_field.rb +255 -0
- data/lib/spontaneous/generators/page/inline.html.cut +1 -1
- data/lib/spontaneous/generators/page/page.html.cut.tt +5 -4
- data/lib/spontaneous/generators/page/page.rb.tt +1 -5
- data/lib/spontaneous/generators/site.rb +1 -0
- data/lib/spontaneous/generators/site/.gitignore +2 -0
- data/lib/spontaneous/generators/site/Gemfile.tt +3 -5
- data/lib/spontaneous/generators/site/config/environment.rb.tt +1 -0
- data/lib/spontaneous/generators/site/config/environments/development.rb.tt +3 -1
- data/lib/spontaneous/generators/site/config/environments/production.rb.tt +3 -1
- data/lib/spontaneous/generators/site/config/indexes.rb.tt +23 -0
- data/lib/spontaneous/generators/site/public/css/{site.css → site.scss} +0 -0
- data/lib/spontaneous/generators/site/schema/box.rb.tt +5 -0
- data/lib/spontaneous/generators/site/templates/layouts/standard.html.cut.tt +11 -5
- data/lib/spontaneous/image_size.rb +0 -1
- data/lib/spontaneous/loader.rb +335 -218
- data/lib/spontaneous/logger.rb +7 -2
- data/lib/spontaneous/media.rb +64 -59
- data/lib/spontaneous/media/file.rb +74 -0
- data/lib/spontaneous/page.rb +47 -18
- data/lib/spontaneous/page_piece.rb +29 -27
- data/lib/spontaneous/paths.rb +0 -1
- data/lib/spontaneous/permissions.rb +3 -21
- data/lib/spontaneous/permissions/user.rb +5 -1
- data/lib/spontaneous/permissions/user_level.rb +6 -7
- data/lib/spontaneous/piece.rb +12 -7
- data/lib/spontaneous/plugins/aliases.rb +76 -31
- data/lib/spontaneous/plugins/allowed_types.rb +36 -37
- data/lib/spontaneous/plugins/application/facets.rb +7 -10
- data/lib/spontaneous/plugins/application/features.rb +17 -0
- data/lib/spontaneous/plugins/application/paths.rb +25 -31
- data/lib/spontaneous/plugins/application/render.rb +1 -5
- data/lib/spontaneous/plugins/application/serialisation.rb +2 -0
- data/lib/spontaneous/plugins/application/state.rb +6 -9
- data/lib/spontaneous/plugins/boxes.rb +65 -40
- data/lib/spontaneous/plugins/controllers.rb +22 -22
- data/lib/spontaneous/plugins/entries.rb +149 -150
- data/lib/spontaneous/plugins/entry.rb +50 -35
- data/lib/spontaneous/plugins/field/editor_class.rb +13 -0
- data/lib/spontaneous/plugins/fields.rb +41 -33
- data/lib/spontaneous/plugins/instance_code.rb +9 -9
- data/lib/spontaneous/plugins/layouts.rb +31 -35
- data/lib/spontaneous/plugins/media.rb +31 -32
- data/lib/spontaneous/plugins/page/formats.rb +56 -31
- data/lib/spontaneous/plugins/page/request.rb +15 -9
- data/lib/spontaneous/plugins/page_search.rb +30 -31
- data/lib/spontaneous/plugins/page_tree.rb +59 -12
- data/lib/spontaneous/plugins/paths.rb +84 -79
- data/lib/spontaneous/plugins/permissions.rb +26 -28
- data/lib/spontaneous/plugins/prototypes.rb +42 -37
- data/lib/spontaneous/plugins/publishing.rb +50 -94
- data/lib/spontaneous/plugins/render.rb +8 -16
- data/lib/spontaneous/plugins/schema_hierarchy.rb +20 -21
- data/lib/spontaneous/plugins/schema_id.rb +33 -25
- data/lib/spontaneous/plugins/schema_title.rb +3 -4
- data/lib/spontaneous/plugins/serialisation.rb +32 -35
- data/lib/spontaneous/plugins/site/features.rb +32 -0
- data/lib/spontaneous/plugins/site/instance.rb +3 -2
- data/lib/spontaneous/plugins/site/level.rb +18 -0
- data/lib/spontaneous/plugins/site/map.rb +2 -1
- data/lib/spontaneous/plugins/site/publishing.rb +56 -59
- data/lib/spontaneous/plugins/site/revisions.rb +24 -19
- data/lib/spontaneous/plugins/site/schema.rb +33 -0
- data/lib/spontaneous/plugins/site/search.rb +43 -0
- data/lib/spontaneous/plugins/site/selectors.rb +35 -30
- data/lib/spontaneous/plugins/site/storage.rb +63 -0
- data/lib/spontaneous/plugins/site_map.rb +23 -25
- data/lib/spontaneous/plugins/styles.rb +35 -43
- data/lib/spontaneous/plugins/supertype.rb +3 -1
- data/lib/spontaneous/plugins/visibility.rb +90 -83
- data/lib/spontaneous/prototypes/box_prototype.rb +55 -25
- data/lib/spontaneous/prototypes/field_prototype.rb +66 -19
- data/lib/spontaneous/prototypes/style_prototype.rb +2 -2
- data/lib/spontaneous/publishing.rb +1 -1
- data/lib/spontaneous/publishing/immediate.rb +128 -49
- data/lib/spontaneous/publishing/simultaneous.rb +70 -0
- data/lib/spontaneous/rack.rb +38 -26
- data/lib/spontaneous/rack/around_back.rb +3 -23
- data/lib/spontaneous/rack/around_preview.rb +3 -8
- data/lib/spontaneous/rack/assets.rb +7 -6
- data/lib/spontaneous/rack/authentication.rb +21 -0
- data/lib/spontaneous/rack/back.rb +310 -331
- data/lib/spontaneous/rack/cacheable_file.rb +27 -0
- data/lib/spontaneous/rack/cookie_authentication.rb +38 -0
- data/lib/spontaneous/rack/css.rb +43 -0
- data/lib/spontaneous/rack/event_source.rb +31 -0
- data/lib/spontaneous/rack/front.rb +30 -8
- data/lib/spontaneous/rack/helpers.rb +31 -0
- data/lib/spontaneous/rack/media.rb +22 -21
- data/lib/spontaneous/rack/public.rb +2 -1
- data/lib/spontaneous/rack/query_authentication.rb +35 -0
- data/lib/spontaneous/rack/reloader.rb +6 -3
- data/lib/spontaneous/rack/user_helpers.rb +28 -0
- data/lib/spontaneous/render.rb +64 -23
- data/lib/spontaneous/render/context_base.rb +143 -0
- data/lib/spontaneous/render/format.rb +24 -19
- data/lib/spontaneous/render/helpers.rb +14 -0
- data/lib/spontaneous/render/helpers/html_helper.rb +69 -0
- data/lib/spontaneous/render/helpers/script_helper.rb +17 -0
- data/lib/spontaneous/render/helpers/stylesheet_helper.rb +16 -0
- data/lib/spontaneous/render/preview_context.rb +8 -0
- data/lib/spontaneous/render/preview_renderer.rb +6 -0
- data/lib/spontaneous/render/publish_context.rb +22 -0
- data/lib/spontaneous/render/published_renderer.rb +12 -13
- data/lib/spontaneous/render/publishing_renderer.rb +3 -0
- data/lib/spontaneous/render/render_cache.rb +26 -0
- data/lib/spontaneous/render/renderer.rb +5 -1
- data/lib/spontaneous/render/request_context.rb +8 -0
- data/lib/spontaneous/schema.rb +56 -24
- data/lib/spontaneous/schema/schema_modification.rb +2 -2
- data/lib/spontaneous/schema/uid.rb +22 -106
- data/lib/spontaneous/schema/uid_map.rb +120 -0
- data/lib/spontaneous/search.rb +11 -0
- data/lib/spontaneous/search/compound_indexer.rb +26 -0
- data/lib/spontaneous/search/database.rb +72 -0
- data/lib/spontaneous/search/field.rb +95 -0
- data/lib/spontaneous/search/index.rb +184 -0
- data/lib/spontaneous/search/results.rb +34 -0
- data/lib/spontaneous/server.rb +5 -1
- data/lib/spontaneous/site.rb +56 -16
- data/lib/spontaneous/storage.rb +22 -0
- data/lib/spontaneous/storage/backend.rb +10 -0
- data/lib/spontaneous/storage/cloud.rb +104 -0
- data/lib/spontaneous/storage/local.rb +52 -0
- data/lib/spontaneous/style.rb +27 -9
- data/lib/spontaneous/version.rb +1 -1
- data/spontaneous.gemspec +719 -0
- data/test/disabled/test_slots.rb +1 -1
- data/test/experimental/test_cutaneous.rb +309 -0
- data/test/experimental/test_features.rb +129 -0
- data/test/fixtures/application/views/{index.erubis → index.erb} +0 -0
- data/test/fixtures/back/public/css/sass_include.scss +5 -0
- data/test/fixtures/back/public/css/sass_template.scss +4 -0
- data/test/fixtures/example_application/templates/client_project.html.cut +4 -4
- data/test/fixtures/example_application/templates/client_project/images.html.cut +1 -1
- data/test/fixtures/example_application/templates/client_projects.html.cut +2 -2
- data/test/fixtures/example_application/templates/inline_image.html.cut +1 -1
- data/test/fixtures/example_application/templates/layouts/home.html.cut +7 -7
- data/test/fixtures/example_application/templates/layouts/info.html.cut +1 -1
- data/test/fixtures/example_application/templates/layouts/project.html.cut +4 -4
- data/test/fixtures/example_application/templates/layouts/projects.html.cut +2 -2
- data/test/fixtures/example_application/templates/project.html.cut +2 -2
- data/test/fixtures/example_application/templates/project/inline.html.cut +3 -3
- data/test/fixtures/example_application/templates/project_image.html.cut +1 -1
- data/test/fixtures/example_application/templates/text.html.cut +1 -1
- data/test/fixtures/fields/youtube_api_response.xml +102 -0
- data/test/fixtures/layouts/layouts/custom4.html.cut +0 -0
- data/test/fixtures/plugins/schema_plugin/public/css/plugin.css +1 -0
- data/test/fixtures/plugins/schema_plugin/public/js/plugin.js +1 -0
- data/test/fixtures/plugins/schema_plugin/public/static.html +1 -0
- data/test/fixtures/plugins/schema_plugin/public/subdir/image.gif +1 -0
- data/test/fixtures/plugins/schema_plugin/public/subdir/include1.scss +3 -0
- data/test/fixtures/plugins/schema_plugin/public/subdir/sass.scss +4 -0
- data/test/fixtures/plugins/schema_plugin/public/subdir/sass/include2.scss +4 -0
- data/test/fixtures/public/templates/layouts/default.html.cut +1 -1
- data/test/fixtures/public/templates/layouts/default.pdf.cut +1 -1
- data/test/fixtures/public/templates/layouts/default.rss.cut +1 -1
- data/test/fixtures/public/templates/layouts/dynamic.html.cut +1 -1
- data/test/fixtures/schema_modification/config/database.yml +0 -0
- data/test/fixtures/schema_modification/config/environment.rb +2 -0
- data/test/fixtures/schema_modification/schema/box.rb +1 -0
- data/test/fixtures/schema_modification/schema/custom_box.rb +1 -0
- data/test/fixtures/schema_modification/schema/page.rb +6 -0
- data/test/fixtures/schema_modification/schema/piece.rb +1 -0
- data/test/fixtures/search/config/database.yml +1 -0
- data/test/fixtures/search/config/indexes.rb +4 -0
- data/test/fixtures/serialisation/root_hash.yaml.erb +16 -20
- data/test/fixtures/storage/cloud/environment.rb +12 -0
- data/test/fixtures/storage/default/environment.rb +1 -0
- data/test/fixtures/templates/aliases/layouts/c_alias.html.cut +1 -1
- data/test/fixtures/templates/content/include.html.cut +1 -1
- data/test/fixtures/templates/content/include_dir.html.cut +1 -1
- data/test/fixtures/templates/content/included.epub.cut +1 -1
- data/test/fixtures/templates/content/included.html.cut +1 -1
- data/test/fixtures/templates/content/partial/included.html.cut +1 -1
- data/test/fixtures/templates/content/preprocess.html.cut +1 -1
- data/test/fixtures/templates/content/second.html.cut +1 -1
- data/test/fixtures/templates/content/template.epub.cut +1 -1
- data/test/fixtures/templates/content/template.html.cut +1 -1
- data/test/fixtures/templates/default_style_class.html.cut +1 -1
- data/test/fixtures/templates/engine/braces.html.cut +6 -0
- data/test/fixtures/templates/engine/multiline.html.cut +5 -0
- data/test/fixtures/templates/extended/grandparent.html.cut +7 -7
- data/test/fixtures/templates/extended/main.html.cut +5 -5
- data/test/fixtures/templates/extended/parent.html.cut +10 -8
- data/test/fixtures/templates/extended/partial.html.cut +1 -0
- data/test/fixtures/templates/extended/partial_with_locals.html.cut +1 -0
- data/test/fixtures/templates/extended/with_includes.html.cut +9 -0
- data/test/fixtures/templates/extended/with_includes_and_locals.html.cut +9 -0
- data/test/fixtures/templates/layouts/entries.html.cut +7 -7
- data/test/fixtures/templates/layouts/page_style.html.cut +1 -1
- data/test/fixtures/templates/layouts/params.html.cut +1 -1
- data/test/fixtures/templates/layouts/preview_render.html.cut +2 -2
- data/test/fixtures/templates/layouts/standard_page.html.cut +1 -1
- data/test/fixtures/templates/layouts/subdir_style.html.cut +1 -1
- data/test/fixtures/templates/layouts/template_params.html.cut +1 -1
- data/test/fixtures/templates/layouts/variables.html.cut +7 -0
- data/test/fixtures/templates/page_class/inline_style.html.cut +1 -1
- data/test/fixtures/templates/preview_render/variables.html.cut +1 -0
- data/test/fixtures/templates/publishing/templates/layouts/dynamic.html.cut +1 -0
- data/test/fixtures/templates/publishing/templates/layouts/dynamic.rtf.cut +1 -0
- data/test/fixtures/templates/publishing/templates/layouts/static.html.cut +1 -0
- data/test/fixtures/templates/template_class/anonymous_style.html.cut +2 -2
- data/test/fixtures/templates/template_class/complex_template.html.cut +4 -4
- data/test/fixtures/templates/template_class/complex_template.pdf.cut +4 -4
- data/test/fixtures/templates/template_class/default_template_style.html.cut +2 -2
- data/test/fixtures/templates/template_class/images_with_template.html.cut +3 -3
- data/test/fixtures/templates/template_class/slots_template.html.cut +3 -3
- data/test/fixtures/templates/template_class/slots_template.pdf.cut +3 -3
- data/test/fixtures/templates/template_class/this_template.epub.cut +1 -1
- data/test/fixtures/templates/template_class/this_template.html.cut +1 -1
- data/test/fixtures/templates/template_class/this_template.pdf.cut +1 -1
- data/test/fixtures/templates/with_default_style_class.html.cut +1 -1
- data/test/functional/test_application.rb +19 -15
- data/test/functional/test_back.rb +130 -98
- data/test/functional/test_front.rb +72 -28
- data/test/javascript/test_dom.rb +1 -1
- data/test/javascript/test_markdown.rb +1 -1
- data/test/slow/test_publishing.rb +94 -75
- data/test/slow/test_visibility.rb +47 -14
- data/test/test_helper.rb +30 -3
- data/test/ui/test_page_editing.rb +1 -1
- data/test/unit/test_alias.rb +200 -16
- data/test/unit/test_authentication.rb +26 -28
- data/test/unit/test_boxes.rb +146 -75
- data/test/unit/test_config.rb +42 -20
- data/test/unit/test_content.rb +156 -37
- data/test/unit/test_content_inheritance.rb +4 -2
- data/test/unit/test_extensions.rb +7 -1
- data/test/unit/test_fields.rb +558 -290
- data/test/{experimental → unit}/test_formats.rb +42 -3
- data/test/unit/test_generators.rb +3 -2
- data/test/unit/test_helpers.rb +54 -0
- data/test/unit/test_image_size.rb +1 -1
- data/test/unit/test_images.rb +51 -40
- data/test/unit/test_layouts.rb +21 -4
- data/test/unit/test_logger.rb +1 -1
- data/test/unit/test_media.rb +165 -7
- data/test/unit/test_page.rb +158 -27
- data/test/unit/test_permissions.rb +170 -187
- data/test/unit/test_piece.rb +27 -9
- data/test/unit/test_plugins.rb +153 -0
- data/test/unit/test_prototype_set.rb +60 -2
- data/test/unit/test_prototypes.rb +81 -20
- data/test/unit/test_render.rb +97 -9
- data/test/unit/test_schema.rb +167 -120
- data/test/unit/test_search.rb +588 -0
- data/test/unit/test_serialisation.rb +26 -10
- data/test/unit/test_site.rb +42 -25
- data/test/unit/test_storage.rb +88 -0
- data/test/unit/test_structure.rb +11 -5
- data/test/unit/test_styles.rb +64 -3
- data/test/unit/test_table_scoping.rb +76 -0
- data/test/unit/test_templates.rb +69 -31
- data/test/unit/test_type_hierarchy.rb +9 -1
- metadata +274 -208
- data/Gemfile.lock +0 -146
- data/application/css/min/54ee0ed3c7fac7632bd5c020d69e9a2503e0c88c.css +0 -1
- data/application/css/min/c256adc144e2bdd0b0539356b04eb62db01e1dc3.css +0 -1
- data/application/js/edit_dialogue.js +0 -137
- data/application/js/min/492a209de8ee955fa9c729a765377495001e11b1.js +0 -17
- data/application/js/min/80f684d77c940887a1d4a63e3a96102e993baa98.js +0 -88
- data/application/js/min/c7140ec9475e5bf868b901e0621338d7d162358b.js +0 -3
- data/application/js/min/f07f2bd6630ee31e1c2288ec223383d8f0658ba6.js +0 -2
- data/application/js/vendor/.DS_Store +0 -0
- data/application/js/vendor/JS.Class-2.1.5/src/command.js +0 -93
- data/application/js/vendor/JS.Class-2.1.5/src/comparable.js +0 -37
- data/application/js/vendor/JS.Class-2.1.5/src/constant_scope.js +0 -48
- data/application/js/vendor/JS.Class-2.1.5/src/core.js +0 -1060
- data/application/js/vendor/JS.Class-2.1.5/src/decorator.js +0 -50
- data/application/js/vendor/JS.Class-2.1.5/src/enumerable.js +0 -505
- data/application/js/vendor/JS.Class-2.1.5/src/forwardable.js +0 -22
- data/application/js/vendor/JS.Class-2.1.5/src/hash.js +0 -334
- data/application/js/vendor/JS.Class-2.1.5/src/linked_list.js +0 -114
- data/application/js/vendor/JS.Class-2.1.5/src/loader.js +0 -553
- data/application/js/vendor/JS.Class-2.1.5/src/method_chain.js +0 -172
- data/application/js/vendor/JS.Class-2.1.5/src/observable.js +0 -55
- data/application/js/vendor/JS.Class-2.1.5/src/package.js +0 -472
- data/application/js/vendor/JS.Class-2.1.5/src/proxy.js +0 -58
- data/application/js/vendor/JS.Class-2.1.5/src/ruby.js +0 -44
- data/application/js/vendor/JS.Class-2.1.5/src/set.js +0 -332
- data/application/js/vendor/JS.Class-2.1.5/src/stack_trace.js +0 -151
- data/application/js/vendor/JS.Class-2.1.5/src/state.js +0 -95
- data/application/js/vendor/JS.Class-2.1.5/src/stdlib.js +0 -2612
- data/application/js/vendor/jquery-1.4.2.min.js +0 -154
- data/application/js/vendor/jquery-1.4.3.min.js +0 -166
- data/application/js/vendor/jquery-1.5.1.min.js +0 -16
- data/application/js/vendor/jquery-1.5.1rc1.min.js +0 -24
- data/application/js/vendor/jquery-ui-1.8.6.custom.min.js +0 -265
- data/application/js/vendor/jquery-ui-1.8.custom.min.js +0 -106
- data/application/js/vendor/jquery.hotkeys-0.7.9.js +0 -248
- data/application/js/vendor/jquery.hotkeys-0.7.9.min.js +0 -19
- data/application/js/vendor/jsdiff.js +0 -169
- data/lib/cutaneous/first_pass_parser.rb +0 -23
- data/lib/cutaneous/parser_core.rb +0 -18
- data/lib/cutaneous/second_pass_parser.rb +0 -23
- data/lib/sequel/plugins/yajl_serialization.rb +0 -154
- data/lib/spontaneous/plugins.rb +0 -20
- data/lib/spontaneous/proxy_object.rb +0 -12
- data/lib/spontaneous/publishing/fire_and_forget.rb +0 -57
- data/lib/spontaneous/render/context.rb +0 -100
- data/spontaneous.gemspec.tmpl +0 -66
- data/test/experimental/test_plugins.rb +0 -64
- data/test/fixtures/templates/publishing/layouts/dynamic.html.cut +0 -1
- data/test/fixtures/templates/publishing/layouts/static.html.cut +0 -1
|
@@ -1,17 +1,26 @@
|
|
|
1
1
|
# encoding: UTF-8
|
|
2
2
|
|
|
3
|
-
require 'hwia'
|
|
4
3
|
|
|
5
4
|
module Spontaneous::Prototypes
|
|
6
5
|
class BoxPrototype
|
|
7
6
|
|
|
8
7
|
attr_reader :name, :options, :owner
|
|
9
8
|
|
|
10
|
-
def initialize(owner, name, options, &block)
|
|
9
|
+
def initialize(owner, name, options, blocks = [], &block)
|
|
11
10
|
@owner = owner
|
|
12
11
|
@name = name.to_sym
|
|
13
12
|
@options = options
|
|
14
|
-
@extend = block
|
|
13
|
+
@extend = [blocks].flatten.push(block).compact
|
|
14
|
+
instance_class
|
|
15
|
+
self
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def position
|
|
19
|
+
owner.box_position(self)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def __source_file
|
|
23
|
+
owner.__source_file
|
|
15
24
|
end
|
|
16
25
|
|
|
17
26
|
def field_prototypes
|
|
@@ -23,10 +32,9 @@ module Spontaneous::Prototypes
|
|
|
23
32
|
end
|
|
24
33
|
|
|
25
34
|
def schema_id
|
|
26
|
-
instance_class.schema_id
|
|
35
|
+
Spontaneous.schema.uids[@_inherited_schema_id] || instance_class.schema_id
|
|
27
36
|
end
|
|
28
37
|
|
|
29
|
-
|
|
30
38
|
def schema_name
|
|
31
39
|
instance_class.schema_name
|
|
32
40
|
end
|
|
@@ -47,12 +55,33 @@ module Spontaneous::Prototypes
|
|
|
47
55
|
@options[:fields]
|
|
48
56
|
end
|
|
49
57
|
|
|
58
|
+
def group
|
|
59
|
+
@options[:group]
|
|
60
|
+
end
|
|
61
|
+
|
|
50
62
|
def instance_class
|
|
51
63
|
@_instance_class ||= create_instance_class
|
|
52
64
|
end
|
|
53
65
|
|
|
66
|
+
def inherit_schema_id(schema_id)
|
|
67
|
+
@_inherited_schema_id = instance_class.schema_id = schema_id.to_s
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def merge(subclass_owner, subclass_options, &subclass_block)
|
|
71
|
+
options = @options.merge(subclass_options)
|
|
72
|
+
Spontaneous::Prototypes::BoxPrototype.new(subclass_owner, name, options, @extend, &subclass_block).tap do |prototype|
|
|
73
|
+
# We want merged boxes, which are essentially monkey-patched box definitions
|
|
74
|
+
# to use the same schema id as the supertype version because otherwise removing the
|
|
75
|
+
# subtype version and falling back to the original supertype definition would remove
|
|
76
|
+
# all the content from the box while the box itself would still remain visible in the UI
|
|
77
|
+
prototype.inherit_schema_id self.schema_id
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
54
81
|
def create_instance_class
|
|
55
82
|
Class.new(box_base_class).tap do |instance_class|
|
|
83
|
+
# doing this means we get proper names for the anonymous box classes
|
|
84
|
+
owner.const_set("#{name.to_s.camelize}Box", instance_class)
|
|
56
85
|
box_owner = owner
|
|
57
86
|
box_name = name
|
|
58
87
|
instance_class.instance_eval do
|
|
@@ -66,17 +95,14 @@ module Spontaneous::Prototypes
|
|
|
66
95
|
box_owner.schema_id
|
|
67
96
|
end
|
|
68
97
|
end
|
|
69
|
-
|
|
70
|
-
instance_class.class_eval(
|
|
71
|
-
|
|
72
|
-
end.tap do |klass|
|
|
73
|
-
# doing this means we get proper names for the anonymous box classes
|
|
74
|
-
owner.const_set("#{name.to_s.camelize}Box", klass)
|
|
98
|
+
@extend.each { |block|
|
|
99
|
+
instance_class.class_eval(&block) if block
|
|
100
|
+
}
|
|
75
101
|
end
|
|
76
102
|
end
|
|
77
103
|
|
|
78
104
|
def box_base_class
|
|
79
|
-
box_class =
|
|
105
|
+
box_class = default_box_class
|
|
80
106
|
class_name = @options[:type] || @options[:class]
|
|
81
107
|
box_class = class_name.to_s.constantize if class_name
|
|
82
108
|
# box_class = Class.new(box_class) do
|
|
@@ -87,6 +113,10 @@ module Spontaneous::Prototypes
|
|
|
87
113
|
box_class
|
|
88
114
|
end
|
|
89
115
|
|
|
116
|
+
def default_box_class
|
|
117
|
+
defined?(::Box) ? ::Box : Spontaneous::Box
|
|
118
|
+
end
|
|
119
|
+
|
|
90
120
|
## failed attempt to exclude anonymous boxes from the list of schema classes
|
|
91
121
|
## actually easier to keep them in, despite later problems with UID creation
|
|
92
122
|
## because this way their fields & styles are automatically validated
|
|
@@ -125,26 +155,26 @@ module Spontaneous::Prototypes
|
|
|
125
155
|
end
|
|
126
156
|
|
|
127
157
|
# TODO: must be able to make these into a module
|
|
128
|
-
def readable?
|
|
129
|
-
Spontaneous::Permissions.has_level?(read_level)
|
|
158
|
+
def readable?(user)
|
|
159
|
+
Spontaneous::Permissions.has_level?(user, read_level)
|
|
130
160
|
end
|
|
131
161
|
|
|
132
|
-
def writable?
|
|
133
|
-
Spontaneous::Permissions.has_level?(write_level)
|
|
162
|
+
def writable?(user)
|
|
163
|
+
Spontaneous::Permissions.has_level?(user, write_level)
|
|
134
164
|
end
|
|
135
165
|
|
|
136
166
|
def style
|
|
137
167
|
@options[:style]# || name
|
|
138
168
|
end
|
|
139
169
|
|
|
140
|
-
def readable_fields
|
|
141
|
-
instance_class.readable_fields
|
|
170
|
+
def readable_fields(user)
|
|
171
|
+
instance_class.readable_fields(user)
|
|
142
172
|
end
|
|
143
173
|
|
|
144
|
-
def allowed_types
|
|
145
|
-
if writable?
|
|
174
|
+
def allowed_types(user)
|
|
175
|
+
if writable?(user)
|
|
146
176
|
types = []
|
|
147
|
-
instance_class.allowed.select { |a| a.readable? }.each do |a|
|
|
177
|
+
instance_class.allowed.select { |a| a.readable?(user) }.each do |a|
|
|
148
178
|
types.concat(a.instance_classes)
|
|
149
179
|
end
|
|
150
180
|
types
|
|
@@ -153,15 +183,15 @@ module Spontaneous::Prototypes
|
|
|
153
183
|
end
|
|
154
184
|
end
|
|
155
185
|
|
|
156
|
-
def export
|
|
157
|
-
allowed = allowed_types.map { |c| c.ui_class }
|
|
186
|
+
def export(user)
|
|
187
|
+
allowed = allowed_types(user).map { |c| c.ui_class }
|
|
158
188
|
{
|
|
159
189
|
:name => name.to_s,
|
|
160
190
|
:id => schema_id.to_s,
|
|
161
191
|
:title => title,
|
|
162
|
-
:writable => writable
|
|
192
|
+
:writable => writable?(user),
|
|
163
193
|
:allowed_types => allowed,
|
|
164
|
-
:fields => readable_fields.map { |name| instance_class.field_prototypes[name].export },
|
|
194
|
+
:fields => readable_fields(user).map { |name| instance_class.field_prototypes[name].export(user) },
|
|
165
195
|
}
|
|
166
196
|
end
|
|
167
197
|
end
|
|
@@ -3,33 +3,33 @@
|
|
|
3
3
|
|
|
4
4
|
module Spontaneous::Prototypes
|
|
5
5
|
class FieldPrototype
|
|
6
|
-
attr_reader :owner, :name
|
|
6
|
+
attr_reader :owner, :name, :options
|
|
7
7
|
|
|
8
|
-
def initialize(owner, name, type, options={})
|
|
8
|
+
def initialize(owner, name, type, options={}, blocks = [], &block)
|
|
9
9
|
@owner = owner
|
|
10
10
|
@name = name
|
|
11
|
+
@extend = [blocks].flatten.push(block).compact
|
|
12
|
+
|
|
13
|
+
parse_options(options)
|
|
14
|
+
|
|
11
15
|
# if the type is nil then try the name, this will assign sensible defaults
|
|
12
16
|
# to fields like 'image' or 'date'
|
|
13
|
-
base_class = Spontaneous::FieldTypes[type || name]
|
|
14
|
-
if block_given?
|
|
15
|
-
@field_class = Class.new(base_class, &Proc.new)
|
|
16
|
-
@field_class.singleton_class.send(:define_method, :name) do
|
|
17
|
-
base_class.name
|
|
18
|
-
end
|
|
19
|
-
else
|
|
20
|
-
@field_class = base_class
|
|
21
|
-
end
|
|
17
|
+
@base_class = Spontaneous::FieldTypes[type || name]
|
|
22
18
|
|
|
23
|
-
#
|
|
24
|
-
|
|
19
|
+
owner.const_set("#{name.to_s.camelize}Field", instance_class)
|
|
20
|
+
|
|
21
|
+
self
|
|
25
22
|
end
|
|
26
23
|
|
|
27
24
|
def schema_name
|
|
28
25
|
"field/#{owner.schema_id}/#{name}"
|
|
29
26
|
end
|
|
30
27
|
|
|
28
|
+
# def schema_id
|
|
29
|
+
# Spontaneous.schema.schema_id(self)
|
|
30
|
+
# end
|
|
31
31
|
def schema_id
|
|
32
|
-
Spontaneous
|
|
32
|
+
Spontaneous.schema.uids[@_inherited_schema_id] || Spontaneous.schema.schema_id(self)
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def schema_owner
|
|
@@ -62,8 +62,27 @@ module Spontaneous::Prototypes
|
|
|
62
62
|
}.merge(options)
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
+
def instance_class
|
|
66
|
+
@_instance_class ||= create_instance_class
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def create_instance_class
|
|
70
|
+
base_class = @base_class
|
|
71
|
+
Class.new(@base_class).tap do |instance_class|
|
|
72
|
+
# although we're subclassing the base field class, we don't want the ui
|
|
73
|
+
# to use a different editor. FieldClass::editor_class is used in the serialisation
|
|
74
|
+
# routine
|
|
75
|
+
# instance_class.singleton_class.send(:define_method, :editor_class) do
|
|
76
|
+
# base_class.editor_class
|
|
77
|
+
# end
|
|
78
|
+
@extend.each { |block|
|
|
79
|
+
instance_class.class_eval(&block) if block
|
|
80
|
+
}
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
65
84
|
def field_class
|
|
66
|
-
|
|
85
|
+
instance_class
|
|
67
86
|
end
|
|
68
87
|
|
|
69
88
|
def default
|
|
@@ -87,25 +106,53 @@ module Spontaneous::Prototypes
|
|
|
87
106
|
Spontaneous::Permissions[level_name]
|
|
88
107
|
end
|
|
89
108
|
|
|
109
|
+
def in_index?(index)
|
|
110
|
+
search.in_index?(index)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def index_id(index)
|
|
114
|
+
search.index_id(index)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def options_for_index(index)
|
|
118
|
+
search.field_definition(index)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def search
|
|
122
|
+
@search ||= S::Search::Field.new(self, @options[:index])
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def inherit_schema_id(schema_id)
|
|
126
|
+
@_inherited_schema_id = schema_id.to_s
|
|
127
|
+
# instance_class.schema_id = schema_id
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def merge(subclass_owner, field_type, subclass_options, &subclass_block)
|
|
131
|
+
options = @options.merge(subclass_options)
|
|
132
|
+
self.class.new(subclass_owner, name, field_type, options, @extend, &subclass_block).tap do |prototype|
|
|
133
|
+
prototype.inherit_schema_id self.schema_id
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
90
137
|
def to_field(values=nil)
|
|
91
138
|
default_values = values.nil?
|
|
92
139
|
values = {
|
|
93
140
|
:name => self.name,
|
|
94
141
|
:unprocessed_value => default
|
|
95
142
|
}.merge(values || {})
|
|
96
|
-
self.
|
|
143
|
+
self.instance_class.new(values, !default_values).tap do |field|
|
|
97
144
|
field.prototype = self
|
|
98
145
|
end
|
|
99
146
|
end
|
|
100
147
|
|
|
101
|
-
def export
|
|
148
|
+
def export(user)
|
|
102
149
|
{
|
|
103
150
|
:name => name.to_s,
|
|
104
151
|
:schema_id => schema_id.to_s,
|
|
105
|
-
:type =>
|
|
152
|
+
:type => instance_class.editor_class,
|
|
106
153
|
:title => title,
|
|
107
154
|
:comment => comment || "",
|
|
108
|
-
:writable => Spontaneous::Permissions.has_level?(write_level)
|
|
155
|
+
:writable => Spontaneous::Permissions.has_level?(user, write_level)
|
|
109
156
|
}
|
|
110
157
|
end
|
|
111
158
|
end
|
|
@@ -4,7 +4,7 @@ module Spontaneous
|
|
|
4
4
|
module Publishing
|
|
5
5
|
autoload :Immediate, "spontaneous/publishing/immediate"
|
|
6
6
|
autoload :Threaded, "spontaneous/publishing/threaded"
|
|
7
|
-
autoload :
|
|
7
|
+
autoload :Simultaneous, "spontaneous/publishing/simultaneous"
|
|
8
8
|
end # Publishing
|
|
9
9
|
end # Spontaneous
|
|
10
10
|
|
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
# encoding: UTF-8
|
|
2
2
|
|
|
3
|
+
require 'simultaneous'
|
|
4
|
+
require 'sass'
|
|
5
|
+
|
|
3
6
|
module Spontaneous
|
|
4
7
|
module Publishing
|
|
5
8
|
class Immediate
|
|
6
9
|
|
|
7
|
-
def self.status
|
|
8
|
-
|
|
9
|
-
end
|
|
10
|
+
# def self.status
|
|
11
|
+
# @status ||= ""
|
|
12
|
+
# end
|
|
10
13
|
|
|
11
|
-
def self.status=(status)
|
|
12
|
-
|
|
13
|
-
end
|
|
14
|
+
# def self.status=(status)
|
|
15
|
+
# @status = status
|
|
16
|
+
# end
|
|
17
|
+
|
|
18
|
+
include ::Simultaneous::Task
|
|
14
19
|
|
|
15
20
|
attr_reader :revision
|
|
16
21
|
|
|
@@ -50,36 +55,33 @@ module Spontaneous
|
|
|
50
55
|
end
|
|
51
56
|
end
|
|
52
57
|
|
|
53
|
-
|
|
54
|
-
|
|
58
|
+
protected
|
|
59
|
+
|
|
60
|
+
def page_rendered(page, event = "rendering")
|
|
55
61
|
@pages_rendered += 1
|
|
56
|
-
|
|
57
|
-
logger.info { "
|
|
62
|
+
update_progress(event, percent_complete)
|
|
63
|
+
logger.info { "Done: #{event} page #{page.path} #{percent_complete.round(1)}%" }
|
|
58
64
|
end
|
|
59
65
|
|
|
60
|
-
protected
|
|
61
66
|
|
|
62
67
|
def pages
|
|
63
68
|
@pages ||= S::Page.order(:depth)
|
|
64
69
|
end
|
|
65
70
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
def render_stages
|
|
72
|
-
# TODO: when search infrastructure is in place modify this to include the indexing steps
|
|
73
|
-
1
|
|
71
|
+
# The number of times the publisher has to run through the site's pages
|
|
72
|
+
# in order to generate the search indexes.
|
|
73
|
+
# Returns either 0 or 1
|
|
74
|
+
def index_stages
|
|
75
|
+
[1, S::Site.indexes.length].min
|
|
74
76
|
end
|
|
75
77
|
|
|
76
|
-
def publish(
|
|
78
|
+
def publish(modified_page_list)
|
|
77
79
|
at_exit {
|
|
78
80
|
abort_publish_at_exit
|
|
79
81
|
}
|
|
80
82
|
before_publish
|
|
81
83
|
begin
|
|
82
|
-
S::Content.publish(revision,
|
|
84
|
+
S::Content.publish(revision, modified_page_list) do
|
|
83
85
|
render_revision
|
|
84
86
|
end
|
|
85
87
|
after_publish
|
|
@@ -90,44 +92,75 @@ module Spontaneous
|
|
|
90
92
|
end
|
|
91
93
|
|
|
92
94
|
def render_revision
|
|
95
|
+
update_progress("rendering", 0)
|
|
93
96
|
@pages_rendered = 0
|
|
94
97
|
S::Content.with_identity_map do
|
|
95
|
-
S::
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
98
|
+
S::Content.with_visible do
|
|
99
|
+
S::Render.with_publishing_renderer do
|
|
100
|
+
render_pages
|
|
101
|
+
index_pages unless index_stages == 0
|
|
99
102
|
end
|
|
100
|
-
# only set this after indexing is complete (if any)
|
|
101
|
-
set_status("rendering:100")
|
|
102
103
|
end
|
|
103
104
|
end
|
|
104
|
-
set_status("copying_files")
|
|
105
105
|
copy_static_files
|
|
106
106
|
generate_rackup_file
|
|
107
107
|
end
|
|
108
108
|
|
|
109
|
+
def render_pages
|
|
110
|
+
# the delay is purely used in interface testing
|
|
111
|
+
delay = Spontaneous::Site.config.publishing_delay
|
|
112
|
+
pages.each do |page|
|
|
113
|
+
page.formats.each do |format|
|
|
114
|
+
render_page(page, format)
|
|
115
|
+
end
|
|
116
|
+
sleep(delay) if delay
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def render_page(page, format)
|
|
121
|
+
logger.info { "#{page.path}" }
|
|
122
|
+
formatter = Spontaneous::Render::Format.for(format)
|
|
123
|
+
renderer = formatter.new(revision, page)
|
|
124
|
+
renderer.render
|
|
125
|
+
page_rendered(page)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def index_pages
|
|
129
|
+
S::Site.indexer(revision) do |indexer|
|
|
130
|
+
pages.each { |page|
|
|
131
|
+
indexer << page
|
|
132
|
+
page_rendered(page, 'indexing')
|
|
133
|
+
}
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
109
137
|
# Used to calculate the progress percentage
|
|
138
|
+
# Calculated by (pages * indexes) * (pages * formats)
|
|
139
|
+
# where indexes = Site.indexes.length > 0 ? 1 : 0
|
|
140
|
+
# although not all pages are included by a format
|
|
110
141
|
def total_pages_to_render
|
|
111
|
-
@total_pages ||=
|
|
112
|
-
total +=
|
|
142
|
+
@total_pages ||= (index_stages * pages.count) + pages.inject(0) do |total, page|
|
|
143
|
+
total += page.formats.length#count { |page| page.formats.include?(format) }
|
|
113
144
|
end
|
|
114
145
|
end
|
|
115
146
|
|
|
116
147
|
def percent_complete
|
|
117
|
-
((@pages_rendered || 0).to_f / (total_pages_to_render
|
|
148
|
+
((@pages_rendered || 0).to_f / (total_pages_to_render).to_f) * 100.0
|
|
118
149
|
end
|
|
119
150
|
|
|
120
|
-
def
|
|
121
|
-
|
|
151
|
+
def update_progress(state, progress='*')
|
|
152
|
+
simultaneous_event('publish_progress', {:state => state, :progress => progress}.to_json)
|
|
122
153
|
end
|
|
123
154
|
|
|
124
155
|
def generate_rackup_file
|
|
125
156
|
# use the real path to the app rather than the symlink in order to sandbox the live site
|
|
126
157
|
# not sure that this is a good idea: it would force a publish for every deploy
|
|
127
158
|
# which is only sometimes appropriate/desirable
|
|
159
|
+
# UPDATE: What was I on about there? The true downside to this is that it would force a restart/HUP for
|
|
160
|
+
# every publish. Not sure that the comment above this one is based on truth or some mad momentary fantasy
|
|
128
161
|
path = Pathname.new(Spontaneous.root).realpath.to_s
|
|
129
|
-
# TODO: enable custom rack middleware by changing config/front into a proper rackup file
|
|
130
162
|
rackup = 'config/front.ru'
|
|
163
|
+
|
|
131
164
|
template = (<<-RACKUP).gsub(/^ +/, '')
|
|
132
165
|
# This is an automatically generated file *DO NOT EDIT*
|
|
133
166
|
# To configure your Rack application make your changes in
|
|
@@ -141,41 +174,87 @@ module Spontaneous
|
|
|
141
174
|
root = '#{path}'
|
|
142
175
|
Dir.chdir(root)
|
|
143
176
|
eval(::File.read('#{rackup}'), binding, ::File.join(root, '#{rackup}'), __LINE__)
|
|
144
|
-
|
|
145
177
|
RACKUP
|
|
146
178
|
rack_file = Spontaneous.revision_dir(revision) / 'config.ru'
|
|
147
179
|
File.open(rack_file, 'w') { |f| f.write(template) }
|
|
148
|
-
|
|
180
|
+
end
|
|
149
181
|
|
|
150
182
|
def copy_static_files
|
|
183
|
+
update_progress("copying_files")
|
|
151
184
|
public_dest = Pathname.new(Spontaneous.revision_dir(revision) / 'public')
|
|
152
|
-
public_src = Pathname.new(Spontaneous.root / 'public').realpath
|
|
153
185
|
FileUtils.mkdir_p(public_dest) unless File.exists?(public_dest)
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
186
|
+
facets = Spontaneous.instance.facets
|
|
187
|
+
public_dirs = facets.map { |facet| facet.paths.expanded(:public) }.flatten
|
|
188
|
+
facets.each do |facet|
|
|
189
|
+
copy_facet_public_files(facet, public_dest)
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def copy_facet_public_files(facet, public_dest)
|
|
194
|
+
public_dirs = facet.paths.expanded(:public).map { |dir| Pathname.new(dir) }
|
|
195
|
+
public_dirs.each do |public_src|
|
|
196
|
+
if public_src.exist?
|
|
197
|
+
public_src = public_src.realpath
|
|
198
|
+
Dir[public_src.to_s / "**/*"].each do |src|
|
|
199
|
+
src = Pathname.new(src)
|
|
200
|
+
# insert facet namespace in front of path to keep URLs consistent across
|
|
201
|
+
# the back & front servers
|
|
202
|
+
dest = [facet.file_namespace, src.relative_path_from(public_src).to_s].compact
|
|
203
|
+
dest = (public_dest + File.join(dest))
|
|
204
|
+
if src.directory?
|
|
205
|
+
dest.mkpath
|
|
206
|
+
else
|
|
207
|
+
case src.extname
|
|
208
|
+
when ".scss"
|
|
209
|
+
render_sass_template(src, dest)
|
|
210
|
+
else
|
|
211
|
+
FileUtils.ln(src, dest, :force => true)
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def render_sass_template(template, dest)
|
|
220
|
+
dest_css = [dest.basename('.scss'), "css"].join(".")
|
|
221
|
+
dest = (dest.dirname + dest_css)
|
|
222
|
+
|
|
223
|
+
dir = File.dirname(template)
|
|
224
|
+
load_paths = [dir, File.join(dir, "sass")]
|
|
225
|
+
|
|
226
|
+
File.open(dest, 'w') do |file|
|
|
227
|
+
begin
|
|
228
|
+
engine = Sass::Engine.for_file(template.to_s, {
|
|
229
|
+
:filename => template.to_s,
|
|
230
|
+
:load_paths => load_paths,
|
|
231
|
+
:cache => false,
|
|
232
|
+
:style => :compressed
|
|
233
|
+
})
|
|
234
|
+
file.write(engine.render)
|
|
235
|
+
rescue Sass::SyntaxError => e
|
|
236
|
+
# it's likely that the error is coming from rendering an include file that isn't designed to
|
|
237
|
+
# be rendered singly (i.e. it depends on another include file)
|
|
238
|
+
# but let's show an error anyway
|
|
239
|
+
logger.warn(e)
|
|
161
240
|
end
|
|
162
241
|
end
|
|
163
242
|
end
|
|
164
243
|
|
|
165
244
|
def before_publish
|
|
166
|
-
|
|
245
|
+
update_progress("initialising")
|
|
167
246
|
S::Site.send(:pending_revision=, revision)
|
|
168
247
|
end
|
|
169
248
|
|
|
170
249
|
def after_publish
|
|
171
|
-
|
|
250
|
+
update_progress("finalising")
|
|
172
251
|
S::Revision.create(:revision => revision, :published_at => Time.now)
|
|
173
252
|
S::Site.send(:set_published_revision, revision)
|
|
174
253
|
S::Site.send(:pending_revision=, nil)
|
|
175
254
|
tmp = Spontaneous.revision_dir(revision) / "tmp"
|
|
176
255
|
FileUtils.mkdir_p(tmp) unless ::File.exists?(tmp)
|
|
177
256
|
system("ln -nsf #{Spontaneous.revision_dir(revision)} #{Spontaneous.revision_dir}")
|
|
178
|
-
|
|
257
|
+
update_progress("complete")
|
|
179
258
|
end
|
|
180
259
|
|
|
181
260
|
def abort_publish_at_exit
|
|
@@ -184,12 +263,12 @@ module Spontaneous
|
|
|
184
263
|
|
|
185
264
|
def abort_publish(exception)
|
|
186
265
|
if r = S::Site.pending_revision
|
|
187
|
-
|
|
266
|
+
update_progress("aborting")
|
|
188
267
|
FileUtils.rm_r(Spontaneous.revision_dir(revision)) if File.exists?(Spontaneous.revision_dir(revision))
|
|
189
268
|
S::Site.send(:pending_revision=, nil)
|
|
190
269
|
S::Content.delete_revision(revision)
|
|
191
270
|
puts exception.backtrace.join("\n")
|
|
192
|
-
|
|
271
|
+
update_progress("error", exception)
|
|
193
272
|
end
|
|
194
273
|
end
|
|
195
274
|
end # Immediate
|