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,181 @@
|
|
|
1
|
+
---
|
|
2
|
+
<%= localization_name %>:
|
|
3
|
+
account: 'Account'
|
|
4
|
+
activerecord:
|
|
5
|
+
errors:
|
|
6
|
+
messages:
|
|
7
|
+
blank: 'this must not be blank' # required
|
|
8
|
+
invalid: 'this does not match the expected format' #invalid_format
|
|
9
|
+
not_a_number: 'this must be a number' # must be number
|
|
10
|
+
taken: 'this name is already in use' # name_in_use
|
|
11
|
+
too_long: 'this must not be longer than %{count} characters' # character_limit
|
|
12
|
+
too_short: 'this must be at least %{count} characters long' # character_minimum
|
|
13
|
+
models:
|
|
14
|
+
page:
|
|
15
|
+
attributes:
|
|
16
|
+
slug:
|
|
17
|
+
taken: 'slug already in use for child of parent' # slug_in_use
|
|
18
|
+
user:
|
|
19
|
+
attributes:
|
|
20
|
+
email:
|
|
21
|
+
invalid: 'invalid e-mail address' # invalid_email
|
|
22
|
+
login:
|
|
23
|
+
taken: 'login already in use' # login already in use
|
|
24
|
+
password:
|
|
25
|
+
confirmation: 'must match confirmation' # password_confirmation
|
|
26
|
+
add_child: 'Add Child'
|
|
27
|
+
add_part: 'Add Part'
|
|
28
|
+
add_tab: 'Add Tab'
|
|
29
|
+
admin: 'Administrator'
|
|
30
|
+
available_tags: 'Available Tags'
|
|
31
|
+
available_tags_for: 'Available Tags for'
|
|
32
|
+
body: 'Body'
|
|
33
|
+
breadcrumb: 'Breadcrumb'
|
|
34
|
+
buttons:
|
|
35
|
+
create: 'Create %{name}'
|
|
36
|
+
save_and_continue: 'Save and Continue Editing'
|
|
37
|
+
save_changes: 'Save Changes'
|
|
38
|
+
cancel: 'Cancel'
|
|
39
|
+
change: 'Change'
|
|
40
|
+
close: 'Close'
|
|
41
|
+
content: 'Content'
|
|
42
|
+
content_type: 'Content‑Type'
|
|
43
|
+
creating_status: 'Creating %{model}…'
|
|
44
|
+
date:
|
|
45
|
+
abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
|
|
46
|
+
abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
|
|
47
|
+
day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
|
|
48
|
+
formats:
|
|
49
|
+
default: "%Y-%m-%d"
|
|
50
|
+
long: "%B %e, %Y"
|
|
51
|
+
only_day: "%e"
|
|
52
|
+
short: "%e %b"
|
|
53
|
+
month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December]
|
|
54
|
+
order: [ :year, :month, :day ]
|
|
55
|
+
delete_layout: 'Delete Layout'
|
|
56
|
+
delete_pages: 'Delete %{pages}'
|
|
57
|
+
delete_snippet: 'Delete Snippet'
|
|
58
|
+
delete_user: 'Delete User'
|
|
59
|
+
description: 'Description'
|
|
60
|
+
design: 'Design'
|
|
61
|
+
designer: 'Designer'
|
|
62
|
+
draft: 'Draft'
|
|
63
|
+
edit_layout: 'Edit Layout'
|
|
64
|
+
edit_page: 'Edit Page'
|
|
65
|
+
edit_snippet: 'Edit Snippet'
|
|
66
|
+
edit_user: 'Edit User'
|
|
67
|
+
email_address: 'E-mail Address'
|
|
68
|
+
extension: 'Extension'
|
|
69
|
+
extensions: 'Extensions'
|
|
70
|
+
filter: 'Filter'
|
|
71
|
+
hidden: 'Hidden'
|
|
72
|
+
hide: 'Hide'
|
|
73
|
+
keywords: 'Keywords'
|
|
74
|
+
language: 'Language'
|
|
75
|
+
layout: 'Layout'
|
|
76
|
+
layouts: 'Layouts'
|
|
77
|
+
log_out: 'Logout'
|
|
78
|
+
logged_in_as: 'Logged in as'
|
|
79
|
+
login: 'Login'
|
|
80
|
+
modify: 'Modify'
|
|
81
|
+
more: 'More'
|
|
82
|
+
name: 'Name'
|
|
83
|
+
new_layout: 'New Layout'
|
|
84
|
+
new_page: 'New Page'
|
|
85
|
+
new_password: 'New Password'
|
|
86
|
+
new_snippet: 'New Snippet'
|
|
87
|
+
new_user: 'New User'
|
|
88
|
+
no_pages: 'No Pages'
|
|
89
|
+
notes: 'Notes'
|
|
90
|
+
optional: 'Optional'
|
|
91
|
+
or: 'or'
|
|
92
|
+
page: 'Page'
|
|
93
|
+
page_page: 'Page Part'
|
|
94
|
+
page_title: 'Page Title'
|
|
95
|
+
page_type: 'Page Type'
|
|
96
|
+
pages: 'Pages'
|
|
97
|
+
pages_controller:
|
|
98
|
+
removed_many: "The pages were successfully removed from the site."
|
|
99
|
+
removed_one: "The page was successfully removed from the site."
|
|
100
|
+
saved: "Your page has been saved below."
|
|
101
|
+
password: 'Password'
|
|
102
|
+
password_confirmation: 'Confirm New Password'
|
|
103
|
+
personal: 'Personal'
|
|
104
|
+
personal_preferences: 'Personal Preferences'
|
|
105
|
+
please_login: 'Please Login'
|
|
106
|
+
powered_by: 'Powered by'
|
|
107
|
+
preferences: 'Preferences'
|
|
108
|
+
preferences_controller:
|
|
109
|
+
error_updating: 'There was an error updating your preferences.'
|
|
110
|
+
updated: 'Your preferences have been updated.'
|
|
111
|
+
published: 'Published'
|
|
112
|
+
published_at: 'Published at'
|
|
113
|
+
reference: 'Reference'
|
|
114
|
+
remember_me: 'Remember me'
|
|
115
|
+
remove: 'Remove'
|
|
116
|
+
remove_layout: 'Remove Layout'
|
|
117
|
+
remove_page: 'Remove Page'
|
|
118
|
+
remove_pages: 'Remove %{pages}'
|
|
119
|
+
remove_tab: 'Remove Tab'
|
|
120
|
+
remove_user: 'Remove user'
|
|
121
|
+
required: 'Required'
|
|
122
|
+
resource_controller:
|
|
123
|
+
not_found: "%{humanized_model_name} could not be found."
|
|
124
|
+
removed: "%{humanized_model_name} has been deleted."
|
|
125
|
+
saved: "%{humanized_model_name} saved below."
|
|
126
|
+
update_conflict: "%{humanized_model_name} has been modified since it was last loaded. Changes cannot be saved without potentially losing data."
|
|
127
|
+
validation_errors: "Validation errors occurred while processing this form. Please take a moment to review the form and correct any input errors before continuing."
|
|
128
|
+
reviewed: 'Reviewed'
|
|
129
|
+
roles: 'Roles'
|
|
130
|
+
saving_changes: Saving Changes
|
|
131
|
+
saving_preferences: Saving preferences
|
|
132
|
+
search_tags: 'Search Tags:'
|
|
133
|
+
select:
|
|
134
|
+
inherit: '<inherit>'
|
|
135
|
+
none: '<none>'
|
|
136
|
+
normal: '<normal>'
|
|
137
|
+
settings: 'Settings'
|
|
138
|
+
slug: 'Slug'
|
|
139
|
+
snippet: 'Snippet'
|
|
140
|
+
snippets: 'Snippets'
|
|
141
|
+
status: 'Status'
|
|
142
|
+
# Warnings and info text:
|
|
143
|
+
text:
|
|
144
|
+
layouts:
|
|
145
|
+
remove_warning: 'Are you sure you want to <strong class="warning">permanently remove</strong> the following layout?'
|
|
146
|
+
pages:
|
|
147
|
+
remove_warning: 'Are you sure you want to <strong class="warning">permanently remove</strong> the following %{pages}?'
|
|
148
|
+
snippets:
|
|
149
|
+
remove_warning: 'Are you sure you want to <strong class="warning">permanently remove</strong> the following snippet?'
|
|
150
|
+
users:
|
|
151
|
+
remove_warning: 'Are you sure you want to <strong class="warning">permanently remove</strong> the following user?'
|
|
152
|
+
this_file_language: "<%= file_name.capitalize %>"
|
|
153
|
+
time:
|
|
154
|
+
am: 'am'
|
|
155
|
+
formats:
|
|
156
|
+
datetime:
|
|
157
|
+
formats:
|
|
158
|
+
default: "%Y-%m-%dT%H:%M:%S%Z"
|
|
159
|
+
default: "%a %b %d %H:%M:%S %Z %Y"
|
|
160
|
+
long: "%B %d, %Y %H:%M"
|
|
161
|
+
only_second: "%S"
|
|
162
|
+
short: "%d %b %H:%M"
|
|
163
|
+
time: "%H:%M"
|
|
164
|
+
timestamp: "%I:%M %p on %B %d, %Y"
|
|
165
|
+
pm: 'pm'
|
|
166
|
+
timestamp:
|
|
167
|
+
at: 'at'
|
|
168
|
+
by: 'by'
|
|
169
|
+
last_updated: 'Last Updated'
|
|
170
|
+
user: 'User'
|
|
171
|
+
username: 'Username'
|
|
172
|
+
username_or_email: 'Username or E-mail Address'
|
|
173
|
+
users: 'Users'
|
|
174
|
+
users_controller:
|
|
175
|
+
cannot_delete_self: 'You cannot delete yourself.'
|
|
176
|
+
version: 'Version'
|
|
177
|
+
view_site: 'View Site'
|
|
178
|
+
website: 'Website'
|
|
179
|
+
welcome_controller:
|
|
180
|
+
invalid_user: 'Invalid username, e-mail address, or password.'
|
|
181
|
+
logged_out: 'You are now logged out.'
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
module TrustyCms<%= class_name %>
|
|
2
|
+
VERSION = "1.0.0"
|
|
3
|
+
SUMMARY = "<%= localization_name.capitalize %> language pack for TrustyCms CMS"
|
|
4
|
+
DESCRIPTION = "Adds <%= localization_name.capitalize %> translations to the TrustyCms CMS interface."
|
|
5
|
+
URL = "<%= homepage %>"
|
|
6
|
+
AUTHORS = ["<%= author_name %>"]
|
|
7
|
+
EMAIL = ["<%= author_email %>"]
|
|
8
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
unless defined? TRUSTY_CMS_ROOT
|
|
2
|
+
ENV["Rails.env"] = "test"
|
|
3
|
+
case
|
|
4
|
+
when ENV["RADIANT_ENV_FILE"]
|
|
5
|
+
require ENV["RADIANT_ENV_FILE"]
|
|
6
|
+
when File.dirname(__FILE__) =~ %r{vendor/trusty_cms/vendor/extensions}
|
|
7
|
+
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../../")}/config/environment"
|
|
8
|
+
else
|
|
9
|
+
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../")}/config/environment"
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
require "#{TRUSTY_CMS_ROOT}/spec/spec_helper"
|
|
13
|
+
|
|
14
|
+
Dataset::Resolver.default << (File.dirname(__FILE__) + "/datasets")
|
|
15
|
+
|
|
16
|
+
if File.directory?(File.dirname(__FILE__) + "/matchers")
|
|
17
|
+
Dir[File.dirname(__FILE__) + "/matchers/*.rb"].each {|file| require file }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
Spec::Runner.configure do |config|
|
|
21
|
+
# config.use_transactional_fixtures = true
|
|
22
|
+
# config.use_instantiated_fixtures = false
|
|
23
|
+
# config.fixture_path = Rails.root + '/spec/fixtures'
|
|
24
|
+
|
|
25
|
+
# You can declare fixtures for each behaviour like this:
|
|
26
|
+
# describe "...." do
|
|
27
|
+
# fixtures :table_a, :table_b
|
|
28
|
+
#
|
|
29
|
+
# Alternatively, if you prefer to declare them only once, you can
|
|
30
|
+
# do so here, like so ...
|
|
31
|
+
#
|
|
32
|
+
# config.global_fixtures = :table_a, :table_b
|
|
33
|
+
#
|
|
34
|
+
# If you declare global fixtures, be aware that they will be declared
|
|
35
|
+
# for all of your examples, even those that don't use them.
|
|
36
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
namespace :radiant do
|
|
2
|
+
namespace :extensions do
|
|
3
|
+
namespace :<%= file_name %> do
|
|
4
|
+
|
|
5
|
+
desc "Runs the migration of the <%= localization_name %> language pack"
|
|
6
|
+
task :migrate => :environment do
|
|
7
|
+
require 'trusty_cms/extension_migrator'
|
|
8
|
+
if ENV["VERSION"]
|
|
9
|
+
<%= class_name %>.migrator.migrate(ENV["VERSION"].to_i)
|
|
10
|
+
else
|
|
11
|
+
<%= class_name %>.migrator.migrate
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
desc "Copies public assets of the <%= localization_name %> language pack to the instance public/ directory."
|
|
16
|
+
task :update => :environment do
|
|
17
|
+
is_svn_or_dir = proc {|path| path =~ /\.svn/ || File.directory?(path) }
|
|
18
|
+
puts "Copying assets from <%= class_name %>"
|
|
19
|
+
Dir[<%= class_name %>.root + "/public/**/*"].reject(&is_svn_or_dir).each do |file|
|
|
20
|
+
path = file.sub(<%= class_name %>.root, '')
|
|
21
|
+
directory = File.dirname(path)
|
|
22
|
+
mkdir_p Rails.root + directory, :verbose => false
|
|
23
|
+
cp file, Rails.root + path, :verbose => false
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
# Load the environment
|
|
3
|
+
unless defined? TRUSTY_CMS_ROOT
|
|
4
|
+
ENV["Rails.env"] = "test"
|
|
5
|
+
case
|
|
6
|
+
when ENV["RADIANT_ENV_FILE"]
|
|
7
|
+
require ENV["RADIANT_ENV_FILE"]
|
|
8
|
+
when File.dirname(__FILE__) =~ %r{vendor/trusty_cms/vendor/extensions}
|
|
9
|
+
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../../")}/config/environment"
|
|
10
|
+
else
|
|
11
|
+
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../")}/config/environment"
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
require "#{TRUSTY_CMS_ROOT}/test/test_helper"
|
|
15
|
+
|
|
16
|
+
class Test::Unit::TestCase
|
|
17
|
+
|
|
18
|
+
# Include a helper to make testing Radius tags easier
|
|
19
|
+
test_helper :extension_tags
|
|
20
|
+
|
|
21
|
+
# Add the fixture directory to the fixture path
|
|
22
|
+
self.fixture_path << File.dirname(__FILE__) + "/fixtures"
|
|
23
|
+
|
|
24
|
+
# Add more helper methods to be used by all extension tests here...
|
|
25
|
+
|
|
26
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
module InheritableClassAttributes
|
|
2
|
+
def self.included(base)
|
|
3
|
+
base.extend ClassMethods
|
|
4
|
+
base.module_eval do
|
|
5
|
+
class << self
|
|
6
|
+
alias inherited_without_inheritable_class_attributes inherited
|
|
7
|
+
alias inherited inherited_with_inheritable_class_attributes
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module ClassMethods
|
|
13
|
+
def inheritable_cattr_readers
|
|
14
|
+
@inheritable_class_readers ||= []
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def inheritable_cattr_writers
|
|
18
|
+
@inheritable_class_writers ||= []
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def cattr_inheritable_reader(*symbols)
|
|
22
|
+
symbols.each do |symbol|
|
|
23
|
+
self.inheritable_cattr_readers << symbol
|
|
24
|
+
self.module_eval %{
|
|
25
|
+
def self.#{symbol}
|
|
26
|
+
@#{symbol}
|
|
27
|
+
end
|
|
28
|
+
}
|
|
29
|
+
end
|
|
30
|
+
self.inheritable_cattr_readers.uniq!
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def cattr_inheritable_writer(*symbols)
|
|
34
|
+
symbols.each do |symbol|
|
|
35
|
+
self.inheritable_cattr_writers << symbol
|
|
36
|
+
self.module_eval %{
|
|
37
|
+
def self.#{symbol}=(value)
|
|
38
|
+
@#{symbol} = value
|
|
39
|
+
end
|
|
40
|
+
}
|
|
41
|
+
end
|
|
42
|
+
self.inheritable_cattr_writers.uniq!
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def cattr_inheritable_accessor(*symbols)
|
|
46
|
+
cattr_inheritable_writer(*symbols)
|
|
47
|
+
cattr_inheritable_reader(*symbols)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def inherited_with_inheritable_class_attributes(klass)
|
|
51
|
+
inherited_without_inheritable_class_attributes(klass) if respond_to?(:inherited_without_inheritable_class_attributes)
|
|
52
|
+
|
|
53
|
+
readers = inheritable_cattr_readers.dup
|
|
54
|
+
writers = inheritable_cattr_writers.dup
|
|
55
|
+
inheritables = [:inheritable_cattr_readers, :inheritable_cattr_writers]
|
|
56
|
+
|
|
57
|
+
(readers + writers + inheritables).uniq.each do |attr|
|
|
58
|
+
var = "@#{attr}"
|
|
59
|
+
old_value = self.module_eval(var)
|
|
60
|
+
new_value = (old_value.dup rescue old_value)
|
|
61
|
+
klass.module_eval("#{var} = new_value")
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
data/lib/local_time.rb
ADDED
data/lib/login_system.rb
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
module LoginSystem
|
|
2
|
+
def self.included(base)
|
|
3
|
+
base.extend ClassMethods
|
|
4
|
+
base.class_eval do
|
|
5
|
+
prepend_before_filter :authenticate
|
|
6
|
+
prepend_before_filter :authorize
|
|
7
|
+
helper_method :current_user
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
protected
|
|
12
|
+
|
|
13
|
+
def current_user
|
|
14
|
+
@current_user ||= (login_from_session || login_from_cookie || login_from_http)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def current_user=(value=nil)
|
|
18
|
+
if value && value.is_a?(User)
|
|
19
|
+
@current_user = value
|
|
20
|
+
session['user_id'] = value.id
|
|
21
|
+
else
|
|
22
|
+
@current_user = nil
|
|
23
|
+
session['user_id'] = nil
|
|
24
|
+
end
|
|
25
|
+
@current_user
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def authenticate
|
|
29
|
+
#puts _process_action_callbacks.map(&:filter)
|
|
30
|
+
action = params['action'].to_s.intern
|
|
31
|
+
if current_user
|
|
32
|
+
session['user_id'] = current_user.id
|
|
33
|
+
true
|
|
34
|
+
else
|
|
35
|
+
session[:return_to] = request.original_url
|
|
36
|
+
respond_to do |format|
|
|
37
|
+
format.html { redirect_to login_url }
|
|
38
|
+
format.any(:xml,:json) { request_http_basic_authentication }
|
|
39
|
+
end
|
|
40
|
+
false
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def authorize
|
|
45
|
+
#puts _process_action_callbacks.map(&:filter)
|
|
46
|
+
action = action_name.to_s.intern
|
|
47
|
+
if user_has_access_to_action?(action)
|
|
48
|
+
true
|
|
49
|
+
else
|
|
50
|
+
permissions = self.class.controller_permissions[action]
|
|
51
|
+
flash[:error] = permissions[:denied_message] || 'Access denied.'
|
|
52
|
+
respond_to do |format|
|
|
53
|
+
format.html { redirect_to(permissions[:denied_url] || { :action => :index }) }
|
|
54
|
+
format.any(:xml, :json) { head :forbidden }
|
|
55
|
+
end
|
|
56
|
+
false
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def user_has_access_to_action?(action)
|
|
61
|
+
self.class.user_has_access_to_action?(current_user, action, self)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def login_from_session
|
|
65
|
+
User.find(session['user_id']) rescue nil
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def login_from_cookie
|
|
69
|
+
if !cookies[:session_token].blank? && user = User.find_by_session_token(cookies[:session_token]) # don't find by empty value
|
|
70
|
+
user.remember_me
|
|
71
|
+
set_session_cookie(user)
|
|
72
|
+
user
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def login_from_http
|
|
77
|
+
if [Mime::XML, Mime::JSON].include?(request.format)
|
|
78
|
+
authenticate_with_http_basic do |user_name, password|
|
|
79
|
+
User.authenticate(user_name, password)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def set_session_cookie(user = current_user)
|
|
85
|
+
cookies[:session_token] = { :value => user.session_token , :expires => TrustyCms::Config['session_timeout'].to_i.from_now.utc }
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
module ClassMethods
|
|
89
|
+
def no_login_required
|
|
90
|
+
skip_before_filter :authenticate
|
|
91
|
+
skip_before_filter :authorize
|
|
92
|
+
puts _process_action_callbacks.map(&:filter)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def login_required?
|
|
96
|
+
filter_chain.any? {|f| f.method == :authenticate || f.method == :authorize }
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def login_required
|
|
100
|
+
unless login_required?
|
|
101
|
+
prepend_before_filter :authenticate, :authorize
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def only_allow_access_to(*args)
|
|
106
|
+
options = {}
|
|
107
|
+
options = args.pop.dup if args.last.kind_of?(Hash)
|
|
108
|
+
options.symbolize_keys!
|
|
109
|
+
actions = args.map { |a| a.to_s.intern }
|
|
110
|
+
actions.each do |action|
|
|
111
|
+
controller_permissions[action] = options
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def controller_permissions
|
|
116
|
+
@controller_permissions ||= Hash.new { |h,k| h[k.to_s.intern] = Hash.new }
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def user_has_access_to_action?(user, action, instance=new)
|
|
120
|
+
permissions = controller_permissions[action.to_s.intern]
|
|
121
|
+
case
|
|
122
|
+
when allowed_roles = permissions[:when]
|
|
123
|
+
allowed_roles = [allowed_roles].flatten
|
|
124
|
+
allowed_roles.any? { |role| user.has_role?(role) }
|
|
125
|
+
when condition_method = permissions[:if]
|
|
126
|
+
instance.send(condition_method)
|
|
127
|
+
else
|
|
128
|
+
true
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
class MethodObserver
|
|
2
|
+
|
|
3
|
+
attr_reader :target
|
|
4
|
+
attr_accessor :result
|
|
5
|
+
|
|
6
|
+
class ObserverCannotObserveTwiceError < StandardError
|
|
7
|
+
def initialize(message = 'observer cannot observe twice')
|
|
8
|
+
super
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def observe(target)
|
|
13
|
+
raise ObserverCannotObserveTwiceError if @target
|
|
14
|
+
@target = target
|
|
15
|
+
make_observable(target)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.instances
|
|
19
|
+
@instances ||= {}
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.new(*args)
|
|
23
|
+
o = super
|
|
24
|
+
instances[o.object_id] = o
|
|
25
|
+
o
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
def make_observable(target)
|
|
30
|
+
methods_to_observe.each do |method|
|
|
31
|
+
target.instance_eval %{
|
|
32
|
+
def #{method}(*args, &block)
|
|
33
|
+
observer = #{self.class}.instances[#{self.object_id}]
|
|
34
|
+
observer.send(:before_#{method}, *args, &block) if observer.respond_to? :before_#{method}
|
|
35
|
+
observer.result = super
|
|
36
|
+
observer.send(:after_#{method}, *args, &block) if observer.respond_to? :after_#{method}
|
|
37
|
+
observer.result
|
|
38
|
+
end
|
|
39
|
+
}
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def methods_to_observe
|
|
44
|
+
(methods_for(:before) + methods_for(:after)).uniq
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def methods_for(name)
|
|
48
|
+
methods.grep(/^#{name}_/).map { |n| n.to_s.gsub(/^#{name}_/, '').intern }
|
|
49
|
+
end
|
|
50
|
+
end
|
data/lib/simpleton.rb
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Simpleton
|
|
2
|
+
|
|
3
|
+
def self.included(base)
|
|
4
|
+
base.extend(ClassMethods)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
module ClassMethods
|
|
8
|
+
|
|
9
|
+
def instance(&block)
|
|
10
|
+
@instance ||= new
|
|
11
|
+
block.call(@instance) if block_given?
|
|
12
|
+
@instance
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def method_missing(method, *args, &block)
|
|
16
|
+
instance.respond_to?(method) ? instance.send(method, *args, &block) : super
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'stringex'
|
|
2
|
+
|
|
3
|
+
class String
|
|
4
|
+
def symbolize
|
|
5
|
+
self.gsub(/[^A-Za-z0-9]+/, "_").gsub(/(^_+|_+$)/, "").underscore.to_sym
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def titlecase
|
|
9
|
+
self.gsub(/((?:^|\s)[a-z])/) { $1.upcase }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def to_name(last_part = '')
|
|
13
|
+
self.underscore.gsub('/', ' ').humanize.titlecase.gsub(/\s*#{last_part}$/, '')
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
unless methods.include?('parameterize')
|
|
17
|
+
def parameterize(sep = '-')
|
|
18
|
+
remove_formatting.downcase.replace_whitespace(sep).collapse(sep)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
alias :to_slug :parameterize
|
|
23
|
+
alias :slugify :parameterize
|
|
24
|
+
alias :slugerize :parameterize
|
|
25
|
+
end
|