refinerycms 0.9.6.19 → 0.9.6.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (385) hide show
  1. data/.gems +0 -8
  2. data/.gitignore +3 -1
  3. data/Rakefile +1 -5
  4. data/VERSION +1 -1
  5. data/bin/refinery-update-core +11 -2
  6. data/config/application.rb +6 -1
  7. data/config/environments/development.rb +10 -6
  8. data/config/settings.rb +3 -0
  9. data/db/migrate/20100305023036_change_users_columns_for_authlogic.rb +46 -0
  10. data/db/migrate/20100305023037_remove_unused_users_columns.rb +16 -0
  11. data/db/migrate/20100312155331_make_user_perishable_token_nullable.rb +13 -0
  12. data/db/migrate/20100312160327_make_user_persistence_token_nullable.rb +13 -0
  13. data/db/migrate/20100315203301_remove_state_from_users.rb +9 -0
  14. data/db/schema.rb +8 -21
  15. data/db/seeds.rb +5 -19
  16. data/lib/refinery/tasks/refinery.rb +1 -1
  17. data/public/javascripts/admin.js +6 -2
  18. data/public/javascripts/jquery-ui-1.8.min.js +374 -0
  19. data/public/javascripts/jquery.js +606 -444
  20. data/public/javascripts/refinery/admin.js +30 -9
  21. data/public/javascripts/refinery/boot_wym.js +4 -0
  22. data/public/javascripts/wymeditor/jquery.refinery.wymeditor.js +3 -4
  23. data/public/stylesheets/refinery/refinery.css +11 -0
  24. data/public/stylesheets/wymeditor/skins/refinery/skin.css +3 -1
  25. data/public/stylesheets/wymeditor/skins/refinery/wymiframe.css +5 -5
  26. data/readme.md +13 -10
  27. data/test/fixtures/users.yml +5 -5
  28. data/test/functional/dashboard_controller_test.rb +0 -4
  29. data/test/functional/images_controller_test.rb +0 -3
  30. data/test/test_helper.rb +7 -3
  31. data/themes/hemingway/views/layouts/application.html.erb +1 -12
  32. data/vendor/plugins/authentication/app/controllers/admin/users_controller.rb +1 -3
  33. data/vendor/plugins/authentication/app/controllers/sessions_controller.rb +3 -14
  34. data/vendor/plugins/authentication/app/controllers/users_controller.rb +26 -37
  35. data/vendor/plugins/authentication/app/models/user.rb +29 -112
  36. data/vendor/plugins/authentication/app/models/user_mailer.rb +8 -5
  37. data/vendor/plugins/authentication/app/models/user_session.rb +9 -0
  38. data/vendor/plugins/authentication/app/views/admin/users/index.html.erb +1 -1
  39. data/vendor/plugins/authentication/app/views/sessions/new.html.erb +5 -4
  40. data/vendor/plugins/authentication/lib/authenticated_system.rb +40 -30
  41. data/vendor/plugins/authentication/rails/init.rb +9 -0
  42. data/vendor/plugins/authlogic/CHANGELOG.rdoc +345 -0
  43. data/vendor/plugins/authlogic/LICENSE +20 -0
  44. data/vendor/plugins/authlogic/README.rdoc +246 -0
  45. data/vendor/plugins/authlogic/Rakefile +42 -0
  46. data/vendor/plugins/authlogic/VERSION.yml +5 -0
  47. data/vendor/plugins/authlogic/authlogic.gemspec +217 -0
  48. data/vendor/plugins/authlogic/generators/session/session_generator.rb +9 -0
  49. data/vendor/plugins/authlogic/generators/session/templates/session.rb +2 -0
  50. data/vendor/plugins/authlogic/init.rb +1 -0
  51. data/vendor/plugins/authlogic/lib/authlogic.rb +64 -0
  52. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/base.rb +107 -0
  53. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/email.rb +110 -0
  54. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/logged_in_status.rb +60 -0
  55. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/login.rb +141 -0
  56. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/magic_columns.rb +24 -0
  57. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/password.rb +355 -0
  58. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/perishable_token.rb +105 -0
  59. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/persistence_token.rb +68 -0
  60. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/restful_authentication.rb +61 -0
  61. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/session_maintenance.rb +139 -0
  62. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/single_access_token.rb +65 -0
  63. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/validations_scope.rb +32 -0
  64. data/vendor/plugins/authlogic/lib/authlogic/authenticates_many/association.rb +42 -0
  65. data/vendor/plugins/authlogic/lib/authlogic/authenticates_many/base.rb +55 -0
  66. data/vendor/plugins/authlogic/lib/authlogic/controller_adapters/abstract_adapter.rb +67 -0
  67. data/vendor/plugins/authlogic/lib/authlogic/controller_adapters/merb_adapter.rb +30 -0
  68. data/vendor/plugins/authlogic/lib/authlogic/controller_adapters/rails_adapter.rb +48 -0
  69. data/vendor/plugins/authlogic/lib/authlogic/controller_adapters/sinatra_adapter.rb +61 -0
  70. data/vendor/plugins/authlogic/lib/authlogic/crypto_providers/aes256.rb +43 -0
  71. data/vendor/plugins/authlogic/lib/authlogic/crypto_providers/bcrypt.rb +90 -0
  72. data/vendor/plugins/authlogic/lib/authlogic/crypto_providers/md5.rb +34 -0
  73. data/vendor/plugins/authlogic/lib/authlogic/crypto_providers/sha1.rb +35 -0
  74. data/vendor/plugins/authlogic/lib/authlogic/crypto_providers/sha256.rb +50 -0
  75. data/vendor/plugins/authlogic/lib/authlogic/crypto_providers/sha512.rb +50 -0
  76. data/vendor/plugins/authlogic/lib/authlogic/crypto_providers/wordpress.rb +43 -0
  77. data/vendor/plugins/authlogic/lib/authlogic/i18n.rb +83 -0
  78. data/vendor/plugins/authlogic/lib/authlogic/i18n/translator.rb +15 -0
  79. data/vendor/plugins/authlogic/lib/authlogic/random.rb +33 -0
  80. data/vendor/plugins/authlogic/lib/authlogic/regex.rb +25 -0
  81. data/vendor/plugins/authlogic/lib/authlogic/session/activation.rb +58 -0
  82. data/vendor/plugins/authlogic/lib/authlogic/session/active_record_trickery.rb +64 -0
  83. data/vendor/plugins/authlogic/lib/authlogic/session/base.rb +37 -0
  84. data/vendor/plugins/authlogic/lib/authlogic/session/brute_force_protection.rb +96 -0
  85. data/vendor/plugins/authlogic/lib/authlogic/session/callbacks.rb +99 -0
  86. data/vendor/plugins/authlogic/lib/authlogic/session/cookies.rb +130 -0
  87. data/vendor/plugins/authlogic/lib/authlogic/session/existence.rb +93 -0
  88. data/vendor/plugins/authlogic/lib/authlogic/session/foundation.rb +63 -0
  89. data/vendor/plugins/authlogic/lib/authlogic/session/http_auth.rb +58 -0
  90. data/vendor/plugins/authlogic/lib/authlogic/session/id.rb +41 -0
  91. data/vendor/plugins/authlogic/lib/authlogic/session/klass.rb +78 -0
  92. data/vendor/plugins/authlogic/lib/authlogic/session/magic_columns.rb +95 -0
  93. data/vendor/plugins/authlogic/lib/authlogic/session/magic_states.rb +59 -0
  94. data/vendor/plugins/authlogic/lib/authlogic/session/params.rb +101 -0
  95. data/vendor/plugins/authlogic/lib/authlogic/session/password.rb +240 -0
  96. data/vendor/plugins/authlogic/lib/authlogic/session/perishable_token.rb +18 -0
  97. data/vendor/plugins/authlogic/lib/authlogic/session/persistence.rb +70 -0
  98. data/vendor/plugins/authlogic/lib/authlogic/session/priority_record.rb +34 -0
  99. data/vendor/plugins/authlogic/lib/authlogic/session/scopes.rb +101 -0
  100. data/vendor/plugins/authlogic/lib/authlogic/session/session.rb +62 -0
  101. data/vendor/plugins/authlogic/lib/authlogic/session/timeout.rb +82 -0
  102. data/vendor/plugins/authlogic/lib/authlogic/session/unauthorized_record.rb +50 -0
  103. data/vendor/plugins/authlogic/lib/authlogic/session/validation.rb +82 -0
  104. data/vendor/plugins/authlogic/lib/authlogic/test_case.rb +120 -0
  105. data/vendor/plugins/authlogic/lib/authlogic/test_case/mock_controller.rb +45 -0
  106. data/vendor/plugins/authlogic/lib/authlogic/test_case/mock_cookie_jar.rb +14 -0
  107. data/vendor/plugins/authlogic/lib/authlogic/test_case/mock_logger.rb +10 -0
  108. data/vendor/plugins/authlogic/lib/authlogic/test_case/mock_request.rb +19 -0
  109. data/vendor/plugins/authlogic/lib/authlogic/test_case/rails_request_adapter.rb +30 -0
  110. data/vendor/plugins/authlogic/rails/init.rb +1 -0
  111. data/vendor/plugins/authlogic/shoulda_macros/authlogic.rb +69 -0
  112. data/vendor/plugins/authlogic/test/acts_as_authentic_test/base_test.rb +18 -0
  113. data/vendor/plugins/authlogic/test/acts_as_authentic_test/email_test.rb +97 -0
  114. data/vendor/plugins/authlogic/test/acts_as_authentic_test/logged_in_status_test.rb +36 -0
  115. data/vendor/plugins/authlogic/test/acts_as_authentic_test/login_test.rb +109 -0
  116. data/vendor/plugins/authlogic/test/acts_as_authentic_test/magic_columns_test.rb +27 -0
  117. data/vendor/plugins/authlogic/test/acts_as_authentic_test/password_test.rb +236 -0
  118. data/vendor/plugins/authlogic/test/acts_as_authentic_test/perishable_token_test.rb +90 -0
  119. data/vendor/plugins/authlogic/test/acts_as_authentic_test/persistence_token_test.rb +55 -0
  120. data/vendor/plugins/authlogic/test/acts_as_authentic_test/restful_authentication_test.rb +40 -0
  121. data/vendor/plugins/authlogic/test/acts_as_authentic_test/session_maintenance_test.rb +84 -0
  122. data/vendor/plugins/authlogic/test/acts_as_authentic_test/single_access_test.rb +44 -0
  123. data/vendor/plugins/authlogic/test/authenticates_many_test.rb +16 -0
  124. data/vendor/plugins/authlogic/test/crypto_provider_test/aes256_test.rb +14 -0
  125. data/vendor/plugins/authlogic/test/crypto_provider_test/bcrypt_test.rb +14 -0
  126. data/vendor/plugins/authlogic/test/crypto_provider_test/sha1_test.rb +23 -0
  127. data/vendor/plugins/authlogic/test/crypto_provider_test/sha256_test.rb +14 -0
  128. data/vendor/plugins/authlogic/test/crypto_provider_test/sha512_test.rb +14 -0
  129. data/vendor/plugins/authlogic/test/fixtures/companies.yml +5 -0
  130. data/vendor/plugins/authlogic/test/fixtures/employees.yml +17 -0
  131. data/vendor/plugins/authlogic/test/fixtures/projects.yml +3 -0
  132. data/vendor/plugins/authlogic/test/fixtures/users.yml +24 -0
  133. data/vendor/plugins/authlogic/test/i18n_test.rb +33 -0
  134. data/vendor/plugins/authlogic/test/libs/affiliate.rb +7 -0
  135. data/vendor/plugins/authlogic/test/libs/company.rb +6 -0
  136. data/vendor/plugins/authlogic/test/libs/employee.rb +7 -0
  137. data/vendor/plugins/authlogic/test/libs/employee_session.rb +2 -0
  138. data/vendor/plugins/authlogic/test/libs/ldaper.rb +3 -0
  139. data/vendor/plugins/authlogic/test/libs/ordered_hash.rb +9 -0
  140. data/vendor/plugins/authlogic/test/libs/project.rb +3 -0
  141. data/vendor/plugins/authlogic/test/libs/user.rb +5 -0
  142. data/vendor/plugins/authlogic/test/libs/user_session.rb +6 -0
  143. data/vendor/plugins/authlogic/test/random_test.rb +49 -0
  144. data/vendor/plugins/authlogic/test/session_test/activation_test.rb +43 -0
  145. data/vendor/plugins/authlogic/test/session_test/active_record_trickery_test.rb +36 -0
  146. data/vendor/plugins/authlogic/test/session_test/brute_force_protection_test.rb +101 -0
  147. data/vendor/plugins/authlogic/test/session_test/callbacks_test.rb +6 -0
  148. data/vendor/plugins/authlogic/test/session_test/cookies_test.rb +112 -0
  149. data/vendor/plugins/authlogic/test/session_test/credentials_test.rb +0 -0
  150. data/vendor/plugins/authlogic/test/session_test/existence_test.rb +64 -0
  151. data/vendor/plugins/authlogic/test/session_test/http_auth_test.rb +28 -0
  152. data/vendor/plugins/authlogic/test/session_test/id_test.rb +17 -0
  153. data/vendor/plugins/authlogic/test/session_test/klass_test.rb +40 -0
  154. data/vendor/plugins/authlogic/test/session_test/magic_columns_test.rb +62 -0
  155. data/vendor/plugins/authlogic/test/session_test/magic_states_test.rb +60 -0
  156. data/vendor/plugins/authlogic/test/session_test/params_test.rb +53 -0
  157. data/vendor/plugins/authlogic/test/session_test/password_test.rb +106 -0
  158. data/vendor/plugins/authlogic/test/session_test/perishability_test.rb +15 -0
  159. data/vendor/plugins/authlogic/test/session_test/persistence_test.rb +21 -0
  160. data/vendor/plugins/authlogic/test/session_test/scopes_test.rb +60 -0
  161. data/vendor/plugins/authlogic/test/session_test/session_test.rb +59 -0
  162. data/vendor/plugins/authlogic/test/session_test/timeout_test.rb +52 -0
  163. data/vendor/plugins/authlogic/test/session_test/unauthorized_record_test.rb +13 -0
  164. data/vendor/plugins/authlogic/test/session_test/validation_test.rb +23 -0
  165. data/vendor/plugins/authlogic/test/test_helper.rb +182 -0
  166. data/vendor/plugins/dashboard/app/helpers/admin/dashboard_helper.rb +1 -1
  167. data/vendor/plugins/friendly_id/Changelog.md +243 -0
  168. data/vendor/plugins/friendly_id/Contributors.md +30 -0
  169. data/vendor/plugins/friendly_id/Gemfile +2 -0
  170. data/vendor/plugins/friendly_id/Guide.md +509 -0
  171. data/vendor/plugins/friendly_id/LICENSE +19 -0
  172. data/vendor/plugins/friendly_id/README.md +76 -0
  173. data/vendor/plugins/friendly_id/Rakefile +68 -0
  174. data/vendor/plugins/friendly_id/extras/README.txt +3 -0
  175. data/vendor/plugins/friendly_id/extras/bench.rb +59 -0
  176. data/vendor/plugins/friendly_id/extras/extras.rb +31 -0
  177. data/vendor/plugins/friendly_id/extras/prof.rb +14 -0
  178. data/vendor/plugins/friendly_id/extras/template-gem.rb +26 -0
  179. data/vendor/plugins/friendly_id/extras/template-plugin.rb +28 -0
  180. data/vendor/plugins/friendly_id/friendly_id.gemspec +40 -0
  181. data/vendor/plugins/friendly_id/generators/friendly_id/friendly_id_generator.rb +28 -0
  182. data/vendor/plugins/friendly_id/generators/friendly_id/templates/create_slugs.rb +18 -0
  183. data/vendor/plugins/friendly_id/lib/friendly_id.rb +67 -0
  184. data/vendor/plugins/friendly_id/lib/friendly_id/active_record2.rb +47 -0
  185. data/vendor/plugins/friendly_id/lib/friendly_id/active_record2/configuration.rb +66 -0
  186. data/vendor/plugins/friendly_id/lib/friendly_id/active_record2/finders.rb +140 -0
  187. data/vendor/plugins/friendly_id/lib/friendly_id/active_record2/simple_model.rb +162 -0
  188. data/vendor/plugins/friendly_id/lib/friendly_id/active_record2/slug.rb +111 -0
  189. data/vendor/plugins/friendly_id/lib/friendly_id/active_record2/slugged_model.rb +323 -0
  190. data/vendor/plugins/friendly_id/lib/friendly_id/active_record2/tasks.rb +66 -0
  191. data/vendor/plugins/friendly_id/lib/friendly_id/active_record2/tasks/friendly_id.rake +19 -0
  192. data/vendor/plugins/friendly_id/lib/friendly_id/configuration.rb +132 -0
  193. data/vendor/plugins/friendly_id/lib/friendly_id/finders.rb +106 -0
  194. data/vendor/plugins/friendly_id/lib/friendly_id/slug_string.rb +292 -0
  195. data/vendor/plugins/friendly_id/lib/friendly_id/slugged.rb +91 -0
  196. data/vendor/plugins/friendly_id/lib/friendly_id/status.rb +35 -0
  197. data/vendor/plugins/friendly_id/lib/friendly_id/test.rb +175 -0
  198. data/vendor/plugins/friendly_id/lib/friendly_id/version.rb +8 -0
  199. data/vendor/plugins/friendly_id/rails/init.rb +2 -0
  200. data/vendor/plugins/friendly_id/test/active_record2/basic_slugged_model_test.rb +14 -0
  201. data/vendor/plugins/friendly_id/test/active_record2/cached_slug_test.rb +61 -0
  202. data/vendor/plugins/friendly_id/test/active_record2/core.rb +93 -0
  203. data/vendor/plugins/friendly_id/test/active_record2/custom_normalizer_test.rb +20 -0
  204. data/vendor/plugins/friendly_id/test/active_record2/custom_table_name_test.rb +22 -0
  205. data/vendor/plugins/friendly_id/test/active_record2/deprecated_test.rb +23 -0
  206. data/vendor/plugins/friendly_id/test/active_record2/scoped_model_test.rb +111 -0
  207. data/vendor/plugins/friendly_id/test/active_record2/simple_test.rb +59 -0
  208. data/vendor/plugins/friendly_id/test/active_record2/slug_test.rb +34 -0
  209. data/vendor/plugins/friendly_id/test/active_record2/slugged.rb +30 -0
  210. data/vendor/plugins/friendly_id/test/active_record2/slugged_status_test.rb +61 -0
  211. data/vendor/plugins/friendly_id/test/active_record2/sti_test.rb +22 -0
  212. data/vendor/plugins/friendly_id/test/active_record2/support/database.mysql.yml +4 -0
  213. data/vendor/plugins/friendly_id/test/active_record2/support/database.postgres.yml +6 -0
  214. data/vendor/plugins/friendly_id/test/active_record2/support/database.sqlite3.yml +2 -0
  215. data/vendor/plugins/friendly_id/test/active_record2/support/models.rb +78 -0
  216. data/vendor/plugins/friendly_id/test/active_record2/tasks_test.rb +82 -0
  217. data/vendor/plugins/friendly_id/test/active_record2/test_helper.rb +114 -0
  218. data/vendor/plugins/friendly_id/test/friendly_id_test.rb +60 -0
  219. data/vendor/plugins/friendly_id/test/slug_string_test.rb +78 -0
  220. data/vendor/plugins/friendly_id/test/test_helper.rb +9 -0
  221. data/vendor/plugins/hpricot/CHANGELOG +88 -0
  222. data/vendor/plugins/hpricot/COPYING +18 -0
  223. data/vendor/plugins/hpricot/README +275 -0
  224. data/vendor/plugins/hpricot/Rakefile +272 -0
  225. data/vendor/plugins/hpricot/ext/fast_xs/FastXsService.java +1030 -0
  226. data/vendor/plugins/hpricot/ext/fast_xs/extconf.rb +4 -0
  227. data/vendor/plugins/hpricot/ext/fast_xs/fast_xs.c +201 -0
  228. data/vendor/plugins/hpricot/ext/hpricot_scan/HpricotCss.java +831 -0
  229. data/vendor/plugins/hpricot/ext/hpricot_scan/HpricotScanService.java +2086 -0
  230. data/vendor/plugins/hpricot/ext/hpricot_scan/MANIFEST +0 -0
  231. data/vendor/plugins/hpricot/ext/hpricot_scan/extconf.rb +6 -0
  232. data/vendor/plugins/hpricot/ext/hpricot_scan/hpricot_common.rl +76 -0
  233. data/vendor/plugins/hpricot/ext/hpricot_scan/hpricot_css.c +3503 -0
  234. data/vendor/plugins/hpricot/ext/hpricot_scan/hpricot_css.java.rl +155 -0
  235. data/vendor/plugins/hpricot/ext/hpricot_scan/hpricot_css.rl +115 -0
  236. data/vendor/plugins/hpricot/ext/hpricot_scan/hpricot_scan.c +6927 -0
  237. data/vendor/plugins/hpricot/ext/hpricot_scan/hpricot_scan.h +79 -0
  238. data/vendor/plugins/hpricot/ext/hpricot_scan/hpricot_scan.java.rl +1152 -0
  239. data/vendor/plugins/hpricot/ext/hpricot_scan/hpricot_scan.rl +788 -0
  240. data/vendor/plugins/hpricot/extras/mingw-rbconfig.rb +176 -0
  241. data/vendor/plugins/hpricot/hpricot.gemspec +17 -0
  242. data/vendor/plugins/hpricot/lib/hpricot.rb +26 -0
  243. data/vendor/plugins/hpricot/lib/hpricot/blankslate.rb +63 -0
  244. data/vendor/plugins/hpricot/lib/hpricot/builder.rb +216 -0
  245. data/vendor/plugins/hpricot/lib/hpricot/elements.rb +510 -0
  246. data/vendor/plugins/hpricot/lib/hpricot/htmlinfo.rb +691 -0
  247. data/vendor/plugins/hpricot/lib/hpricot/inspect.rb +103 -0
  248. data/vendor/plugins/hpricot/lib/hpricot/modules.rb +40 -0
  249. data/vendor/plugins/hpricot/lib/hpricot/parse.rb +38 -0
  250. data/vendor/plugins/hpricot/lib/hpricot/tag.rb +219 -0
  251. data/vendor/plugins/hpricot/lib/hpricot/tags.rb +164 -0
  252. data/vendor/plugins/hpricot/lib/hpricot/traverse.rb +839 -0
  253. data/vendor/plugins/hpricot/lib/hpricot/xchar.rb +94 -0
  254. data/vendor/plugins/hpricot/setup.rb +1585 -0
  255. data/vendor/plugins/hpricot/test/files/basic.xhtml +17 -0
  256. data/vendor/plugins/hpricot/test/files/boingboing.html +2266 -0
  257. data/vendor/plugins/hpricot/test/files/cy0.html +3653 -0
  258. data/vendor/plugins/hpricot/test/files/immob.html +400 -0
  259. data/vendor/plugins/hpricot/test/files/pace_application.html +1320 -0
  260. data/vendor/plugins/hpricot/test/files/tenderlove.html +16 -0
  261. data/vendor/plugins/hpricot/test/files/uswebgen.html +220 -0
  262. data/vendor/plugins/hpricot/test/files/utf8.html +1054 -0
  263. data/vendor/plugins/hpricot/test/files/week9.html +1723 -0
  264. data/vendor/plugins/hpricot/test/files/why.xml +19 -0
  265. data/vendor/plugins/hpricot/test/load_files.rb +7 -0
  266. data/vendor/plugins/hpricot/test/nokogiri-bench.rb +64 -0
  267. data/vendor/plugins/hpricot/test/test_alter.rb +96 -0
  268. data/vendor/plugins/hpricot/test/test_builder.rb +37 -0
  269. data/vendor/plugins/hpricot/test/test_parser.rb +428 -0
  270. data/vendor/plugins/hpricot/test/test_paths.rb +25 -0
  271. data/vendor/plugins/hpricot/test/test_preserved.rb +88 -0
  272. data/vendor/plugins/hpricot/test/test_xml.rb +28 -0
  273. data/vendor/plugins/inquiries/app/controllers/admin/inquiries_controller.rb +1 -6
  274. data/vendor/plugins/inquiries/app/helpers/inquiries_helper.rb +0 -11
  275. data/vendor/plugins/inquiries/app/views/admin/inquiries/_inquiry.html.erb +10 -6
  276. data/vendor/plugins/inquiries/app/views/inquiry_mailer/confirmation.html.erb +1 -1
  277. data/vendor/plugins/inquiries/config/routes.rb +1 -1
  278. data/vendor/plugins/pages/app/controllers/admin/pages_controller.rb +16 -3
  279. data/vendor/plugins/pages/app/models/page_part.rb +9 -0
  280. data/vendor/plugins/rails_indexes/lib/indexer.rb +0 -2
  281. data/vendor/plugins/refinery/app/views/admin/_head.html.erb +2 -1
  282. data/vendor/plugins/refinery/app/views/shared/_head.html.erb +0 -1
  283. data/vendor/plugins/refinery/app/views/shared/_ie6check.html.erb +23 -11
  284. data/vendor/plugins/refinery/app/views/welcome.html.erb +1 -1
  285. data/vendor/plugins/refinery/app/views/wymiframe.html.erb +2 -1
  286. data/vendor/plugins/refinery/lib/generators/refinery/USAGE +1 -1
  287. data/vendor/plugins/refinery/lib/generators/refinery/templates/migration.rb +2 -2
  288. data/vendor/plugins/refinery/lib/generators/refinery/templates/model.rb +4 -0
  289. data/vendor/plugins/refinery/lib/generators/refinery/templates/views/admin/_form.html.erb +6 -0
  290. data/vendor/plugins/refinery/lib/generators/refinery/templates/views/show.html.erb +5 -3
  291. data/vendor/plugins/refinery/lib/refinery/application_helper.rb +2 -2
  292. data/vendor/plugins/refinery/lib/refinery/initializer.rb +4 -41
  293. data/vendor/plugins/refinery_settings/app/models/refinery_setting.rb +7 -3
  294. data/vendor/plugins/slim_scrooge/README.textile +112 -0
  295. data/vendor/plugins/slim_scrooge/Rakefile +29 -0
  296. data/vendor/plugins/slim_scrooge/VERSION.yml +5 -0
  297. data/vendor/plugins/slim_scrooge/ext/Rakefile +42 -0
  298. data/vendor/plugins/slim_scrooge/ext/extconf.rb +5 -0
  299. data/vendor/plugins/slim_scrooge/lib/slim_scrooge.rb +16 -0
  300. data/vendor/plugins/slim_scrooge/lib/slim_scrooge/callsite.rb +96 -0
  301. data/vendor/plugins/slim_scrooge/lib/slim_scrooge/callsites.rb +70 -0
  302. data/vendor/plugins/slim_scrooge/lib/slim_scrooge/monitored_hash.rb +103 -0
  303. data/vendor/plugins/slim_scrooge/lib/slim_scrooge/result_set.rb +38 -0
  304. data/vendor/plugins/slim_scrooge/lib/slim_scrooge/simple_set.rb +34 -0
  305. data/vendor/plugins/slim_scrooge/lib/slim_scrooge/slim_scrooge.rb +46 -0
  306. data/vendor/plugins/slim_scrooge/rails/init.rb +8 -0
  307. data/vendor/plugins/slim_scrooge/slim_scrooge.gemspec +62 -0
  308. data/vendor/plugins/slim_scrooge/slim_scrooge_windows.gemspec +59 -0
  309. data/vendor/plugins/slim_scrooge/test/active_record_setup.rb +3 -0
  310. data/vendor/plugins/slim_scrooge/test/helper.rb +91 -0
  311. data/vendor/plugins/slim_scrooge/test/models/course.rb +2 -0
  312. data/vendor/plugins/slim_scrooge/test/schema/schema.rb +5 -0
  313. data/vendor/plugins/slim_scrooge/test/setup.rb +5 -0
  314. data/vendor/plugins/themes/app/models/theme.rb +7 -0
  315. data/vendor/plugins/themes/lib/theme_server.rb +3 -1
  316. data/vendor/plugins/themes/rails/init.rb +16 -13
  317. data/vendor/plugins/will_paginate/.manifest +43 -0
  318. data/vendor/plugins/will_paginate/CHANGELOG.rdoc +139 -0
  319. data/vendor/plugins/will_paginate/LICENSE +18 -0
  320. data/vendor/plugins/will_paginate/README.rdoc +107 -0
  321. data/vendor/plugins/will_paginate/Rakefile +53 -0
  322. data/vendor/plugins/will_paginate/examples/apple-circle.gif +0 -0
  323. data/vendor/plugins/will_paginate/examples/index.haml +69 -0
  324. data/vendor/plugins/will_paginate/examples/index.html +92 -0
  325. data/vendor/plugins/will_paginate/examples/pagination.css +90 -0
  326. data/vendor/plugins/will_paginate/examples/pagination.sass +91 -0
  327. data/vendor/plugins/will_paginate/init.rb +1 -0
  328. data/vendor/plugins/will_paginate/lib/will_paginate.rb +90 -0
  329. data/vendor/plugins/will_paginate/lib/will_paginate/array.rb +16 -0
  330. data/vendor/plugins/will_paginate/lib/will_paginate/collection.rb +146 -0
  331. data/vendor/plugins/will_paginate/lib/will_paginate/core_ext.rb +43 -0
  332. data/vendor/plugins/will_paginate/lib/will_paginate/finder.rb +264 -0
  333. data/vendor/plugins/will_paginate/lib/will_paginate/named_scope.rb +170 -0
  334. data/vendor/plugins/will_paginate/lib/will_paginate/named_scope_patch.rb +37 -0
  335. data/vendor/plugins/will_paginate/lib/will_paginate/version.rb +9 -0
  336. data/vendor/plugins/will_paginate/lib/will_paginate/view_helpers.rb +408 -0
  337. data/vendor/plugins/will_paginate/test/boot.rb +21 -0
  338. data/vendor/plugins/will_paginate/test/collection_test.rb +143 -0
  339. data/vendor/plugins/will_paginate/test/console +8 -0
  340. data/vendor/plugins/will_paginate/test/database.yml +22 -0
  341. data/vendor/plugins/will_paginate/test/finder_test.rb +473 -0
  342. data/vendor/plugins/will_paginate/test/fixtures/admin.rb +3 -0
  343. data/vendor/plugins/will_paginate/test/fixtures/developer.rb +14 -0
  344. data/vendor/plugins/will_paginate/test/fixtures/developers_projects.yml +13 -0
  345. data/vendor/plugins/will_paginate/test/fixtures/project.rb +15 -0
  346. data/vendor/plugins/will_paginate/test/fixtures/projects.yml +6 -0
  347. data/vendor/plugins/will_paginate/test/fixtures/replies.yml +29 -0
  348. data/vendor/plugins/will_paginate/test/fixtures/reply.rb +7 -0
  349. data/vendor/plugins/will_paginate/test/fixtures/schema.rb +38 -0
  350. data/vendor/plugins/will_paginate/test/fixtures/topic.rb +10 -0
  351. data/vendor/plugins/will_paginate/test/fixtures/topics.yml +30 -0
  352. data/vendor/plugins/will_paginate/test/fixtures/user.rb +2 -0
  353. data/vendor/plugins/will_paginate/test/fixtures/users.yml +35 -0
  354. data/vendor/plugins/will_paginate/test/helper.rb +37 -0
  355. data/vendor/plugins/will_paginate/test/lib/activerecord_test_case.rb +43 -0
  356. data/vendor/plugins/will_paginate/test/lib/activerecord_test_connector.rb +75 -0
  357. data/vendor/plugins/will_paginate/test/lib/load_fixtures.rb +11 -0
  358. data/vendor/plugins/will_paginate/test/lib/view_test_process.rb +179 -0
  359. data/vendor/plugins/will_paginate/test/tasks.rake +59 -0
  360. data/vendor/plugins/will_paginate/test/view_test.rb +373 -0
  361. data/vendor/plugins/will_paginate/will_paginate.gemspec +19 -0
  362. metadata +308 -27
  363. data/db/migrate/20091029034951_remove_blurb_from_news_items.rb +0 -9
  364. data/public/javascripts/jquery-ui-1.8rc1.min.js +0 -375
  365. data/test/fixtures/news_items.yml +0 -14
  366. data/test/unit/news_items_test.rb +0 -33
  367. data/vendor/plugins/authentication/test/fixtures/users.yml +0 -19
  368. data/vendor/plugins/authentication/test/functional/sessions_controller_test.rb +0 -85
  369. data/vendor/plugins/authentication/test/functional/users_controller_test.rb +0 -99
  370. data/vendor/plugins/authentication/test/unit/user_test.rb +0 -164
  371. data/vendor/plugins/news/app/controllers/admin/news_items_controller.rb +0 -5
  372. data/vendor/plugins/news/app/controllers/news_items_controller.rb +0 -20
  373. data/vendor/plugins/news/app/models/news_item.rb +0 -24
  374. data/vendor/plugins/news/app/views/admin/news_items/_form.html.erb +0 -19
  375. data/vendor/plugins/news/app/views/admin/news_items/_news_item.html.erb +0 -15
  376. data/vendor/plugins/news/app/views/admin/news_items/edit.html.erb +0 -1
  377. data/vendor/plugins/news/app/views/admin/news_items/index.html.erb +0 -31
  378. data/vendor/plugins/news/app/views/admin/news_items/new.html.erb +0 -1
  379. data/vendor/plugins/news/app/views/news_items/_recent_posts.html.erb +0 -8
  380. data/vendor/plugins/news/app/views/news_items/index.html.erb +0 -17
  381. data/vendor/plugins/news/app/views/news_items/index.rss.builder +0 -26
  382. data/vendor/plugins/news/app/views/news_items/show.html.erb +0 -13
  383. data/vendor/plugins/news/config/routes.rb +0 -7
  384. data/vendor/plugins/news/news.md +0 -20
  385. data/vendor/plugins/news/rails/init.rb +0 -11
