refinerycms 0.9.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.
- data/CONTRIBUTORS +8 -0
- data/LICENSE +21 -0
- data/README +40 -0
- data/app/controllers/application.rb +3 -0
- data/app/controllers/application_controller.rb +8 -0
- data/config/amazon_s3.yml +17 -0
- data/config/boot.rb +110 -0
- data/config/database.yml.example +20 -0
- data/config/environment.rb +67 -0
- data/config/environments/development.rb +17 -0
- data/config/environments/production.rb +19 -0
- data/config/environments/test.rb +22 -0
- data/config/initializers/inflections.rb +10 -0
- data/config/initializers/mime_types.rb +5 -0
- data/config/rackspace_cloudfiles.yml +14 -0
- data/config/routes.rb +19 -0
- data/db/migrate/20090903030652_remove_title_from_resources.rb +9 -0
- data/db/migrate/20090914025122_change_default_image_thumbnails.rb +9 -0
- data/db/migrate/20090916025552_resave_refinery_settings_through_serializer.rb +13 -0
- data/db/migrate/20090916045536_create_user_plugins.rb +41 -0
- data/db/migrate/20090916055243_add_position_to_user_plugins.rb +9 -0
- data/db/schema.rb +141 -0
- data/db/seeds.rb +109 -0
- data/lib/refinery_initializer.rb +9 -0
- data/public/.htaccess +40 -0
- data/public/404.html +29 -0
- data/public/422.html +30 -0
- data/public/500.html +30 -0
- data/public/favicon.ico +0 -0
- data/public/images/lightbox/bullet.gif +0 -0
- data/public/images/lightbox/close.gif +0 -0
- data/public/images/lightbox/closelabel.gif +0 -0
- data/public/images/lightbox/donate-button.gif +0 -0
- data/public/images/lightbox/download-icon.gif +0 -0
- data/public/images/lightbox/loading.gif +0 -0
- data/public/images/lightbox/nextlabel.gif +0 -0
- data/public/images/lightbox/prevlabel.gif +0 -0
- data/public/images/refinery/add.gif +0 -0
- data/public/images/refinery/add.png +0 -0
- data/public/images/refinery/admin_bg.png +0 -0
- data/public/images/refinery/ajax-loader.gif +0 -0
- data/public/images/refinery/branch-end.gif +0 -0
- data/public/images/refinery/branch-start.gif +0 -0
- data/public/images/refinery/branch.gif +0 -0
- data/public/images/refinery/cross.gif +0 -0
- data/public/images/refinery/deactive-gradient.gif +0 -0
- data/public/images/refinery/delete.gif +0 -0
- data/public/images/refinery/drag.gif +0 -0
- data/public/images/refinery/edit.gif +0 -0
- data/public/images/refinery/header-background.gif +0 -0
- data/public/images/refinery/header_background.png +0 -0
- data/public/images/refinery/hover-gradient.jpg +0 -0
- data/public/images/refinery/icons/accept.png +0 -0
- data/public/images/refinery/icons/add.png +0 -0
- data/public/images/refinery/icons/application_edit.png +0 -0
- data/public/images/refinery/icons/application_go.png +0 -0
- data/public/images/refinery/icons/arrow_left.png +0 -0
- data/public/images/refinery/icons/arrow_switch.png +0 -0
- data/public/images/refinery/icons/arrow_up.png +0 -0
- data/public/images/refinery/icons/bin_closed.png +0 -0
- data/public/images/refinery/icons/cancel.png +0 -0
- data/public/images/refinery/icons/cog_add.png +0 -0
- data/public/images/refinery/icons/cog_edit.png +0 -0
- data/public/images/refinery/icons/cross.png +0 -0
- data/public/images/refinery/icons/delete.png +0 -0
- data/public/images/refinery/icons/edit.png +0 -0
- data/public/images/refinery/icons/email_edit.png +0 -0
- data/public/images/refinery/icons/email_go.png +0 -0
- data/public/images/refinery/icons/email_open.png +0 -0
- data/public/images/refinery/icons/eye.png +0 -0
- data/public/images/refinery/icons/help.png +0 -0
- data/public/images/refinery/icons/image_add.png +0 -0
- data/public/images/refinery/icons/image_edit.png +0 -0
- data/public/images/refinery/icons/layout_add.png +0 -0
- data/public/images/refinery/icons/layout_edit.png +0 -0
- data/public/images/refinery/icons/page_add.png +0 -0
- data/public/images/refinery/icons/page_edit.png +0 -0
- data/public/images/refinery/icons/page_link.png +0 -0
- data/public/images/refinery/icons/page_white_edit.png +0 -0
- data/public/images/refinery/icons/page_white_put.png +0 -0
- data/public/images/refinery/icons/reorder.png +0 -0
- data/public/images/refinery/icons/tick.png +0 -0
- data/public/images/refinery/icons/user.png +0 -0
- data/public/images/refinery/icons/user_add.png +0 -0
- data/public/images/refinery/icons/user_comment.png +0 -0
- data/public/images/refinery/icons/user_edit.png +0 -0
- data/public/images/refinery/info.gif +0 -0
- data/public/images/refinery/logo.png +0 -0
- data/public/images/refinery/m-tools.gif +0 -0
- data/public/images/refinery/magnifier.png +0 -0
- data/public/images/refinery/nav-3-background.gif +0 -0
- data/public/images/refinery/page_bg.png +0 -0
- data/public/images/refinery/resolve-digital.gif +0 -0
- data/public/images/refinery/search.gif +0 -0
- data/public/images/refinery/shad_blcorner.png +0 -0
- data/public/images/refinery/shad_bottom.png +0 -0
- data/public/images/refinery/shad_brcorner.png +0 -0
- data/public/images/refinery/shad_tlcorner.png +0 -0
- data/public/images/refinery/shad_trcorner.png +0 -0
- data/public/images/refinery/tableft.gif +0 -0
- data/public/images/refinery/tabright.gif +0 -0
- data/public/images/refinery/tick.gif +0 -0
- data/public/images/thickbox/cross.png +0 -0
- data/public/images/thickbox/loadingAnimation.gif +0 -0
- data/public/images/thickbox/macFFBgHack.png +0 -0
- data/public/images/wymeditor/skins/refinery/blockquote.png +0 -0
- data/public/images/wymeditor/skins/refinery/center.png +0 -0
- data/public/images/wymeditor/skins/refinery/css.png +0 -0
- data/public/images/wymeditor/skins/refinery/h1.png +0 -0
- data/public/images/wymeditor/skins/refinery/h2.png +0 -0
- data/public/images/wymeditor/skins/refinery/h3.png +0 -0
- data/public/images/wymeditor/skins/refinery/h4.png +0 -0
- data/public/images/wymeditor/skins/refinery/h5.png +0 -0
- data/public/images/wymeditor/skins/refinery/h6.png +0 -0
- data/public/images/wymeditor/skins/refinery/icons.png +0 -0
- data/public/images/wymeditor/skins/refinery/iframe/lbl-blockquote.png +0 -0
- data/public/images/wymeditor/skins/refinery/iframe/lbl-h1.png +0 -0
- data/public/images/wymeditor/skins/refinery/iframe/lbl-h2.png +0 -0
- data/public/images/wymeditor/skins/refinery/iframe/lbl-h3.png +0 -0
- data/public/images/wymeditor/skins/refinery/iframe/lbl-h4.png +0 -0
- data/public/images/wymeditor/skins/refinery/iframe/lbl-h5.png +0 -0
- data/public/images/wymeditor/skins/refinery/iframe/lbl-h6.png +0 -0
- data/public/images/wymeditor/skins/refinery/iframe/lbl-p.png +0 -0
- data/public/images/wymeditor/skins/refinery/iframe/lbl-pre.png +0 -0
- data/public/images/wymeditor/skins/refinery/justify.png +0 -0
- data/public/images/wymeditor/skins/refinery/left.png +0 -0
- data/public/images/wymeditor/skins/refinery/paragraph.png +0 -0
- data/public/images/wymeditor/skins/refinery/right.png +0 -0
- data/public/images/wymeditor/skins/wymeditor_icon.png +0 -0
- data/public/javascripts/admin.js +26 -0
- data/public/javascripts/application.js +2 -0
- data/public/javascripts/builder.js +136 -0
- data/public/javascripts/controls.js +963 -0
- data/public/javascripts/dialog.js +52 -0
- data/public/javascripts/dragdrop.js +973 -0
- data/public/javascripts/effects.js +1128 -0
- data/public/javascripts/fastinit.js +84 -0
- data/public/javascripts/jquery/GPL-LICENSE.txt +278 -0
- data/public/javascripts/jquery/MIT-LICENSE.txt +20 -0
- data/public/javascripts/jquery/README +67 -0
- data/public/javascripts/jquery/jquery.js +11 -0
- data/public/javascripts/jquery/jquery.ui.draggable.js +1 -0
- data/public/javascripts/jquery/jquery.ui.js +1 -0
- data/public/javascripts/jquery/jquery.ui.resizable.js +1 -0
- data/public/javascripts/jquery/jquery.ui.sortable.js +1 -0
- data/public/javascripts/lightbox.js +503 -0
- data/public/javascripts/livepipe.js +356 -0
- data/public/javascripts/overlabel.js +66 -0
- data/public/javascripts/parse_url.js +38 -0
- data/public/javascripts/prototype.enhancements.js +24 -0
- data/public/javascripts/prototype.js +4320 -0
- data/public/javascripts/scriptaculous.js +47 -0
- data/public/javascripts/slider.js +275 -0
- data/public/javascripts/tabs.js +147 -0
- data/public/javascripts/thickbox.js +363 -0
- data/public/javascripts/tooltips.js +173 -0
- data/public/javascripts/wymeditor/boot_wym.js +163 -0
- data/public/javascripts/wymeditor/jquery.refinery.wymeditor.js +4986 -0
- data/public/javascripts/wymeditor/lang/ca.js +45 -0
- data/public/javascripts/wymeditor/lang/cs.js +45 -0
- data/public/javascripts/wymeditor/lang/de.js +45 -0
- data/public/javascripts/wymeditor/lang/en.js +48 -0
- data/public/javascripts/wymeditor/lang/es.js +45 -0
- data/public/javascripts/wymeditor/lang/fa.js +46 -0
- data/public/javascripts/wymeditor/lang/fr.js +45 -0
- data/public/javascripts/wymeditor/lang/he.js +45 -0
- data/public/javascripts/wymeditor/lang/hu.js +45 -0
- data/public/javascripts/wymeditor/lang/it.js +45 -0
- data/public/javascripts/wymeditor/lang/nb.js +45 -0
- data/public/javascripts/wymeditor/lang/nl.js +45 -0
- data/public/javascripts/wymeditor/lang/nn.js +45 -0
- data/public/javascripts/wymeditor/lang/pl.js +45 -0
- data/public/javascripts/wymeditor/lang/pt-br.js +45 -0
- data/public/javascripts/wymeditor/lang/pt.js +45 -0
- data/public/javascripts/wymeditor/lang/ru.js +45 -0
- data/public/javascripts/wymeditor/lang/sv.js +45 -0
- data/public/javascripts/wymeditor/lang/tr.js +45 -0
- data/public/javascripts/wymeditor/lang/zh_cn.js +47 -0
- data/public/javascripts/wymeditor/skins/refinery/skin.js +40 -0
- data/public/robots.txt +2 -0
- data/public/stylesheets/application.css +0 -0
- data/public/stylesheets/application.css.example +76 -0
- data/public/stylesheets/formatting.css +0 -0
- data/public/stylesheets/formatting.css.example +86 -0
- data/public/stylesheets/home.css +0 -0
- data/public/stylesheets/home.css.example +27 -0
- data/public/stylesheets/ie6.css +0 -0
- data/public/stylesheets/ie7.css +0 -0
- data/public/stylesheets/lightbox.css +27 -0
- data/public/stylesheets/overlabel.css +21 -0
- data/public/stylesheets/refinery.css +1036 -0
- data/public/stylesheets/theme.css +36 -0
- data/public/stylesheets/thickbox.css +165 -0
- data/public/stylesheets/tooltips.css +38 -0
- data/public/stylesheets/wymeditor/skins/refinery/skin.css +211 -0
- data/public/stylesheets/wymeditor/skins/refinery/wymiframe.css +92 -0
- data/public/wymeditor/GPL-license.txt +278 -0
- data/public/wymeditor/MIT-license.txt +20 -0
- data/public/wymeditor/README +35 -0
- data/vendor/plugins/acts_as_indexed/CHANGELOG +74 -0
- data/vendor/plugins/acts_as_indexed/MIT-LICENSE +20 -0
- data/vendor/plugins/acts_as_indexed/README.rdoc +114 -0
- data/vendor/plugins/acts_as_indexed/Rakefile +35 -0
- data/vendor/plugins/acts_as_indexed/init.rb +2 -0
- data/vendor/plugins/acts_as_indexed/lib/acts_as_indexed.rb +224 -0
- data/vendor/plugins/acts_as_indexed/lib/search_atom.rb +107 -0
- data/vendor/plugins/acts_as_indexed/lib/search_index.rb +329 -0
- data/vendor/plugins/acts_as_indexed/lib/will_paginate_search.rb +29 -0
- data/vendor/plugins/acts_as_indexed/test/abstract_unit.rb +47 -0
- data/vendor/plugins/acts_as_indexed/test/acts_as_indexed_test.rb +102 -0
- data/vendor/plugins/acts_as_indexed/test/database.yml +10 -0
- data/vendor/plugins/acts_as_indexed/test/fixtures/post.rb +5 -0
- data/vendor/plugins/acts_as_indexed/test/fixtures/posts.yml +31 -0
- data/vendor/plugins/acts_as_indexed/test/schema.rb +6 -0
- data/vendor/plugins/acts_as_tree/README +26 -0
- data/vendor/plugins/acts_as_tree/Rakefile +22 -0
- data/vendor/plugins/acts_as_tree/init.rb +1 -0
- data/vendor/plugins/acts_as_tree/lib/active_record/acts/tree.rb +141 -0
- data/vendor/plugins/acts_as_tree/test/abstract_unit.rb +0 -0
- data/vendor/plugins/acts_as_tree/test/acts_as_tree_test.rb +219 -0
- data/vendor/plugins/acts_as_tree/test/database.yml +0 -0
- data/vendor/plugins/acts_as_tree/test/fixtures/mixin.rb +0 -0
- data/vendor/plugins/acts_as_tree/test/fixtures/mixins.yml +0 -0
- data/vendor/plugins/acts_as_tree/test/schema.rb +0 -0
- data/vendor/plugins/attachment_fu/CHANGELOG +35 -0
- data/vendor/plugins/attachment_fu/LICENSE +20 -0
- data/vendor/plugins/attachment_fu/README +193 -0
- data/vendor/plugins/attachment_fu/Rakefile +22 -0
- data/vendor/plugins/attachment_fu/amazon_s3.yml.tpl +17 -0
- data/vendor/plugins/attachment_fu/init.rb +16 -0
- data/vendor/plugins/attachment_fu/install.rb +7 -0
- data/vendor/plugins/attachment_fu/lib/geometry.rb +93 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu.rb +514 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/backends/cloud_file_backend.rb +211 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/backends/db_file_backend.rb +39 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/backends/file_system_backend.rb +126 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/backends/s3_backend.rb +394 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/core_image_processor.rb +59 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/gd2_processor.rb +54 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/image_science_processor.rb +61 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/mini_magick_processor.rb +132 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/rmagick_processor.rb +57 -0
- data/vendor/plugins/attachment_fu/rackspace_cloudfiles.yml.tpl +14 -0
- data/vendor/plugins/attachment_fu/test/backends/db_file_test.rb +16 -0
- data/vendor/plugins/attachment_fu/test/backends/file_system_test.rb +143 -0
- data/vendor/plugins/attachment_fu/test/backends/remote/cloudfiles_test.rb +102 -0
- data/vendor/plugins/attachment_fu/test/backends/remote/s3_test.rb +119 -0
- data/vendor/plugins/attachment_fu/test/base_attachment_tests.rb +77 -0
- data/vendor/plugins/attachment_fu/test/basic_test.rb +70 -0
- data/vendor/plugins/attachment_fu/test/database.yml +18 -0
- data/vendor/plugins/attachment_fu/test/extra_attachment_test.rb +67 -0
- data/vendor/plugins/attachment_fu/test/fixtures/attachment.rb +226 -0
- data/vendor/plugins/attachment_fu/test/fixtures/files/fake/rails.png +0 -0
- data/vendor/plugins/attachment_fu/test/fixtures/files/foo.txt +1 -0
- data/vendor/plugins/attachment_fu/test/fixtures/files/rails.png +0 -0
- data/vendor/plugins/attachment_fu/test/geometry_test.rb +108 -0
- data/vendor/plugins/attachment_fu/test/processors/core_image_test.rb +37 -0
- data/vendor/plugins/attachment_fu/test/processors/gd2_test.rb +31 -0
- data/vendor/plugins/attachment_fu/test/processors/image_science_test.rb +31 -0
- data/vendor/plugins/attachment_fu/test/processors/mini_magick_test.rb +103 -0
- data/vendor/plugins/attachment_fu/test/processors/rmagick_test.rb +255 -0
- data/vendor/plugins/attachment_fu/test/schema.rb +134 -0
- data/vendor/plugins/attachment_fu/test/test_helper.rb +150 -0
- data/vendor/plugins/attachment_fu/test/validation_test.rb +55 -0
- data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/color.rb +27 -0
- data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/effects.rb +31 -0
- data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/perspective.rb +25 -0
- data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/quality.rb +25 -0
- data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/scale.rb +47 -0
- data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/watermark.rb +32 -0
- data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/processor.rb +123 -0
- data/vendor/plugins/authentication/README +0 -0
- data/vendor/plugins/authentication/Rakefile +0 -0
- data/vendor/plugins/authentication/app/controllers/admin/users_controller.rb +93 -0
- data/vendor/plugins/authentication/app/controllers/sessions_controller.rb +30 -0
- data/vendor/plugins/authentication/app/controllers/users_controller.rb +86 -0
- data/vendor/plugins/authentication/app/helpers/sessions_helper.rb +2 -0
- data/vendor/plugins/authentication/app/helpers/users_helper.rb +2 -0
- data/vendor/plugins/authentication/app/models/user.rb +146 -0
- data/vendor/plugins/authentication/app/models/user_mailer.rb +25 -0
- data/vendor/plugins/authentication/app/models/user_observer.rb +11 -0
- data/vendor/plugins/authentication/app/models/user_plugin.rb +5 -0
- data/vendor/plugins/authentication/app/views/admin/users/_form.html.erb +42 -0
- data/vendor/plugins/authentication/app/views/admin/users/edit.html.erb +1 -0
- data/vendor/plugins/authentication/app/views/admin/users/index.html.erb +41 -0
- data/vendor/plugins/authentication/app/views/admin/users/new.html.erb +1 -0
- data/vendor/plugins/authentication/app/views/sessions/new.html.erb +21 -0
- data/vendor/plugins/authentication/app/views/user_mailer/activation.html.erb +3 -0
- data/vendor/plugins/authentication/app/views/user_mailer/signup_notification.html.erb +8 -0
- data/vendor/plugins/authentication/app/views/users/new.html.erb +28 -0
- data/vendor/plugins/authentication/config/routes.rb +10 -0
- data/vendor/plugins/authentication/init.rb +13 -0
- data/vendor/plugins/authentication/lib/authenticated_system.rb +115 -0
- data/vendor/plugins/authentication/lib/authenticated_test_helper.rb +10 -0
- data/vendor/plugins/authentication/test/fixtures/users.yml +19 -0
- data/vendor/plugins/authentication/test/functional/admin/base_controller_test.rb +8 -0
- data/vendor/plugins/authentication/test/functional/admin/dashboard_controller_test.rb +8 -0
- data/vendor/plugins/authentication/test/functional/admin/pages_controller_test.rb +8 -0
- data/vendor/plugins/authentication/test/functional/sessions_controller_test.rb +85 -0
- data/vendor/plugins/authentication/test/functional/users_controller_test.rb +99 -0
- data/vendor/plugins/authentication/test/test_helper.rb +38 -0
- data/vendor/plugins/authentication/test/unit/user_mailer_test.rb +31 -0
- data/vendor/plugins/authentication/test/unit/user_test.rb +164 -0
- data/vendor/plugins/dashboard/app/controllers/admin/dashboard_controller.rb +16 -0
- data/vendor/plugins/dashboard/app/helpers/admin/dashboard_helper.rb +19 -0
- data/vendor/plugins/dashboard/app/views/admin/dashboard/_recent_activity.html.erb +14 -0
- data/vendor/plugins/dashboard/app/views/admin/dashboard/index.html.erb +31 -0
- data/vendor/plugins/dashboard/config/routes.rb +5 -0
- data/vendor/plugins/dashboard/init.rb +7 -0
- data/vendor/plugins/images/app/controllers/admin/images_controller.rb +72 -0
- data/vendor/plugins/images/app/helpers/admin/images_helper.rb +17 -0
- data/vendor/plugins/images/app/models/image.rb +51 -0
- data/vendor/plugins/images/app/views/admin/images/_form.html.erb +36 -0
- data/vendor/plugins/images/app/views/admin/images/_grid_view.html.erb +17 -0
- data/vendor/plugins/images/app/views/admin/images/_list_view.html.erb +21 -0
- data/vendor/plugins/images/app/views/admin/images/edit.html.erb +1 -0
- data/vendor/plugins/images/app/views/admin/images/index.html.erb +43 -0
- data/vendor/plugins/images/app/views/admin/images/insert.html.erb +115 -0
- data/vendor/plugins/images/app/views/admin/images/new.html.erb +1 -0
- data/vendor/plugins/images/config/routes.rb +5 -0
- data/vendor/plugins/images/init.rb +8 -0
- data/vendor/plugins/images/lib/tasks/images.rake +28 -0
- data/vendor/plugins/inquiries/app/controllers/admin/inquiries_controller.rb +29 -0
- data/vendor/plugins/inquiries/app/controllers/admin/inquiry_settings_controller.rb +16 -0
- data/vendor/plugins/inquiries/app/controllers/inquiries_controller.rb +41 -0
- data/vendor/plugins/inquiries/app/helpers/inquiries_helper.rb +13 -0
- data/vendor/plugins/inquiries/app/models/inquiry.rb +18 -0
- data/vendor/plugins/inquiries/app/models/inquiry_mailer.rb +19 -0
- data/vendor/plugins/inquiries/app/models/inquiry_setting.rb +11 -0
- data/vendor/plugins/inquiries/app/views/admin/inquiries/_inquiry.html.erb +27 -0
- data/vendor/plugins/inquiries/app/views/admin/inquiries/index.html.erb +44 -0
- data/vendor/plugins/inquiries/app/views/admin/inquiries/show.html.erb +62 -0
- data/vendor/plugins/inquiries/app/views/admin/inquiry_settings/_confirmation_email_form.html.erb +50 -0
- data/vendor/plugins/inquiries/app/views/admin/inquiry_settings/_notification_recipients_form.html.erb +22 -0
- data/vendor/plugins/inquiries/app/views/admin/inquiry_settings/edit.html.erb +5 -0
- data/vendor/plugins/inquiries/app/views/admin/inquiry_settings/index.html.erb +32 -0
- data/vendor/plugins/inquiries/app/views/inquiries/new.html.erb +33 -0
- data/vendor/plugins/inquiries/app/views/inquiries/thank_you.html.erb +9 -0
- data/vendor/plugins/inquiries/app/views/inquiry_mailer/confirmation.html.erb +1 -0
- data/vendor/plugins/inquiries/app/views/inquiry_mailer/notification.html.erb +18 -0
- data/vendor/plugins/inquiries/config/routes.rb +8 -0
- data/vendor/plugins/inquiries/init.rb +11 -0
- data/vendor/plugins/news/app/controllers/admin/news_items_controller.rb +5 -0
- data/vendor/plugins/news/app/controllers/news_items_controller.rb +20 -0
- data/vendor/plugins/news/app/models/news_item.rb +26 -0
- data/vendor/plugins/news/app/views/admin/news_items/_form.html.erb +33 -0
- data/vendor/plugins/news/app/views/admin/news_items/_news_item.html.erb +15 -0
- data/vendor/plugins/news/app/views/admin/news_items/edit.html.erb +1 -0
- data/vendor/plugins/news/app/views/admin/news_items/index.html.erb +36 -0
- data/vendor/plugins/news/app/views/admin/news_items/new.html.erb +1 -0
- data/vendor/plugins/news/app/views/news_items/_recent_posts.html.erb +8 -0
- data/vendor/plugins/news/app/views/news_items/index.html.erb +23 -0
- data/vendor/plugins/news/app/views/news_items/show.html.erb +18 -0
- data/vendor/plugins/news/config/routes.rb +7 -0
- data/vendor/plugins/news/init.rb +7 -0
- data/vendor/plugins/pages/app/controllers/admin/page_dialogs_controller.rb +48 -0
- data/vendor/plugins/pages/app/controllers/admin/page_parts_controller.rb +35 -0
- data/vendor/plugins/pages/app/controllers/admin/pages_controller.rb +12 -0
- data/vendor/plugins/pages/app/controllers/pages_controller.rb +20 -0
- data/vendor/plugins/pages/app/helpers/pages_helper.rb +2 -0
- data/vendor/plugins/pages/app/models/page.rb +97 -0
- data/vendor/plugins/pages/app/models/page_part.rb +17 -0
- data/vendor/plugins/pages/app/views/admin/page_dialogs/_page_link.html.erb +6 -0
- data/vendor/plugins/pages/app/views/admin/page_dialogs/link_to.html.erb +253 -0
- data/vendor/plugins/pages/app/views/admin/page_parts/new.html.erb +11 -0
- data/vendor/plugins/pages/app/views/admin/pages/_form.html.erb +179 -0
- data/vendor/plugins/pages/app/views/admin/pages/_list.html.erb +29 -0
- data/vendor/plugins/pages/app/views/admin/pages/_sortable_list.html.erb +4 -0
- data/vendor/plugins/pages/app/views/admin/pages/edit.html.erb +1 -0
- data/vendor/plugins/pages/app/views/admin/pages/index.html.erb +42 -0
- data/vendor/plugins/pages/app/views/admin/pages/new.html.erb +1 -0
- data/vendor/plugins/pages/app/views/pages/home.html.erb +9 -0
- data/vendor/plugins/pages/app/views/pages/show.html.erb +10 -0
- data/vendor/plugins/pages/config/routes.rb +12 -0
- data/vendor/plugins/pages/init.rb +8 -0
- data/vendor/plugins/refinery/app/controllers/admin/base_controller.rb +37 -0
- data/vendor/plugins/refinery/app/controllers/admin/refinery_core_controller.rb +14 -0
- data/vendor/plugins/refinery/app/helpers/application_helper.rb +84 -0
- data/vendor/plugins/refinery/app/views/admin/_head.html.erb +27 -0
- data/vendor/plugins/refinery/app/views/admin/_menu.html.erb +85 -0
- data/vendor/plugins/refinery/app/views/layouts/admin.html.erb +25 -0
- data/vendor/plugins/refinery/app/views/layouts/application.html.erb +32 -0
- data/vendor/plugins/refinery/app/views/shared/_footer.html.erb +3 -0
- data/vendor/plugins/refinery/app/views/shared/_google_analytics.html.erb +12 -0
- data/vendor/plugins/refinery/app/views/shared/_ie6check.html.erb +11 -0
- data/vendor/plugins/refinery/app/views/shared/_menu.html.erb +16 -0
- data/vendor/plugins/refinery/app/views/shared/_menu_branch.html.erb +28 -0
- data/vendor/plugins/refinery/app/views/shared/_message.html.erb +10 -0
- data/vendor/plugins/refinery/app/views/shared/_submenu.html.erb +4 -0
- data/vendor/plugins/refinery/app/views/shared/_submenu_branch.html.erb +10 -0
- data/vendor/plugins/refinery/app/views/shared/admin/_make_sortable.html.erb +71 -0
- data/vendor/plugins/refinery/app/views/shared/admin/_search.html.erb +5 -0
- data/vendor/plugins/refinery/app/views/shared/admin/_sortable_list.html.erb +10 -0
- data/vendor/plugins/refinery/app/views/welcome.html.erb +13 -0
- data/vendor/plugins/refinery/app/views/wymiframe.html.erb +8 -0
- data/vendor/plugins/refinery/config/routes.rb +10 -0
- data/vendor/plugins/refinery/init.rb +9 -0
- data/vendor/plugins/refinery/lib/crud.rb +134 -0
- data/vendor/plugins/refinery/lib/generators/refinery/README +29 -0
- data/vendor/plugins/refinery/lib/generators/refinery/Rakefile +12 -0
- data/vendor/plugins/refinery/lib/generators/refinery/USAGE +2 -0
- data/vendor/plugins/refinery/lib/generators/refinery/install.rb +2 -0
- data/vendor/plugins/refinery/lib/generators/refinery/refinery_generator.rb +65 -0
- data/vendor/plugins/refinery/lib/generators/refinery/templates/config/routes.rb +7 -0
- data/vendor/plugins/refinery/lib/generators/refinery/templates/controller.rb +5 -0
- data/vendor/plugins/refinery/lib/generators/refinery/templates/init.rb +7 -0
- data/vendor/plugins/refinery/lib/generators/refinery/templates/migration.rb +36 -0
- data/vendor/plugins/refinery/lib/generators/refinery/templates/model.rb +8 -0
- data/vendor/plugins/refinery/lib/generators/refinery/templates/public_controller.rb +20 -0
- data/vendor/plugins/refinery/lib/generators/refinery/templates/views/admin/_form.html.erb +18 -0
- data/vendor/plugins/refinery/lib/generators/refinery/templates/views/admin/_singular_name.html.erb +15 -0
- data/vendor/plugins/refinery/lib/generators/refinery/templates/views/admin/_sortable_list.html.erb +2 -0
- data/vendor/plugins/refinery/lib/generators/refinery/templates/views/admin/edit.html.erb +1 -0
- data/vendor/plugins/refinery/lib/generators/refinery/templates/views/admin/index.html.erb +45 -0
- data/vendor/plugins/refinery/lib/generators/refinery/templates/views/admin/new.html.erb +1 -0
- data/vendor/plugins/refinery/lib/generators/refinery/templates/views/index.html.erb +15 -0
- data/vendor/plugins/refinery/lib/generators/refinery/templates/views/show.html.erb +23 -0
- data/vendor/plugins/refinery/lib/refinery.rb +15 -0
- data/vendor/plugins/refinery/lib/refinery/activity.rb +16 -0
- data/vendor/plugins/refinery/lib/refinery/application_controller.rb +53 -0
- data/vendor/plugins/refinery/lib/refinery/form_helpers.rb +28 -0
- data/vendor/plugins/refinery/lib/refinery/initializer.rb +28 -0
- data/vendor/plugins/refinery/lib/refinery/link_renderer.rb +45 -0
- data/vendor/plugins/refinery/lib/refinery/plugin.rb +47 -0
- data/vendor/plugins/refinery/lib/refinery/plugins.rb +53 -0
- data/vendor/plugins/refinery/lib/tasks/refinery.rake +28 -0
- data/vendor/plugins/refinery_dialogs/app/controllers/admin/dialogs_controller.rb +24 -0
- data/vendor/plugins/refinery_dialogs/app/views/admin/dialogs/show.html.erb +20 -0
- data/vendor/plugins/refinery_dialogs/app/views/layouts/admin_dialog.html.erb +31 -0
- data/vendor/plugins/refinery_dialogs/config/routes.rb +5 -0
- data/vendor/plugins/refinery_dialogs/init.rb +8 -0
- data/vendor/plugins/refinery_settings/app/controllers/admin/refinery_settings_controller.rb +5 -0
- data/vendor/plugins/refinery_settings/app/models/refinery_setting.rb +62 -0
- data/vendor/plugins/refinery_settings/app/views/admin/refinery_settings/_form.html.erb +21 -0
- data/vendor/plugins/refinery_settings/app/views/admin/refinery_settings/_make_sortable.html.erb +7 -0
- data/vendor/plugins/refinery_settings/app/views/admin/refinery_settings/_refinery_setting.html.erb +13 -0
- data/vendor/plugins/refinery_settings/app/views/admin/refinery_settings/edit.html.erb +4 -0
- data/vendor/plugins/refinery_settings/app/views/admin/refinery_settings/index.html.erb +33 -0
- data/vendor/plugins/refinery_settings/app/views/admin/refinery_settings/new.html.erb +1 -0
- data/vendor/plugins/refinery_settings/config/routes.rb +5 -0
- data/vendor/plugins/refinery_settings/init.rb +9 -0
- data/vendor/plugins/resources/app/controllers/admin/resources_controller.rb +25 -0
- data/vendor/plugins/resources/app/models/resource.rb +36 -0
- data/vendor/plugins/resources/app/views/admin/resources/_form.html.erb +18 -0
- data/vendor/plugins/resources/app/views/admin/resources/_resource.html.erb +16 -0
- data/vendor/plugins/resources/app/views/admin/resources/edit.html.erb +1 -0
- data/vendor/plugins/resources/app/views/admin/resources/index.html.erb +33 -0
- data/vendor/plugins/resources/app/views/admin/resources/new.html.erb +1 -0
- data/vendor/plugins/resources/config/routes.rb +7 -0
- data/vendor/plugins/resources/init.rb +7 -0
- metadata +567 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright (c) 2007 Douglas Shearer
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
= acts_as_indexed
|
|
2
|
+
|
|
3
|
+
If you find this plugin useful, please consider a donation to show your support!
|
|
4
|
+
|
|
5
|
+
http://www.paypal.com/cgi-bin/webscr?cmd=_send-money
|
|
6
|
+
|
|
7
|
+
Paypal address: mailto:dougal.s@gmail.com
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
== Instructions
|
|
11
|
+
|
|
12
|
+
This plugin allows boolean-queried fulltext search to be added to any Rails app
|
|
13
|
+
with no dependencies and minimal setup.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
== Resources
|
|
17
|
+
|
|
18
|
+
=== Install
|
|
19
|
+
./script/plugin install git://github.com/dougal/acts_as_indexed.git
|
|
20
|
+
|
|
21
|
+
If you don't have git installed, you can download the plugin from the GitHub page (http://github.com/dougal/acts_as_indexed) and unpack it into the +vendor/plugins+ directory of your rails app.
|
|
22
|
+
|
|
23
|
+
== Usage
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
=== Setup
|
|
27
|
+
|
|
28
|
+
Add +acts_as_indexed+ to the top of any models you want to index, along with a
|
|
29
|
+
list of the fields you wish to be indexed.
|
|
30
|
+
|
|
31
|
+
class Post < ActiveRecord::Base
|
|
32
|
+
acts_as_indexed :fields => [:title, :body]
|
|
33
|
+
|
|
34
|
+
...
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
The fields are not limited to model fields, but can be any instance method of
|
|
38
|
+
the current model.
|
|
39
|
+
|
|
40
|
+
class User < ActiveRecord::Base
|
|
41
|
+
acts_as_indexed :fields => [:address, :fullname]
|
|
42
|
+
|
|
43
|
+
def fullname
|
|
44
|
+
return self.firstname + ' ' + self.lastname
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
...
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
Acts_as_indexed automatically filters out query words shorter than 3 characters, for
|
|
51
|
+
performance sake. This value can be changed by passing +min_word_size+ along
|
|
52
|
+
with the fields. NOTE: The index files must be rebuilt by deleting the 'index'
|
|
53
|
+
directory in your app's root directory.
|
|
54
|
+
|
|
55
|
+
class Post < ActiveRecord::Base
|
|
56
|
+
acts_as_indexed :fields => [:title, :body], :min_word_size => 5
|
|
57
|
+
|
|
58
|
+
...
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
=== Searching
|
|
63
|
+
|
|
64
|
+
To search, call the +find_with_index+ method on your model, passing a query as
|
|
65
|
+
the first argument. The optional +ids_only+ parameter, when set to true, will
|
|
66
|
+
return only the IDs of any matching records.
|
|
67
|
+
|
|
68
|
+
# Returns array of Post objects.
|
|
69
|
+
my_search_results = Post.find_with_index('my search query')
|
|
70
|
+
|
|
71
|
+
# Pass any of the ActiveRecord find options to the search.
|
|
72
|
+
my_search_results = Post.find_with_index('my search query',{:limit => 10}) # return the first 10 matches.
|
|
73
|
+
|
|
74
|
+
# Returns array of IDs.
|
|
75
|
+
my_search_results = Post.find_with_index('my search query',{},{:ids_only => true}) # => [12,19,33...
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
=== Query Options
|
|
79
|
+
|
|
80
|
+
The following query operators are supported:
|
|
81
|
+
|
|
82
|
+
AND:: This is the default option. 'cat dog' will find records matching 'cat' AND 'dog'.
|
|
83
|
+
NOT:: 'cat -dog' will find records matching 'cat' AND NOT 'dog'
|
|
84
|
+
INCLUDE:: 'cat +me' will find records matching 'cat' and 'me', even if 'me' is smaller than the +min_word_size+
|
|
85
|
+
"":: Quoted terms are matched as phrases. '"cat dog"' will find records matching the whole phrase. Quoted terms can be preceded by the NOT operator; 'cat -"big dog"' etc. Quoted terms can include words shorter than the +min_word_size+.
|
|
86
|
+
|
|
87
|
+
=== Pagination
|
|
88
|
+
|
|
89
|
+
Pagination is supported via the +paginate_search+ method whose first argument is the search query, followed all the standard will_paginate arguments.
|
|
90
|
+
|
|
91
|
+
@images = Image.paginate_search 'girl', :page => 1, :per_page => 5
|
|
92
|
+
|
|
93
|
+
== RDoc Documentation
|
|
94
|
+
|
|
95
|
+
To generate the RDoc documentation, run the <tt>rake rdoc</tt> task in the acts_as_indexed
|
|
96
|
+
plugin folder. Then point your browser at <tt>/vendor/plugins/acts_as_indexed/rdoc/index.html</tt>.
|
|
97
|
+
|
|
98
|
+
Alternatively, you can view the rdoc documentation online[http://douglasfshearer.com/rdoc/acts_as_indexed/].
|
|
99
|
+
|
|
100
|
+
== Problems, Comments, Suggestions?
|
|
101
|
+
|
|
102
|
+
All of the above are most welcome. mailto:dougal.s@gmail.com
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
== Credits
|
|
106
|
+
|
|
107
|
+
Douglas F Shearer - http:douglasfshearer.com
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
== Future Releases
|
|
111
|
+
|
|
112
|
+
Future releases will be looking to add the following features:
|
|
113
|
+
* Optional html scrubbing during indexing.
|
|
114
|
+
* Ranking affected by field weightings.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'rake'
|
|
2
|
+
require 'rake/testtask'
|
|
3
|
+
require 'rake/rdoctask'
|
|
4
|
+
|
|
5
|
+
desc 'Default: run unit tests.'
|
|
6
|
+
task :default => :test
|
|
7
|
+
|
|
8
|
+
desc 'Test the acts_as_indexed plugin.'
|
|
9
|
+
Rake::TestTask.new(:test) do |t|
|
|
10
|
+
t.libs << 'lib'
|
|
11
|
+
t.pattern = 'test/**/*_test.rb'
|
|
12
|
+
t.verbose = true
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
desc 'Generate documentation for the acts_as_indexed plugin.'
|
|
16
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
|
17
|
+
rdoc.rdoc_dir = 'rdoc'
|
|
18
|
+
rdoc.title = 'ActsAsIndexed'
|
|
19
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
|
20
|
+
rdoc.rdoc_files.include('README.rdoc')
|
|
21
|
+
rdoc.rdoc_files.include('CHANGELOG')
|
|
22
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
namespace :rcov do
|
|
26
|
+
desc "Generate a coverage report in coverage/"
|
|
27
|
+
task :gen do
|
|
28
|
+
sh "rcov --output coverage test/*_test.rb"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
desc "Remove generated coverage files."
|
|
32
|
+
task :clobber do
|
|
33
|
+
sh "rm -rdf coverage"
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# ActsAsIndexed
|
|
2
|
+
# Copyright (c) 2007 Douglas F Shearer.
|
|
3
|
+
# http://douglasfshearer.com
|
|
4
|
+
# Distributed under the MIT license as included with this plugin.
|
|
5
|
+
|
|
6
|
+
require 'active_record'
|
|
7
|
+
|
|
8
|
+
require File.dirname(__FILE__) + '/search_index'
|
|
9
|
+
require File.dirname(__FILE__) + '/search_atom'
|
|
10
|
+
|
|
11
|
+
module Foo #:nodoc:
|
|
12
|
+
module Acts #:nodoc:
|
|
13
|
+
module Indexed #:nodoc:
|
|
14
|
+
|
|
15
|
+
def self.included(mod)
|
|
16
|
+
mod.extend(ClassMethods)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
module ClassMethods
|
|
20
|
+
|
|
21
|
+
# Declares a class as searchable.
|
|
22
|
+
#
|
|
23
|
+
# ====options:
|
|
24
|
+
# fields:: Names of fields to include in the index. Symbols pointing to
|
|
25
|
+
# instance methods of your model may also be given here.
|
|
26
|
+
# index_file_depth:: Tuning value for the index partitioning. Larger
|
|
27
|
+
# values result in quicker searches, but slower
|
|
28
|
+
# indexing. Default is 3.
|
|
29
|
+
# min_word_size:: Sets the minimum length for a word in a query. Words
|
|
30
|
+
# shorter than this value are ignored in searches
|
|
31
|
+
# unless preceded by the '+' operator. Default is 3.
|
|
32
|
+
# index_file:: Sets the location for the index. By default this is
|
|
33
|
+
# RAILS_ROOT/index. Specify as an array. Heroku, for
|
|
34
|
+
# example would use RAILS_ROOT/tmp/index, which would be
|
|
35
|
+
# set as [RAILS_ROOT,'tmp','index]
|
|
36
|
+
|
|
37
|
+
def acts_as_indexed(options = {})
|
|
38
|
+
class_eval do
|
|
39
|
+
extend Foo::Acts::Indexed::SingletonMethods
|
|
40
|
+
end
|
|
41
|
+
include Foo::Acts::Indexed::InstanceMethods
|
|
42
|
+
|
|
43
|
+
after_create :add_to_index
|
|
44
|
+
before_update :update_index
|
|
45
|
+
after_destroy :remove_from_index
|
|
46
|
+
|
|
47
|
+
cattr_accessor :aai_config
|
|
48
|
+
|
|
49
|
+
# default config
|
|
50
|
+
self.aai_config = {
|
|
51
|
+
:index_file => [RAILS_ROOT,'index'],
|
|
52
|
+
:index_file_depth => 3,
|
|
53
|
+
:min_word_size => 3,
|
|
54
|
+
:fields => []
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
aai_config[:index_file] += [RAILS_ENV,name]
|
|
58
|
+
|
|
59
|
+
aai_config.merge!(options)
|
|
60
|
+
|
|
61
|
+
raise(ArgumentError, 'no fields specified') unless aai_config.include?(:fields)
|
|
62
|
+
raise(ArgumentError, 'index_file_depth cannot be less than one (1)') if aai_config[:index_file_depth].to_i < 1
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Adds the passed +record+ to the index. Index is built if it does not already exist. Clears the query cache.
|
|
66
|
+
|
|
67
|
+
def index_add(record)
|
|
68
|
+
build_index if !File.exists?(File.join(aai_config[:index_file]))
|
|
69
|
+
index = SearchIndex.new(aai_config[:index_file], aai_config[:index_file_depth], aai_config[:fields], aai_config[:min_word_size])
|
|
70
|
+
index.add_record(record)
|
|
71
|
+
index.save
|
|
72
|
+
@query_cache = {}
|
|
73
|
+
true
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Removes the passed +record+ from the index. Clears the query cache.
|
|
77
|
+
|
|
78
|
+
def index_remove(record)
|
|
79
|
+
index = SearchIndex.new(aai_config[:index_file], aai_config[:index_file_depth], aai_config[:fields], aai_config[:min_word_size])
|
|
80
|
+
# record won't be in index if it doesn't exist. Just return true.
|
|
81
|
+
return true if !index.exists?
|
|
82
|
+
index.remove_record(record)
|
|
83
|
+
index.save
|
|
84
|
+
@query_cache = {}
|
|
85
|
+
true
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Updates the index.
|
|
89
|
+
# 1. Removes the previous version of the record from the index
|
|
90
|
+
# 2. Adds the new version to the index.
|
|
91
|
+
|
|
92
|
+
def index_update(record)
|
|
93
|
+
build_index if !File.exists?(File.join(aai_config[:index_file]))
|
|
94
|
+
index = SearchIndex.new(aai_config[:index_file], aai_config[:index_file_depth], aai_config[:fields], aai_config[:min_word_size])
|
|
95
|
+
#index.remove_record(find(record.id))
|
|
96
|
+
#index.add_record(record)
|
|
97
|
+
index.update_record(record,find(record.id))
|
|
98
|
+
index.save
|
|
99
|
+
@query_cache = {}
|
|
100
|
+
true
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Finds instances matching the terms passed in +query+. Terms are ANDed by
|
|
104
|
+
# default. Returns an array of model instances or, if +ids_only+ is
|
|
105
|
+
# true, an array of integer IDs.
|
|
106
|
+
#
|
|
107
|
+
# Keeps a cache of matched IDs for the current session to speed up
|
|
108
|
+
# multiple identical searches.
|
|
109
|
+
#
|
|
110
|
+
# ====find_options
|
|
111
|
+
# Same as ActiveRecord#find options hash. An :order key will override
|
|
112
|
+
# the relevance ranking
|
|
113
|
+
#
|
|
114
|
+
# ====options
|
|
115
|
+
# ids_only:: Method returns an array of integer IDs when set to true.
|
|
116
|
+
# no_query_cache:: Turns off the query cache when set to true. Useful for testing.
|
|
117
|
+
|
|
118
|
+
def search_index(query, find_options={}, options={})
|
|
119
|
+
# Clear the query cache off if the key is set.
|
|
120
|
+
@query_cache = {} if (options.has_key?('no_query_cache') || options[:no_query_cache])
|
|
121
|
+
if !@query_cache || !@query_cache[query]
|
|
122
|
+
logger.debug('Query not in cache, running search.')
|
|
123
|
+
build_index if !File.exists?(File.join(aai_config[:index_file]))
|
|
124
|
+
index = SearchIndex.new(aai_config[:index_file], aai_config[:index_file_depth], aai_config[:fields], aai_config[:min_word_size])
|
|
125
|
+
@query_cache = {} if !@query_cache
|
|
126
|
+
@query_cache[query] = index.search(query)
|
|
127
|
+
else
|
|
128
|
+
logger.debug('Query held in cache.')
|
|
129
|
+
end
|
|
130
|
+
return @query_cache[query].sort.reverse.map(&:first) if (options.has_key?(:ids_only) && options[:ids_only]) || @query_cache[query].empty?
|
|
131
|
+
|
|
132
|
+
# slice up the results by offset and limit
|
|
133
|
+
offset = find_options[:offset] || 0
|
|
134
|
+
limit = find_options.include?(:limit) ? find_options[:limit] : @query_cache[query].size
|
|
135
|
+
part_query = @query_cache[query].sort.reverse.slice(offset,limit).map(&:first)
|
|
136
|
+
|
|
137
|
+
# Set these to nil as we are dealing with the pagination by setting
|
|
138
|
+
# exactly what records we want.
|
|
139
|
+
find_options[:offset] = nil
|
|
140
|
+
find_options[:limit] = nil
|
|
141
|
+
|
|
142
|
+
with_scope :find => find_options do
|
|
143
|
+
# Doing the find like this eliminates the possibility of errors occuring
|
|
144
|
+
# on either missing records (out-of-sync) or an empty results array.
|
|
145
|
+
records = find(:all, :conditions => [ "#{class_name.tableize}.id IN (?)", part_query])
|
|
146
|
+
|
|
147
|
+
if find_options.include?(:order)
|
|
148
|
+
records # Just return the records without ranking them.
|
|
149
|
+
else
|
|
150
|
+
# Results come back in random order from SQL, so order again.
|
|
151
|
+
ranked_records = {}
|
|
152
|
+
records.each do |r|
|
|
153
|
+
ranked_records[r] = @query_cache[query][r.id]
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
ranked_records.to_a.sort_by{|a| a.last }.reverse.map(&:first)
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
private
|
|
163
|
+
|
|
164
|
+
# Builds an index from scratch for the current model class.
|
|
165
|
+
def build_index
|
|
166
|
+
increment = 500
|
|
167
|
+
offset = 0
|
|
168
|
+
while (records = find(:all, :limit => increment, :offset => offset)).size > 0
|
|
169
|
+
#p "offset is #{offset}, increment is #{increment}"
|
|
170
|
+
index = SearchIndex.new(aai_config[:index_file], aai_config[:index_file_depth], aai_config[:fields], aai_config[:min_word_size])
|
|
171
|
+
offset += increment
|
|
172
|
+
index.add_records(records)
|
|
173
|
+
index.save
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# Adds model class singleton methods.
|
|
180
|
+
module SingletonMethods
|
|
181
|
+
|
|
182
|
+
# Finds instances matching the terms passed in +query+.
|
|
183
|
+
#
|
|
184
|
+
# See Foo::Acts::Indexed::ClassMethods#search_index.
|
|
185
|
+
def find_with_index(query='', find_options = {}, options = {})
|
|
186
|
+
search_index(query, find_options, options)
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Adds model class instance methods.
|
|
192
|
+
# Methods are called automatically by ActiveRecord on +save+, +destroy+,
|
|
193
|
+
# and +update+ of model instances.
|
|
194
|
+
module InstanceMethods
|
|
195
|
+
|
|
196
|
+
# Adds the current model instance to index.
|
|
197
|
+
# Called by ActiveRecord on +save+.
|
|
198
|
+
def add_to_index
|
|
199
|
+
self.class.index_add(self)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
# Removes the current model instance to index.
|
|
203
|
+
# Called by ActiveRecord on +destroy+.
|
|
204
|
+
def remove_from_index
|
|
205
|
+
self.class.index_remove(self)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
# Updates current model instance index.
|
|
209
|
+
# Called by ActiveRecord on +update+.
|
|
210
|
+
def update_index
|
|
211
|
+
self.class.index_update(self)
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
# reopen ActiveRecord and include all the above to make
|
|
220
|
+
# them available to all our models if they want it
|
|
221
|
+
|
|
222
|
+
ActiveRecord::Base.class_eval do
|
|
223
|
+
include Foo::Acts::Indexed
|
|
224
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# ActsAsIndexed
|
|
2
|
+
# Copyright (c) 2007 Douglas F Shearer.
|
|
3
|
+
# http://douglasfshearer.com
|
|
4
|
+
# Distributed under the MIT license as included with this plugin.
|
|
5
|
+
|
|
6
|
+
module Foo #:nodoc:
|
|
7
|
+
module Acts #:nodoc:
|
|
8
|
+
module Indexed #:nodoc:
|
|
9
|
+
class SearchAtom
|
|
10
|
+
|
|
11
|
+
# Contains a hash of records.
|
|
12
|
+
# { 'record_id' => [pos1, pos2, pos] }
|
|
13
|
+
#--
|
|
14
|
+
# Weighting:
|
|
15
|
+
# http://www.perlmonks.com/index.pl?node_id=27509
|
|
16
|
+
# W(T, D) = tf(T, D) * log ( DN / df(T))
|
|
17
|
+
# weighting = frequency_in_this_record * log (total_number_of_records / number_of_matching_records)
|
|
18
|
+
|
|
19
|
+
def initialize
|
|
20
|
+
@records = {}
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Returns true if the given record is present.
|
|
24
|
+
def include_record?(record_id)
|
|
25
|
+
@records.include?(record_id)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Adds +record_id+ to the stored records.
|
|
29
|
+
def add_record(record_id)
|
|
30
|
+
@records[record_id] = [] if !include_record?(record_id)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Adds +pos+ to the array of positions for +record_id+.
|
|
34
|
+
def add_position(record_id, pos)
|
|
35
|
+
add_record(record_id)
|
|
36
|
+
@records[record_id] << pos
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Returns all record IDs stored in this Atom.
|
|
40
|
+
def record_ids
|
|
41
|
+
@records.keys
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Returns an array of positions for +record_id+ stored in this Atom.
|
|
45
|
+
def positions(record_id)
|
|
46
|
+
return @records[records] if include_record?(record_id)
|
|
47
|
+
nil
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Removes +record_id+ from this Atom.
|
|
51
|
+
def remove_record(record_id)
|
|
52
|
+
@records.delete(record_id)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Returns at atom containing the records and positions of +self+ preceded by +former+
|
|
56
|
+
# "former latter" or "big dog" where "big" is the former and "dog" is the latter.
|
|
57
|
+
def preceded_by(former)
|
|
58
|
+
matches = SearchAtom.new
|
|
59
|
+
latter = {}
|
|
60
|
+
former.record_ids.each do |rid|
|
|
61
|
+
latter[rid] = @records[rid] if @records[rid]
|
|
62
|
+
end
|
|
63
|
+
# Iterate over each record in latter.
|
|
64
|
+
latter.each do |record_id,pos|
|
|
65
|
+
|
|
66
|
+
# Iterate over each position.
|
|
67
|
+
pos.each do |p|
|
|
68
|
+
# Check if previous position is in former.
|
|
69
|
+
if former.include_position?(record_id,p-1)
|
|
70
|
+
matches.add_record(record_id) if !matches.include_record?(record_id)
|
|
71
|
+
matches.add_position(record_id,p)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end
|
|
76
|
+
return matches
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Returns a hash of record_ids and weightings for each record in the
|
|
80
|
+
# atom.
|
|
81
|
+
def weightings(records_size)
|
|
82
|
+
out = {}
|
|
83
|
+
@records.each do |r_id, pos|
|
|
84
|
+
|
|
85
|
+
# Fixes a bug when the records_size is zero. i.e. The only record
|
|
86
|
+
# contaning the word has been deleted.
|
|
87
|
+
if records_size < 1
|
|
88
|
+
out[r_id] = 0.0
|
|
89
|
+
next
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# weighting = frequency * log (records.size / records_with_atom)
|
|
93
|
+
out[r_id] = pos.size * Math.log(records_size / @records.size)
|
|
94
|
+
end
|
|
95
|
+
out
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
protected
|
|
99
|
+
|
|
100
|
+
def include_position?(record_id,pos)
|
|
101
|
+
@records[record_id].include?(pos)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|