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,142 @@
|
|
|
1
|
+
module TrustyCms
|
|
2
|
+
class Config
|
|
3
|
+
class Definition
|
|
4
|
+
|
|
5
|
+
attr_reader :empty, :default, :type, :notes, :validate_with, :select_from, :allow_blank, :allow_display, :allow_change, :units, :definer
|
|
6
|
+
|
|
7
|
+
# Configuration 'definitions' are metadata held in memory that add restriction and description to individual config entries.
|
|
8
|
+
#
|
|
9
|
+
# By default radiant's configuration machinery is open and ad-hoc: config items are just globally-accessible variables.
|
|
10
|
+
# They're created when first mentioned and then available in all parts of the application. The definition mechanism is a way
|
|
11
|
+
# to place limits on that behavior. It allows you to protect a config entry, to specify the values it can take and to
|
|
12
|
+
# validate it when it changes. In the next update it will also allow you to declare that
|
|
13
|
+
# a config item is global or site-specific.
|
|
14
|
+
#
|
|
15
|
+
# The actual defining is done by TrustyCms::Config#define and usually in a block like this:
|
|
16
|
+
#
|
|
17
|
+
# TrustyCms::Config.prepare do |config|
|
|
18
|
+
# config.namespace('users', :allow_change => true) do |users|
|
|
19
|
+
# users.define 'allow_password_reset?', :label => 'Allow password reset?'
|
|
20
|
+
# end
|
|
21
|
+
# end
|
|
22
|
+
#
|
|
23
|
+
# See the method documentation in TrustyCms::Config for options and conventions.
|
|
24
|
+
#
|
|
25
|
+
def initialize(options={})
|
|
26
|
+
[:empty, :default, :type, :notes, :validate_with, :select_from, :allow_blank, :allow_change, :allow_display, :units, :definer].each do |attribute|
|
|
27
|
+
instance_variable_set "@#{attribute}".to_sym, options[attribute]
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Returns true if the definition included an :empty flag, which should only be the case for the blank, unrestricting
|
|
32
|
+
# definitions created when an undefined config item is set or got.
|
|
33
|
+
#
|
|
34
|
+
def empty?
|
|
35
|
+
!!empty
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Returns true if the definition included a :type => :boolean parameter. Config entries that end in '?' are automatically
|
|
39
|
+
# considered boolean, whether a type is declared or not. config.boolean? may therefore differ from config.definition.boolean?
|
|
40
|
+
#
|
|
41
|
+
def boolean?
|
|
42
|
+
type == :boolean
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Returns true if the definition included a :select_from parameter (either as list or proc).
|
|
46
|
+
#
|
|
47
|
+
def selector?
|
|
48
|
+
!select_from.blank?
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Returns true if the definition included a :type => :integer parameter
|
|
52
|
+
def integer?
|
|
53
|
+
type == :integer
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Returns the list of possible values for this config entry in a form suitable for passing to options_for_select.
|
|
57
|
+
# if :select_from is a proc it is called first with no arguments and its return value passed through.
|
|
58
|
+
#
|
|
59
|
+
def selection
|
|
60
|
+
if selector?
|
|
61
|
+
choices = select_from
|
|
62
|
+
choices = choices.call if choices.respond_to? :call
|
|
63
|
+
choices = normalize_selection(choices)
|
|
64
|
+
choices.unshift ["",""] if allow_blank?
|
|
65
|
+
choices
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# in definitions we accept anything that options_for_select would normally take
|
|
70
|
+
# here we standardises on an options array-of-arrays so that it's easier to validate input
|
|
71
|
+
#
|
|
72
|
+
def normalize_selection(choices)
|
|
73
|
+
choices = choices.to_a if Hash === choices
|
|
74
|
+
choices = choices.collect{|c| (c.is_a? Array) ? c : [c,c]}
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# If the config item is a selector and :select_from specifies [name, value] pairs (as hash or array),
|
|
78
|
+
# this will return the name corresponding to the currently selected value.
|
|
79
|
+
#
|
|
80
|
+
def selected(value)
|
|
81
|
+
if value && selector? && pair = selection.find{|s| s.last == value}
|
|
82
|
+
pair.first
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Checks the supplied value against the validation rules for this definition.
|
|
87
|
+
# There are several ways in which validations might be defined or implied:
|
|
88
|
+
# * if :validate_with specifies a block, the setting object is passed to the block
|
|
89
|
+
# * if :type is :integer, we test that the supplied string resolves to a valid integer
|
|
90
|
+
# * if the config item is a selector we test that its value is one of the permitted options
|
|
91
|
+
# * if :allow_blank has been set to false, we test that the value is not blank
|
|
92
|
+
#
|
|
93
|
+
def validate(setting)
|
|
94
|
+
if allow_blank?
|
|
95
|
+
return if setting.value.blank?
|
|
96
|
+
else
|
|
97
|
+
setting.errors.add :value, :blank if setting.value.blank?
|
|
98
|
+
end
|
|
99
|
+
if validate_with.is_a? Proc
|
|
100
|
+
validate_with.call(setting)
|
|
101
|
+
end
|
|
102
|
+
if selector?
|
|
103
|
+
setting.errors.add :value, :not_permitted unless selectable?(setting.value)
|
|
104
|
+
end
|
|
105
|
+
if integer?
|
|
106
|
+
Integer(setting.value) rescue setting.errors.add :value, :not_a_number
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Returns true if the value is one of the permitted selections. Not case-sensitive.
|
|
111
|
+
def selectable?(value)
|
|
112
|
+
return true unless selector?
|
|
113
|
+
selection.map(&:last).map(&:downcase).include?(value.downcase)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Returns true unless :allow_blank has been explicitly set to false. Defaults to true.
|
|
117
|
+
# A config item that does not allow_blank must be set or it will not be valid.
|
|
118
|
+
def allow_blank?
|
|
119
|
+
true unless allow_blank == false
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Returns true unless :allow_change has been explicitly set to false. Defaults to true.
|
|
123
|
+
# A config item that is not settable cannot be changed in the running application.
|
|
124
|
+
def settable?
|
|
125
|
+
true unless allow_change == false
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Returns true unless :allow_change has been explicitly set to false. Defaults to true.
|
|
129
|
+
# A config item that is not visible cannot be displayed in a radius tag.
|
|
130
|
+
def visible?
|
|
131
|
+
true unless allow_display == false
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Returns true if :allow_display has been explicitly set to false. Defaults to true.
|
|
135
|
+
def hidden?
|
|
136
|
+
true if allow_display == false
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
require 'active_resource'
|
|
2
|
+
require 'tmpdir'
|
|
3
|
+
require 'fileutils'
|
|
4
|
+
require 'rake'
|
|
5
|
+
|
|
6
|
+
module Registry
|
|
7
|
+
class Extension < ActiveResource::Base
|
|
8
|
+
self.site = ENV['REGISTRY_URL'] || "http://ext.radiantcms.org/"
|
|
9
|
+
|
|
10
|
+
def install
|
|
11
|
+
Registry.const_get(install_type).new(self).install
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def uninstall
|
|
15
|
+
Uninstaller.new(self).uninstall
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def inspect
|
|
19
|
+
%{
|
|
20
|
+
Name: #{name}
|
|
21
|
+
Description:
|
|
22
|
+
#{description}
|
|
23
|
+
Author: #{author.name} <#{author.email}>
|
|
24
|
+
Source code: #{repository_url}
|
|
25
|
+
Download: #{download_url}
|
|
26
|
+
Install type: #{install_type}
|
|
27
|
+
Supports: TrustyCms #{supports_radiant_version}
|
|
28
|
+
}.strip
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
class Action
|
|
33
|
+
def rake(command)
|
|
34
|
+
puts "rake #{command}"
|
|
35
|
+
puts `rake #{command} Rails.env=#{Rails.env}` if tasks_include? command
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def tasks_include?(command)
|
|
39
|
+
command = command.split(':')
|
|
40
|
+
if command.length > 1 && command[0..1] == ['radiant','extensions']
|
|
41
|
+
extension = command[2]
|
|
42
|
+
task = "radiant:extensions:#{extension}:#{command[3].split[0]}"
|
|
43
|
+
else
|
|
44
|
+
extension = task = command[0]
|
|
45
|
+
end
|
|
46
|
+
rake_file = File.join(Rails.root, 'vendor', 'extensions', extension) + '/lib/tasks/' + extension + '_extension_tasks.rake'
|
|
47
|
+
load rake_file if File.exist? rake_file
|
|
48
|
+
tasks = Rake.application.tasks.map(&:name)
|
|
49
|
+
tasks.include? task
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def file_utils
|
|
53
|
+
FileUtils
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
delegate :cd, :cp_r, :rm_r, :to => :file_utils
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
class Installer < Action
|
|
60
|
+
attr_accessor :url, :path, :name
|
|
61
|
+
def initialize(url, name)
|
|
62
|
+
self.url, self.name = url, name
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def install
|
|
66
|
+
copy_to_vendor_extensions
|
|
67
|
+
migrate
|
|
68
|
+
update
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def copy_to_vendor_extensions
|
|
72
|
+
cp_r(self.path, File.expand_path(File.join(Rails.root, 'vendor', 'extensions', name)))
|
|
73
|
+
rm_r(self.path)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def migrate
|
|
77
|
+
rake "radiant:extensions:#{name}:migrate"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def update
|
|
81
|
+
rake "radiant:extensions:#{name}:update"
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
class Uninstaller < Action
|
|
86
|
+
attr_accessor :name
|
|
87
|
+
def initialize(extension)
|
|
88
|
+
self.name = extension.name
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def uninstall
|
|
92
|
+
migrate_down
|
|
93
|
+
remove_extension_directory
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def migrate_down
|
|
97
|
+
rake "radiant:extensions:#{name}:migrate VERSION=0"
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def remove_extension_directory
|
|
101
|
+
rm_r(File.join(Rails.root, 'vendor', 'extensions', name))
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
class Checkout < Installer
|
|
106
|
+
def initialize(extension)
|
|
107
|
+
super(extension.repository_url, extension.name)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def checkout_command
|
|
111
|
+
raise "Not Implemented!"
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def install
|
|
115
|
+
checkout
|
|
116
|
+
super
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def checkout
|
|
120
|
+
self.path = File.join(Dir.tmpdir, name)
|
|
121
|
+
cd(Dir.tmpdir) { system "#{checkout_command}" }
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
class Download < Installer
|
|
126
|
+
def initialize(extension)
|
|
127
|
+
super(extension.download_url, extension.name)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def install
|
|
131
|
+
download
|
|
132
|
+
unpack
|
|
133
|
+
super
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def unpack
|
|
137
|
+
raise "Not Implemented!"
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def filename
|
|
141
|
+
File.basename(self.url)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def download
|
|
145
|
+
require 'open-uri'
|
|
146
|
+
File.open(File.join(Dir.tmpdir, self.filename), 'w') {|f| f.write open(self.url).read }
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
class Git < Checkout
|
|
151
|
+
def project_in_git?
|
|
152
|
+
@in_git ||= File.directory?(".git")
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def checkout_command
|
|
156
|
+
"git clone #{url} #{name}"
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def checkout
|
|
160
|
+
if project_in_git?
|
|
161
|
+
system "git submodule add #{url} vendor/extensions/#{name}"
|
|
162
|
+
cd(File.join('vendor', 'extensions', name)) do
|
|
163
|
+
system "git submodule init && git submodule update"
|
|
164
|
+
end
|
|
165
|
+
else
|
|
166
|
+
super
|
|
167
|
+
cd(path) do
|
|
168
|
+
system "git submodule init && git submodule update"
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def copy_to_vendor_extensions
|
|
174
|
+
super unless project_in_git?
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
class Subversion < Checkout
|
|
179
|
+
def checkout_command
|
|
180
|
+
"svn checkout #{url} #{name}"
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
class Gem < Download
|
|
185
|
+
def gem_name(name)
|
|
186
|
+
name.gsub(/-\d+\.\d+\.\d+(.+)?\.gem/, '')
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def download
|
|
190
|
+
# Don't download the gem if it's already installed
|
|
191
|
+
extension = gem_name(filename)
|
|
192
|
+
begin
|
|
193
|
+
gem extension
|
|
194
|
+
rescue ::Gem::LoadError
|
|
195
|
+
super
|
|
196
|
+
`gem install #{extension}`
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def unpack
|
|
201
|
+
output = nil
|
|
202
|
+
cd(Dir.tmpdir) do
|
|
203
|
+
output = `gem unpack #{gem_name(filename)}`
|
|
204
|
+
end
|
|
205
|
+
self.path = output.match(/'(.*)'/)[1]
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
class Tarball < Download
|
|
210
|
+
def filename
|
|
211
|
+
"#{self.name}.tar"
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def unpack
|
|
215
|
+
output = nil
|
|
216
|
+
cd(Dir.tmpdir) { output = `tar xvf #{filename}` }
|
|
217
|
+
self.path = File.join(Dir.tmpdir, output.split(/\n/).first.split('/').first)
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
class Gzip < Tarball
|
|
222
|
+
def filename
|
|
223
|
+
@unpacked ? super : "#{self.name}.tar.gz"
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def unpack
|
|
227
|
+
cd(Dir.tmpdir) { system "gunzip #{self.filename}" }
|
|
228
|
+
@unpacked = true
|
|
229
|
+
super
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
class Bzip2 < Tarball
|
|
234
|
+
def filename
|
|
235
|
+
@unpacked ? super : "#{self.name}.tar.bz2"
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def unpack
|
|
239
|
+
cd(Dir.tmpdir) { system "bunzip2 #{self.filename}" }
|
|
240
|
+
@unpacked = true
|
|
241
|
+
super
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
class Zip < Download
|
|
246
|
+
def unpack
|
|
247
|
+
output = nil
|
|
248
|
+
cd(Dir.tmpdir) { output = `unzip #{filename} -d #{name}` }
|
|
249
|
+
self.path = File.join(Dir.tmpdir, name)
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
module TrustyCms
|
|
255
|
+
class Extension
|
|
256
|
+
module Script
|
|
257
|
+
class << self
|
|
258
|
+
def execute(args)
|
|
259
|
+
command = args.shift || 'help'
|
|
260
|
+
begin
|
|
261
|
+
const_get(command.camelize).new(args)
|
|
262
|
+
rescue ArgumentError => e
|
|
263
|
+
puts e.message
|
|
264
|
+
Help.new [command]
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
module Util
|
|
270
|
+
attr_accessor :extension_name, :extension
|
|
271
|
+
|
|
272
|
+
def to_extension_name(string)
|
|
273
|
+
string.to_s.underscore
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
def installed?
|
|
277
|
+
path_match = Regexp.compile("(^|/|\\\\)#{extension_name}$")
|
|
278
|
+
extension_paths.any? {|p| p =~ path_match }
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
def registered?
|
|
282
|
+
self.extension
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
def extension_paths
|
|
286
|
+
paths = [Rails.root, TRUSTY_CMS_ROOT].uniq.map { |p| Dir["#{p}/vendor/extensions/*"] }
|
|
287
|
+
paths.unshift Dir["#{TRUSTY_CMS_ROOT}/test/fixtures/extensions/*"] if Rails.env == 'test' #nasty
|
|
288
|
+
paths.flatten
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
def load_extensions
|
|
292
|
+
Registry::Extension.find(:all)
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
def find_extension
|
|
296
|
+
self.extension = load_extensions.find{|e| e.name == self.extension_name }
|
|
297
|
+
end
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
class Install
|
|
301
|
+
include Util
|
|
302
|
+
|
|
303
|
+
def initialize(args=[])
|
|
304
|
+
raise ArgumentError, "You must specify an extension to install." if args.blank?
|
|
305
|
+
self.extension_name = to_extension_name(args.shift)
|
|
306
|
+
if installed?
|
|
307
|
+
puts "#{extension_name} is already installed."
|
|
308
|
+
else
|
|
309
|
+
find_extension
|
|
310
|
+
if registered?
|
|
311
|
+
extension.install
|
|
312
|
+
else
|
|
313
|
+
raise ArgumentError, "#{extension_name} is not available in the registry."
|
|
314
|
+
end
|
|
315
|
+
end
|
|
316
|
+
end
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
class Uninstall
|
|
320
|
+
include Util
|
|
321
|
+
|
|
322
|
+
def initialize(args=[])
|
|
323
|
+
raise ArgumentError, "You must specify an extension to uninstall." if args.blank?
|
|
324
|
+
self.extension_name = to_extension_name(args.shift)
|
|
325
|
+
if installed?
|
|
326
|
+
find_extension && extension.uninstall
|
|
327
|
+
else
|
|
328
|
+
puts "#{extension_name} is not installed."
|
|
329
|
+
end
|
|
330
|
+
end
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
class Info
|
|
334
|
+
include Util
|
|
335
|
+
|
|
336
|
+
def initialize(args=[])
|
|
337
|
+
raise ArgumentError, "You must specify an extension to get info on" if args.blank?
|
|
338
|
+
self.extension_name = to_extension_name(args.shift)
|
|
339
|
+
find_extension and puts extension.inspect
|
|
340
|
+
end
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
class Help
|
|
344
|
+
def initialize(args=[])
|
|
345
|
+
command = args.shift
|
|
346
|
+
command = 'help' unless self.class.instance_methods(false).collect {|im| im.to_s}.include?(command.to_s)
|
|
347
|
+
send(command)
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
def help
|
|
351
|
+
$stdout.puts %{Usage: script/extension command [arguments]
|
|
352
|
+
|
|
353
|
+
Available commands:
|
|
354
|
+
#{command_names}
|
|
355
|
+
|
|
356
|
+
For help on an individual command:
|
|
357
|
+
script/extension help command
|
|
358
|
+
|
|
359
|
+
You may install extensions from another registry by setting the REGISTRY_URL
|
|
360
|
+
By default the REGISTRY_URL is set to http://ext.radiantcms.org
|
|
361
|
+
|
|
362
|
+
Code for the registry application may be found at:
|
|
363
|
+
http://github.com/radiant/radiant-extension-registry/
|
|
364
|
+
}
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
def install
|
|
368
|
+
$stdout.puts %{Usage: script/extension install extension_name
|
|
369
|
+
|
|
370
|
+
Installs an extension from information in the global registry.
|
|
371
|
+
}
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
def uninstall
|
|
375
|
+
$stdout.puts %{Usage: script/extension uninstall extension_name
|
|
376
|
+
|
|
377
|
+
Removes a previously installed extension from the current project.
|
|
378
|
+
}
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
def info
|
|
382
|
+
$stdout.puts %{Usage: script/extension info extension_name
|
|
383
|
+
|
|
384
|
+
Displays registry information about the extension.
|
|
385
|
+
}
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
private
|
|
389
|
+
def command_names
|
|
390
|
+
(TrustyCms::Extension::Script.constants - ['Util']).sort.map {|n| n.to_s.underscore }.join(", ")
|
|
391
|
+
end
|
|
392
|
+
end
|
|
393
|
+
end
|
|
394
|
+
end
|
|
395
|
+
end
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
require 'annotatable'
|
|
2
|
+
require 'simpleton'
|
|
3
|
+
require 'trusty_cms/admin_ui'
|
|
4
|
+
|
|
5
|
+
module TrustyCms
|
|
6
|
+
class Extension
|
|
7
|
+
include Simpleton
|
|
8
|
+
include Annotatable
|
|
9
|
+
|
|
10
|
+
annotate :version, :description, :url, :extension_name, :path
|
|
11
|
+
|
|
12
|
+
attr_writer :active
|
|
13
|
+
|
|
14
|
+
def active?
|
|
15
|
+
@active
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def root
|
|
19
|
+
path.to_s
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def migrated?
|
|
23
|
+
migrator.new(:up, migrations_path).pending_migrations.empty?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def enabled?
|
|
27
|
+
active? and migrated?
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Conventional plugin-like routing
|
|
31
|
+
def routed?
|
|
32
|
+
File.exist?(routing_file)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def migrations_path
|
|
36
|
+
File.join(self.root, 'db', 'migrate')
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def migrates_from
|
|
40
|
+
@migrates_from ||= {}
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def routing_file
|
|
44
|
+
File.join(self.root, 'config', 'routes.rb')
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def load_initializers
|
|
48
|
+
Dir["#{self.root}/config/initializers/**/*.rb"].sort.each do |initializer|
|
|
49
|
+
load(initializer)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def migrator
|
|
54
|
+
unless @migrator
|
|
55
|
+
extension = self
|
|
56
|
+
@migrator = Class.new(ExtensionMigrator){ self.extension = extension }
|
|
57
|
+
end
|
|
58
|
+
@migrator
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def admin
|
|
62
|
+
AdminUI.instance
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def tab(name, options={}, &block)
|
|
66
|
+
@the_tab = admin.nav[name]
|
|
67
|
+
unless @the_tab
|
|
68
|
+
@the_tab = TrustyCms::AdminUI::NavTab.new(name)
|
|
69
|
+
before = options.delete(:before)
|
|
70
|
+
after = options.delete(:after)
|
|
71
|
+
tab_name = before || after
|
|
72
|
+
tab_object = admin.nav[tab_name]
|
|
73
|
+
if tab_object
|
|
74
|
+
index = admin.nav.index(tab_object)
|
|
75
|
+
index += 1 unless before
|
|
76
|
+
admin.nav.insert(index, @the_tab)
|
|
77
|
+
else
|
|
78
|
+
admin.nav << @the_tab
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
if block_given?
|
|
82
|
+
block.call(@the_tab)
|
|
83
|
+
end
|
|
84
|
+
return @the_tab
|
|
85
|
+
end
|
|
86
|
+
alias :add_tab :tab
|
|
87
|
+
|
|
88
|
+
def add_item(*args)
|
|
89
|
+
@the_tab.add_item(*args)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Determine if another extension is installed and up to date.
|
|
93
|
+
#
|
|
94
|
+
# if MyExtension.extension_enabled?(:third_party)
|
|
95
|
+
# ThirdPartyExtension.extend(MyExtension::IntegrationPoints)
|
|
96
|
+
# end
|
|
97
|
+
def extension_enabled?(extension)
|
|
98
|
+
begin
|
|
99
|
+
extension = (extension.to_s.camelcase + 'Extension').constantize
|
|
100
|
+
extension.enabled?
|
|
101
|
+
rescue NameError
|
|
102
|
+
false
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
class << self
|
|
107
|
+
|
|
108
|
+
def activate_extension
|
|
109
|
+
return if instance.active?
|
|
110
|
+
instance.activate if instance.respond_to? :activate
|
|
111
|
+
TrustyCms::Application.config.paths["config/routes"].concat([instance.routing_file]) if instance.routed?
|
|
112
|
+
TrustyCms::Application.reload_routes!
|
|
113
|
+
instance.active = true
|
|
114
|
+
end
|
|
115
|
+
alias :activate :activate_extension
|
|
116
|
+
|
|
117
|
+
def deactivate_extension
|
|
118
|
+
return unless instance.active?
|
|
119
|
+
instance.active = false
|
|
120
|
+
instance.deactivate if instance.respond_to? :deactivate
|
|
121
|
+
end
|
|
122
|
+
alias :deactivate :deactivate_extension
|
|
123
|
+
|
|
124
|
+
def inherited(subclass)
|
|
125
|
+
subclass.extension_name = subclass.name.to_name('Extension')
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def migrate_from(extension_name, until_migration=nil)
|
|
129
|
+
instance.migrates_from[extension_name] = until_migration
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Expose the configuration object for init hooks
|
|
133
|
+
# class MyExtension < ActiveRecord::Base
|
|
134
|
+
# extension_config do |config|
|
|
135
|
+
# config.after_initialize do
|
|
136
|
+
# run_something
|
|
137
|
+
# end
|
|
138
|
+
# end
|
|
139
|
+
# end
|
|
140
|
+
def extension_config(&block)
|
|
141
|
+
yield Rails.configuration
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|