@@ -0,0 +1,30 @@
1
+ We are grateful for many contributions from the Ruby and Rails
2
+ community, in particular from the following people:
3
+
4
+ * Adam Cigánek
5
+ * Alexander Gräfe
6
+ * Alistair Holt
7
+ * Andrew Loe III
8
+ * Ben Woosley
9
+ * Bence Nagy
10
+ * Brian Collins
11
+ * Bruno Michel
12
+ * Chris Nolan
13
+ * David Ramalho
14
+ * Diego Carrion
15
+ * Diego R. V.
16
+ * Florian Aßmann
17
+ * Harry Love
18
+ * Ian Stewart
19
+ * Jesse Crouch
20
+ * Joe Van Dyk
21
+ * Johan Kok
22
+ * Josh Nichols
23
+ * Mikhail Shirkov
24
+ * Nathan Phelps
25
+ * Rdavila
26
+ * Rob Ingram
27
+ * Sean Abrahams
28
+ * Steve Luscher
29
+ * Steven Noble
30
+ * Tim Kadom
@@ -0,0 +1,2 @@
1
+ gem "mocha"
2
+ gem "rails", :git => "../rails/"
@@ -0,0 +1,509 @@
1
+ # FriendlyId Guide
2
+
3
+ * Table of Contents
4
+ {:toc}
5
+
6
+ ## Overview
7
+
8
+ FriendlyId is a Ruby gem which allows you to work with human-friendly strings
9
+ as if they were numeric ids for ActiveRecord models. This facilitates replacing
10
+ "unfriendly" URL's like
11
+
12
+ http://example.com/states/4323454
13
+
14
+ with "friendly" ones such as:
15
+
16
+ http://example.com/states/washington
17
+
18
+ ## Simple Models
19
+
20
+ The simplest way to use FriendlyId is with a model that has a uniquely indexed
21
+ column with no spaces or special characters, and that is seldom or never
22
+ updated. The most common example of this is a user name or login column:
23
+
24
+ class User < ActiveRecord::Base
25
+ :validates_format_of :login, :with => /\A[a-z0-9]\z/i
26
+ has_friendly_id :login
27
+ end
28
+
29
+ @user = User.find "joe" # the old User.find(1) still works, too
30
+ @user.to_param # returns "joe"
31
+ redirect_to @user # the URL will be /users/joe
32
+
33
+ In this case, FriendlyId assumes you want to use the column as-is; FriendlyId
34
+ will never modify the value of the column, and your application must ensure
35
+ that the value is admissible in a URL:
36
+
37
+ class City < ActiveRecord::Base
38
+ has_friendly_id :name
39
+ end
40
+
41
+ @city.find "Viña del Mar"
42
+ redirect_to @city # the URL will be /cities/Viña%20del%20Mar
43
+
44
+ For this reason, it is often more convenient to use Slugs rather than a single
45
+ column.
46
+
47
+ ## Slugged Models
48
+
49
+ FriendlyId uses a separate table to store slugs for models which require some
50
+ processing of the friendly_id text. The most common example is a blog post's
51
+ title, which may have spaces, uppercase characters, or other attributes you
52
+ wish to modify to make them more suitable for use in URL's.
53
+
54
+ class Post < ActiveRecord::Base
55
+ has_friendly_id :title, :use_slug => true
56
+ end
57
+
58
+ @post = Post.create(:title => "This is the first post!")
59
+ @post.friendly_id # returns "this-is-the-first-post"
60
+ redirect_to @post # the URL will be /posts/this-is-the-first-post
61
+
62
+ If you are unsure whether to use slugs, then your best bet is to use them,
63
+ because FriendlyId provides many useful features that only work with slugs.
64
+ These features are explained in detail {file:Guide.md#features below}.
65
+
66
+ ## Installation
67
+
68
+ FriendlyId can be installed as a gem, or as a Rails plugin. It is compatible
69
+ with Rails 2.2.x, 2.3.x. Support for Rails 3.x is in progress.
70
+
71
+ ### As a Gem
72
+
73
+ gem install friendly_id
74
+
75
+ #### Rails 2.2.x - 2.3.x
76
+
77
+ After installing the gem, add an entry in environment.rb:
78
+
79
+ config.gem "friendly_id", :version => ">= 2.3"
80
+
81
+ ### As a Plugin
82
+
83
+ Plugin installation is simple for all supported versions of Rails:
84
+
85
+ ./script/plugin install git://github.com/norman/friendly_id.git
86
+
87
+ However, installing as a gem offers simpler version control than plugin
88
+ installation. Whenever possible, install as a gem instead. Plugin support will
89
+ probably be removed in version 3.0.
90
+
91
+ ### Setup
92
+
93
+ After installing either as a gem or plugin, run:
94
+
95
+ ./script/generate friendly_id
96
+ rake db:migrate
97
+
98
+ This will install the Rake tasks and slug migration for FriendlyId. If you are
99
+ not going to use slugs, you can do:
100
+
101
+ ./script/generate friendly_id --skip-migration
102
+
103
+ FriendlyId is now set up and ready for you to use.
104
+
105
+ ## Configuration
106
+
107
+ FriendlyId is configured in your model using the `has_friendly_id` method:
108
+
109
+ has_friendly_id :a_column_or_method options_hash
110
+
111
+ class Post < ActiveRecord::Base
112
+ # use the "title" column as the basis of the friendly_id, and use slugs
113
+ has_friendly_id :title, :use_slug => true,
114
+ # remove accents and other diacritics from Western characters
115
+ :approximate_ascii => true,
116
+ # don't use slugs longer than 50 chars
117
+ :max_length => 50
118
+ end
119
+
120
+ Read on to learn about the various features that can be configured. For the
121
+ full list of valid configuration options, see the instance attribute summary
122
+ for {FriendlyId::Configuration}.
123
+
124
+ # Features
125
+
126
+ ## FriendlyId Strings
127
+
128
+ FriendlyId comes with {FriendlyId::SlugString excellent support for Unicode
129
+ strings}. When using slugs, FriendlyId will automatically modify the slug text
130
+ to make it more suitable for use in a URL:
131
+
132
+ class City < ActiveRecord::Base
133
+ has_friendly_id :name, :use_slug => true
134
+ end
135
+
136
+ @city.create :name => "Viña del Mar"
137
+ @city.friendly_id # will be "viña-del-mar"
138
+
139
+ By default, the string is {FriendlyId::SlugString#downcase! downcased} and
140
+ {FriendlyId::SlugString#clean! stripped}, {FriendlyId::SlugString#with_dashes! spaces are replaced with dashes},
141
+ and {FriendlyId::SlugString#word_chars! non-word characters are removed}.
142
+
143
+ ### Replacing Accented Characters
144
+
145
+ If your strings use Western characters, you can use the `:approximate_ascii` option to remove
146
+ accents and other diacritics:
147
+
148
+ class City < ActiveRecord::Base
149
+ has_friendly_id :name, :use_slug => true, :approximate_ascii => true
150
+ end
151
+
152
+ @city.create :name => "Łódź, Poland"
153
+ @city.friendly_id # will be "lodz-poland"
154
+
155
+ There are special options for some languages:
156
+
157
+ ### German Approximations
158
+
159
+ class Person < ActiveRecord::Base
160
+ has_friendly_id :name, :use_slug => true, :approximate_ascii => true,
161
+ :ascii_approximation_options => :german
162
+ end
163
+
164
+ @person.create :name => "Jürgen Müller"
165
+ @person.friendly_id # will be "juergen-mueller"
166
+
167
+ ### Spanish Approximations
168
+
169
+ class Post < ActiveRecord::Base
170
+ has_friendly_id :title, :use_slug => true, :approximate_ascii => true,
171
+ :ascii_approximation_options => :spanish
172
+ end
173
+
174
+ @post.create(:title => "¡Feliz año!")
175
+ @post.title # will be "feliz-anno"
176
+
177
+ ### Approximations for Other Languages
178
+
179
+ You can add custom approximations for your language by adding Hash of
180
+ approximations to {FriendlyId::SlugString::APPROXIMATIONS}. The approximations
181
+ must be listed as Unicode decimal numbers, and arrays of numbers.
182
+
183
+ ### Unicode Slugs
184
+
185
+ By default, any character outside the Unicode Western character sets will be
186
+ passed through untouched, allowing you to have slugs in Arabic, Japanese,
187
+ Greek, etc:
188
+
189
+ @post.create :title => "katakana: ゲコゴサザシジ!"
190
+ @post.friendly_id # will be: "katakana-ゲコゴサザシジ"
191
+
192
+ ### ASCII Slugs
193
+
194
+ You can also configure FriendlyId using `:strip_non_ascii` to completely delete
195
+ any non-ascii characters:
196
+
197
+ class Post < ActiveRecord::Base
198
+ has_friendly_id :title, :use_slug => true, :strip_non_ascii => true
199
+ end
200
+
201
+ @post.create :title => "katakana: ゲコゴサザシジ!"
202
+ @post.friendly_id # will be: "katakana"
203
+
204
+
205
+ ### Using a Custom Method to Generate the Slug Text
206
+
207
+ FriendlyId can use either a column or a method to generate the slug text for
208
+ your model:
209
+
210
+ class City < ActiveRecord::Base
211
+
212
+ belongs_to :country
213
+ has_friendly_id :name_and_country, :use_slug => true
214
+
215
+ def name_and_country
216
+ #{name} #{country.name}
217
+ end
218
+
219
+ end
220
+
221
+ @country = Country.create(:name => "Argentina")
222
+ @city = City.create(:name => "Buenos Aires", :country => @country)
223
+ @city.friendly_id # will be "buenos-aires-argentina"
224
+
225
+ One word of caution: in the example above, if the country's name were updated,
226
+ say, to "Argentine Republic", the city's friendly_id would not be
227
+ automatically updated. For this reason, it's a good idea to avoid using
228
+ frequently-updated relations as a part of the friendly_id.
229
+
230
+ ## Using a Custom Method to Process the Slug Text
231
+
232
+ If the built-in slug text handling options don't work for your application,
233
+ you can override the `normalize_friendly_id` method in your model class in
234
+ order to fine-tune the output:
235
+
236
+ class City < ActiveRecord::Base
237
+
238
+ def normalize_friendly_id(text)
239
+ my_text_modifier_method(text)
240
+ end
241
+
242
+ end
243
+
244
+ The normalize_friendly_id method takes a single argument and receives an
245
+ instance of {FriendlyId::SlugString}, a class which wraps a regular Ruby
246
+ string with some additional formatting options inherits Multibyte support from
247
+ ActiveSupport::Multibyte::Chars.
248
+
249
+ ### Converting non-Western characters to ASCII with Stringex
250
+
251
+ Stringex is a library which provides some interesting options for transliterating
252
+ non-Western strings to ASCII:
253
+
254
+ "你好".to_url => "ni-hao"
255
+
256
+ Using Stringex with FriendlyId is a simple matter of installing and requiring
257
+ the `stringex` gem, and overriding the `normalize_friendly_id` method in your
258
+ model:
259
+
260
+ class City < ActiveRecord::Base
261
+
262
+ def normalize_friendly_id(text)
263
+ text.to_url
264
+ end
265
+
266
+ end
267
+
268
+ ## Redirecting to the Current Friendly URL
269
+
270
+ FriendlyId maintains a history of your record's older slugs, so if your
271
+ record's friendly_id changes, your URL's won't break. It offers several
272
+ methods to determine whether the model instance was found using the most
273
+ recent friendly_id. This helps you redirect to your "unfriendly" URL's to your
274
+ new "friendly" ones when adding FriendlyId to an existing application:
275
+
276
+ class PostsController < ApplicationController
277
+
278
+ before_filter ensure_current_post_url, :only => :show
279
+
280
+ ...
281
+
282
+ def ensure_current_post_url
283
+ redirect_to @post, :status => :moved_permanently unless @post.friendly_id_status.best?
284
+ end
285
+
286
+ end
287
+
288
+ For more information, take a look at the documentation for {FriendlyId::Status}.
289
+
290
+ ## Non-unique Slugs
291
+
292
+ FriendlyId will append a arbitrary number to the end of the id to keep it
293
+ unique if necessary:
294
+
295
+ /posts/new-version-released
296
+ /posts/new-version-released--2
297
+ /posts/new-version-released--3
298
+ ...
299
+ etc.
300
+
301
+ Note that the number is preceded by "--" to distinguish it from the
302
+ rest of the slug. This is important to enable having slugs like:
303
+
304
+ /cars/peugeot-206
305
+ /cars/peugeot-206--2
306
+
307
+ You can configure the separator string used by your model by setting the
308
+ `:sequence_separator` option in `has_friendly_id`:
309
+
310
+ has_friendly_id :title, :use_slug => true, :sequence_separator => ";"
311
+
312
+ You can also override the default used in
313
+ {FriendlyId::Configuration::DEFAULTS} to set the value for any model using
314
+ FriendlyId. If you change this value in an existing application, be sure to
315
+ {file:Guide.md#regenerating_slugs regenerate the slugs} afterwards.
316
+
317
+ ## Reserved Words
318
+
319
+ You can configure a list of strings as reserved so that, for example, you
320
+ don't end up with this problem:
321
+
322
+ /users/joe-schmoe # A user chose "joe schmoe" as his user name - no worries.
323
+ /users/new # A user chose "new" as his user name, and now no one can sign up.
324
+
325
+ Reserved words are configured using the `:reserved_words` option:
326
+
327
+ class Restaurant < ActiveRecord::Base
328
+ belongs_to :city
329
+ has_friendly_id :name, :use_slug => true, :reserved_words => ["my", "values"]
330
+ end
331
+
332
+ The strings "new" and "index" are reserved by default. When you attempt to
333
+ store a reserved value, FriendlyId raises a
334
+ {FriendlyId::ReservedError}. You can also override the default
335
+ reserved words in {FriendlyId::Configuration::DEFAULTS} to set the value for any
336
+ model using FriendlyId.
337
+
338
+ ## Caching the FriendlyId Slug for Better Performance
339
+
340
+ Checking the slugs table all the time has an impact on performance, so as of
341
+ 2.2.0, FriendlyId offers slug caching.
342
+
343
+ ### Automatic setup
344
+
345
+ To enable slug caching, simply add a column named "cached_slug" to your model.
346
+ FriendlyId will automatically use this column if it detects it:
347
+
348
+ class AddCachedSlugToUsers < ActiveRecord::Migration
349
+ def self.up
350
+ add_column :users, :cached_slug, :string
351
+ end
352
+
353
+ def self.down
354
+ remove_column :users, :cached_slug
355
+ end
356
+ end
357
+
358
+ Then, redo the slugs:
359
+
360
+ rake friendly_id:redo_slugs MODEL=User
361
+
362
+ FriendlyId will also query against the cache column if it's available, which
363
+ can significantly improve the performance of many queries, particularly when
364
+ passing an array of friendly ids to #find.
365
+
366
+ A few warnings when using this feature:
367
+
368
+ * *DO NOT* forget to redo the slugs, or else this feature will not work!
369
+ * This feature uses `attr_protected` to protect the `cached_slug` column,
370
+ unless you have already invoked `attr_accessible`. If you wish to use
371
+ `attr_accessible`, you must invoke it BEFORE you invoke `has_friendly_id` in
372
+ your class.
373
+ * FriendlyId can not query against the slug cache when you pass a :scope
374
+ argument to #find. Try to avoid passing an array of friendly id's and a
375
+ scope to #find, as this will result in weak performance.
376
+
377
+ ### Using a custom column name
378
+
379
+ You can also use a different name for the column if you choose, via the
380
+ `:cache_column` config option:
381
+
382
+ class User < ActiveRecord::Base
383
+ has_friendly_id :name, :use_slug => true, :cache_column => 'my_cached_slug'
384
+ end
385
+
386
+
387
+ ## Scoped Slugs
388
+
389
+ FriendlyId can generate unique slugs within a given scope. For example, assume
390
+ you have an application that displays restaurants. Without scoped slugs, if
391
+ two restaurants are named "Joe's Diner," the second one will end up with
392
+ "joes-diner--2" as its friendly_id. Using scoped allows you to keep the
393
+ slug names unique for each city, so that the second "Joe's Diner" could have
394
+ the slug "joes-diner" if it's located in a different city:
395
+
396
+ class Restaurant < ActiveRecord::Base
397
+ belongs_to :city
398
+ has_friendly_id :name, :use_slug => true, :scope => :city
399
+ end
400
+
401
+ class City < ActiveRecord::Base
402
+ has_many :restaurants
403
+ has_friendly_id :name, :use_slug => true
404
+ end
405
+
406
+ http://example.org/cities/seattle/restaurants/joes-diner
407
+ http://example.org/cities/chicago/restaurants/joes-diner
408
+
409
+ Restaurant.find("joes-diner", :scope => "seattle") # returns 1 record
410
+ Restaurant.find("joes-diner", :scope => "chicago") # returns 1 record
411
+ Restaurant.find("joes-diner") # returns both records
412
+
413
+ The value for the `:scope` key in your model can be a custom method you
414
+ define, or the name of a relation. If it's the name of a relation, then the
415
+ scope's text value will be the result of calling `to_param` on the related
416
+ model record. In the example above, the city model also uses FriendlyId and so
417
+ its `to_param` method returns its friendly_id: "chicago" or "seattle".
418
+
419
+ ### Updating a Relation's Scoped Slugs
420
+
421
+ When using a relation as the scope, updating the relation will update the
422
+ slugs, but only if both models have specified the relationship. In the above
423
+ example, updates to City will update the slugs for Restaurant because City
424
+ specifies that it `has_many :restaurants`.
425
+
426
+ ### Routes for Scoped Models
427
+
428
+ Note that FriendlyId does not set up any routes for scoped models; you must
429
+ do this yourself in your application. Here's an example of one way to set
430
+ this up:
431
+
432
+ # in routes.rb
433
+ map.resources :restaurants
434
+ map.restaurant "/restaurants/:scope/:id", :controller => "restaurants"
435
+
436
+ # in views
437
+ link_to 'Show', restaurant_path(restaurant.city, restaurant)
438
+
439
+ # in controllers
440
+ @restaurant = Restaurant.find(params[:id], :scope => params[:scope])
441
+
442
+
443
+ ## FriendlyId Rake Tasks
444
+
445
+ FriendlyId provides several tasks to help maintain your application.
446
+
447
+ ### Generating New Slugs For the First Time
448
+
449
+ friendly_id:make_slugs MODEL=<model name>
450
+
451
+ Use this task to generate slugs after installing FriendlyId in a new
452
+ application.
453
+
454
+ ### Regenerating Slugs
455
+
456
+ friendly_id:redo_slugs MODEL=<model name>
457
+
458
+ Use this task to regenerate slugs after making any changes to your model's
459
+ FriendlyId configuration options that affect slug generation. For example,
460
+ if you introduce a `cached_slug` column or change the `:seqence_separator`.
461
+
462
+ ### Deleting Old Slugs
463
+
464
+ rake friendly_id:remove_old_slugs MODEL=<model name> DAYS=<days>
465
+
466
+ Use this task if you wish to delete expired slugs; manually or perhaps via
467
+ cron. If you don't specify the days option, the default is to remove unused
468
+ slugs older than 45 days.
469
+
470
+ # Hacking FriendlyId
471
+
472
+ A couple of notes for programmers intending to work on FriendlyId:
473
+
474
+ If you intend to send a pull request, in general it's best to make minor
475
+ changes in the master branch, and major changes in the edge branch.
476
+
477
+ Before removing any public or protected methods, FriendlyId will deprecate
478
+ them through one major release cycle. Private methods may, however, change at
479
+ any time.
480
+
481
+ ## Some Benchmarks
482
+
483
+ These benchmarks can give you an idea of FriendlyId's impact on the
484
+ performance of your application. Of course your results may vary.
485
+
486
+ Note that much of the performance difference can be attributed to finding an
487
+ SQL record by a text column. Finding a single record by numeric primary key is
488
+ always the fastest operation, and thus the best choice when possible. If you
489
+ decide not to use FriendlyId for performance reasons, keep in mind that your
490
+ own solution is unlikely to be any faster than FriendlyId with cached slugs
491
+ enabled. But if it is, then your patches would be very welcome!
492
+
493
+ ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin10.2.0]
494
+ friendly_id (2.3.0)
495
+ sqlite3 3.6.19 in-memory database
496
+ ------------------------------------------------------------------------------------------------
497
+ find model using id x10000 | 2.948 | 0 |
498
+ find model using array of ids x10000 | 6.020 | 0 |
499
+ find unslugged model using friendly id x10000 | 4.474 | 52% |
500
+ find unslugged model using array of friendly ids x10000 | 6.498 | 7% |
501
+ find slugged model using friendly id x10000 | 7.536 | 155% |
502
+ find slugged model using array of friendly ids x10000 | 18.020 | 200% |
503
+ find cached slugged model using friendly id x10000 | 4.791 | 63% |
504
+ find cached slugged model using array of friendly ids x10000 | 7.275 | 21% |
505
+ find model using id, then to_param x10000 | 2.974 | 0 |
506
+ find unslugged model using friendly id, then to_param x10000 | 4.608 | 55% |
507
+ find slugged model using friendly id, then to_param x10000 | 12.589 | 323% |
508
+ find cached slugged model using friendly id, then to_param x10000 | 5.037 | 69% |
509
+ ------------------------------------------------------------------------------------------------