gluttonberg-core 2.6.4 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +29 -3
- data/Rakefile +32 -15
- data/app/assets/images/chosen-sprite-2x.png +0 -0
- data/app/assets/images/chosen-sprite.png +0 -0
- data/app/assets/images/{library/gb_sort_by_asc.png → gb_sort_by_asc.png} +0 -0
- data/app/assets/images/{library/gb_sort_by_desc.png → gb_sort_by_desc.png} +0 -0
- data/app/assets/javascripts/chosen-jquery-min.js +2 -0
- data/app/assets/javascripts/gb_360player.js +676 -0
- data/app/assets/javascripts/gb_application.js +708 -463
- data/app/assets/javascripts/gb_html5.js +9 -0
- data/app/assets/javascripts/gb_jeditable.js +356 -356
- data/app/assets/javascripts/gb_jquery-nestable.js +490 -0
- data/app/assets/javascripts/gb_utils.js +1808 -0
- data/app/assets/javascripts/gluttonberg.js +26 -0
- data/app/assets/javascripts/jcrop/css/gb_jquery-Jcrop.css +163 -31
- data/app/assets/javascripts/jcrop/js/jquery-Jcrop-min.js +19 -243
- data/app/assets/javascripts/jquery-1-10-1.js +6 -0
- data/app/assets/javascripts/jquery-ui-1-10-3.custom-min.js +6 -0
- data/app/assets/javascripts/jquery-validate.js +652 -718
- data/app/assets/javascripts/rails.js +372 -106
- data/app/assets/javascripts/redactormin.js +7348 -0
- data/app/assets/stylesheets/chosen.css +430 -0
- data/app/assets/stylesheets/gb_360player.css +2 -10
- data/app/assets/stylesheets/gb_admin-override.sass +466 -22
- data/app/assets/stylesheets/gb_bootstrap.css +7 -1
- data/app/assets/stylesheets/gluttonberg.css +17 -0
- data/app/assets/stylesheets/redactor.css +864 -0
- data/app/assets/stylesheets/user-styles.sass +0 -3
- data/app/controllers/gluttonberg/admin/asset_library/assets_ajax_controller.rb +65 -0
- data/app/controllers/gluttonberg/admin/asset_library/assets_bulk_controller.rb +47 -0
- data/app/controllers/gluttonberg/admin/asset_library/assets_controller.rb +43 -266
- data/app/controllers/gluttonberg/admin/asset_library/base_controller.rb +29 -0
- data/app/controllers/gluttonberg/admin/asset_library/collections_controller.rb +11 -37
- data/app/controllers/gluttonberg/admin/base_controller.rb +117 -178
- data/app/controllers/gluttonberg/admin/content/auto_save_controller.rb +63 -0
- data/app/controllers/gluttonberg/admin/content/flag_controller.rb +6 -6
- data/app/controllers/gluttonberg/admin/content/galleries_controller.rb +29 -37
- data/app/controllers/gluttonberg/admin/content/page_localizations_controller.rb +82 -49
- data/app/controllers/gluttonberg/admin/content/pages_controller.rb +59 -32
- data/app/controllers/gluttonberg/admin/main_controller.rb +77 -7
- data/app/controllers/gluttonberg/admin/membership/base_controller.rb +2 -1
- data/app/controllers/gluttonberg/admin/membership/groups_controller.rb +27 -33
- data/app/controllers/gluttonberg/admin/membership/main_controller.rb +3 -2
- data/app/controllers/gluttonberg/admin/membership/members_controller.rb +37 -42
- data/app/controllers/gluttonberg/admin/password_resets_controller.rb +16 -28
- data/app/controllers/gluttonberg/admin/settings/configurations_controller.rb +101 -0
- data/app/controllers/gluttonberg/admin/settings/embeds_controller.rb +79 -0
- data/app/controllers/gluttonberg/admin/settings/locales_controller.rb +22 -28
- data/app/controllers/gluttonberg/admin/settings/stylesheets_controller.rb +31 -36
- data/app/controllers/gluttonberg/admin/settings/users_controller.rb +45 -40
- data/app/controllers/gluttonberg/base_controller.rb +95 -0
- data/app/controllers/gluttonberg/public/base_controller.rb +104 -157
- data/app/controllers/gluttonberg/public/flag_controller.rb +2 -7
- data/app/controllers/gluttonberg/public/gallery_controller.rb +1 -0
- data/app/controllers/gluttonberg/public/member_password_resets_controller.rb +5 -17
- data/app/controllers/gluttonberg/public/members_controller.rb +5 -15
- data/app/controllers/gluttonberg/public/pages_controller.rb +25 -14
- data/app/controllers/gluttonberg/public/public_assets_controller.rb +4 -2
- data/app/helpers/gluttonberg/admin.rb +86 -368
- data/app/helpers/gluttonberg/admin/assets.rb +84 -0
- data/app/helpers/gluttonberg/admin/form.rb +159 -0
- data/app/helpers/gluttonberg/admin/messages.rb +32 -0
- data/app/helpers/gluttonberg/admin/versioning.rb +196 -0
- data/app/helpers/gluttonberg/application_helper.rb +34 -7
- data/app/helpers/gluttonberg/asset_library.rb +29 -254
- data/app/helpers/gluttonberg/content_helpers.rb +17 -69
- data/app/helpers/gluttonberg/deprecated.rb +24 -0
- data/app/helpers/gluttonberg/public.rb +51 -244
- data/app/helpers/gluttonberg/public/assets.rb +31 -0
- data/app/helpers/gluttonberg/public/cms_stylesheets.rb +35 -0
- data/app/helpers/gluttonberg/public/html_truncate.rb +74 -0
- data/app/helpers/gluttonberg/public/meta_tags.rb +27 -0
- data/app/helpers/gluttonberg/public/nav_tree.rb +99 -0
- data/app/helpers/gluttonberg/public/page_info.rb +168 -0
- data/app/mailer/gluttonberg/base_notifier.rb +25 -0
- data/app/mailer/member_notifier.rb +8 -20
- data/app/mailer/notifier.rb +14 -39
- data/app/models/ability.rb +48 -34
- data/app/models/flag.rb +7 -7
- data/app/models/gluttonberg/asset.rb +115 -166
- data/app/models/gluttonberg/asset_bulk_import.rb +70 -0
- data/app/models/gluttonberg/asset_category.rb +75 -29
- data/app/models/gluttonberg/asset_collection.rb +65 -12
- data/app/models/gluttonberg/asset_mime_type.rb +5 -0
- data/app/models/gluttonberg/asset_thumbnail.rb +6 -1
- data/app/models/gluttonberg/asset_type.rb +49 -38
- data/app/models/gluttonberg/audio_asset_attribute.rb +7 -3
- data/app/models/gluttonberg/authorization.rb +10 -0
- data/app/models/gluttonberg/auto_save.rb +32 -0
- data/app/models/gluttonberg/collapsed_page.rb +13 -0
- data/app/models/gluttonberg/embed.rb +13 -0
- data/app/models/gluttonberg/feed.rb +14 -5
- data/app/models/gluttonberg/gallery.rb +35 -9
- data/app/models/gluttonberg/gallery_image.rb +9 -2
- data/app/models/gluttonberg/group.rb +18 -2
- data/app/models/gluttonberg/html_content.rb +5 -1
- data/app/models/gluttonberg/image_content.rb +5 -1
- data/app/models/gluttonberg/locale.rb +28 -9
- data/app/models/gluttonberg/member.rb +48 -197
- data/app/models/gluttonberg/page.rb +78 -288
- data/app/models/gluttonberg/page_localization.rb +63 -66
- data/app/models/gluttonberg/plain_text_content.rb +6 -0
- data/app/models/gluttonberg/repeater.rb +30 -0
- data/app/models/gluttonberg/search.rb +96 -72
- data/app/models/gluttonberg/select_content.rb +12 -0
- data/app/models/gluttonberg/setting.rb +79 -29
- data/app/models/gluttonberg/sitemap.rb +1 -0
- data/app/models/gluttonberg/stylesheet.rb +12 -6
- data/app/models/gluttonberg/textarea_content.rb +14 -0
- data/app/models/gluttonberg/version.rb +9 -0
- data/app/models/user.rb +137 -13
- data/app/observers/gluttonberg/locale_observer.rb +33 -22
- data/app/observers/gluttonberg/page_localization_observer.rb +22 -12
- data/app/observers/gluttonberg/page_observer.rb +50 -35
- data/app/views/{gluttonberg/public/exceptions → exceptions}/access_denied.html.haml +0 -0
- data/app/views/{gluttonberg/public/exceptions → exceptions}/not_found.html.haml +0 -0
- data/app/views/gluttonberg/admin/asset_library/assets/_browser_root.html.haml +17 -12
- data/app/views/gluttonberg/admin/asset_library/assets/_form.html.haml +5 -7
- data/app/views/gluttonberg/admin/asset_library/assets/browser.html.haml +5 -5
- data/app/views/gluttonberg/admin/asset_library/assets/show.html.haml +13 -7
- data/app/views/gluttonberg/admin/asset_library/assets/show.json.rabl +3 -0
- data/app/views/gluttonberg/admin/asset_library/{assets → assets_ajax}/browser_collection.json.haml +0 -0
- data/app/views/gluttonberg/admin/asset_library/{assets → assets_bulk}/add_assets_in_bulk.html.haml +6 -20
- data/app/views/gluttonberg/admin/asset_library/{assets → assets_bulk}/create_assets_in_bulk.html.haml +0 -0
- data/app/views/gluttonberg/admin/asset_library/collections/_form.html.haml +8 -5
- data/app/views/gluttonberg/admin/asset_library/shared/_asset_browser.html.haml +34 -0
- data/app/views/gluttonberg/admin/asset_library/shared/_asset_panels.html.haml +15 -11
- data/app/views/gluttonberg/admin/content/editors/_html_content.html.haml +2 -2
- data/app/views/gluttonberg/admin/content/editors/_select_content.html.haml +7 -0
- data/app/views/gluttonberg/admin/content/editors/_textarea_content.html.haml +6 -0
- data/app/views/gluttonberg/admin/content/flag/index.html.haml +48 -39
- data/app/views/gluttonberg/admin/content/galleries/_form.html.haml +46 -9
- data/app/views/gluttonberg/admin/content/galleries/_image_repeater.html.haml +30 -0
- data/app/views/gluttonberg/admin/content/galleries/edit.html.haml +1 -12
- data/app/views/gluttonberg/admin/content/galleries/index.html.haml +18 -9
- data/app/views/gluttonberg/admin/content/galleries/new.html.haml +1 -1
- data/app/views/gluttonberg/admin/content/main/_sidebar.html.haml +28 -16
- data/app/views/gluttonberg/admin/content/page_localizations/_form.html.haml +11 -20
- data/app/views/gluttonberg/admin/content/page_localizations/edit.html.haml +7 -0
- data/app/views/gluttonberg/admin/content/pages/_form.html.haml +11 -4
- data/app/views/gluttonberg/admin/content/pages/_page_settings.html.haml +4 -7
- data/app/views/gluttonberg/admin/content/pages/_row.html.haml +38 -30
- data/app/views/gluttonberg/admin/content/pages/index.html.haml +23 -15
- data/app/views/gluttonberg/admin/content/pages/pages_list_for_tinymce.html.haml +14 -3
- data/app/views/gluttonberg/admin/content/pages/show.html.haml +1 -1
- data/app/views/gluttonberg/admin/main/index.html.haml +13 -12
- data/app/views/gluttonberg/admin/main/waiting_for_approval.html.haml +33 -0
- data/app/views/gluttonberg/admin/membership/groups/index.html.haml +5 -5
- data/app/views/gluttonberg/admin/membership/members/_form.html.haml +3 -1
- data/app/views/gluttonberg/admin/membership/members/edit.html.haml +1 -0
- data/app/views/gluttonberg/admin/membership/members/index.html.haml +1 -1
- data/app/views/gluttonberg/admin/password_resets/edit.html.haml +36 -16
- data/app/views/gluttonberg/admin/password_resets/new.html.haml +19 -11
- data/app/views/gluttonberg/admin/settings/configurations/_form.html.haml +28 -0
- data/app/views/gluttonberg/admin/settings/configurations/_settings_table.html.haml +42 -0
- data/app/views/gluttonberg/admin/settings/{generic_settings → configurations}/_value_tag.html.haml +0 -0
- data/app/views/gluttonberg/admin/settings/configurations/edit.html.haml +4 -0
- data/app/views/gluttonberg/admin/settings/configurations/index.html.haml +31 -0
- data/app/views/gluttonberg/admin/settings/{generic_settings → configurations}/new.html.haml +2 -2
- data/app/views/gluttonberg/admin/settings/embeds/_form.html.haml +19 -0
- data/app/views/gluttonberg/admin/settings/embeds/edit.html.haml +12 -0
- data/app/views/gluttonberg/admin/settings/embeds/index.html.haml +36 -0
- data/app/views/gluttonberg/admin/settings/embeds/list_for_redactor.html.haml +29 -0
- data/app/views/gluttonberg/admin/settings/embeds/new.html.haml +12 -0
- data/app/views/gluttonberg/admin/settings/locales/edit.html.haml +9 -1
- data/app/views/gluttonberg/admin/settings/locales/index.html.haml +2 -1
- data/app/views/gluttonberg/admin/settings/locales/new.html.haml +10 -1
- data/app/views/gluttonberg/admin/settings/main/_sidebar.html.haml +9 -7
- data/app/views/gluttonberg/admin/settings/stylesheets/_form.html.haml +11 -9
- data/app/views/gluttonberg/admin/settings/stylesheets/edit.html.haml +11 -2
- data/app/views/gluttonberg/admin/settings/stylesheets/index.html.haml +45 -36
- data/app/views/gluttonberg/admin/settings/stylesheets/new.html.haml +11 -2
- data/app/views/gluttonberg/admin/settings/users/_form.html.haml +29 -18
- data/app/views/gluttonberg/admin/settings/users/index.html.haml +1 -1
- data/app/views/gluttonberg/admin/shared/_asset_panel.html.haml +19 -4
- data/app/views/gluttonberg/admin/shared/_auto_save_version.html.haml +12 -0
- data/app/views/gluttonberg/admin/shared/_datetime_field.html.haml +19 -0
- data/app/views/gluttonberg/admin/shared/_previous_version_warning.html.haml +5 -0
- data/app/views/gluttonberg/admin/shared/_version_alerts.html.haml +34 -0
- data/app/views/gluttonberg/admin/shared/_version_dashboard_notifications.html.haml +11 -0
- data/app/views/gluttonberg/admin/shared/_version_listing.html.haml +23 -0
- data/app/views/gluttonberg/admin/shared/delete.html.haml +21 -48
- data/app/views/gluttonberg/admin/shared/generic.html.haml +20 -19
- data/app/views/gluttonberg/admin/user_sessions/new.html.haml +14 -9
- data/app/views/gluttonberg/public/member_password_resets/edit.html.haml +2 -0
- data/app/views/gluttonberg/public/member_password_resets/new.html.haml +3 -0
- data/app/views/gluttonberg/public/members/_form.html.haml +3 -0
- data/app/views/gluttonberg/public/members/edit.html.haml +7 -9
- data/app/views/gluttonberg/public/members/show.html.haml +1 -3
- data/app/views/gluttonberg/public/pages/restrict_site_access.html.haml +3 -4
- data/app/views/gluttonberg/public/shared/_gallery_images_lis.html.haml +9 -0
- data/app/views/layouts/_flash_messages.html.haml +5 -3
- data/app/views/layouts/bare.html.haml +8 -17
- data/app/views/layouts/gluttonberg.html.haml +37 -44
- data/app/views/notifier/version_declined.html.haml +21 -0
- data/config/locales/en_au.yml +1 -1
- data/config/locales/en_gb.yml +2 -1
- data/config/routes.rb +70 -85
- data/db/migrate/20130801050257_create_repeater.rb +14 -0
- data/lib/audio_job.rb +11 -9
- data/lib/engine.rb +115 -72
- data/lib/generators/gluttonberg/resource/resource_generator.rb +51 -41
- data/lib/generators/gluttonberg/resource/templates/admin_controller.rb +16 -11
- data/lib/generators/gluttonberg/resource/templates/backend_view_edit.html.haml +7 -2
- data/lib/generators/gluttonberg/resource/templates/backend_view_form.html.haml +3 -14
- data/lib/generators/gluttonberg/resource/templates/backend_view_import.html.haml +10 -7
- data/lib/generators/gluttonberg/resource/templates/backend_view_index.html.haml +6 -5
- data/lib/generators/gluttonberg/resource/templates/backend_view_show.html.haml +2 -2
- data/lib/generators/gluttonberg/resource/templates/migration.rb +12 -1
- data/lib/generators/gluttonberg/resource/templates/model.rb +18 -1
- data/lib/generators/gluttonberg/resource/templates/public_view_index.html.haml +27 -10
- data/lib/generators/gluttonberg/resource/templates/public_view_show.html.haml +10 -4
- data/lib/gluttonberg.rb +68 -37
- data/lib/gluttonberg/can_flag.rb +64 -76
- data/lib/gluttonberg/components.rb +47 -24
- data/lib/gluttonberg/content.rb +15 -0
- data/lib/gluttonberg/content/block.rb +99 -85
- data/lib/gluttonberg/content/block_localization.rb +11 -8
- data/lib/gluttonberg/content/clean_html.rb +12 -15
- data/lib/gluttonberg/content/default_template_file.rb +44 -0
- data/lib/gluttonberg/content/despamilator/filter/naughty_words.rb +4 -2
- data/lib/gluttonberg/content/home_page_info.rb +39 -0
- data/lib/gluttonberg/content/import_export_csv.rb +243 -130
- data/lib/gluttonberg/content/localization.rb +137 -148
- data/lib/gluttonberg/content/page_children.rb +36 -0
- data/lib/gluttonberg/content/page_components.rb +23 -0
- data/lib/gluttonberg/content/page_description_info.rb +55 -0
- data/lib/gluttonberg/content/page_duplicate.rb +68 -0
- data/lib/gluttonberg/content/page_finder.rb +63 -0
- data/lib/gluttonberg/content/page_localization_slug.rb +89 -0
- data/lib/gluttonberg/content/page_repairer.rb +117 -0
- data/lib/gluttonberg/content/publishable.rb +77 -71
- data/lib/gluttonberg/content/slug_management.rb +74 -26
- data/lib/gluttonberg/content/validations.rb +58 -0
- data/lib/gluttonberg/content/versioning.rb +40 -22
- data/lib/gluttonberg/drag_tree.rb +0 -1
- data/lib/gluttonberg/drag_tree/action_controller.rb +49 -37
- data/lib/gluttonberg/drag_tree/action_view.rb +0 -6
- data/lib/gluttonberg/drag_tree/active_record.rb +49 -49
- data/lib/gluttonberg/extensions.rb +1 -0
- data/lib/gluttonberg/extensions/string.rb +20 -0
- data/lib/gluttonberg/gb_file.rb +30 -0
- data/lib/gluttonberg/helpers/form_builder.rb +91 -38
- data/lib/gluttonberg/library.rb +9 -90
- data/lib/gluttonberg/library/attachment_mixin.rb +88 -98
- data/lib/gluttonberg/library/config/image_sizes.rb +22 -19
- data/lib/gluttonberg/library/default_asset_types.rb +104 -0
- data/lib/gluttonberg/library/processor/audio.rb +32 -16
- data/lib/gluttonberg/library/processor/image.rb +78 -69
- data/lib/gluttonberg/library/quick_magick/image.rb +72 -319
- data/lib/gluttonberg/library/quick_magick/image/draw.rb +133 -0
- data/lib/gluttonberg/library/quick_magick/image/operators_and_settings.rb +78 -0
- data/lib/gluttonberg/library/quick_magick/image/serialization.rb +79 -0
- data/lib/gluttonberg/library/quick_magick/image_list.rb +0 -1
- data/lib/gluttonberg/library/storage/filesystem.rb +45 -46
- data/lib/gluttonberg/library/storage/s3.rb +123 -119
- data/lib/gluttonberg/membership.rb +9 -0
- data/lib/gluttonberg/membership/export.rb +82 -0
- data/lib/gluttonberg/membership/import.rb +179 -0
- data/lib/gluttonberg/middleware/honeypot.rb +1 -2
- data/lib/gluttonberg/middleware/locales.rb +69 -18
- data/lib/gluttonberg/middleware/rewriter.rb +57 -16
- data/lib/gluttonberg/mixin_manager.rb +19 -0
- data/lib/gluttonberg/page_description.rb +82 -112
- data/lib/gluttonberg/random_string_generator.rb +31 -0
- data/lib/gluttonberg/record_history.rb +5 -7
- data/lib/gluttonberg/tasks/asset.rake +19 -8
- data/lib/gluttonberg/tasks/gluttonberg.rake +167 -13
- data/lib/gluttonberg/templates.rb +1 -3
- data/lib/gluttonberg/version.rb +1 -1
- data/lib/photo_job.rb +16 -0
- data/spec/controllers/auto_save_controller_spec.rb +57 -0
- data/spec/controllers/record_history_spec.rb +75 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/admin/staff_profiles_controller.rb +56 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/models/staff_profile.rb +20 -0
- data/spec/dummy/app/models/vendor_mixin.rb +14 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +18 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +8 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/gluttonberg_advance_settings.rb +73 -0
- data/spec/dummy/config/initializers/gluttonberg_basic_settings.rb +65 -0
- data/spec/dummy/config/initializers/gluttonberg_menu_settings.rb +1 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/{lib/generators/gluttonberg/installer/templates → spec/dummy/config}/page_descriptions.rb +103 -65
- data/spec/dummy/config/routes.rb +10 -0
- data/spec/dummy/db/20130625060411_create_staff_profile.rb +35 -0
- data/spec/dummy/db/schema.rb +474 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/dummy/tmp/cache/041/891/setting_library_number_of_recent_assets +0 -0
- data/spec/dummy/tmp/cache/08E/741/setting_comment_number_of_emails_allowed +0 -0
- data/spec/dummy/tmp/cache/580/D10/setting_title +0 -0
- data/spec/dummy/tmp/cache/62E/160/setting_fb_icon +0 -0
- data/spec/dummy/tmp/cache/6D6/FB0/setting_keywords +0 -0
- data/spec/dummy/tmp/cache/6D8/B60/setting_s3_key_id +0 -0
- data/spec/dummy/tmp/cache/6E1/A40/setting_s3_bucket +0 -0
- data/spec/dummy/tmp/cache/779/DF0/setting_from_email +0 -0
- data/spec/dummy/tmp/cache/7C5/450/setting_title_site1 +0 -0
- data/spec/dummy/tmp/cache/7C6/460/setting_title_site2 +0 -0
- data/spec/dummy/tmp/cache/802/000/setting_description +0 -0
- data/spec/dummy/tmp/cache/836/DD0/setting_backend_logo +0 -0
- data/spec/dummy/tmp/cache/862/FA0/setting_audio_assets +1 -0
- data/spec/dummy/tmp/cache/867/4E0/setting_video_assets +0 -0
- data/spec/dummy/tmp/cache/867/710/setting_enable_WYSIWYG +0 -0
- data/spec/dummy/tmp/cache/873/9E0/setting_fb_icon_site1 +0 -0
- data/spec/dummy/tmp/cache/874/9F0/setting_fb_icon_site2 +0 -0
- data/spec/dummy/tmp/cache/87D/A10/setting_s3_access_key +0 -0
- data/spec/dummy/tmp/cache/8AC/280/setting_s3_server_url +0 -0
- data/spec/dummy/tmp/cache/91B/730/setting_keywords_site1 +0 -0
- data/spec/dummy/tmp/cache/91C/740/setting_keywords_site2 +0 -0
- data/spec/dummy/tmp/cache/933/980/setting_auto_save_time +0 -0
- data/spec/dummy/tmp/cache/9BE/290/setting_from_email_site1 +0 -0
- data/spec/dummy/tmp/cache/9BF/2A0/setting_from_email_site2 +0 -0
- data/spec/dummy/tmp/cache/A02/5E0/setting_google_analytics +0 -0
- data/spec/dummy/tmp/cache/A47/800/setting_description_site1 +0 -0
- data/spec/dummy/tmp/cache/A48/810/setting_description_site2 +0 -0
- data/spec/dummy/tmp/cache/A69/B60/setting_comment_blacklist +0 -0
- data/spec/dummy/tmp/cache/B5C/D40/setting_number_of_revisions +0 -0
- data/spec/dummy/tmp/cache/BB3/350/setting_restrict_site_access +0 -0
- data/spec/dummy/tmp/cache/BB7/620/setting_comment_notification +0 -0
- data/spec/dummy/tmp/cache/BFB/140/setting_comment_email_as_spam +0 -0
- data/spec/dummy/tmp/cache/C47/DE0/setting_google_analytics_site1 +0 -0
- data/spec/dummy/tmp/cache/C48/DF0/setting_google_analytics_site2 +0 -0
- data/spec/dummy/tmp/cache/D3E/E20/setting_number_of_per_page_items +0 -0
- data/spec/dummy/tmp/cache/DF8/DB0/setting_restrict_site_access_site1 +0 -0
- data/spec/dummy/tmp/cache/DF9/DC0/setting_restrict_site_access_site2 +0 -0
- data/spec/dummy/tmp/cache/DFC/200/setting_comment_notification_site1 +0 -0
- data/spec/dummy/tmp/cache/DFD/210/setting_comment_notification_site2 +0 -0
- data/spec/dummy/tmp/cache/FD9/200/setting_comment_number_of_urls_allowed +0 -0
- data/spec/fixtures/assets/assets_import.zip +0 -0
- data/spec/fixtures/assets/audio.mp3 +0 -0
- data/spec/fixtures/assets/c3-add-interactive.mov +0 -0
- data/spec/fixtures/assets/gb_banner.jpg +0 -0
- data/spec/fixtures/assets/gb_logo.png +0 -0
- data/spec/fixtures/assets/high_res_photo.jpg +0 -0
- data/spec/fixtures/assets/untitled +0 -0
- data/spec/fixtures/members.csv +5 -0
- data/spec/fixtures/staff_profiles.csv +4 -0
- data/spec/helpers/public/assets_spec.rb +73 -0
- data/spec/helpers/public/content_helpers_spec.rb +71 -0
- data/spec/helpers/public/html_truncate_spec.rb +37 -0
- data/spec/helpers/public/meta_tags_spec.rb +29 -0
- data/spec/helpers/public/page_info_spec.rb +233 -0
- data/spec/helpers/public_spec.rb +114 -0
- data/spec/lib/content/import_export_csv_spec.rb +177 -0
- data/spec/lib/content/localization_spec.rb +107 -0
- data/spec/lib/content/page_finder_spec.rb +71 -0
- data/spec/lib/content/page_repairer_spec.rb +151 -0
- data/spec/lib/content/publishable_spec.rb +54 -0
- data/spec/lib/content/validations_spec.rb +88 -0
- data/spec/lib/drag_tree/action_controller_spec.rb +137 -0
- data/spec/lib/drag_tree/active_record_spec.rb +86 -0
- data/spec/lib/library/s3_rspec.rb +78 -0
- data/spec/lib/membership/export_spec.rb +89 -0
- data/spec/lib/membership/import_spec.rb +68 -0
- data/spec/lib/middleware/locales_spec.rb +192 -0
- data/spec/lib/middleware/rewriter_spec.rb +186 -0
- data/spec/lib/page_description_spec.rb +68 -0
- data/spec/mailers/member_notifier_spec.rb +140 -0
- data/spec/mailers/notifier_spec.rb +86 -0
- data/spec/models/asset_bulk_import_spec.rb +43 -0
- data/spec/models/asset_category_spec.rb +77 -0
- data/spec/models/asset_collection_spec.rb +72 -0
- data/spec/models/asset_spec.rb +278 -0
- data/spec/models/asset_type_spec.rb +109 -0
- data/spec/models/member_spec.rb +128 -0
- data/spec/models/page_localization_spec.rb +81 -0
- data/spec/models/page_spec.rb +221 -0
- data/spec/models/setting_spec.rb +49 -0
- data/spec/models/user_spec.rb +385 -0
- data/spec/observers/locale_observer_spec.rb +79 -0
- data/spec/observers/page_localization_observer_spec.rb +87 -0
- data/spec/observers/page_observer_spec.rb +130 -0
- data/spec/spec_helper.rb +90 -0
- metadata +508 -331
- data/app/assets/images/gb_360-button-pause-light.gif +0 -0
- data/app/assets/images/gb_360-button-pause-light.png +0 -0
- data/app/assets/images/gb_360-button-pause.gif +0 -0
- data/app/assets/images/gb_360-button-pause.png +0 -0
- data/app/assets/images/gb_360-button-play-light.gif +0 -0
- data/app/assets/images/gb_360-button-play-light.png +0 -0
- data/app/assets/images/gb_360-button-play.gif +0 -0
- data/app/assets/images/gb_360-button-play.png +0 -0
- data/app/assets/images/gb_360-button-vis-pause-light.gif +0 -0
- data/app/assets/images/gb_360-button-vis-pause-light.png +0 -0
- data/app/assets/images/gb_360-button-vis-pause.gif +0 -0
- data/app/assets/images/gb_360-button-vis-pause.png +0 -0
- data/app/assets/images/gb_360-button-vis-play-light.gif +0 -0
- data/app/assets/images/gb_360-button-vis-play-light.png +0 -0
- data/app/assets/images/gb_360-button-vis-play.gif +0 -0
- data/app/assets/images/gb_360-button-vis-play.png +0 -0
- data/app/assets/images/gb_button_bkg_grey.gif +0 -0
- data/app/assets/images/gb_icon_content_2.png +0 -0
- data/app/assets/images/gb_icon_dash.png +0 -0
- data/app/assets/images/gb_icon_library_2.png +0 -0
- data/app/assets/images/gb_page_content_fillin.gif +0 -0
- data/app/assets/images/gb_spinner_for_dialouge.gif +0 -0
- data/app/assets/images/gb_sub_nav_back_bkg.gif +0 -0
- data/app/assets/images/gb_subnav_bkg.gif +0 -0
- data/app/assets/images/gb_table_head_bkg.gif +0 -0
- data/app/assets/images/gb_wrapper_bkg.png +0 -0
- data/app/assets/images/gb_wysiwyg.png +0 -0
- data/app/assets/images/help/gb_help.jpg +0 -0
- data/app/assets/images/icons/gb_collapsed.png +0 -0
- data/app/assets/images/icons/gb_expanded.png +0 -0
- data/app/assets/images/library/gb_back.gif +0 -0
- data/app/assets/images/library/gb_dialog_overlay.png +0 -0
- data/app/assets/images/library/gb_inactive_tab.jpg +0 -0
- data/app/assets/images/library/gb_search_icon.gif +0 -0
- data/app/assets/images/library/gb_wysiwyg_pic.png +0 -0
- data/app/assets/javascripts/gb_ajaxfileupload.js +0 -205
- data/app/assets/javascripts/gb_berniecode-animator.js +0 -674
- data/app/assets/javascripts/gb_bootstrap-datepicker.js +0 -501
- data/app/assets/javascripts/gb_expander.js +0 -81
- data/app/assets/javascripts/gb_jquery-dragTree.js +0 -525
- data/app/assets/javascripts/gb_jquery-tagarea.js +0 -404
- data/app/assets/javascripts/gb_login.js +0 -33
- data/app/assets/javascripts/gb_tags.js +0 -177
- data/app/assets/javascripts/jquery-1-7-1.js +0 -9267
- data/app/assets/javascripts/jquery-dimensions-min.js +0 -12
- data/app/assets/javascripts/jquery-ui-1-8-23-custom-min.js +0 -85
- data/app/assets/javascripts/tiny_mce/jquery.tinymce.js +0 -1
- data/app/assets/javascripts/tiny_mce/langs/en.js +0 -223
- data/app/assets/javascripts/tiny_mce/plugins/advhr/css/advhr.css +0 -5
- data/app/assets/javascripts/tiny_mce/plugins/advhr/editor_plugin.js +0 -1
- data/app/assets/javascripts/tiny_mce/plugins/advhr/js/rule.js +0 -43
- data/app/assets/javascripts/tiny_mce/plugins/advhr/langs/en_dlg.js +0 -7
- data/app/assets/javascripts/tiny_mce/plugins/advhr/rule.htm +0 -58
- data/app/assets/javascripts/tiny_mce/plugins/advlink/css/advlink.css +0 -8
- data/app/assets/javascripts/tiny_mce/plugins/advlink/editor_plugin.js +0 -61
- data/app/assets/javascripts/tiny_mce/plugins/advlink/js/advlink.js +0 -564
- data/app/assets/javascripts/tiny_mce/plugins/advlink/langs/en_dlg.js +0 -54
- data/app/assets/javascripts/tiny_mce/plugins/advlink/link.htm +0 -355
- data/app/assets/javascripts/tiny_mce/plugins/advlist/editor_plugin.js +0 -1
- data/app/assets/javascripts/tiny_mce/plugins/autolink/editor_plugin.js +0 -1
- data/app/assets/javascripts/tiny_mce/plugins/fullscreen/editor_plugin.js +0 -1
- data/app/assets/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +0 -109
- data/app/assets/javascripts/tiny_mce/plugins/gb_assets/editor_plugin.js +0 -47
- data/app/assets/javascripts/tiny_mce/plugins/gb_assets/editor_plugin_src.js +0 -43
- data/app/assets/javascripts/tiny_mce/plugins/gb_assets/emotions.htm +0 -41
- data/app/assets/javascripts/tiny_mce/plugins/gb_assets/js/emotions.js +0 -22
- data/app/assets/javascripts/tiny_mce/plugins/gb_assets/langs/en_dlg.js +0 -20
- data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/editor_plugin.js +0 -1
- data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif +0 -0
- data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif +0 -0
- data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif +0 -0
- data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif +0 -0
- data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif +0 -0
- data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif +0 -0
- data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif +0 -0
- data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css +0 -90
- data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/template.htm +0 -387
- data/app/assets/javascripts/tiny_mce/plugins/insertdatetime/editor_plugin.js +0 -1
- data/app/assets/javascripts/tiny_mce/plugins/lists/editor_plugin.js +0 -1
- data/app/assets/javascripts/tiny_mce/plugins/paste/editor_plugin.js +0 -1
- data/app/assets/javascripts/tiny_mce/plugins/paste/js/pastetext.js +0 -36
- data/app/assets/javascripts/tiny_mce/plugins/paste/js/pasteword.js +0 -51
- data/app/assets/javascripts/tiny_mce/plugins/paste/langs/en_dlg.js +0 -5
- data/app/assets/javascripts/tiny_mce/plugins/paste/pastetext.htm +0 -27
- data/app/assets/javascripts/tiny_mce/plugins/paste/pasteword.htm +0 -21
- data/app/assets/javascripts/tiny_mce/plugins/preview/editor_plugin.js +0 -1
- data/app/assets/javascripts/tiny_mce/plugins/preview/jscripts/embed.js +0 -73
- data/app/assets/javascripts/tiny_mce/plugins/preview/preview.html +0 -18
- data/app/assets/javascripts/tiny_mce/plugins/style/css/props.css +0 -13
- data/app/assets/javascripts/tiny_mce/plugins/style/editor_plugin.js +0 -1
- data/app/assets/javascripts/tiny_mce/plugins/style/js/props.js +0 -635
- data/app/assets/javascripts/tiny_mce/plugins/style/langs/en_dlg.js +0 -70
- data/app/assets/javascripts/tiny_mce/plugins/style/props.htm +0 -838
- data/app/assets/javascripts/tiny_mce/plugins/table/cell.htm +0 -180
- data/app/assets/javascripts/tiny_mce/plugins/table/css/cell.css +0 -17
- data/app/assets/javascripts/tiny_mce/plugins/table/css/row.css +0 -25
- data/app/assets/javascripts/tiny_mce/plugins/table/css/table.css +0 -13
- data/app/assets/javascripts/tiny_mce/plugins/table/editor_plugin.js +0 -1
- data/app/assets/javascripts/tiny_mce/plugins/table/js/cell.js +0 -319
- data/app/assets/javascripts/tiny_mce/plugins/table/js/merge_cells.js +0 -27
- data/app/assets/javascripts/tiny_mce/plugins/table/js/row.js +0 -237
- data/app/assets/javascripts/tiny_mce/plugins/table/js/table.js +0 -450
- data/app/assets/javascripts/tiny_mce/plugins/table/langs/en_dlg.js +0 -75
- data/app/assets/javascripts/tiny_mce/plugins/table/merge_cells.htm +0 -32
- data/app/assets/javascripts/tiny_mce/plugins/table/row.htm +0 -158
- data/app/assets/javascripts/tiny_mce/plugins/table/table.htm +0 -188
- data/app/assets/javascripts/tiny_mce/plugins/wordcount/editor_plugin.js +0 -1
- data/app/assets/javascripts/tiny_mce/themes/advanced/anchor.htm +0 -26
- data/app/assets/javascripts/tiny_mce/themes/advanced/editor_template.js +0 -1
- data/app/assets/javascripts/tiny_mce/themes/advanced/editor_template_src.js +0 -1358
- data/app/assets/javascripts/tiny_mce/themes/advanced/img/icons.gif +0 -0
- data/app/assets/javascripts/tiny_mce/themes/advanced/img/trans.gif +0 -0
- data/app/assets/javascripts/tiny_mce/themes/advanced/js/anchor.js +0 -42
- data/app/assets/javascripts/tiny_mce/themes/advanced/js/link.js +0 -153
- data/app/assets/javascripts/tiny_mce/themes/advanced/js/source_editor.js +0 -56
- data/app/assets/javascripts/tiny_mce/themes/advanced/langs/en.js +0 -68
- data/app/assets/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +0 -54
- data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/content.css +0 -47
- data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +0 -117
- data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
- data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
- data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
- data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
- data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
- data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
- data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +0 -227
- data/app/assets/javascripts/tiny_mce/themes/advanced/source_editor.htm +0 -25
- data/app/assets/javascripts/tiny_mce/tiny_mce.js +0 -1
- data/app/assets/javascripts/tiny_mce/tiny_mce_popup.js +0 -5
- data/app/assets/javascripts/tiny_mce/utils/editable_selects.js +0 -70
- data/app/assets/javascripts/tiny_mce/utils/form_utils.js +0 -210
- data/app/assets/javascripts/tiny_mce/utils/mctabs.js +0 -162
- data/app/assets/javascripts/tiny_mce/utils/validate.js +0 -252
- data/app/controllers/gluttonberg/admin/content/articles_controller.rb +0 -139
- data/app/controllers/gluttonberg/admin/content/blogs_controller.rb +0 -101
- data/app/controllers/gluttonberg/admin/content/comments_controller.rb +0 -130
- data/app/controllers/gluttonberg/admin/content/main_controller.rb +0 -13
- data/app/controllers/gluttonberg/admin/help_controller.rb +0 -15
- data/app/controllers/gluttonberg/admin/settings/generic_settings_controller.rb +0 -90
- data/app/controllers/gluttonberg/admin/settings/main_controller.rb +0 -11
- data/app/controllers/gluttonberg/public/articles_controller.rb +0 -79
- data/app/controllers/gluttonberg/public/blogs_controller.rb +0 -44
- data/app/controllers/gluttonberg/public/comments_controller.rb +0 -46
- data/app/models/gluttonberg/article.rb +0 -73
- data/app/models/gluttonberg/article_localization.rb +0 -21
- data/app/models/gluttonberg/blog.rb +0 -19
- data/app/models/gluttonberg/comment.rb +0 -142
- data/app/models/gluttonberg/comment_subscription.rb +0 -28
- data/app/models/gluttonberg/help.rb +0 -48
- data/app/views/gluttonberg/admin/content/articles/_form.html.haml +0 -115
- data/app/views/gluttonberg/admin/content/articles/edit.html.haml +0 -11
- data/app/views/gluttonberg/admin/content/articles/index.html.haml +0 -71
- data/app/views/gluttonberg/admin/content/articles/new.html.haml +0 -11
- data/app/views/gluttonberg/admin/content/blogs/_form.html.haml +0 -56
- data/app/views/gluttonberg/admin/content/blogs/edit.html.haml +0 -3
- data/app/views/gluttonberg/admin/content/blogs/index.html.haml +0 -35
- data/app/views/gluttonberg/admin/content/blogs/new.html.haml +0 -10
- data/app/views/gluttonberg/admin/content/comments/index.html.haml +0 -66
- data/app/views/gluttonberg/admin/content/galleries/_images_list.html.haml +0 -21
- data/app/views/gluttonberg/admin/content/galleries/add_image.html.haml +0 -1
- data/app/views/gluttonberg/admin/content/main/index.html.haml +0 -20
- data/app/views/gluttonberg/admin/content/pages/edit_home.html.haml +0 -11
- data/app/views/gluttonberg/admin/exceptions/internal_server_error.html.haml +0 -11
- data/app/views/gluttonberg/admin/exceptions/not_acceptable.html.haml +0 -9
- data/app/views/gluttonberg/admin/membership/main/index.html.haml +0 -11
- data/app/views/gluttonberg/admin/settings/generic_settings/_form.html.haml +0 -26
- data/app/views/gluttonberg/admin/settings/generic_settings/edit.html.haml +0 -4
- data/app/views/gluttonberg/admin/settings/generic_settings/index.html.haml +0 -58
- data/app/views/gluttonberg/admin/settings/main/index.html.haml +0 -18
- data/app/views/gluttonberg/public/articles/index.rss.builder +0 -21
- data/app/views/gluttonberg/public/blogs/show.rss.builder +0 -21
- data/app/views/gluttonberg/public/exceptions/internal_server_error.html.haml +0 -11
- data/app/views/gluttonberg/public/exceptions/not_acceptable.html.haml +0 -9
- data/app/views/help/gluttonberg/admin/AssetLibrary/assets/add_assets_in_bulk.html.haml +0 -41
- data/app/views/help/gluttonberg/admin/AssetLibrary/assets/edit.html.haml +0 -61
- data/app/views/help/gluttonberg/admin/AssetLibrary/assets/index.html.haml +0 -16
- data/app/views/help/gluttonberg/admin/AssetLibrary/assets/new.html.haml +0 -57
- data/app/views/help/gluttonberg/admin/AssetLibrary/collections/edit.html.haml +0 -15
- data/app/views/help/gluttonberg/admin/AssetLibrary/collections/index.html.haml +0 -41
- data/app/views/help/gluttonberg/admin/AssetLibrary/collections/new.html.haml +0 -15
- data/app/views/help/gluttonberg/admin/AssetLibrary/main/index.html.haml +0 -34
- data/app/views/help/gluttonberg/admin/content/page_localizations/edit.html.haml +0 -89
- data/app/views/help/gluttonberg/admin/content/pages/_page_description_help.html.haml +0 -14
- data/app/views/help/gluttonberg/admin/content/pages/edit.html.haml +0 -62
- data/app/views/help/gluttonberg/admin/content/pages/index.html.haml +0 -111
- data/app/views/help/gluttonberg/admin/content/pages/new.html.haml +0 -61
- data/app/views/help/gluttonberg/admin/settings/dialects/edit.html.haml +0 -47
- data/app/views/help/gluttonberg/admin/settings/dialects/index.html.haml +0 -50
- data/app/views/help/gluttonberg/admin/settings/dialects/new.html.haml +0 -47
- data/app/views/help/gluttonberg/admin/settings/generic_settings/index.html.haml +0 -74
- data/app/views/help/gluttonberg/admin/settings/locales/edit.html.haml +0 -71
- data/app/views/help/gluttonberg/admin/settings/locales/index.html.haml +0 -57
- data/app/views/help/gluttonberg/admin/settings/locales/new.html.haml +0 -71
- data/app/views/help/gluttonberg/admin/settings/users/edit.html.haml +0 -63
- data/app/views/help/gluttonberg/admin/settings/users/index.html.haml +0 -60
- data/app/views/help/gluttonberg/admin/settings/users/new.html.haml +0 -69
- data/app/views/notifier/comment_notification.html.haml +0 -17
- data/app/views/notifier/comment_notification_for_admin.html.haml +0 -19
- data/db/migrate/20121106025800_add_artist_and_link_to_assets.rb +0 -6
- data/lib/acts_as_versioned.rb +0 -496
- data/lib/generators/gluttonberg/blog/blog_generator.rb +0 -46
- data/lib/generators/gluttonberg/blog/templates/articles_index.html.haml +0 -18
- data/lib/generators/gluttonberg/blog/templates/articles_show.html.haml +0 -63
- data/lib/generators/gluttonberg/blog/templates/articles_tag.html.haml +0 -24
- data/lib/generators/gluttonberg/blog/templates/blog_migration.rb +0 -90
- data/lib/generators/gluttonberg/blog/templates/blogs_index.html.haml +0 -15
- data/lib/generators/gluttonberg/blog/templates/blogs_show.html.haml +0 -25
- data/lib/generators/gluttonberg/installer/USAGE +0 -1
- data/lib/generators/gluttonberg/installer/installer_generator.rb +0 -106
- data/lib/generators/gluttonberg/installer/templates/delayed_job_script +0 -5
- data/lib/generators/gluttonberg/installer/templates/gluttonberg_migration.rb +0 -368
- data/lib/generators/gluttonberg/installer/templates/public.html.haml +0 -24
- data/lib/generators/gluttonberg/installer/templates/sitemap.rb +0 -70
- data/lib/gluttonberg/authorizable.rb +0 -51
- data/lib/gluttonberg/helpers.rb +0 -20
- data/lib/rails/railties/tasks.rake +0 -3
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
module Gluttonberg
|
|
2
|
+
module Library
|
|
3
|
+
module QuickMagick
|
|
4
|
+
module Draw
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
# Instance Methods
|
|
8
|
+
# The shape primitives are drawn in the color specified by the preceding -fill setting.
|
|
9
|
+
# For unfilled shapes, use -fill none.
|
|
10
|
+
# You can optionally control the stroke (the "outline" of a shape) with the -stroke and -strokewidth settings.
|
|
11
|
+
|
|
12
|
+
# draws a point at the given location in pixels
|
|
13
|
+
# A point primitive is specified by a single point in the pixel plane, that is, by an ordered pair
|
|
14
|
+
# of integer coordinates, x,y.
|
|
15
|
+
# (As it involves only a single pixel, a point primitive is not affected by -stroke or -strokewidth.)
|
|
16
|
+
def draw_point(x, y, options={})
|
|
17
|
+
_draw(options, "point #{x},#{y}")
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# draws a line between the given two points
|
|
21
|
+
# A line primitive requires a start point and end point.
|
|
22
|
+
def draw_line(x0, y0, x1, y1, options={})
|
|
23
|
+
_draw_4_points("line", x0, y0, x1, y1, options)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# draw a rectangle with the given two corners
|
|
27
|
+
# A rectangle primitive is specified by the pair of points at the upper left and lower right corners.
|
|
28
|
+
def draw_rectangle(x0, y0, x1, y1, options={})
|
|
29
|
+
_draw_4_points("rectangle", x0, y0, x1, y1, options)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# draw a rounded rectangle with the given two corners
|
|
33
|
+
# wc and hc are the width and height of the arc
|
|
34
|
+
# A roundRectangle primitive takes the same corner points as a rectangle
|
|
35
|
+
# followed by the width and height of the rounded corners to be removed.
|
|
36
|
+
def draw_round_rectangle(x0, y0, x1, y1, wc, hc, options={})
|
|
37
|
+
_draw_6_points("roundRectangle", x0, y0, x1, y1, wc, hc, options)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# The arc primitive is used to inscribe an elliptical segment in to a given rectangle.
|
|
41
|
+
# An arc requires the two corners used for rectangle (see above) followed by
|
|
42
|
+
# the start and end angles of the arc of the segment segment (e.g. 130,30 200,100 45,90).
|
|
43
|
+
# The start and end points produced are then joined with a line segment and the resulting segment of an ellipse is filled.
|
|
44
|
+
def draw_arc(x0, y0, x1, y1, a0, a1, options={})
|
|
45
|
+
_draw_6_points("arc", x0, y0, x1, y1, a0, a1, options)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Use ellipse to draw a partial (or whole) ellipse.
|
|
49
|
+
# Give the center point, the horizontal and vertical "radii"
|
|
50
|
+
# (the semi-axes of the ellipse) and start and end angles in degrees (e.g. 100,100 100,150 0,360).
|
|
51
|
+
def draw_ellipse(x0, y0, rx, ry, a0, a1, options={})
|
|
52
|
+
_draw_6_points("ellipse", x0, y0, rx, ry, a0, a1, options)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# The circle primitive makes a disk (filled) or circle (unfilled). Give the center and any point on the perimeter (boundary).
|
|
56
|
+
def draw_circle(x0, y0, x1, y1, options={})
|
|
57
|
+
_draw_4_points("circle", x0, y0, x1, y1, options)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# The polyline primitive requires three or more points to define their perimeters.
|
|
61
|
+
# A polyline is simply a polygon in which the final point is not stroked to the start point.
|
|
62
|
+
# When unfilled, this is a polygonal line. If the -stroke setting is none (the default), then a polyline is identical to a polygon.
|
|
63
|
+
# points - A single array with each pair forming a coordinate in the form (x, y).
|
|
64
|
+
# e.g. [0,0,100,100,100,0] will draw a polyline between points (0,0)-(100,100)-(100,0)
|
|
65
|
+
def draw_polyline(points, options={})
|
|
66
|
+
_draw(options, "polyline #{points_to_str(points)}")
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# The polygon primitive requires three or more points to define their perimeters.
|
|
70
|
+
# A polyline is simply a polygon in which the final point is not stroked to the start point.
|
|
71
|
+
# When unfilled, this is a polygonal line. If the -stroke setting is none (the default), then a polyline is identical to a polygon.
|
|
72
|
+
# points - A single array with each pair forming a coordinate in the form (x, y).
|
|
73
|
+
# e.g. [0,0,100,100,100,0] will draw a polygon between points (0,0)-(100,100)-(100,0)
|
|
74
|
+
def draw_polygon(points, options={})
|
|
75
|
+
_draw(options, "polygon #{points_to_str(points)}")
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# The Bezier primitive creates a spline curve and requires three or points to define its shape.
|
|
79
|
+
# The first and last points are the knots and these points are attained by the curve,
|
|
80
|
+
# while any intermediate coordinates are control points.
|
|
81
|
+
# If two control points are specified, the line between each end knot and its sequentially
|
|
82
|
+
# respective control point determines the tangent direction of the curve at that end.
|
|
83
|
+
# If one control point is specified, the lines from the end knots to the one control point
|
|
84
|
+
# determines the tangent directions of the curve at each end.
|
|
85
|
+
# If more than two control points are specified, then the additional control points
|
|
86
|
+
# act in combination to determine the intermediate shape of the curve.
|
|
87
|
+
# In order to draw complex curves, it is highly recommended either to use the path primitive
|
|
88
|
+
# or to draw multiple four-point bezier segments with the start and end knots of each successive segment repeated.
|
|
89
|
+
def draw_bezier(points, options={})
|
|
90
|
+
_draw(options, "bezier #{points_to_str(points)}")
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# A path represents an outline of an object, defined in terms of moveto
|
|
94
|
+
# (set a new current point), lineto (draw a straight line), curveto (draw a Bezier curve),
|
|
95
|
+
# arc (elliptical or circular arc) and closepath (close the current shape by drawing a
|
|
96
|
+
# line to the last moveto) elements.
|
|
97
|
+
# Compound paths (i.e., a path with subpaths, each consisting of a single moveto followed by
|
|
98
|
+
# one or more line or curve operations) are possible to allow effects such as donut holes in objects.
|
|
99
|
+
# (See http://www.w3.org/TR/SVG/paths.html)
|
|
100
|
+
def draw_path(path_spec, options={})
|
|
101
|
+
_draw(options, "path #{path_spec}")
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Use image to composite an image with another image. Follow the image keyword
|
|
105
|
+
# with the composite operator, image location, image size, and filename
|
|
106
|
+
# You can use 0,0 for the image size, which means to use the actual dimensions found in the image header.
|
|
107
|
+
# Otherwise, it is scaled to the given dimensions. See -compose for a description of the composite operators.
|
|
108
|
+
def draw_image(operator, x0, y0, w, h, image_filename, options={})
|
|
109
|
+
_draw(options, "image #{operator} #{x0},#{y0} #{w},#{h} \"#{image_filename}\"")
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Use text to annotate an image with text. Follow the text coordinates with a string.
|
|
113
|
+
def draw_text(x0, y0, text, options={})
|
|
114
|
+
_draw(options, "text #{x0},#{y0} '#{text}'")
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
private
|
|
118
|
+
def _draw(options, draw_command_postfix)
|
|
119
|
+
append_to_operators("draw", "#{options_to_str(options)} #{draw_command_postfix}")
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# draw_ellipse, draw_arc, draw_round_rectangle
|
|
123
|
+
def _draw_6_points(shape, x0, y0, rx, ry, a0, a1, options={})
|
|
124
|
+
_draw(options, "#{shape} #{x0},#{y0} #{rx},#{ry} #{a0},#{a1}")
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def _draw_4_points(shape, x0, y0, x1, y1, options={})
|
|
128
|
+
_draw(options, "#{shape} #{x0},#{y0} #{x1},#{y1}")
|
|
129
|
+
end
|
|
130
|
+
end #Draw
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
module Gluttonberg
|
|
2
|
+
module Library
|
|
3
|
+
module QuickMagick
|
|
4
|
+
module OperatorsAndSettings
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
# InstanceMethods
|
|
8
|
+
# Image operators supported by ImageMagick
|
|
9
|
+
IMAGE_OPERATORS_METHODS = %w{
|
|
10
|
+
alpha auto-orient bench black-threshold bordercolor charcoal clip clip-mask clip-path colorize
|
|
11
|
+
contrast convolve cycle decipher deskew despeckle distort edge encipher emboss enhance equalize
|
|
12
|
+
evaluate flip flop function gamma identify implode layers level level-colors median modulate monochrome
|
|
13
|
+
negate noise normalize opaque ordered-dither NxN paint polaroid posterize print profile quantize
|
|
14
|
+
radial-blur Raise random-threshold recolor render rotate segment sepia-tone set shade solarize
|
|
15
|
+
sparse-color spread strip swirl threshold tile tint transform transparent transpose transverse trim
|
|
16
|
+
type unique-colors white-threshold
|
|
17
|
+
|
|
18
|
+
adaptive-blur adaptive-resize adaptive-sharpen annotate blur border chop contrast-stretch extent
|
|
19
|
+
extract frame gaussian-blur geometry lat linear-stretch liquid-rescale motion-blur region repage
|
|
20
|
+
resample resize roll sample scale selective-blur shadow sharpen shave shear sigmoidal-contrast
|
|
21
|
+
sketch splice thumbnail unsharp vignette wave
|
|
22
|
+
|
|
23
|
+
append average clut coalesce combine composite deconstruct flatten fx hald-clut morph mosaic process reverse separate write
|
|
24
|
+
crop
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
# methods that are called with (=)
|
|
28
|
+
WITH_EQUAL_METHODS =
|
|
29
|
+
%w{alpha background bias black-point-compensation blue-primary border bordercolor caption
|
|
30
|
+
cahnnel colors colorspace comment compose compress depth density encoding endian family fill filter
|
|
31
|
+
font format frame fuzz geometry gravity label mattecolor page pointsize quality stroke strokewidth
|
|
32
|
+
undercolor units weight
|
|
33
|
+
brodercolor transparent type size}
|
|
34
|
+
|
|
35
|
+
# methods that takes geometry options
|
|
36
|
+
WITH_GEOMETRY_METHODS =
|
|
37
|
+
%w{density page sampling-factor size tile-offset adaptive-blur adaptive-resize adaptive-sharpen
|
|
38
|
+
annotate blur border chop contrast-stretch extent extract frame gaussian-blur
|
|
39
|
+
geometry lat linear-stretch liquid-rescale motion-blur region repage resample resize roll
|
|
40
|
+
sample scale selective-blur shadow sharpen shave shear sigmoidal-contrast sketch
|
|
41
|
+
splice thumbnail unsharp vignette wave crop}
|
|
42
|
+
|
|
43
|
+
# Methods that need special treatment. This array is used just to keep track of them.
|
|
44
|
+
SPECIAL_COMMANDS =
|
|
45
|
+
%w{floodfill antialias draw}
|
|
46
|
+
|
|
47
|
+
# Image settings supported by ImageMagick
|
|
48
|
+
IMAGE_SETTINGS_METHODS = %w{
|
|
49
|
+
adjoin affine alpha authenticate attenuate background bias black-point-compensation
|
|
50
|
+
blue-primary bordercolor caption channel colors colorspace comment compose compress define
|
|
51
|
+
delay depth display dispose dither encoding endian family fill filter font format fuzz gravity
|
|
52
|
+
green-primary intent interlace interpolate interword-spacing kerning label limit loop mask
|
|
53
|
+
mattecolor monitor orient ping pointsize preview quality quiet red-primary regard-warnings
|
|
54
|
+
remap respect-parentheses scene seed stretch stroke strokewidth style taint texture treedepth
|
|
55
|
+
transparent-color undercolor units verbose view virtual-pixel weight white-point
|
|
56
|
+
|
|
57
|
+
density page sampling-factor size tile-offset
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
(IMAGE_OPERATORS_METHODS + IMAGE_SETTINGS_METHODS).flatten.each do |method|
|
|
61
|
+
if WITH_EQUAL_METHODS.include?(method)
|
|
62
|
+
define_method((method+'=').to_sym) do |arg|
|
|
63
|
+
append_to_settings(method, arg)
|
|
64
|
+
end
|
|
65
|
+
elsif WITH_GEOMETRY_METHODS.include?(method)
|
|
66
|
+
define_method((method).to_sym) do |*args|
|
|
67
|
+
append_to_settings(method, QuickMagick::geometry(*args) )
|
|
68
|
+
end
|
|
69
|
+
else
|
|
70
|
+
define_method(method.to_sym) do |*args|
|
|
71
|
+
append_to_settings(method, args.join(" "))
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end #Operators
|
|
76
|
+
end #QuickMagick
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module Gluttonberg
|
|
2
|
+
module Library
|
|
3
|
+
module QuickMagick
|
|
4
|
+
module Serialization
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
module ClassMethods
|
|
8
|
+
# create an array of images from the given blob data
|
|
9
|
+
def from_blob(blob, &proc)
|
|
10
|
+
file = Tempfile.new(QuickMagick::random_string)
|
|
11
|
+
file.binmode
|
|
12
|
+
file.write(blob)
|
|
13
|
+
file.close
|
|
14
|
+
self.read(file.path, &proc)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# create an array of images from the given file
|
|
18
|
+
def read(filename, &proc)
|
|
19
|
+
info = identify(%Q<"#{filename}">)
|
|
20
|
+
info_lines = info.split(/[\r\n]/)
|
|
21
|
+
images = []
|
|
22
|
+
info_lines.each_with_index do |info_line, i|
|
|
23
|
+
images << Image.new("#{filename}", i, info_line)
|
|
24
|
+
end
|
|
25
|
+
images.each(&proc) if block_given?
|
|
26
|
+
return images
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
alias open read
|
|
30
|
+
end #ClassMethods
|
|
31
|
+
|
|
32
|
+
# InstanceMethods
|
|
33
|
+
# saves the current image to the given filename
|
|
34
|
+
def save(output_filename)
|
|
35
|
+
result = QuickMagick.exec3 "convert #{command_line} #{QuickMagick.c output_filename}"
|
|
36
|
+
if @pseudo_image
|
|
37
|
+
# since it's been saved, convert it to normal image (not pseudo)
|
|
38
|
+
initialize(output_filename)
|
|
39
|
+
revert!
|
|
40
|
+
end
|
|
41
|
+
return result
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
alias write save
|
|
45
|
+
alias convert save
|
|
46
|
+
|
|
47
|
+
# saves the current image overwriting the original image file
|
|
48
|
+
def save!
|
|
49
|
+
raise QuickMagick::QuickMagickError, "Cannot mogrify a pseudo image" if @pseudo_image
|
|
50
|
+
result = QuickMagick.exec3 "mogrify #{command_line}"
|
|
51
|
+
# remove all operations to avoid duplicate operations
|
|
52
|
+
revert!
|
|
53
|
+
return result
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
alias write! save!
|
|
57
|
+
alias mogrify! save!
|
|
58
|
+
|
|
59
|
+
def to_blob
|
|
60
|
+
tmp_file = Tempfile.new(QuickMagick::random_string)
|
|
61
|
+
if command_line =~ /-format\s(\S+)\s/
|
|
62
|
+
# use format set up by user
|
|
63
|
+
blob_format = $1
|
|
64
|
+
elsif !@pseudo_image
|
|
65
|
+
# use original image format
|
|
66
|
+
blob_format = self.format
|
|
67
|
+
else
|
|
68
|
+
# default format is jpg
|
|
69
|
+
blob_format = 'jpg'
|
|
70
|
+
end
|
|
71
|
+
save "#{blob_format}:#{tmp_file.path}"
|
|
72
|
+
blob = nil
|
|
73
|
+
File.open(tmp_file.path, 'rb') { |f| blob = f.read}
|
|
74
|
+
blob
|
|
75
|
+
end
|
|
76
|
+
end #Settings
|
|
77
|
+
end #QuickMagick
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -2,73 +2,72 @@ module Gluttonberg
|
|
|
2
2
|
module Library
|
|
3
3
|
module Storage
|
|
4
4
|
module Filesystem
|
|
5
|
-
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
6
|
module ClassMethods
|
|
7
7
|
# It run when the engine is loaded. It makes sure that all the required
|
|
8
8
|
# directories for storing assets are in the public dir, creating them if
|
|
9
9
|
# they are missing. It also stores the various paths so they can be
|
|
10
10
|
# retreived using the assets_dir method.
|
|
11
|
-
def
|
|
12
|
-
Library.set_asset_root("public/user_assets", "public/user_assets", "public/test_assets")
|
|
11
|
+
def storage_setup
|
|
12
|
+
Library.set_asset_root(File.join(Rails.root, "public/user_assets"), File.join(Rails.root, "public/user_assets"), File.join(Rails.root, "public/test_assets"))
|
|
13
13
|
FileUtils.mkdir(Library.root) unless File.exists?(Library.root) || File.symlink?(Library.root)
|
|
14
14
|
end
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
module InstanceMethods
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
# The generated directory where this file is located. If it is an image
|
|
19
|
+
# it’s thumbnails will be stored here as well.
|
|
20
|
+
def directory
|
|
21
|
+
self.class.storage_setup if Library.root.blank?
|
|
22
|
+
Library.root + "/" + self.asset_hash
|
|
23
|
+
end
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
def tmp_directory
|
|
26
|
+
self.class.storage_setup if Library.tmp_root.blank?
|
|
27
|
+
Library.tmp_root + "/" + self.asset_hash
|
|
28
|
+
end
|
|
30
29
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
def assets_directory_public_url
|
|
31
|
+
"/user_assets"
|
|
32
|
+
end
|
|
34
33
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
end
|
|
34
|
+
def make_backup(replace_backup=true)
|
|
35
|
+
FileUtils.rm(original_file_on_disk) if replace_backup && File.exist?(original_file_on_disk)
|
|
36
|
+
FileUtils.cp location_on_disk, original_file_on_disk unless File.exist?(original_file_on_disk)
|
|
37
|
+
FileUtils.chmod(0755,original_file_on_disk)
|
|
38
|
+
end
|
|
41
39
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
end
|
|
40
|
+
def remove_file_from_storage
|
|
41
|
+
if File.exists?(directory)
|
|
42
|
+
FileUtils.rm_r(directory)
|
|
46
43
|
end
|
|
44
|
+
end
|
|
47
45
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
def remove_file_from_tmp_storage
|
|
47
|
+
# just dummy method. As we don't need to remove because tmp and actual folder is same for filesystem
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def download_asset_to_tmp_file
|
|
51
|
+
# just dummy method. As we don't need to download file for filesystem storage
|
|
52
|
+
end
|
|
51
53
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
def update_file_on_storage
|
|
55
|
+
if file
|
|
56
|
+
FileUtils.mkdir(directory) unless File.exists?(directory)
|
|
57
|
+
FileUtils.rm(location_on_disk) if File.exists?(location_on_disk)
|
|
58
|
+
FileUtils.cp file.tempfile.path, location_on_disk
|
|
59
|
+
FileUtils.chmod(0755, location_on_disk)
|
|
57
60
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
end
|
|
61
|
+
# new file has been upload, if its image generate thumbnails, if mp3 collect sound info.
|
|
62
|
+
asset_processing
|
|
61
63
|
end
|
|
64
|
+
end
|
|
62
65
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
end
|
|
66
|
+
def move_tmp_file_to_actual_directory(file_name , tmp_file_dirty=true)
|
|
67
|
+
if self.file_dirty == true
|
|
68
|
+
self.file_dirty = false
|
|
67
69
|
end
|
|
68
|
-
|
|
69
|
-
# def write_file_to_disc(src_file_path , )
|
|
70
|
-
# end
|
|
71
|
-
end #InstanceMethods
|
|
70
|
+
end
|
|
72
71
|
|
|
73
72
|
end #Filesystem
|
|
74
73
|
end #Storage
|
|
@@ -2,41 +2,47 @@ module Gluttonberg
|
|
|
2
2
|
module Library
|
|
3
3
|
module Storage
|
|
4
4
|
module S3
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
5
7
|
module ClassMethods
|
|
6
8
|
# It run when the engine is loaded. It makes sure that all the required
|
|
7
9
|
# directories for storing assets are in the public dir, creating them if
|
|
8
10
|
# they are missing. It also stores the various paths so they can be
|
|
9
11
|
# retreived using the assets_dir method.
|
|
10
12
|
TEMP_ASSET_DIRECTORY = "tmp/user_assets"
|
|
11
|
-
def
|
|
13
|
+
def storage_setup
|
|
12
14
|
Library.set_asset_root("user_assets", TEMP_ASSET_DIRECTORY, "public/test_assets")
|
|
13
15
|
FileUtils.mkdir(Library.root) unless File.exists?(Library.root) || File.symlink?(Library.root)
|
|
14
16
|
FileUtils.mkdir(Library.tmp_root) unless File.exists?(Library.tmp_root) || File.symlink?(Library.tmp_root)
|
|
15
17
|
end
|
|
16
18
|
|
|
17
|
-
def
|
|
19
|
+
def s3_server_url
|
|
18
20
|
Gluttonberg::Setting.get_setting("s3_server_url")
|
|
19
21
|
end
|
|
20
22
|
|
|
21
|
-
def
|
|
23
|
+
def s3_bucket_name
|
|
22
24
|
Gluttonberg::Setting.get_setting("s3_bucket")
|
|
23
25
|
end
|
|
24
26
|
|
|
25
|
-
def
|
|
27
|
+
def s3_server_key_id
|
|
26
28
|
Gluttonberg::Setting.get_setting("s3_key_id")
|
|
27
29
|
end
|
|
28
30
|
|
|
29
|
-
def
|
|
31
|
+
def s3_server_access_key
|
|
30
32
|
Gluttonberg::Setting.get_setting("s3_access_key")
|
|
31
33
|
end
|
|
32
34
|
|
|
33
|
-
def
|
|
34
|
-
key_id =
|
|
35
|
-
key_val =
|
|
36
|
-
s3_server_url =
|
|
37
|
-
s3_bucket =
|
|
35
|
+
def bucket_handle
|
|
36
|
+
key_id = self.s3_server_key_id
|
|
37
|
+
key_val = self.s3_server_access_key
|
|
38
|
+
s3_server_url = self.s3_server_url
|
|
39
|
+
s3_bucket = self.s3_bucket_name
|
|
38
40
|
if !key_id.blank? && !key_val.blank? && !s3_server_url.blank? && !s3_bucket.blank?
|
|
39
|
-
s3 = AWS::S3.new({
|
|
41
|
+
s3 = AWS::S3.new({
|
|
42
|
+
:access_key_id => key_id,
|
|
43
|
+
:secret_access_key => key_val,
|
|
44
|
+
:server => s3_server_url
|
|
45
|
+
})
|
|
40
46
|
bucket = s3.buckets[s3_bucket]
|
|
41
47
|
else
|
|
42
48
|
nil
|
|
@@ -44,149 +50,149 @@ module Gluttonberg
|
|
|
44
50
|
end
|
|
45
51
|
|
|
46
52
|
#takes file from public/assets folder and upload to s3 if s3 info is given in CMS settings
|
|
47
|
-
def
|
|
53
|
+
def migrate_file_to_s3(asset_hash , file_name, mime_type='')
|
|
48
54
|
bucket = bucket_handle
|
|
49
|
-
|
|
50
|
-
local_file = "public/user_assets/" + asset_hash + "/" + file_name
|
|
55
|
+
if bucket != nil
|
|
51
56
|
key_for_s3 = "user_assets/" + asset_hash + "/" + file_name
|
|
52
|
-
date = Time.now+1.years
|
|
53
|
-
key = bucket.objects[key_for_s3]
|
|
54
57
|
asset = Gluttonberg::Asset.where(:asset_hash => asset_hash).first
|
|
55
58
|
unless asset.blank?
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
unless mime_type.blank?
|
|
61
|
-
key.write(File.open(local_file), {:expires => date.rfc2822, :content_type => mime_type , :acl => :public_read })
|
|
62
|
-
else
|
|
63
|
-
key.write(File.open(local_file) , {:expires => date.rfc2822 , :acl => :public_read })
|
|
64
|
-
end
|
|
59
|
+
local_file = asset.tmp_directory + "/" + file_name
|
|
60
|
+
local_file = "public/user_assets/" + asset_hash + "/" + file_name unless File.exist?(local_file)
|
|
61
|
+
puts " Copying #{local_file} to #{self.s3_bucket_name}"
|
|
62
|
+
self.upload_file_to(asset, bucket.objects[key_for_s3], mime_type, local_file)
|
|
65
63
|
asset.update_attributes(:copied_to_s3 => true)
|
|
66
|
-
puts "Copied"
|
|
67
64
|
end
|
|
68
65
|
end
|
|
69
66
|
end
|
|
70
67
|
|
|
68
|
+
def upload_file_to(asset, bucket_key, mime_type, local_file)
|
|
69
|
+
options = {
|
|
70
|
+
:expires => (Time.now+1.years).rfc2822,
|
|
71
|
+
:acl => :public_read
|
|
72
|
+
}
|
|
73
|
+
mime_type = asset.mime_type if mime_type.blank?
|
|
74
|
+
options[:content_type] = mime_type unless mime_type.blank?
|
|
75
|
+
response = bucket_key.write(File.open(File.join((Rails.env == 'test' ? Engine.root : Rails.root),local_file)), options)
|
|
76
|
+
puts "Copied"
|
|
77
|
+
end
|
|
78
|
+
|
|
71
79
|
end
|
|
72
80
|
|
|
73
|
-
module InstanceMethods
|
|
74
81
|
|
|
75
|
-
|
|
76
|
-
unless @bucket.blank?
|
|
77
|
-
@bucket
|
|
78
|
-
else
|
|
79
|
-
@bucket = S3::ClassMethods.bucket_handle
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
+
# InstanceMethods
|
|
82
83
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
Library.root + "/" + self.asset_hash
|
|
87
|
-
end
|
|
84
|
+
def bucket_handle
|
|
85
|
+
@bucket ||= self.class.bucket_handle
|
|
86
|
+
end
|
|
88
87
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
Library.tmp_root + "/" + self.asset_hash
|
|
93
|
-
end
|
|
88
|
+
def bucket_handle=(handle)
|
|
89
|
+
@bucket = handle
|
|
90
|
+
end
|
|
94
91
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
92
|
+
# The generated directory where this file is located.
|
|
93
|
+
def directory
|
|
94
|
+
self.class.storage_setup if Library.root.blank?
|
|
95
|
+
Library.root + "/" + self.asset_hash
|
|
96
|
+
end
|
|
98
97
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
98
|
+
# The generated tmp directory where we will locate this file temporarily for processing.
|
|
99
|
+
def tmp_directory
|
|
100
|
+
self.class.storage_setup if Library.tmp_root.blank?
|
|
101
|
+
Library.tmp_root + "/" + self.asset_hash
|
|
102
|
+
end
|
|
102
103
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
FileUtils.chmod(0755,tmp_original_file_on_disk)
|
|
107
|
-
move_tmp_file_to_actual_directory("original_" + file_name , true)
|
|
108
|
-
end
|
|
109
|
-
end
|
|
104
|
+
def s3_bucket_root_url
|
|
105
|
+
"http://#{self.class.s3_server_url}/#{self.class.s3_bucket_name}"
|
|
106
|
+
end
|
|
110
107
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
108
|
+
def assets_directory_public_url
|
|
109
|
+
"#{s3_bucket_root_url}/user_assets"
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def make_backup(replace_backup=true)
|
|
113
|
+
unless File.exist?(tmp_original_file_on_disk)
|
|
114
|
+
FileUtils.cp tmp_location_on_disk, tmp_original_file_on_disk
|
|
115
|
+
FileUtils.chmod(0755,tmp_original_file_on_disk)
|
|
116
|
+
move_tmp_file_to_actual_directory("original_" + file_name , true)
|
|
114
117
|
end
|
|
118
|
+
end
|
|
115
119
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
120
|
+
def remove_file_from_storage
|
|
121
|
+
remove_file_from_tmp_storage
|
|
122
|
+
remove_asset_folder_from_s3
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def remove_file_from_tmp_storage
|
|
126
|
+
if File.exists?(tmp_directory)
|
|
127
|
+
puts "Remove assset folder from tmp storage (#{tmp_directory})"
|
|
128
|
+
FileUtils.rm_r(tmp_directory)
|
|
121
129
|
end
|
|
130
|
+
end
|
|
122
131
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
end
|
|
132
|
+
def update_file_on_storage
|
|
133
|
+
if file
|
|
134
|
+
FileUtils.mkdir(tmp_directory) unless File.exists?(tmp_directory)
|
|
135
|
+
FileUtils.cp file.tempfile.path, tmp_location_on_disk
|
|
136
|
+
FileUtils.chmod(0755, tmp_location_on_disk)
|
|
137
|
+
|
|
138
|
+
move_tmp_file_to_actual_directory(file_name , false)
|
|
139
|
+
# new file has been upload, if its image generate thumbnails, if mp3 collect sound info.
|
|
140
|
+
asset_processing
|
|
141
|
+
# delete local tmp folder
|
|
142
|
+
remove_file_from_tmp_storage unless self.asset_type.asset_category.name == "video"
|
|
135
143
|
end
|
|
144
|
+
end
|
|
136
145
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
end
|
|
146
|
+
def move_tmp_file_to_actual_directory(file_name , tmp_file_dirty=true)
|
|
147
|
+
if self.file_dirty == true || tmp_file_dirty == true
|
|
148
|
+
copy_file_to_s3(file_name)
|
|
149
|
+
self.file_dirty = false
|
|
142
150
|
end
|
|
151
|
+
end
|
|
143
152
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
unless self.mime_type.blank?
|
|
154
|
-
key.write(File.open(local_file), {:expires => date.rfc2822, :content_type => self.mime_type , :acl => :public_read })
|
|
155
|
-
else
|
|
156
|
-
key.write(File.open(local_file) , {:expires => date.rfc2822 , :acl => :public_read })
|
|
157
|
-
end
|
|
158
|
-
self.update_column(:copied_to_s3 , true)
|
|
159
|
-
puts "Copied"
|
|
160
|
-
end
|
|
153
|
+
#takes file from tmp folder and upload to s3 if s3 info is given in CMS settings
|
|
154
|
+
def copy_file_to_s3(file_name)
|
|
155
|
+
bucket = bucket_handle
|
|
156
|
+
if bucket
|
|
157
|
+
local_file = self.tmp_directory + "/" + file_name
|
|
158
|
+
puts "Copying #{file_name} (#{local_file}) to #{self.class.s3_bucket_name}"
|
|
159
|
+
bucket_key = bucket.objects[self.directory + "/" + file_name]
|
|
160
|
+
self.class.upload_file_to(self, bucket_key, self.mime_type, local_file)
|
|
161
|
+
self.update_column(:copied_to_s3 , true)
|
|
161
162
|
end
|
|
163
|
+
end
|
|
162
164
|
|
|
165
|
+
# This method is used for delayed job
|
|
166
|
+
def copy_audios_to_s3
|
|
167
|
+
copy_file_to_s3(self.file_name)
|
|
168
|
+
end
|
|
163
169
|
|
|
170
|
+
# TODO
|
|
171
|
+
def remove_file_from_s3(file_name)
|
|
172
|
+
end
|
|
164
173
|
|
|
165
|
-
|
|
166
|
-
|
|
174
|
+
def remove_asset_folder_from_s3
|
|
175
|
+
bucket = bucket_handle
|
|
176
|
+
unless bucket.blank?
|
|
177
|
+
bucket.objects.with_prefix(self.directory).delete_all
|
|
167
178
|
end
|
|
179
|
+
end
|
|
168
180
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
bucket.objects.with_prefix(self.directory).delete_all
|
|
173
|
-
end
|
|
174
|
-
end
|
|
181
|
+
def download_asset_to_tmp_file
|
|
182
|
+
download_orginal_file_from_s3
|
|
183
|
+
end
|
|
175
184
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
185
|
+
def download_orginal_file_from_s3
|
|
186
|
+
FileUtils.mkdir(self.tmp_directory) unless File.exists?(self.tmp_directory)
|
|
187
|
+
_download_file_from_s3(self.location_on_disk, self.tmp_location_on_disk)
|
|
188
|
+
_download_file_from_s3(self.original_file_on_disk, self.tmp_original_file_on_disk)
|
|
189
|
+
end
|
|
179
190
|
|
|
180
|
-
|
|
191
|
+
private
|
|
192
|
+
def _download_file_from_s3(src, dest)
|
|
181
193
|
FileUtils.mkdir(self.tmp_directory) unless File.exists?(self.tmp_directory)
|
|
182
194
|
bucket = bucket_handle
|
|
183
195
|
key = bucket.objects[self.location_on_disk]
|
|
184
|
-
File.open(self.tmp_location_on_disk, "w", encoding: "ASCII-8BIT") do |f|
|
|
185
|
-
key.read do |chunk|
|
|
186
|
-
f.write(chunk)
|
|
187
|
-
end
|
|
188
|
-
end
|
|
189
|
-
key = bucket.objects[self.original_file_on_disk]
|
|
190
196
|
if key.exists?
|
|
191
197
|
File.open(self.tmp_original_file_on_disk, "w", encoding: "ASCII-8BIT") do |f|
|
|
192
198
|
key.read do |chunk|
|
|
@@ -195,8 +201,6 @@ module Gluttonberg
|
|
|
195
201
|
end
|
|
196
202
|
end
|
|
197
203
|
end
|
|
198
|
-
|
|
199
|
-
end #InstanceMethods
|
|
200
204
|
end #S3
|
|
201
205
|
end #Storage
|
|
202
206
|
end #Library
|