refinerycms 0.9.6.19 → 0.9.6.21

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.
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
+ ------------------------------------------------------------------------------------------------