trusty-cms 1.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 +15 -0
- data/.gitignore +23 -0
- data/CHANGELOG.md +754 -0
- data/CONTRIBUTORS.md +263 -0
- data/Gemfile +40 -0
- data/Gemfile.lock +177 -0
- data/INSTALL.md +10 -0
- data/LICENSE.md +21 -0
- data/README.md +85 -0
- data/Rakefile +7 -0
- data/app/controllers/admin/configuration_controller.rb +50 -0
- data/app/controllers/admin/extensions_controller.rb +11 -0
- data/app/controllers/admin/layouts_controller.rb +8 -0
- data/app/controllers/admin/page_fields_controller.rb +9 -0
- data/app/controllers/admin/page_parts_controller.rb +9 -0
- data/app/controllers/admin/pages_controller.rb +89 -0
- data/app/controllers/admin/preferences_controller.rb +46 -0
- data/app/controllers/admin/references_controller.rb +7 -0
- data/app/controllers/admin/resource_controller.rb +245 -0
- data/app/controllers/admin/users_controller.rb +40 -0
- data/app/controllers/admin/welcome_controller.rb +48 -0
- data/app/controllers/application_controller.rb +114 -0
- data/app/controllers/site_controller.rb +97 -0
- data/app/helpers/admin/configuration_helper.rb +80 -0
- data/app/helpers/admin/export_helper.rb +2 -0
- data/app/helpers/admin/extensions_helper.rb +2 -0
- data/app/helpers/admin/layouts_helper.rb +21 -0
- data/app/helpers/admin/node_helper.rb +96 -0
- data/app/helpers/admin/pages_helper.rb +117 -0
- data/app/helpers/admin/preferences_helper.rb +3 -0
- data/app/helpers/admin/references_helper.rb +46 -0
- data/app/helpers/admin/regions_helper.rb +28 -0
- data/app/helpers/admin/resource_helper.rb +2 -0
- data/app/helpers/admin/users_helper.rb +8 -0
- data/app/helpers/admin/welcome_helper.rb +2 -0
- data/app/helpers/application_helper.rb +241 -0
- data/app/helpers/site_helper.rb +2 -0
- data/app/models/deprecated_tags.rb +42 -0
- data/app/models/file_not_found_page.rb +32 -0
- data/app/models/layout.rb +15 -0
- data/app/models/menu_renderer.rb +140 -0
- data/app/models/page.rb +377 -0
- data/app/models/page_context.rb +53 -0
- data/app/models/page_field.rb +3 -0
- data/app/models/page_part.rb +20 -0
- data/app/models/standard_tags.rb +1318 -0
- data/app/models/status.rb +41 -0
- data/app/models/text_filter.rb +36 -0
- data/app/models/trusty_cms/config.rb +313 -0
- data/app/models/trusty_cms/page_response_cache_director.rb +43 -0
- data/app/models/user.rb +96 -0
- data/app/models/user_action_observer.rb +25 -0
- data/app/views/admin/configuration/edit.html.haml +38 -0
- data/app/views/admin/configuration/show.html.haml +58 -0
- data/app/views/admin/extensions/index.html.haml +41 -0
- data/app/views/admin/layouts/_form.html.haml +39 -0
- data/app/views/admin/layouts/edit.html.haml +9 -0
- data/app/views/admin/layouts/index.html.haml +35 -0
- data/app/views/admin/layouts/new.html.haml +7 -0
- data/app/views/admin/layouts/remove.html.haml +16 -0
- data/app/views/admin/page_fields/_page_field.html.haml +12 -0
- data/app/views/admin/page_parts/_page_part.html.haml +18 -0
- data/app/views/admin/pages/_fields.html.haml +71 -0
- data/app/views/admin/pages/_meta_row.html.haml +8 -0
- data/app/views/admin/pages/_node.html.haml +26 -0
- data/app/views/admin/pages/_popups.html.haml +27 -0
- data/app/views/admin/pages/children.html.haml +2 -0
- data/app/views/admin/pages/edit.html.haml +12 -0
- data/app/views/admin/pages/index.html.haml +26 -0
- data/app/views/admin/pages/new.html.haml +10 -0
- data/app/views/admin/pages/remove.html.haml +18 -0
- data/app/views/admin/preferences/edit.html.haml +44 -0
- data/app/views/admin/references/_tag_reference.haml +3 -0
- data/app/views/admin/references/filters.haml +6 -0
- data/app/views/admin/references/tags.haml +30 -0
- data/app/views/admin/users/_avatar.html.haml +5 -0
- data/app/views/admin/users/_form.html.haml +53 -0
- data/app/views/admin/users/_password_fields.html.haml +18 -0
- data/app/views/admin/users/edit.html.haml +9 -0
- data/app/views/admin/users/index.html.haml +39 -0
- data/app/views/admin/users/new.html.haml +6 -0
- data/app/views/admin/users/remove.html.haml +16 -0
- data/app/views/admin/welcome/login.html.haml +23 -0
- data/app/views/layouts/application.html.haml +50 -0
- data/app/views/site/not_found.html.haml +3 -0
- data/bin/ci/before_script +15 -0
- data/bin/trusty_cms +53 -0
- data/config/application.rb +124 -0
- data/config/boot.rb +9 -0
- data/config/compass.config +15 -0
- data/config/database.db2.yml +20 -0
- data/config/database.mysql.yml +25 -0
- data/config/database.postgresql.yml +25 -0
- data/config/database.sqlite.yml +16 -0
- data/config/database.sqlserver.yml +20 -0
- data/config/environment.rb +5 -0
- data/config/environments/development.rb +19 -0
- data/config/environments/production.rb +27 -0
- data/config/environments/test.rb +35 -0
- data/config/initializers/active_record_extensions.rb +1 -0
- data/config/initializers/configuration_extensions.rb +0 -0
- data/config/initializers/haml.rb +2 -0
- data/config/initializers/object_extensions.rb +1 -0
- data/config/initializers/radiant_config.rb +16 -0
- data/config/initializers/rails_patch.rb +2 -0
- data/config/initializers/response_cache_timeout.rb +3 -0
- data/config/initializers/string_extensions.rb +1 -0
- data/config/initializers/symbol_extensions.rb +1 -0
- data/config/initializers/tmp.rb +2 -0
- data/config/locales/en.yml +230 -0
- data/config/locales/en_available_tags.yml +625 -0
- data/config/preinitializer.rb +18 -0
- data/config/routes.rb +30 -0
- data/db/migrate/001_create_radiant_tables.rb +75 -0
- data/db/migrate/002_insert_initial_data.rb +12 -0
- data/db/migrate/003_rename_behavior_column.rb +9 -0
- data/db/migrate/004_rename_filter_column.rb +11 -0
- data/db/migrate/005_add_virtual_column_to_page.rb +9 -0
- data/db/migrate/006_integer_columns_to_boolean.rb +36 -0
- data/db/migrate/007_remove_virtual_column_from_page.rb +9 -0
- data/db/migrate/008_add_virtual_column_to_page_again.rb +9 -0
- data/db/migrate/009_add_content_type_field_to_layout.rb +9 -0
- data/db/migrate/010_merge_behaviors_and_pages.rb +57 -0
- data/db/migrate/011_rename_type_column_on_page_to_class_name.rb +9 -0
- data/db/migrate/012_create_extension_meta.rb +13 -0
- data/db/migrate/013_add_notes_field_to_user.rb +9 -0
- data/db/migrate/014_rename_config_default_parts_key.rb +17 -0
- data/db/migrate/015_add_optimistic_locking.rb +15 -0
- data/db/migrate/016_add_sessions.rb +16 -0
- data/db/migrate/017_rename_created_by_updated_by_columns.rb +15 -0
- data/db/migrate/018_add_description_and_keywords_to_pages.rb +11 -0
- data/db/migrate/019_add_salt_to_users.rb +11 -0
- data/db/migrate/020_add_session_info_to_users.rb +11 -0
- data/db/migrate/021_remove_session_expire_from_users.rb +9 -0
- data/db/migrate/20081203140407_add_indexes.rb +19 -0
- data/db/migrate/20090226140109_add_user_language.rb +9 -0
- data/db/migrate/20090929164633_rename_developer_role_to_designer.rb +9 -0
- data/db/migrate/20091003095744_change_user_language_to_locale.rb +9 -0
- data/db/migrate/20100805154952_add_page_fields.rb +15 -0
- data/db/migrate/20100805155020_convert_page_metas.rb +24 -0
- data/db/migrate/20100810151922_add_field_name_index.rb +11 -0
- data/db/migrate/20110902203823_add_allowed_children_cache_to_pages.rb +13 -0
- data/db/migrate/20111016150725_extend_page_part_content_limit.rb +15 -0
- data/db/migrate/20120209231801_change_pages_allowed_children_cache_to_text.rb +11 -0
- data/db/schema.rb +128 -0
- data/lib/active_record_extensions/active_record_extensions.rb +27 -0
- data/lib/annotatable.rb +68 -0
- data/lib/configuration_extensions/configuration_extensions.rb +357 -0
- data/lib/generators/extension/USAGE +30 -0
- data/lib/generators/extension/extension_generator.rb +97 -0
- data/lib/generators/extension/templates/README.md +6 -0
- data/lib/generators/extension/templates/RSpecRakefile +109 -0
- data/lib/generators/extension/templates/Rakefile +25 -0
- data/lib/generators/extension/templates/cucumber.yml +1 -0
- data/lib/generators/extension/templates/cucumber_env.rb +11 -0
- data/lib/generators/extension/templates/cucumber_paths.rb +22 -0
- data/lib/generators/extension/templates/en.yml +3 -0
- data/lib/generators/extension/templates/extension.rb +21 -0
- data/lib/generators/extension/templates/functional_test.rb +15 -0
- data/lib/generators/extension/templates/gemspec.rb +29 -0
- data/lib/generators/extension/templates/lib.rb +8 -0
- data/lib/generators/extension/templates/migration.rb +9 -0
- data/lib/generators/extension/templates/radiant_config.rb +3 -0
- data/lib/generators/extension/templates/routes.rb +5 -0
- data/lib/generators/extension/templates/spec.opts +6 -0
- data/lib/generators/extension/templates/spec_helper.rb +42 -0
- data/lib/generators/extension/templates/tasks.rake +47 -0
- data/lib/generators/extension/templates/test_helper.rb +26 -0
- data/lib/generators/extension_controller/USAGE +36 -0
- data/lib/generators/extension_controller/extension_controller_generator.rb +84 -0
- data/lib/generators/extension_controller/templates/controller.rb +10 -0
- data/lib/generators/extension_controller/templates/controller_spec.rb +23 -0
- data/lib/generators/extension_controller/templates/functional_test.rb +11 -0
- data/lib/generators/extension_controller/templates/helper.rb +2 -0
- data/lib/generators/extension_controller/templates/helper_spec.rb +11 -0
- data/lib/generators/extension_controller/templates/helper_test.rb +4 -0
- data/lib/generators/extension_controller/templates/view.html.erb +2 -0
- data/lib/generators/extension_controller/templates/view_spec.rb +12 -0
- data/lib/generators/extension_mailer/USAGE +17 -0
- data/lib/generators/extension_mailer/extension_mailer_generator.rb +68 -0
- data/lib/generators/extension_mailer/templates/fixture.erb +3 -0
- data/lib/generators/extension_mailer/templates/mailer.rb +15 -0
- data/lib/generators/extension_mailer/templates/unit_test.rb +21 -0
- data/lib/generators/extension_mailer/templates/view.erb +3 -0
- data/lib/generators/extension_migration/USAGE +34 -0
- data/lib/generators/extension_migration/extension_migration_generator.rb +25 -0
- data/lib/generators/extension_migration/templates/migration.rb +11 -0
- data/lib/generators/extension_model/USAGE +35 -0
- data/lib/generators/extension_model/extension_model_generator.rb +68 -0
- data/lib/generators/extension_model/templates/fixtures.yml +19 -0
- data/lib/generators/extension_model/templates/migration.rb +16 -0
- data/lib/generators/extension_model/templates/model.rb +2 -0
- data/lib/generators/extension_model/templates/model_spec.rb +11 -0
- data/lib/generators/extension_model/templates/unit_test.rb +8 -0
- data/lib/generators/generator_base_extension.rb +16 -0
- data/lib/generators/instance/instance_generator.rb +148 -0
- data/lib/generators/instance/templates/databases/db2.yml +40 -0
- data/lib/generators/instance/templates/databases/mysql.yml +47 -0
- data/lib/generators/instance/templates/databases/postgresql.yml +44 -0
- data/lib/generators/instance/templates/databases/sqlite3.yml +16 -0
- data/lib/generators/instance/templates/databases/sqlserver.yml +21 -0
- data/lib/generators/instance/templates/instance_boot.rb +122 -0
- data/lib/generators/instance/templates/instance_config.ru +2 -0
- data/lib/generators/instance/templates/instance_environment.rb +83 -0
- data/lib/generators/instance/templates/instance_gemfile +81 -0
- data/lib/generators/instance/templates/instance_generate +6 -0
- data/lib/generators/instance/templates/instance_radiant_config.rb +16 -0
- data/lib/generators/instance/templates/instance_rakefile +3 -0
- data/lib/generators/instance/templates/instance_routes.rb +1 -0
- data/lib/generators/language_extension/USAGE +27 -0
- data/lib/generators/language_extension/language_extension_generator.rb +71 -0
- data/lib/generators/language_extension/templates/README +3 -0
- data/lib/generators/language_extension/templates/RSpecRakefile +123 -0
- data/lib/generators/language_extension/templates/Rakefile +25 -0
- data/lib/generators/language_extension/templates/available_tags.yml +553 -0
- data/lib/generators/language_extension/templates/cucumber.yml +1 -0
- data/lib/generators/language_extension/templates/cucumber_env.rb +16 -0
- data/lib/generators/language_extension/templates/cucumber_paths.rb +14 -0
- data/lib/generators/language_extension/templates/extension.rb +12 -0
- data/lib/generators/language_extension/templates/functional_test.rb +15 -0
- data/lib/generators/language_extension/templates/gemspec.rb +24 -0
- data/lib/generators/language_extension/templates/lang.yml +181 -0
- data/lib/generators/language_extension/templates/lib.rb +8 -0
- data/lib/generators/language_extension/templates/spec.opts +6 -0
- data/lib/generators/language_extension/templates/spec_helper.rb +36 -0
- data/lib/generators/language_extension/templates/tasks.rake +28 -0
- data/lib/generators/language_extension/templates/test_helper.rb +26 -0
- data/lib/inheritable_class_attributes.rb +65 -0
- data/lib/local_time.rb +6 -0
- data/lib/login_system.rb +132 -0
- data/lib/method_observer.rb +50 -0
- data/lib/object_extensions/object_extensions.rb +5 -0
- data/lib/simpleton.rb +21 -0
- data/lib/string_extensions/string_extensions.rb +25 -0
- data/lib/symbol_extensions/symbol_extensions.rb +5 -0
- data/lib/tasks/database.rake +85 -0
- data/lib/tasks/environments.rake +11 -0
- data/lib/tasks/extensions.rake +85 -0
- data/lib/tasks/framework.rake +255 -0
- data/lib/tasks/instance.rake +23 -0
- data/lib/tasks/prototype.rake +31 -0
- data/lib/tasks/radiant_config.rake +18 -0
- data/lib/tasks/release.rake +131 -0
- data/lib/tasks/translate.rake +59 -0
- data/lib/tasks/undefine.rake +28 -0
- data/lib/translation_support.rb +54 -0
- data/lib/trusty_cms/admin_ui/region_partials.rb +23 -0
- data/lib/trusty_cms/admin_ui/region_set.rb +35 -0
- data/lib/trusty_cms/admin_ui.rb +244 -0
- data/lib/trusty_cms/available_locales.rb +19 -0
- data/lib/trusty_cms/cache.rb +100 -0
- data/lib/trusty_cms/config/definition.rb +142 -0
- data/lib/trusty_cms/engine.rb +10 -0
- data/lib/trusty_cms/extension/script.rb +395 -0
- data/lib/trusty_cms/extension.rb +146 -0
- data/lib/trusty_cms/extension_loader.rb +130 -0
- data/lib/trusty_cms/extension_migrator.rb +98 -0
- data/lib/trusty_cms/extension_path.rb +200 -0
- data/lib/trusty_cms/initializer.rb +162 -0
- data/lib/trusty_cms/pagination/controller.rb +41 -0
- data/lib/trusty_cms/pagination/link_renderer.rb +34 -0
- data/lib/trusty_cms/resource_responses.rb +121 -0
- data/lib/trusty_cms/setup.rb +227 -0
- data/lib/trusty_cms/taggable.rb +138 -0
- data/lib/trusty_cms/task_support.rb +66 -0
- data/lib/trusty_cms.rb +19 -0
- data/log/.keep +0 -0
- data/public/.htaccess +40 -0
- data/public/404.html +8 -0
- data/public/500.html +8 -0
- data/public/dispatch.cgi +10 -0
- data/public/dispatch.fcgi +24 -0
- data/public/dispatch.rb +10 -0
- data/public/favicon.ico +0 -0
- data/public/images/admin/add_tab.png +0 -0
- data/public/images/admin/avatar_32x32.png +0 -0
- data/public/images/admin/avatar_64x64.png +0 -0
- data/public/images/admin/avatar_96x96.png +0 -0
- data/public/images/admin/brown_bottom_line.gif +0 -0
- data/public/images/admin/calendar_down.gif +0 -0
- data/public/images/admin/collapse.png +0 -0
- data/public/images/admin/draft_page.png +0 -0
- data/public/images/admin/expand.png +0 -0
- data/public/images/admin/image.png +0 -0
- data/public/images/admin/javascript.png +0 -0
- data/public/images/admin/layout.png +0 -0
- data/public/images/admin/metadata_toggle.png +0 -0
- data/public/images/admin/minus.png +0 -0
- data/public/images/admin/minus_disabled.png +0 -0
- data/public/images/admin/minus_grey.png +0 -0
- data/public/images/admin/navigation_secondary_separator.gif +0 -0
- data/public/images/admin/page.png +0 -0
- data/public/images/admin/plus.png +0 -0
- data/public/images/admin/plus_disabled.png +0 -0
- data/public/images/admin/plus_grey.png +0 -0
- data/public/images/admin/popup_border_background.png +0 -0
- data/public/images/admin/popup_border_bottom_left.png +0 -0
- data/public/images/admin/popup_border_bottom_right.png +0 -0
- data/public/images/admin/popup_border_top_left.png +0 -0
- data/public/images/admin/popup_border_top_right.png +0 -0
- data/public/images/admin/search.png +0 -0
- data/public/images/admin/single_form_shadow.png +0 -0
- data/public/images/admin/snippet.png +0 -0
- data/public/images/admin/spinner.gif +0 -0
- data/public/images/admin/status_background.png +0 -0
- data/public/images/admin/status_bottom_left.png +0 -0
- data/public/images/admin/status_bottom_right.png +0 -0
- data/public/images/admin/status_spinner.gif +0 -0
- data/public/images/admin/status_top_left.png +0 -0
- data/public/images/admin/status_top_right.png +0 -0
- data/public/images/admin/stylesheet.png +0 -0
- data/public/images/admin/tab_close.png +0 -0
- data/public/images/admin/upload.png +0 -0
- data/public/images/admin/virtual_page.png +0 -0
- data/public/images/radiant/radiant-badge-color.png +0 -0
- data/public/javascripts/admin/application.js +94 -0
- data/public/javascripts/admin/codearea.js +165 -0
- data/public/javascripts/admin/controls.js +965 -0
- data/public/javascripts/admin/cookie.js +80 -0
- data/public/javascripts/admin/dateinput.js +402 -0
- data/public/javascripts/admin/dragdrop.js +974 -0
- data/public/javascripts/admin/dropdown.js +216 -0
- data/public/javascripts/admin/effects.js +1122 -0
- data/public/javascripts/admin/lowpro.js +340 -0
- data/public/javascripts/admin/overrides.js +1 -0
- data/public/javascripts/admin/page_preview.js +41 -0
- data/public/javascripts/admin/pagefield.js +54 -0
- data/public/javascripts/admin/pagestatus.js +17 -0
- data/public/javascripts/admin/popup.js +339 -0
- data/public/javascripts/admin/prototype.js +4874 -0
- data/public/javascripts/admin/ruledtable.js +13 -0
- data/public/javascripts/admin/shortcuts.js +33 -0
- data/public/javascripts/admin/sitemap.js +149 -0
- data/public/javascripts/admin/status.js +233 -0
- data/public/javascripts/admin/tabcontrol.js +123 -0
- data/public/javascripts/admin/toggle.js +430 -0
- data/public/javascripts/admin/utility.js +53 -0
- data/public/javascripts/admin/validationerror.js +18 -0
- data/public/loading-iframe.html +11 -0
- data/public/robots.txt +1 -0
- data/public/stylesheets/sass/admin/_base.sass +18 -0
- data/public/stylesheets/sass/admin/main.sass +27 -0
- data/public/stylesheets/sass/admin/modules/_boxes.sass +6 -0
- data/public/stylesheets/sass/admin/modules/_gradients.sass +4 -0
- data/public/stylesheets/sass/admin/modules/_links.sass +18 -0
- data/public/stylesheets/sass/admin/overrides.sass +2 -0
- data/public/stylesheets/sass/admin/partials/_actions.sass +96 -0
- data/public/stylesheets/sass/admin/partials/_avatars.sass +10 -0
- data/public/stylesheets/sass/admin/partials/_content.sass +58 -0
- data/public/stylesheets/sass/admin/partials/_dateinput.sass +62 -0
- data/public/stylesheets/sass/admin/partials/_deprecated.sass +55 -0
- data/public/stylesheets/sass/admin/partials/_dropdown.sass +28 -0
- data/public/stylesheets/sass/admin/partials/_footer.sass +12 -0
- data/public/stylesheets/sass/admin/partials/_forms.sass +322 -0
- data/public/stylesheets/sass/admin/partials/_header.sass +114 -0
- data/public/stylesheets/sass/admin/partials/_index.sass +147 -0
- data/public/stylesheets/sass/admin/partials/_layout.sass +10 -0
- data/public/stylesheets/sass/admin/partials/_messages.sass +10 -0
- data/public/stylesheets/sass/admin/partials/_popup.sass +213 -0
- data/public/stylesheets/sass/admin/partials/_tabcontrol.sass +72 -0
- data/public/stylesheets/sass/admin/partials/_toolbar.sass +31 -0
- data/public/stylesheets/sass/admin/partials/_typography.sass +60 -0
- data/public/stylesheets/sass/admin/partials/_validations.sass +19 -0
- data/rails/init.rb +1 -0
- data/script/about +4 -0
- data/script/breakpointer +3 -0
- data/script/console +3 -0
- data/script/dbconsole +3 -0
- data/script/destroy +3 -0
- data/script/extension +5 -0
- data/script/generate +3 -0
- data/script/performance/benchmarker +3 -0
- data/script/performance/profiler +3 -0
- data/script/performance/request +3 -0
- data/script/plugin +3 -0
- data/script/process/inspector +3 -0
- data/script/process/reaper +3 -0
- data/script/process/spawner +3 -0
- data/script/process/spinner +3 -0
- data/script/rails +6 -0
- data/script/runner +3 -0
- data/script/server +3 -0
- data/script/version +5 -0
- data/spec/ci/database.mysql.yml +4 -0
- data/spec/ci/database.postgresql.yml +4 -0
- data/spec/ci/database.sqlite.yml +3 -0
- data/trusty_cms.gemspec +50 -0
- metadata +781 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
require 'trusty_cms/extension'
|
|
2
|
+
require 'trusty_cms/extension_path'
|
|
3
|
+
require 'method_observer'
|
|
4
|
+
|
|
5
|
+
module TrustyCms
|
|
6
|
+
class ExtensionLoader
|
|
7
|
+
# The ExtensionLoader is reponsible for the loading, activation and reactivation of extensions.
|
|
8
|
+
# The noticing of important subdirectories is now handled by the ExtensionPath class.
|
|
9
|
+
|
|
10
|
+
class DependenciesObserver < MethodObserver
|
|
11
|
+
# Extends the reload mechanism in ActiveSupport so that extensions are deactivated and reactivated
|
|
12
|
+
# when model classes are reloaded (in development mode, usually).
|
|
13
|
+
|
|
14
|
+
attr_accessor :config
|
|
15
|
+
|
|
16
|
+
def initialize(rails_config) #:nodoc
|
|
17
|
+
@config = rails_config
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def before_clear(*args) #:nodoc
|
|
21
|
+
ExtensionLoader.deactivate_extensions
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def after_clear(*args) #:nodoc
|
|
25
|
+
ExtensionLoader.load_extensions
|
|
26
|
+
ExtensionLoader.activate_extensions
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
include Simpleton
|
|
31
|
+
|
|
32
|
+
attr_accessor :initializer, :extensions
|
|
33
|
+
|
|
34
|
+
def initialize #:nodoc
|
|
35
|
+
self.extensions = []
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Returns a list of paths to all the extensions that are enabled in the configuration of this application.
|
|
39
|
+
#
|
|
40
|
+
def enabled_extension_paths
|
|
41
|
+
ExtensionPath.enabled.map(&:to_s)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Returns a list of all the paths discovered within extension roots of the specified type.
|
|
45
|
+
# (by calling the corresponding class method on ExtensionPath).
|
|
46
|
+
#
|
|
47
|
+
# extension_loader.paths(:metal) #=> ['extension/app/metal', 'extension/app/metal']
|
|
48
|
+
# extension_loader.paths(:controller) #=> ['extension/app/controllers', 'extension/app/controllers']
|
|
49
|
+
# extension_loader.paths(:eager_load) #=> ['extension/app/controllers', 'extension/app/models', 'extension/app/helpers']
|
|
50
|
+
#
|
|
51
|
+
# For compatibility with the old loader, there are corresponding +type_paths+ methods.
|
|
52
|
+
# There are also (deprecated) +add_type_paths+ methods.
|
|
53
|
+
#
|
|
54
|
+
def paths(type)
|
|
55
|
+
ExtensionPath.send("#{type}_paths".to_sym)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Loads but does not activate all the extensions that have been enabled, in the configured order
|
|
59
|
+
# (which defaults to alphabetically). If an extension fails to load an error will be logged
|
|
60
|
+
# but application startup will continue. If an extension doesn't exist, a LoadError will be raised
|
|
61
|
+
# and startup will halt.
|
|
62
|
+
#
|
|
63
|
+
def load_extensions
|
|
64
|
+
configuration = TrustyCms::Application.config
|
|
65
|
+
@observer ||= DependenciesObserver.new(configuration).observe(::ActiveSupport::Dependencies)
|
|
66
|
+
self.extensions = configuration.enabled_extensions.map { |ext| load_extension(ext) }.compact
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Loads the specified extension.
|
|
70
|
+
#
|
|
71
|
+
def load_extension(name)
|
|
72
|
+
extension_path = ExtensionPath.find(name)
|
|
73
|
+
begin
|
|
74
|
+
constant = "#{name}_extension".camelize
|
|
75
|
+
extension = constant.constantize
|
|
76
|
+
extension.unloadable
|
|
77
|
+
extension.path = extension_path
|
|
78
|
+
extension
|
|
79
|
+
rescue LoadError, NameError => e
|
|
80
|
+
$stderr.puts "Could not load extension: #{name}.\n#{e.inspect}"
|
|
81
|
+
nil
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Loads all the initializers defined in enabled extensions, in the configured order.
|
|
86
|
+
#
|
|
87
|
+
def load_extension_initalizers
|
|
88
|
+
extensions.each &:load_initializers
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Deactivates all enabled extensions.
|
|
92
|
+
#
|
|
93
|
+
def deactivate_extensions
|
|
94
|
+
extensions.each &:deactivate
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Activates all enabled extensions and makes sure that any newly declared subclasses of Page are recognised.
|
|
98
|
+
# The admin UI and views have to be reinitialized each time to pick up changes and avoid duplicates.
|
|
99
|
+
#
|
|
100
|
+
def activate_extensions
|
|
101
|
+
initializer.initialize_views
|
|
102
|
+
extensions.each &:activate
|
|
103
|
+
Page.load_subclasses
|
|
104
|
+
end
|
|
105
|
+
alias :reactivate :activate_extensions
|
|
106
|
+
|
|
107
|
+
class << self
|
|
108
|
+
# Builds an ExtensionPath object from the supplied path, working out the name of the extension on the way.
|
|
109
|
+
# The ExtensionPath object will later be used to scan and load the extension.
|
|
110
|
+
# An extension name can be supplied in addition to the path. It will be processed in the usual way to
|
|
111
|
+
# remove radiant- and -extension and any verion numbering.
|
|
112
|
+
#
|
|
113
|
+
def record_path(path, name=nil)
|
|
114
|
+
ExtensionPath.from_path(path, name)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# For compatibility with old calls probably still to be found in some extensions.
|
|
118
|
+
#
|
|
119
|
+
%w{controller model view metal plugin load locale}.each do |type|
|
|
120
|
+
define_method("#{type}_paths".to_sym) do
|
|
121
|
+
paths(type)
|
|
122
|
+
end
|
|
123
|
+
define_method("add_#{type}_paths".to_sym) do |additional_paths|
|
|
124
|
+
::ActiveSupport::Deprecation.warn("ExtensionLoader.add_#{type}_paths is has been moved and is deprecated. Please use TrustyCms.configuration.add_#{type}_paths", caller)
|
|
125
|
+
initializer.configuration.send("add_#{type}_paths".to_sym, additional_paths)
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
module TrustyCms
|
|
2
|
+
class ExtensionMigrator < ActiveRecord::Migrator
|
|
3
|
+
class << self
|
|
4
|
+
attr_accessor :extension
|
|
5
|
+
|
|
6
|
+
def migrate(target_version = nil)
|
|
7
|
+
super extension.migrations_path, target_version
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def migrate_extensions
|
|
11
|
+
TrustyCms::Application.config.enabled_extensions.each do |ext|
|
|
12
|
+
to_migrate = Extension.descendants.detect{|descendant| descendant.name == "#{ext.to_s.camelize}Extension" }
|
|
13
|
+
to_migrate.migrator.migrate
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def get_all_versions
|
|
18
|
+
ActiveRecord::Base.connection.select_values("SELECT version FROM #{schema_migrations_table_name}").
|
|
19
|
+
select { |version| version.starts_with?("#{@extension.extension_name}-")}.
|
|
20
|
+
map { |version| version.sub("#{@extension.extension_name}-", '').to_i }.sort
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def initialize(direction, migrations_path, target_version = nil)
|
|
25
|
+
super
|
|
26
|
+
initialize_extension_schema_migrations
|
|
27
|
+
initialize_received_migrations
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
def quote(s)
|
|
32
|
+
ActiveRecord::Base.connection.quote(s)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def extension_name
|
|
36
|
+
self.class.extension.extension_name
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def version_string(version)
|
|
40
|
+
"#{extension_name}-#{version}"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def initialize_extension_schema_migrations
|
|
44
|
+
current_version = ActiveRecord::Base.connection.select_value("SELECT schema_version FROM extension_meta WHERE name = #{quote(extension_name)}")
|
|
45
|
+
if current_version
|
|
46
|
+
assume_migrated_upto_version(current_version.to_i)
|
|
47
|
+
ActiveRecord::Base.connection.delete("DELETE FROM extension_meta WHERE name = #{quote(extension_name)}")
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def initialize_received_migrations
|
|
52
|
+
if donors = self.class.extension.migrates_from
|
|
53
|
+
donors.each do |extension_name, until_migration|
|
|
54
|
+
replaced = ActiveRecord::Base.connection.select_values("SELECT version FROM #{ActiveRecord::Migrator.schema_migrations_table_name} WHERE version LIKE '#{extension_name}-%'").map{|v| v.sub(/^#{extension_name}\-/, '').to_i}
|
|
55
|
+
replaced.delete_if{|v| v > until_migration.to_i} if until_migration
|
|
56
|
+
assume_migrated_upto_version(replaced.max) if replaced.any?
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def assume_migrated_upto_version(version)
|
|
62
|
+
version = version.to_i
|
|
63
|
+
sm_table = self.class.schema_migrations_table_name
|
|
64
|
+
|
|
65
|
+
migrated = self.class.get_all_versions
|
|
66
|
+
versions = Dir["#{@migrations_path}/[0-9]*_*.rb"].map do |filename|
|
|
67
|
+
filename.split('/').last.split('_').first.to_i
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
unless migrated.include?(version)
|
|
71
|
+
ActiveRecord::Base.connection.execute "INSERT INTO #{sm_table} (version) VALUES (#{quote(version_string(version))})"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
inserted = Set.new
|
|
75
|
+
(versions - migrated).each do |v|
|
|
76
|
+
if inserted.include?(v)
|
|
77
|
+
raise "Duplicate migration #{v}. Please renumber your migrations to resolve the conflict."
|
|
78
|
+
elsif v < version
|
|
79
|
+
ActiveRecord::Base.connection.execute "INSERT INTO #{sm_table} (version) VALUES (#{quote(version_string(v))})"
|
|
80
|
+
inserted << v
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def record_version_state_after_migrating(version)
|
|
86
|
+
sm_table = self.class.schema_migrations_table_name
|
|
87
|
+
|
|
88
|
+
@migrated_versions ||= []
|
|
89
|
+
if down?
|
|
90
|
+
@migrated_versions.delete(version.to_i)
|
|
91
|
+
ActiveRecord::Base.connection.update("DELETE FROM #{sm_table} WHERE version = #{quote(version_string(version))}")
|
|
92
|
+
else
|
|
93
|
+
@migrated_versions.push(version.to_i).sort!
|
|
94
|
+
ActiveRecord::Base.connection.insert("INSERT INTO #{sm_table} (version) VALUES (#{quote(version_string(version))})")
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
module TrustyCms
|
|
2
|
+
class ExtensionPath
|
|
3
|
+
# This class holds information about extensions that may be loaded. It has two roles: to remember the
|
|
4
|
+
# location of the extension so that we don't have to search for it again, and to look within that path
|
|
5
|
+
# for significant application subdirectories.
|
|
6
|
+
#
|
|
7
|
+
# We can't just retrieve this information from the Extension class because the initializer sets up
|
|
8
|
+
# most of the application load_paths before plugins (including extensions) are loaded. You can think
|
|
9
|
+
# of this as a sort of pre-extension class preparing the way for extension loading.
|
|
10
|
+
#
|
|
11
|
+
# You can use instances of this class to retrieve information about a particular extension:
|
|
12
|
+
#
|
|
13
|
+
# ExtensionPath.new(:name, :path)
|
|
14
|
+
# ExtensionPath.find(:name) #=> ExtensionPath instance
|
|
15
|
+
# ExtensionPath.find(:name).plugin_paths #=> "path/vendor/plugins" if it exists and is a directory
|
|
16
|
+
# ExtensionPath.for(:name) #=> "path"
|
|
17
|
+
#
|
|
18
|
+
# The initializer calls class methods to get overall lists (in configured order) of enabled load paths:
|
|
19
|
+
#
|
|
20
|
+
# ExtensionPath.enabled #=> ["path", "path", "path", "path"]
|
|
21
|
+
# ExtensionPath.plugin_paths #=> ["path/vendor/plugins", "path/vendor/plugins"]
|
|
22
|
+
|
|
23
|
+
attr_accessor :name, :path
|
|
24
|
+
@@known_paths = {}
|
|
25
|
+
|
|
26
|
+
def initialize(options = {}) #:nodoc
|
|
27
|
+
@name, @path = options[:name], options[:path]
|
|
28
|
+
@@known_paths[@name.to_sym] = self
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def required
|
|
32
|
+
File.join(path, "#{name}_extension")
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def to_s
|
|
36
|
+
path
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Builds a new ExtensionPath object from the supplied path, working out the name of the extension by
|
|
40
|
+
# stripping the extra bits from radiant-something-extension-1.0.0 to leave just 'something'. The object
|
|
41
|
+
# is returned, and also remembered here for later use by the initializer (to find load paths) and the
|
|
42
|
+
# ExtensionLoader, to load and activate the extension.
|
|
43
|
+
#
|
|
44
|
+
# If two arguments are given, the second is taken to be the full extension name.
|
|
45
|
+
#
|
|
46
|
+
def self.from_path(path, name=nil)
|
|
47
|
+
name = path if name.blank?
|
|
48
|
+
name = File.basename(name).gsub(/^trusty-|-extension(-[\d\.a-z]+|-[a-z\d]+)*$/, '')
|
|
49
|
+
new(:name => name, :path => path)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Forgets all recorded extension paths.
|
|
53
|
+
# Currently only used in testing.
|
|
54
|
+
#
|
|
55
|
+
def self.clear_paths!
|
|
56
|
+
@@known_paths = {}
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Returns a list of all the likely load paths found within this extension root. It includes all of these
|
|
60
|
+
# that exist and are directories:
|
|
61
|
+
#
|
|
62
|
+
# * path
|
|
63
|
+
# * path/lib
|
|
64
|
+
# * path/app/models
|
|
65
|
+
# * path/app/controllers
|
|
66
|
+
# * path/app/metal
|
|
67
|
+
# * path/app/helpers
|
|
68
|
+
# * path/test/helpers
|
|
69
|
+
#
|
|
70
|
+
# You can call the class method ExtensionPath.load_paths to get a flattened list of all the load paths in all the enabled extensions.
|
|
71
|
+
#
|
|
72
|
+
def load_paths
|
|
73
|
+
%w(lib app/models app/controllers app/metal app/helpers test/helpers).collect { |d| check_subdirectory(d) }.push(path).flatten.compact
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Returns a list of all the +vendor/plugin+ paths found within this extension root.
|
|
77
|
+
# Call the class method ExtensionPath.plugin_paths to get a list of the plugin paths found in all enabled extensions.
|
|
78
|
+
#
|
|
79
|
+
def plugin_paths
|
|
80
|
+
check_subdirectory("vendor/plugins")
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Returns a list of names of all the locale files found within this extension root.
|
|
84
|
+
# Call the class method ExtensionPath.locale_paths to get a list of the locale files found in all enabled extensions
|
|
85
|
+
# in reverse order so that locale definitions override one another correctly.
|
|
86
|
+
#
|
|
87
|
+
def locale_paths
|
|
88
|
+
if check_subdirectory("config/locales")
|
|
89
|
+
Dir[File.join("#{path}","config/locales","*.{rb,yml}")]
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Returns the app/helpers path if it is found within this extension root.
|
|
94
|
+
# Call the class method ExtensionPath.helper_paths to get a list of the helper paths found in all enabled extensions.
|
|
95
|
+
#
|
|
96
|
+
def helper_paths
|
|
97
|
+
check_subdirectory("app/helpers")
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Returns the app/models path if it is found within this extension root.
|
|
101
|
+
# Call the class method ExtensionPath.model_paths to get a list of the model paths found in all enabled extensions.
|
|
102
|
+
#
|
|
103
|
+
def model_paths
|
|
104
|
+
check_subdirectory("app/models")
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Returns the app/controllers path if it is found within this extension root.
|
|
108
|
+
# Call the class method ExtensionPath.controller_paths to get a list of the controller paths found in all enabled extensions.
|
|
109
|
+
#
|
|
110
|
+
def controller_paths
|
|
111
|
+
check_subdirectory("app/controllers")
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Returns the app/views path if it is found within this extension root.
|
|
115
|
+
# Call the class method ExtensionPath.view_paths to get a list of the view paths found in all enabled extensions
|
|
116
|
+
# in reverse order so that views override one another correctly.
|
|
117
|
+
#
|
|
118
|
+
def view_paths
|
|
119
|
+
check_subdirectory("app/views")
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Returns the app/metal path if it is found within this extension root.
|
|
123
|
+
# Call the class method ExtensionPath.metal_paths to get a list of the metal paths found in all enabled extensions.
|
|
124
|
+
#
|
|
125
|
+
def metal_paths
|
|
126
|
+
check_subdirectory("app/metal")
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Returns a list of all the rake task files found within this extension root.
|
|
130
|
+
#
|
|
131
|
+
def rake_task_paths
|
|
132
|
+
if check_subdirectory("lib/tasks")
|
|
133
|
+
Dir[File.join("#{path}","lib/tasks/**","*.rake")]
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# Returns a list of extension subdirectories that should be marked for eager loading. At the moment that
|
|
138
|
+
# includes all the controller, model and helper paths. The main purpose here is to ensure that extension
|
|
139
|
+
# controllers are loaded before running cucumber features, and there may be a better way to achieve that.
|
|
140
|
+
#
|
|
141
|
+
# Call the class method ExtensionPath.eager_load_paths to get a list for all enabled extensions.
|
|
142
|
+
#
|
|
143
|
+
def eager_load_paths
|
|
144
|
+
[controller_paths, model_paths, helper_paths].flatten.compact
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
class << self
|
|
148
|
+
# Returns the ExtensionPath object for the given extension name.
|
|
149
|
+
#
|
|
150
|
+
def find(name)
|
|
151
|
+
raise LoadError, "Cannot return path for unknown extension: #{name}" unless @@known_paths[name.to_sym]
|
|
152
|
+
@@known_paths[name.to_sym]
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Returns the root path recorded for the given extension name.
|
|
156
|
+
#
|
|
157
|
+
def for(name)
|
|
158
|
+
find(name).path
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Returns a list of path objects for all the enabled extensions in the configured order.
|
|
162
|
+
# If a configured extension has not been found during initialization, a LoadError will be thrown here.
|
|
163
|
+
#
|
|
164
|
+
# Note that at this stage, in line with the usage of config.extensions = [], the extension names
|
|
165
|
+
# are being passed around as symbols.
|
|
166
|
+
#
|
|
167
|
+
def enabled
|
|
168
|
+
enabled_extensions = TrustyCms::Application.config.enabled_extensions
|
|
169
|
+
@@known_paths.values_at(*enabled_extensions).compact
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# Returns a list of the root paths to all the enabled extensions, in the configured order.
|
|
173
|
+
#
|
|
174
|
+
def enabled_paths
|
|
175
|
+
enabled.map(&:path)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
[:load_paths, :plugin_paths, :helper_paths, :model_paths, :controller_paths, :eager_load_paths].each do |m|
|
|
179
|
+
define_method(m) do
|
|
180
|
+
enabled.map{|ep| ep.send(m)}.flatten.compact
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
[:locale_paths, :view_paths, :metal_paths, :rake_task_paths].each do |m|
|
|
184
|
+
define_method(m) do
|
|
185
|
+
enabled.map{|ep| ep.send(m)}.flatten.compact.reverse
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
private
|
|
191
|
+
|
|
192
|
+
# If the supplied path within the extension root exists and is a directory, its absolute path is returned. Otherwise, nil.
|
|
193
|
+
#
|
|
194
|
+
def check_subdirectory(subpath)
|
|
195
|
+
subdirectory = File.join(path, subpath)
|
|
196
|
+
subdirectory if File.directory?(subdirectory)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
end
|
|
200
|
+
end
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
require 'trusty_cms/admin_ui'
|
|
2
|
+
require 'trusty_cms/extension_loader'
|
|
3
|
+
|
|
4
|
+
module TrustyCms
|
|
5
|
+
|
|
6
|
+
module Initializer
|
|
7
|
+
|
|
8
|
+
# Rails::Initializer is essentially a list of startup steps and we extend it here by:
|
|
9
|
+
# * overriding or extending some of those steps so that they use radiant and extension paths
|
|
10
|
+
# as well as (or instead of) the rails defaults.
|
|
11
|
+
# * appending some extra steps to set up the admin UI and activate extensions
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# Returns true in the very unusual case where radiant has been deployed as a rails app itself, rather than
|
|
15
|
+
# loaded as a gem or from vendor/. This is only likely in situations where radiant is customised so heavily
|
|
16
|
+
# that extensions are not sufficient.
|
|
17
|
+
#
|
|
18
|
+
def deployed_as_app?
|
|
19
|
+
TRUSTY_CMS_ROOT == Rails.root
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Extends the Rails::Initializer default to add extension paths to the autoload list.
|
|
23
|
+
# Note that +default_autoload_paths+ is also overridden to point to TRUSTY_CMS_ROOT.
|
|
24
|
+
#
|
|
25
|
+
def set_autoload_patf
|
|
26
|
+
super
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Overrides the Rails initializer to load metal from TRUSTY_CMS_ROOT and from radiant extensions.
|
|
30
|
+
#
|
|
31
|
+
def initialize_metal
|
|
32
|
+
Rails::Rack::Metal.requested_metals = configuration.metals
|
|
33
|
+
Rails::Rack::Metal.metal_paths = ["#{TRUSTY_CMS_ROOT}/app/metal"] # reset Rails default to TRUSTY_CMS_ROOT
|
|
34
|
+
Rails::Rack::Metal.metal_paths += plugin_loader.engine_metal_paths
|
|
35
|
+
Rails::Rack::Metal.metal_paths += extension_loader.paths(:metal)
|
|
36
|
+
Rails::Rack::Metal.metal_paths.uniq!
|
|
37
|
+
|
|
38
|
+
configuration.middleware.insert_before(
|
|
39
|
+
:"ActionController::ParamsParser",
|
|
40
|
+
Rails::Rack::Metal, :if => Rails::Rack::Metal.metals.any?)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Extends the Rails initializer to add locale paths from TRUSTY_CMS_ROOT and from radiant extensions.
|
|
44
|
+
#
|
|
45
|
+
def initialize_i18n
|
|
46
|
+
radiant_locale_paths = Dir[File.join(TRUSTY_CMS_ROOT, 'config', 'locales', '*.{rb,yml}')]
|
|
47
|
+
configuration.i18n.load_path = radiant_locale_paths + extension_loader.paths(:locale)
|
|
48
|
+
super
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Extends the Rails initializer to add plugin paths in extensions
|
|
52
|
+
# and makes extension load paths reloadable (eg in development mode)
|
|
53
|
+
#
|
|
54
|
+
def add_plugin_load_paths
|
|
55
|
+
configuration.add_plugin_paths(extension_loader.paths(:plugin))
|
|
56
|
+
super
|
|
57
|
+
ActiveSupport::Dependencies.autoload_once_paths -= extension_loader.paths(:load)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Overrides the standard gem-loader to use Bundler instead of config.gem. This is the method normally monkey-patched
|
|
61
|
+
# into Rails::Initializer from boot.rb if you follow the instructions at http://gembundler.com/rails23.html
|
|
62
|
+
#
|
|
63
|
+
def load_gems
|
|
64
|
+
@bundler_loaded ||= Bundler.require :default, Rails.env
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Extends the Rails initializer also to load radiant extensions (which have been excluded from the list of plugins).
|
|
68
|
+
#
|
|
69
|
+
def load_plugins
|
|
70
|
+
super
|
|
71
|
+
extension_loader.load_extensions
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Extends the Rails initializer to run initializers from radiant and from extensions. The load order will be:
|
|
75
|
+
# 1. TRUSTY_CMS_ROOT/config/intializers/*.rb
|
|
76
|
+
# 2. Rails.root/config/intializers/*.rb
|
|
77
|
+
# 3. config/initializers/*.rb found in extensions, in extension load order.
|
|
78
|
+
#
|
|
79
|
+
# In the now rare case where radiant is deployed as an ordinary rails application, step 1 is skipped
|
|
80
|
+
# because it is equivalent to step 2.
|
|
81
|
+
#
|
|
82
|
+
def load_application_initializers
|
|
83
|
+
load_radiant_initializers unless deployed_as_app?
|
|
84
|
+
super
|
|
85
|
+
extension_loader.load_extension_initalizers
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Loads initializers found in TRUSTY_CMS_ROOT/config/initializers.
|
|
89
|
+
#
|
|
90
|
+
def load_radiant_initializers
|
|
91
|
+
Dir["#{TRUSTY_CMS_ROOT}/config/initializers/**/*.rb"].sort.each do |initializer|
|
|
92
|
+
load(initializer)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Extends the Rails initializer with some extra steps at the end of initialization:
|
|
97
|
+
# * hook up radiant view paths in controllers and notifiers
|
|
98
|
+
# * initialize the navigation tabs in the admin interface
|
|
99
|
+
# * initialize the extendable partial sets that make up the admin interface
|
|
100
|
+
# * call +activate+ on all radiant extensions
|
|
101
|
+
# * add extension controller paths
|
|
102
|
+
# * mark extension app paths for eager loading
|
|
103
|
+
#
|
|
104
|
+
def after_initialize
|
|
105
|
+
super
|
|
106
|
+
extension_loader.activate_extensions # also calls initialize_views
|
|
107
|
+
TrustyCms::Application.config.add_controller_paths(extension_loader.paths(:controller))
|
|
108
|
+
TrustyCms::Application.config.add_eager_load_paths(extension_loader.paths(:eager_load))
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Initializes all the admin interface elements and views. Separate here so that it can be called
|
|
112
|
+
# to reset the interface before extension (re)activation.
|
|
113
|
+
#
|
|
114
|
+
def initialize_views
|
|
115
|
+
initialize_default_admin_tabs
|
|
116
|
+
initialize_framework_views
|
|
117
|
+
admin.load_default_regions
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Initializes the core admin tabs. Separate so that it can be invoked by itself in tests.
|
|
121
|
+
#
|
|
122
|
+
def initialize_default_admin_tabs
|
|
123
|
+
admin.initialize_nav
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# This adds extension view paths to the standard Rails::Initializer method.
|
|
127
|
+
# In environments that don't cache templates it reloads the path set on each request,
|
|
128
|
+
# so that new extension paths are noticed without a restart.
|
|
129
|
+
#
|
|
130
|
+
def initialize_framework_views
|
|
131
|
+
view_paths = extension_loader.paths(:view) #.push(TrustyCms::Application.config.view_path)
|
|
132
|
+
if ActionController::Base.view_paths.count == 0 || !ActionView::Base.cache_template_loading
|
|
133
|
+
ActionController::Base.view_paths = ActionView::Base.process_view_paths(view_paths)
|
|
134
|
+
end
|
|
135
|
+
if ActionMailer::Base.view_paths.count == 0 || !ActionView::Base.cache_template_loading
|
|
136
|
+
ActionMailer::Base.view_paths = ActionView::Base.process_view_paths(view_paths)
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Extends the Rails initializer to make sure that extension controller paths are available when routes
|
|
141
|
+
# are initialized.
|
|
142
|
+
#
|
|
143
|
+
def initialize_routing
|
|
144
|
+
configuration.add_controller_paths(extension_loader.paths(:controller))
|
|
145
|
+
configuration.add_eager_load_paths(extension_loader.paths(:eager_load))
|
|
146
|
+
super
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# Returns the TrustyCms::AdminUI singleton so that the initializer can set up the admin interface.
|
|
150
|
+
#
|
|
151
|
+
def admin
|
|
152
|
+
TrustyCms::Application.config.admin
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Returns the ExtensionLoader singleton that will eventually load extensions.
|
|
156
|
+
#
|
|
157
|
+
def extension_loader
|
|
158
|
+
ExtensionLoader.instance {|l| l.initializer = self }
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
end
|
|
162
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module TrustyCms
|
|
2
|
+
module Pagination
|
|
3
|
+
module Controller
|
|
4
|
+
# for inclusion into public-facing controllers
|
|
5
|
+
|
|
6
|
+
def configure_pagination
|
|
7
|
+
# unconfigured parameters remain at will_paginate defaults
|
|
8
|
+
# will_paginate controller options are not overridden by tag attribetus
|
|
9
|
+
WillPaginate::ViewHelpers.pagination_options[:param_name] = TrustyCms::Config["pagination.param_name"].to_sym unless TrustyCms::Config["pagination.param_name"].blank?
|
|
10
|
+
WillPaginate::ViewHelpers.pagination_options[:per_page_param_name] = TrustyCms::Config["pagination.per_page_param_name"].blank? ? :per_page : TrustyCms::Config["pagination.per_page_param_name"].to_sym
|
|
11
|
+
|
|
12
|
+
# will_paginate view options can be overridden by tag attributes
|
|
13
|
+
[:class, :previous_label, :next_label, :inner_window, :outer_window, :separator, :container].each do |opt|
|
|
14
|
+
WillPaginate::ViewHelpers.pagination_options[opt] = TrustyCms::Config["pagination.#{opt}"] unless TrustyCms::Config["pagination.#{opt}"].blank?
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def pagination_parameters
|
|
19
|
+
{
|
|
20
|
+
:page => params[WillPaginate::ViewHelpers.pagination_options[:param_name]] || 1,
|
|
21
|
+
:per_page => params[WillPaginate::ViewHelpers.pagination_options[:per_page_param_name]] || TrustyCms::Config['pagination.per_page'] || 20
|
|
22
|
+
}
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def self.included(base)
|
|
26
|
+
base.class_eval {
|
|
27
|
+
helper_method :pagination_parameters
|
|
28
|
+
before_filter :configure_pagination
|
|
29
|
+
}
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# This handy simplification is adapted from SphinxSearch (thanks)
|
|
2
|
+
# and originally came from Ultrasphinx
|
|
3
|
+
# it saves us a lot of including and bodging to make will_paginate's template calls work in the Page model
|
|
4
|
+
|
|
5
|
+
module TrustyCms
|
|
6
|
+
module Pagination
|
|
7
|
+
class LinkRenderer < WillPaginate::LinkRenderer
|
|
8
|
+
def initialize(url_stem)
|
|
9
|
+
@url_stem = url_stem
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def to_html
|
|
13
|
+
links = @options[:page_links] ? windowed_links : []
|
|
14
|
+
links.unshift page_link_or_span(@collection.previous_page, 'disabled prev_page', @options[:previous_label])
|
|
15
|
+
links.push page_link_or_span(@collection.next_page, 'disabled next_page', @options[:next_label])
|
|
16
|
+
html = links.join(@options[:separator])
|
|
17
|
+
@options[:container] ? %{<div class="pagination">#{html}</div>} : html
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# this is rather crude compared to the WillPaginate link-builder,
|
|
21
|
+
# but it can get by without much context to draw on
|
|
22
|
+
def page_link(page, text, attributes = {})
|
|
23
|
+
linkclass = %{ class="#{attributes[:class]}"} if attributes[:class]
|
|
24
|
+
linkrel = %{ rel="#{attributes[:rel]}"} if attributes[:rel]
|
|
25
|
+
param_name = WillPaginate::ViewHelpers.pagination_options[:param_name]
|
|
26
|
+
%Q{<a href="#{@url_stem}?#{param_name}=#{page}"#{linkrel}#{linkclass}>#{text}</a>}
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def page_span(page, text, attributes = {})
|
|
30
|
+
%{<span class="#{attributes[:class]}">#{text}</span>}
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|