radiantcms-couchrest_model 0.1

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 (2534) hide show
  1. data/CHANGELOG +544 -0
  2. data/CONTRIBUTORS +219 -0
  3. data/INSTALL +35 -0
  4. data/LICENSE +21 -0
  5. data/README +3 -0
  6. data/Rakefile +11 -0
  7. data/app/controllers/admin/extensions_controller.rb +11 -0
  8. data/app/controllers/admin/layouts_controller.rb +8 -0
  9. data/app/controllers/admin/page_parts_controller.rb +9 -0
  10. data/app/controllers/admin/pages_controller.rb +52 -0
  11. data/app/controllers/admin/preferences_controller.rb +46 -0
  12. data/app/controllers/admin/references_controller.rb +7 -0
  13. data/app/controllers/admin/resource_controller.rb +233 -0
  14. data/app/controllers/admin/snippets_controller.rb +8 -0
  15. data/app/controllers/admin/users_controller.rb +40 -0
  16. data/app/controllers/admin/welcome_controller.rb +43 -0
  17. data/app/controllers/application_controller.rb +88 -0
  18. data/app/controllers/site_controller.rb +77 -0
  19. data/app/helpers/admin/abstract_model_helper.rb +2 -0
  20. data/app/helpers/admin/export_helper.rb +2 -0
  21. data/app/helpers/admin/extensions_helper.rb +2 -0
  22. data/app/helpers/admin/layouts_helper.rb +21 -0
  23. data/app/helpers/admin/node_helper.rb +87 -0
  24. data/app/helpers/admin/pages_helper.rb +117 -0
  25. data/app/helpers/admin/preferences_helper.rb +3 -0
  26. data/app/helpers/admin/references_helper.rb +44 -0
  27. data/app/helpers/admin/regions_helper.rb +28 -0
  28. data/app/helpers/admin/snippets_helper.rb +41 -0
  29. data/app/helpers/admin/users_helper.rb +8 -0
  30. data/app/helpers/admin/welcome_helper.rb +2 -0
  31. data/app/helpers/application_helper.rb +249 -0
  32. data/app/helpers/site_helper.rb +2 -0
  33. data/app/models/file_not_found_page.rb +32 -0
  34. data/app/models/layout.rb +15 -0
  35. data/app/models/page.rb +353 -0
  36. data/app/models/page_context.rb +46 -0
  37. data/app/models/page_part.rb +21 -0
  38. data/app/models/radiant/config.rb +292 -0
  39. data/app/models/snippet.rb +19 -0
  40. data/app/models/standard_tags.rb +1321 -0
  41. data/app/models/status.rb +41 -0
  42. data/app/models/text_filter.rb +36 -0
  43. data/app/models/user.rb +97 -0
  44. data/app/models/user_action_observer.rb +13 -0
  45. data/app/views/admin/extensions/index.html.haml +41 -0
  46. data/app/views/admin/layouts/_form.html.haml +39 -0
  47. data/app/views/admin/layouts/edit.html.haml +9 -0
  48. data/app/views/admin/layouts/index.html.haml +36 -0
  49. data/app/views/admin/layouts/new.html.haml +7 -0
  50. data/app/views/admin/layouts/remove.html.haml +16 -0
  51. data/app/views/admin/page_parts/_page_part.html.haml +18 -0
  52. data/app/views/admin/pages/_fields.html.haml +61 -0
  53. data/app/views/admin/pages/_meta_row.html.haml +8 -0
  54. data/app/views/admin/pages/_node.html.haml +25 -0
  55. data/app/views/admin/pages/_popups.html.haml +27 -0
  56. data/app/views/admin/pages/children.html.haml +2 -0
  57. data/app/views/admin/pages/edit.html.haml +12 -0
  58. data/app/views/admin/pages/index.html.haml +26 -0
  59. data/app/views/admin/pages/new.html.haml +10 -0
  60. data/app/views/admin/pages/remove.html.haml +18 -0
  61. data/app/views/admin/preferences/edit.html.haml +44 -0
  62. data/app/views/admin/references/_tag_reference.haml +3 -0
  63. data/app/views/admin/references/filters.haml +6 -0
  64. data/app/views/admin/references/tags.haml +30 -0
  65. data/app/views/admin/snippets/_form.html.haml +33 -0
  66. data/app/views/admin/snippets/edit.html.haml +9 -0
  67. data/app/views/admin/snippets/index.html.haml +34 -0
  68. data/app/views/admin/snippets/new.html.haml +7 -0
  69. data/app/views/admin/snippets/remove.html.haml +17 -0
  70. data/app/views/admin/users/_avatar.html.haml +5 -0
  71. data/app/views/admin/users/_form.html.haml +53 -0
  72. data/app/views/admin/users/_password_fields.html.haml +18 -0
  73. data/app/views/admin/users/edit.html.haml +9 -0
  74. data/app/views/admin/users/index.html.haml +39 -0
  75. data/app/views/admin/users/new.html.haml +6 -0
  76. data/app/views/admin/users/remove.html.haml +16 -0
  77. data/app/views/admin/welcome/login.html.haml +23 -0
  78. data/app/views/layouts/application.html.haml +55 -0
  79. data/app/views/site/not_found.html.haml +3 -0
  80. data/bin/radiant +53 -0
  81. data/config/boot.rb +162 -0
  82. data/config/cucumber.yml +7 -0
  83. data/config/database.db2.yml +23 -0
  84. data/config/database.mysql.yml +28 -0
  85. data/config/database.postgresql.yml +28 -0
  86. data/config/database.sqlite.yml +19 -0
  87. data/config/database.sqlserver.yml +23 -0
  88. data/config/environment.rb +92 -0
  89. data/config/environments/cucumber.rb +29 -0
  90. data/config/environments/development.rb +17 -0
  91. data/config/environments/production.rb +24 -0
  92. data/config/environments/test.rb +38 -0
  93. data/config/initializers/haml.rb +2 -0
  94. data/config/locales/en.yml +227 -0
  95. data/config/locales/en_available_tags.yml +621 -0
  96. data/config/routes.rb +41 -0
  97. data/db/migrate/001_create_radiant_tables.rb +75 -0
  98. data/db/migrate/002_insert_initial_data.rb +12 -0
  99. data/db/migrate/003_rename_behavior_column.rb +9 -0
  100. data/db/migrate/004_rename_filter_column.rb +11 -0
  101. data/db/migrate/005_add_virtual_column_to_page.rb +9 -0
  102. data/db/migrate/006_integer_columns_to_boolean.rb +36 -0
  103. data/db/migrate/007_remove_virtual_column_from_page.rb +9 -0
  104. data/db/migrate/008_add_virtual_column_to_page_again.rb +9 -0
  105. data/db/migrate/009_add_content_type_field_to_layout.rb +9 -0
  106. data/db/migrate/010_merge_behaviors_and_pages.rb +57 -0
  107. data/db/migrate/011_rename_type_column_on_page_to_class_name.rb +9 -0
  108. data/db/migrate/012_create_extension_meta.rb +13 -0
  109. data/db/migrate/013_add_notes_field_to_user.rb +9 -0
  110. data/db/migrate/014_rename_config_default_parts_key.rb +17 -0
  111. data/db/migrate/015_add_optimistic_locking.rb +15 -0
  112. data/db/migrate/016_add_sessions.rb +16 -0
  113. data/db/migrate/017_rename_created_by_updated_by_columns.rb +15 -0
  114. data/db/migrate/018_add_description_and_keywords_to_pages.rb +11 -0
  115. data/db/migrate/019_add_salt_to_users.rb +11 -0
  116. data/db/migrate/020_add_session_info_to_users.rb +11 -0
  117. data/db/migrate/021_remove_session_expire_from_users.rb +9 -0
  118. data/db/migrate/20081203140407_add_indexes.rb +19 -0
  119. data/db/migrate/20090226140109_add_user_language.rb +9 -0
  120. data/db/migrate/20090929164633_rename_developer_role_to_designer.rb +9 -0
  121. data/db/migrate/20091003095744_change_user_language_to_locale.rb +9 -0
  122. data/db/schema.rb +119 -0
  123. data/features/admin/content_negotiation.feature +24 -0
  124. data/features/admin/layouts_management.feature +10 -0
  125. data/features/admin/pages_management.feature +78 -0
  126. data/features/admin/resource_pagination.feature +27 -0
  127. data/features/admin/snippets_management.feature +57 -0
  128. data/features/admin/user_permissions.feature +156 -0
  129. data/features/admin/user_preferences.feature +35 -0
  130. data/features/admin/users_management.feature +62 -0
  131. data/features/page_serving.feature +42 -0
  132. data/features/step_definitions/admin/admin_steps.rb +37 -0
  133. data/features/step_definitions/admin/content_negotiation_steps.rb +50 -0
  134. data/features/step_definitions/admin/pages_management_steps.rb +14 -0
  135. data/features/step_definitions/admin/pagination_steps.rb +44 -0
  136. data/features/step_definitions/admin/users_management_steps.rb +15 -0
  137. data/features/step_definitions/page_serving_steps.rb +46 -0
  138. data/features/step_definitions/web_steps.rb +273 -0
  139. data/features/support/dataset.rb +9 -0
  140. data/features/support/env.rb +58 -0
  141. data/features/support/paths.rb +61 -0
  142. data/lib/annotatable.rb +68 -0
  143. data/lib/autotest/discover.rb +3 -0
  144. data/lib/autotest/radiant_rails_rspec.rb +111 -0
  145. data/lib/generators/extension/USAGE +30 -0
  146. data/lib/generators/extension/extension_generator.rb +99 -0
  147. data/lib/generators/extension/templates/README +6 -0
  148. data/lib/generators/extension/templates/RSpecRakefile +117 -0
  149. data/lib/generators/extension/templates/Rakefile +25 -0
  150. data/lib/generators/extension/templates/cucumber.yml +1 -0
  151. data/lib/generators/extension/templates/cucumber_env.rb +16 -0
  152. data/lib/generators/extension/templates/cucumber_paths.rb +14 -0
  153. data/lib/generators/extension/templates/en.yml +3 -0
  154. data/lib/generators/extension/templates/extension.rb +23 -0
  155. data/lib/generators/extension/templates/functional_test.rb +15 -0
  156. data/lib/generators/extension/templates/migration.rb +9 -0
  157. data/lib/generators/extension/templates/routes.rb +5 -0
  158. data/lib/generators/extension/templates/spec.opts +6 -0
  159. data/lib/generators/extension/templates/spec_helper.rb +36 -0
  160. data/lib/generators/extension/templates/tasks.rake +55 -0
  161. data/lib/generators/extension/templates/test_helper.rb +26 -0
  162. data/lib/generators/extension_controller/USAGE +36 -0
  163. data/lib/generators/extension_controller/extension_controller_generator.rb +84 -0
  164. data/lib/generators/extension_controller/templates/controller.rb +10 -0
  165. data/lib/generators/extension_controller/templates/controller_spec.rb +23 -0
  166. data/lib/generators/extension_controller/templates/functional_test.rb +11 -0
  167. data/lib/generators/extension_controller/templates/helper.rb +2 -0
  168. data/lib/generators/extension_controller/templates/helper_spec.rb +11 -0
  169. data/lib/generators/extension_controller/templates/helper_test.rb +4 -0
  170. data/lib/generators/extension_controller/templates/view.html.erb +2 -0
  171. data/lib/generators/extension_controller/templates/view_spec.rb +12 -0
  172. data/lib/generators/extension_mailer/USAGE +17 -0
  173. data/lib/generators/extension_mailer/extension_mailer_generator.rb +68 -0
  174. data/lib/generators/extension_mailer/templates/fixture.erb +3 -0
  175. data/lib/generators/extension_mailer/templates/mailer.rb +15 -0
  176. data/lib/generators/extension_mailer/templates/unit_test.rb +21 -0
  177. data/lib/generators/extension_mailer/templates/view.erb +3 -0
  178. data/lib/generators/extension_migration/USAGE +34 -0
  179. data/lib/generators/extension_migration/extension_migration_generator.rb +25 -0
  180. data/lib/generators/extension_migration/templates/migration.rb +11 -0
  181. data/lib/generators/extension_model/USAGE +35 -0
  182. data/lib/generators/extension_model/extension_model_generator.rb +68 -0
  183. data/lib/generators/extension_model/templates/fixtures.yml +19 -0
  184. data/lib/generators/extension_model/templates/migration.rb +16 -0
  185. data/lib/generators/extension_model/templates/model.rb +2 -0
  186. data/lib/generators/extension_model/templates/model_spec.rb +11 -0
  187. data/lib/generators/extension_model/templates/unit_test.rb +8 -0
  188. data/lib/generators/generator_base_extension.rb +16 -0
  189. data/lib/generators/instance/instance_generator.rb +119 -0
  190. data/lib/generators/instance/templates/databases/db2.yml +40 -0
  191. data/lib/generators/instance/templates/databases/mysql.yml +47 -0
  192. data/lib/generators/instance/templates/databases/postgresql.yml +44 -0
  193. data/lib/generators/instance/templates/databases/sqlite3.yml +16 -0
  194. data/lib/generators/instance/templates/databases/sqlserver.yml +21 -0
  195. data/lib/generators/instance/templates/instance_boot.rb +161 -0
  196. data/lib/generators/instance/templates/instance_environment.rb +86 -0
  197. data/lib/generators/instance/templates/instance_generate +18 -0
  198. data/lib/generators/instance/templates/instance_rakefile +3 -0
  199. data/lib/generators/instance/templates/instance_routes.rb +1 -0
  200. data/lib/generators/language_extension/USAGE +27 -0
  201. data/lib/generators/language_extension/language_extension_generator.rb +49 -0
  202. data/lib/generators/language_extension/templates/README +3 -0
  203. data/lib/generators/language_extension/templates/RSpecRakefile +123 -0
  204. data/lib/generators/language_extension/templates/Rakefile +25 -0
  205. data/lib/generators/language_extension/templates/available_tags.yml +553 -0
  206. data/lib/generators/language_extension/templates/cucumber.yml +1 -0
  207. data/lib/generators/language_extension/templates/cucumber_env.rb +16 -0
  208. data/lib/generators/language_extension/templates/cucumber_paths.rb +14 -0
  209. data/lib/generators/language_extension/templates/extension.rb +8 -0
  210. data/lib/generators/language_extension/templates/functional_test.rb +15 -0
  211. data/lib/generators/language_extension/templates/lang.yml +181 -0
  212. data/lib/generators/language_extension/templates/spec.opts +6 -0
  213. data/lib/generators/language_extension/templates/spec_helper.rb +36 -0
  214. data/lib/generators/language_extension/templates/tasks.rake +28 -0
  215. data/lib/generators/language_extension/templates/test_helper.rb +26 -0
  216. data/lib/inheritable_class_attributes.rb +65 -0
  217. data/lib/local_time.rb +6 -0
  218. data/lib/login_system.rb +128 -0
  219. data/lib/method_observer.rb +50 -0
  220. data/lib/plugins/active_record_extensions/init.rb +1 -0
  221. data/lib/plugins/active_record_extensions/lib/active_record_extensions.rb +18 -0
  222. data/lib/plugins/extension_patches/init.rb +1 -0
  223. data/lib/plugins/extension_patches/lib/routing_extension.rb +31 -0
  224. data/lib/plugins/object_extensions/init.rb +1 -0
  225. data/lib/plugins/object_extensions/lib/object_extensions.rb +5 -0
  226. data/lib/plugins/response_cache_timeout/init.rb +3 -0
  227. data/lib/plugins/string_extensions/init.rb +1 -0
  228. data/lib/plugins/string_extensions/lib/string_extensions.rb +23 -0
  229. data/lib/plugins/symbol_extensions/init.rb +1 -0
  230. data/lib/plugins/symbol_extensions/lib/symbol_extensions.rb +5 -0
  231. data/lib/radiant.rb +19 -0
  232. data/lib/radiant/admin_ui.rb +257 -0
  233. data/lib/radiant/admin_ui/region_partials.rb +18 -0
  234. data/lib/radiant/admin_ui/region_set.rb +35 -0
  235. data/lib/radiant/available_locales.rb +31 -0
  236. data/lib/radiant/cache.rb +98 -0
  237. data/lib/radiant/extension.rb +132 -0
  238. data/lib/radiant/extension/script.rb +393 -0
  239. data/lib/radiant/extension_loader.rb +171 -0
  240. data/lib/radiant/extension_migrator.rb +86 -0
  241. data/lib/radiant/initializer.rb +296 -0
  242. data/lib/radiant/legacy_routes.rb +72 -0
  243. data/lib/radiant/pagination/controller.rb +34 -0
  244. data/lib/radiant/pagination/link_renderer.rb +34 -0
  245. data/lib/radiant/resource_responses.rb +115 -0
  246. data/lib/radiant/setup.rb +223 -0
  247. data/lib/radiant/taggable.rb +92 -0
  248. data/lib/simpleton.rb +21 -0
  249. data/lib/task_support.rb +64 -0
  250. data/lib/tasks/ci.rake +17 -0
  251. data/lib/tasks/cucumber.rake +47 -0
  252. data/lib/tasks/database.rake +31 -0
  253. data/lib/tasks/environments.rake +11 -0
  254. data/lib/tasks/extensions.rake +97 -0
  255. data/lib/tasks/framework.rake +213 -0
  256. data/lib/tasks/instance.rake +23 -0
  257. data/lib/tasks/prototype.rake +34 -0
  258. data/lib/tasks/radiant_config.rake +18 -0
  259. data/lib/tasks/release.rake +130 -0
  260. data/lib/tasks/rspec.rake +221 -0
  261. data/lib/tasks/translate.rake +59 -0
  262. data/lib/tasks/undefine.rake +28 -0
  263. data/lib/translation_support.rb +54 -0
  264. data/log/.keep +0 -0
  265. data/public/.htaccess +40 -0
  266. data/public/404.html +8 -0
  267. data/public/500.html +8 -0
  268. data/public/dispatch.cgi +10 -0
  269. data/public/dispatch.fcgi +24 -0
  270. data/public/dispatch.rb +10 -0
  271. data/public/favicon.ico +0 -0
  272. data/public/images/admin/add_tab.png +0 -0
  273. data/public/images/admin/avatar_32x32.png +0 -0
  274. data/public/images/admin/avatar_96x96.png +0 -0
  275. data/public/images/admin/brown_bottom_line.gif +0 -0
  276. data/public/images/admin/buttons_background.png +0 -0
  277. data/public/images/admin/calendar_down.gif +0 -0
  278. data/public/images/admin/collapse.png +0 -0
  279. data/public/images/admin/draft_page.png +0 -0
  280. data/public/images/admin/expand.png +0 -0
  281. data/public/images/admin/layout.png +0 -0
  282. data/public/images/admin/login_shadow.png +0 -0
  283. data/public/images/admin/metadata_toggle.png +0 -0
  284. data/public/images/admin/minus.png +0 -0
  285. data/public/images/admin/minus_disabled.png +0 -0
  286. data/public/images/admin/minus_grey.png +0 -0
  287. data/public/images/admin/navigation_background.gif +0 -0
  288. data/public/images/admin/navigation_secondary_background.png +0 -0
  289. data/public/images/admin/navigation_secondary_separator.gif +0 -0
  290. data/public/images/admin/navigation_shadow.png +0 -0
  291. data/public/images/admin/navigation_tabs.png +0 -0
  292. data/public/images/admin/new_homepage.png +0 -0
  293. data/public/images/admin/new_layout.png +0 -0
  294. data/public/images/admin/new_snippet.png +0 -0
  295. data/public/images/admin/new_user.png +0 -0
  296. data/public/images/admin/page.png +0 -0
  297. data/public/images/admin/plus.png +0 -0
  298. data/public/images/admin/plus_grey.png +0 -0
  299. data/public/images/admin/popup_border_background.png +0 -0
  300. data/public/images/admin/popup_border_bottom_left.png +0 -0
  301. data/public/images/admin/popup_border_bottom_right.png +0 -0
  302. data/public/images/admin/popup_border_top_left.png +0 -0
  303. data/public/images/admin/popup_border_top_right.png +0 -0
  304. data/public/images/admin/shadow.png +0 -0
  305. data/public/images/admin/shadow_grey.png +0 -0
  306. data/public/images/admin/single_form_shadow.png +0 -0
  307. data/public/images/admin/snippet.png +0 -0
  308. data/public/images/admin/spacer.gif +0 -0
  309. data/public/images/admin/spinner.gif +0 -0
  310. data/public/images/admin/status_background.png +0 -0
  311. data/public/images/admin/status_bottom_left.png +0 -0
  312. data/public/images/admin/status_bottom_right.png +0 -0
  313. data/public/images/admin/status_spinner.gif +0 -0
  314. data/public/images/admin/status_top_left.png +0 -0
  315. data/public/images/admin/status_top_right.png +0 -0
  316. data/public/images/admin/tab_close.png +0 -0
  317. data/public/images/admin/vertical_tan_gradient.png +0 -0
  318. data/public/images/admin/view_site.png +0 -0
  319. data/public/images/admin/virtual_page.png +0 -0
  320. data/public/images/radiant-badge-color.png +0 -0
  321. data/public/javascripts/admin/application.js +85 -0
  322. data/public/javascripts/admin/codearea.js +165 -0
  323. data/public/javascripts/admin/controls.js +965 -0
  324. data/public/javascripts/admin/cookie.js +80 -0
  325. data/public/javascripts/admin/dateinput.js +402 -0
  326. data/public/javascripts/admin/dragdrop.js +974 -0
  327. data/public/javascripts/admin/effects.js +1122 -0
  328. data/public/javascripts/admin/lowpro.js +340 -0
  329. data/public/javascripts/admin/overrides.js +1 -0
  330. data/public/javascripts/admin/pagestatus.js +17 -0
  331. data/public/javascripts/admin/popup.js +216 -0
  332. data/public/javascripts/admin/prototype.js +4874 -0
  333. data/public/javascripts/admin/ruledtable.js +13 -0
  334. data/public/javascripts/admin/shortcuts.js +27 -0
  335. data/public/javascripts/admin/sitemap.js +149 -0
  336. data/public/javascripts/admin/status.js +233 -0
  337. data/public/javascripts/admin/tabcontrol.js +122 -0
  338. data/public/javascripts/admin/toggle.js +430 -0
  339. data/public/javascripts/admin/utility.js +53 -0
  340. data/public/javascripts/admin/validationerror.js +18 -0
  341. data/public/robots.txt +1 -0
  342. data/public/stylesheets/admin/main.css +1 -0
  343. data/public/stylesheets/admin/overrides.css +0 -0
  344. data/public/stylesheets/sass/admin/main.sass +31 -0
  345. data/public/stylesheets/sass/admin/modules/_grid.sass +56 -0
  346. data/public/stylesheets/sass/admin/modules/_links.sass +18 -0
  347. data/public/stylesheets/sass/admin/modules/_opacity.sass +7 -0
  348. data/public/stylesheets/sass/admin/modules/_rounded.sass +41 -0
  349. data/public/stylesheets/sass/admin/modules/_shadow.sass +12 -0
  350. data/public/stylesheets/sass/admin/overrides.sass +2 -0
  351. data/public/stylesheets/sass/admin/partials/_actions.sass +98 -0
  352. data/public/stylesheets/sass/admin/partials/_avatars.sass +10 -0
  353. data/public/stylesheets/sass/admin/partials/_base.sass +7 -0
  354. data/public/stylesheets/sass/admin/partials/_content.sass +27 -0
  355. data/public/stylesheets/sass/admin/partials/_dateinput.sass +62 -0
  356. data/public/stylesheets/sass/admin/partials/_deprecated.sass +26 -0
  357. data/public/stylesheets/sass/admin/partials/_footer.sass +12 -0
  358. data/public/stylesheets/sass/admin/partials/_forms.sass +310 -0
  359. data/public/stylesheets/sass/admin/partials/_header.sass +112 -0
  360. data/public/stylesheets/sass/admin/partials/_layout.sass +10 -0
  361. data/public/stylesheets/sass/admin/partials/_messages.sass +10 -0
  362. data/public/stylesheets/sass/admin/partials/_popup.sass +117 -0
  363. data/public/stylesheets/sass/admin/partials/_reset.sass +36 -0
  364. data/public/stylesheets/sass/admin/partials/_tabcontrol.sass +71 -0
  365. data/public/stylesheets/sass/admin/partials/_toolbar.sass +31 -0
  366. data/public/stylesheets/sass/admin/partials/_validations.sass +21 -0
  367. data/script/about +3 -0
  368. data/script/autospec +5 -0
  369. data/script/breakpointer +3 -0
  370. data/script/console +3 -0
  371. data/script/cucumber +10 -0
  372. data/script/dbconsole +3 -0
  373. data/script/destroy +3 -0
  374. data/script/extension +5 -0
  375. data/script/generate +4 -0
  376. data/script/performance/benchmarker +3 -0
  377. data/script/performance/profiler +3 -0
  378. data/script/performance/request +3 -0
  379. data/script/plugin +3 -0
  380. data/script/process/inspector +3 -0
  381. data/script/process/reaper +3 -0
  382. data/script/process/spawner +3 -0
  383. data/script/process/spinner +3 -0
  384. data/script/runner +3 -0
  385. data/script/server +3 -0
  386. data/script/spec +5 -0
  387. data/script/spec_server +116 -0
  388. data/script/version +5 -0
  389. data/spec/controllers/admin/extensions_controller_spec.rb +36 -0
  390. data/spec/controllers/admin/layouts_controller_spec.rb +102 -0
  391. data/spec/controllers/admin/pages_controller_spec.rb +289 -0
  392. data/spec/controllers/admin/paginated_controller_spec.rb +26 -0
  393. data/spec/controllers/admin/preferences_controller_spec.rb +57 -0
  394. data/spec/controllers/admin/references_controller_spec.rb +15 -0
  395. data/spec/controllers/admin/snippets_controller_spec.rb +110 -0
  396. data/spec/controllers/admin/users_controller_spec.rb +101 -0
  397. data/spec/controllers/admin/welcome_controller_spec.rb +98 -0
  398. data/spec/controllers/application_controller_spec.rb +88 -0
  399. data/spec/controllers/site_controller_spec.rb +182 -0
  400. data/spec/datasets/config_dataset.rb +12 -0
  401. data/spec/datasets/file_not_found_dataset.rb +22 -0
  402. data/spec/datasets/home_page_dataset.rb +62 -0
  403. data/spec/datasets/layouts_dataset.rb +58 -0
  404. data/spec/datasets/markup_pages_dataset.rb +13 -0
  405. data/spec/datasets/pages_dataset.rb +65 -0
  406. data/spec/datasets/pages_with_layouts_dataset.rb +10 -0
  407. data/spec/datasets/snippets_dataset.rb +38 -0
  408. data/spec/datasets/users_and_pages_dataset.rb +9 -0
  409. data/spec/datasets/users_dataset.rb +56 -0
  410. data/spec/fixtures/example_extension/README +3 -0
  411. data/spec/fixtures/example_extension/Rakefile +120 -0
  412. data/spec/fixtures/example_extension/example_extension.rb +21 -0
  413. data/spec/fixtures/example_extension/lib/tasks/example_extension_tasks.rake +28 -0
  414. data/spec/fixtures/example_extension/spec/spec.opts +6 -0
  415. data/spec/fixtures/example_extension/spec/spec_helper.rb +36 -0
  416. data/spec/fixtures/radiant_config.yml +10 -0
  417. data/spec/fixtures/sample.txt +1 -0
  418. data/spec/generators/extension_controller_generator_spec.rb +95 -0
  419. data/spec/generators/extension_generator_spec.rb +235 -0
  420. data/spec/generators/extension_generators_spec_helper.rb +166 -0
  421. data/spec/generators/extension_mailer_generator_spec.rb +60 -0
  422. data/spec/generators/extension_migration_generator_spec.rb +21 -0
  423. data/spec/generators/extension_model_generator_spec.rb +61 -0
  424. data/spec/generators/instance_generator_spec.rb +159 -0
  425. data/spec/helpers/admin/abstract_model_helper_spec.rb +4 -0
  426. data/spec/helpers/admin/export_helper_spec.rb +4 -0
  427. data/spec/helpers/admin/extensions_helper_spec.rb +4 -0
  428. data/spec/helpers/admin/layouts_helper_spec.rb +4 -0
  429. data/spec/helpers/admin/node_helper_spec.rb +106 -0
  430. data/spec/helpers/admin/pages_helper_spec.rb +63 -0
  431. data/spec/helpers/admin/preferences_helper_spec.rb +11 -0
  432. data/spec/helpers/admin/references_helper_spec.rb +124 -0
  433. data/spec/helpers/admin/regions_helper_spec.rb +47 -0
  434. data/spec/helpers/admin/snippets_helper_spec.rb +4 -0
  435. data/spec/helpers/admin/users_helper_spec.rb +11 -0
  436. data/spec/helpers/admin/welcome_helper_spec.rb +4 -0
  437. data/spec/helpers/application_helper_spec.rb +263 -0
  438. data/spec/helpers/site_helper_spec.rb +4 -0
  439. data/spec/lib/annotatable_spec.rb +86 -0
  440. data/spec/lib/autotest_spec.rb +81 -0
  441. data/spec/lib/core_ext/string_ext_spec.rb +11 -0
  442. data/spec/lib/inheritable_class_attributes_spec.rb +90 -0
  443. data/spec/lib/login_system_spec.rb +195 -0
  444. data/spec/lib/method_observer_spec.rb +48 -0
  445. data/spec/lib/radiant/admin_ui/nav_tabs_spec.rb +139 -0
  446. data/spec/lib/radiant/admin_ui/region_partials_spec.rb +35 -0
  447. data/spec/lib/radiant/admin_ui/region_set_spec.rb +61 -0
  448. data/spec/lib/radiant/admin_ui_spec.rb +121 -0
  449. data/spec/lib/radiant/available_locales_spec.rb +13 -0
  450. data/spec/lib/radiant/extension/script_spec.rb +473 -0
  451. data/spec/lib/radiant/extension_loader_spec.rb +248 -0
  452. data/spec/lib/radiant/extension_migrator_spec.rb +46 -0
  453. data/spec/lib/radiant/extension_spec.rb +132 -0
  454. data/spec/lib/radiant/initializer_spec.rb +168 -0
  455. data/spec/lib/radiant/legacy_routes_spec.rb +14 -0
  456. data/spec/lib/radiant/resource_responses_spec.rb +207 -0
  457. data/spec/lib/radiant/taggable_spec.rb +188 -0
  458. data/spec/lib/radiant_spec.rb +30 -0
  459. data/spec/lib/simpleton_spec.rb +45 -0
  460. data/spec/lib/task_support_spec.rb +93 -0
  461. data/spec/lib/translation_support_spec.rb +16 -0
  462. data/spec/matchers/autotest_matchers.rb +47 -0
  463. data/spec/matchers/generator_matchers.rb +235 -0
  464. data/spec/matchers/login_system_matcher.rb +79 -0
  465. data/spec/matchers/render_form_errors_matcher.rb +62 -0
  466. data/spec/matchers/render_matcher.rb +133 -0
  467. data/spec/models/file_not_found_page_spec.rb +35 -0
  468. data/spec/models/layout_spec.rb +29 -0
  469. data/spec/models/page_context_spec.rb +66 -0
  470. data/spec/models/page_part_spec.rb +67 -0
  471. data/spec/models/page_spec.rb +687 -0
  472. data/spec/models/radiant/config_spec.rb +149 -0
  473. data/spec/models/snippet_spec.rb +41 -0
  474. data/spec/models/standard_tags_spec.rb +1146 -0
  475. data/spec/models/status_spec.rb +64 -0
  476. data/spec/models/text_filter_spec.rb +44 -0
  477. data/spec/models/user_action_observer_spec.rb +34 -0
  478. data/spec/models/user_spec.rb +209 -0
  479. data/spec/rcov.opts +2 -0
  480. data/spec/spec.opts +4 -0
  481. data/spec/spec_helper.rb +74 -0
  482. data/test/fixtures/extensions/basic/app/controllers/basic_extension_controller.rb +7 -0
  483. data/test/fixtures/extensions/basic/app/metal/basic_metal.rb +9 -0
  484. data/test/fixtures/extensions/basic/app/models/basic_extension_mailer.rb +4 -0
  485. data/test/fixtures/extensions/basic/app/models/basic_extension_model.rb +2 -0
  486. data/test/fixtures/extensions/basic/app/views/basic_extension/index.html.erb +1 -0
  487. data/test/fixtures/extensions/basic/app/views/basic_extension/override.html.erb +1 -0
  488. data/test/fixtures/extensions/basic/app/views/basic_extension_mailer/message.text.html.erb +1 -0
  489. data/test/fixtures/extensions/basic/basic_extension.rb +11 -0
  490. data/test/fixtures/extensions/basic/db/migrate/200812131420_create_initial_schema.rb +10 -0
  491. data/test/fixtures/extensions/basic/db/migrate/200812131421_modify_initial_schema.rb +10 -0
  492. data/test/fixtures/extensions/basic/lib/new_module.rb +2 -0
  493. data/test/fixtures/extensions/basic/vendor/plugins/multiple/init.rb +1 -0
  494. data/test/fixtures/extensions/basic/vendor/plugins/multiple/lib/multiple.rb +2 -0
  495. data/test/fixtures/extensions/basic/vendor/plugins/plugin_normal/init.rb +1 -0
  496. data/test/fixtures/extensions/basic/vendor/plugins/plugin_normal/lib/normal_plugin.rb +2 -0
  497. data/test/fixtures/extensions/load_order_blue/load_order_blue_extension.rb +8 -0
  498. data/test/fixtures/extensions/load_order_green/load_order_green_extension.rb +8 -0
  499. data/test/fixtures/extensions/load_order_red/load_order_red_extension.rb +8 -0
  500. data/test/fixtures/extensions/locale/config/locales/en-uk.yml +3 -0
  501. data/test/fixtures/extensions/locale/config/locales/en.yml +3 -0
  502. data/test/fixtures/extensions/locale/locale_extension.rb +5 -0
  503. data/test/fixtures/extensions/overriding/app/metal/basic_metal.rb +9 -0
  504. data/test/fixtures/extensions/overriding/app/views/basic_extension/override.html.erb +1 -0
  505. data/test/fixtures/extensions/overriding/overriding_extension.rb +8 -0
  506. data/test/fixtures/extensions/overriding/vendor/plugins/multiple/init.rb +1 -0
  507. data/test/fixtures/extensions/overriding/vendor/plugins/multiple/lib/multiple.rb +2 -0
  508. data/test/fixtures/extensions/routed/config/routes.rb +1 -0
  509. data/test/fixtures/extensions/routed/routed_extension.rb +2 -0
  510. data/test/fixtures/extensions/special_characters/db/migrate/001_create_initial_schema.rb +10 -0
  511. data/test/fixtures/extensions/special_characters/special_characters_extension.rb +3 -0
  512. data/test/fixtures/extensions/upgrading/db/migrate/01_first.rb +7 -0
  513. data/test/fixtures/extensions/upgrading/db/migrate/02_second.rb +7 -0
  514. data/test/fixtures/extensions/upgrading/db/migrate/03_pending.rb +7 -0
  515. data/test/fixtures/extensions/upgrading/db/migrate/04_dont_run.rb +7 -0
  516. data/test/fixtures/extensions/upgrading/upgrading_extension.rb +2 -0
  517. data/test/fixtures/gems/misnamed_ext-0.0.0/misnamed_ext_extension.rb +2 -0
  518. data/test/fixtures/gems/radiant-gem_ext-extension-0.0.0/gem_ext_extension.rb +2 -0
  519. data/test/fixtures/gems/radiant-gem_ext-extension-0.0.0/lib/gem_ext.rb +3 -0
  520. data/test/helpers/page_test_helper.rb +79 -0
  521. data/test/helpers/render_test_helper.rb +60 -0
  522. data/test/helpers/user_test_helper.rb +35 -0
  523. data/test/helpers/validation_test_helper.rb +42 -0
  524. data/test/test_helper.rb +64 -0
  525. data/vendor/highline/CHANGELOG +222 -0
  526. data/vendor/highline/INSTALL +35 -0
  527. data/vendor/highline/LICENSE +7 -0
  528. data/vendor/highline/README +63 -0
  529. data/vendor/highline/Rakefile +82 -0
  530. data/vendor/highline/TODO +6 -0
  531. data/vendor/highline/examples/ansi_colors.rb +38 -0
  532. data/vendor/highline/examples/asking_for_arrays.rb +18 -0
  533. data/vendor/highline/examples/basic_usage.rb +75 -0
  534. data/vendor/highline/examples/color_scheme.rb +32 -0
  535. data/vendor/highline/examples/limit.rb +12 -0
  536. data/vendor/highline/examples/menus.rb +65 -0
  537. data/vendor/highline/examples/overwrite.rb +19 -0
  538. data/vendor/highline/examples/page_and_wrap.rb +322 -0
  539. data/vendor/highline/examples/password.rb +7 -0
  540. data/vendor/highline/examples/trapping_eof.rb +22 -0
  541. data/vendor/highline/examples/using_readline.rb +17 -0
  542. data/vendor/highline/lib/highline.rb +758 -0
  543. data/vendor/highline/lib/highline/color_scheme.rb +120 -0
  544. data/vendor/highline/lib/highline/compatibility.rb +17 -0
  545. data/vendor/highline/lib/highline/import.rb +43 -0
  546. data/vendor/highline/lib/highline/menu.rb +395 -0
  547. data/vendor/highline/lib/highline/question.rb +463 -0
  548. data/vendor/highline/lib/highline/system_extensions.rb +193 -0
  549. data/vendor/highline/setup.rb +1360 -0
  550. data/vendor/highline/test/tc_color_scheme.rb +56 -0
  551. data/vendor/highline/test/tc_highline.rb +823 -0
  552. data/vendor/highline/test/tc_import.rb +54 -0
  553. data/vendor/highline/test/tc_menu.rb +429 -0
  554. data/vendor/highline/test/ts_all.rb +15 -0
  555. data/vendor/plugins/acts_as_tree/README +26 -0
  556. data/vendor/plugins/acts_as_tree/Rakefile +22 -0
  557. data/vendor/plugins/acts_as_tree/init.rb +1 -0
  558. data/vendor/plugins/acts_as_tree/lib/active_record/acts/tree.rb +96 -0
  559. data/vendor/plugins/acts_as_tree/test/abstract_unit.rb +0 -0
  560. data/vendor/plugins/acts_as_tree/test/acts_as_tree_test.rb +219 -0
  561. data/vendor/plugins/acts_as_tree/test/database.yml +0 -0
  562. data/vendor/plugins/acts_as_tree/test/fixtures/mixin.rb +0 -0
  563. data/vendor/plugins/acts_as_tree/test/fixtures/mixins.yml +0 -0
  564. data/vendor/plugins/acts_as_tree/test/schema.rb +0 -0
  565. data/vendor/plugins/dataset/CHANGELOG +59 -0
  566. data/vendor/plugins/dataset/LICENSE +19 -0
  567. data/vendor/plugins/dataset/README +111 -0
  568. data/vendor/plugins/dataset/Rakefile +31 -0
  569. data/vendor/plugins/dataset/TODO +15 -0
  570. data/vendor/plugins/dataset/VERSION.yml +4 -0
  571. data/vendor/plugins/dataset/dataset.gemspec +33 -0
  572. data/vendor/plugins/dataset/lib/dataset.rb +128 -0
  573. data/vendor/plugins/dataset/lib/dataset/base.rb +157 -0
  574. data/vendor/plugins/dataset/lib/dataset/collection.rb +19 -0
  575. data/vendor/plugins/dataset/lib/dataset/database/base.rb +30 -0
  576. data/vendor/plugins/dataset/lib/dataset/database/mysql.rb +34 -0
  577. data/vendor/plugins/dataset/lib/dataset/database/postgresql.rb +34 -0
  578. data/vendor/plugins/dataset/lib/dataset/database/sqlite3.rb +32 -0
  579. data/vendor/plugins/dataset/lib/dataset/extensions/cucumber.rb +21 -0
  580. data/vendor/plugins/dataset/lib/dataset/extensions/rspec.rb +21 -0
  581. data/vendor/plugins/dataset/lib/dataset/extensions/test_unit.rb +60 -0
  582. data/vendor/plugins/dataset/lib/dataset/instance_methods.rb +10 -0
  583. data/vendor/plugins/dataset/lib/dataset/load.rb +37 -0
  584. data/vendor/plugins/dataset/lib/dataset/record/fixture.rb +73 -0
  585. data/vendor/plugins/dataset/lib/dataset/record/meta.rb +66 -0
  586. data/vendor/plugins/dataset/lib/dataset/record/model.rb +50 -0
  587. data/vendor/plugins/dataset/lib/dataset/resolver.rb +110 -0
  588. data/vendor/plugins/dataset/lib/dataset/session.rb +35 -0
  589. data/vendor/plugins/dataset/lib/dataset/session_binding.rb +307 -0
  590. data/vendor/plugins/dataset/lib/dataset/version.rb +9 -0
  591. data/vendor/plugins/dataset/spec/dataset/cucumber_spec.rb +54 -0
  592. data/vendor/plugins/dataset/spec/dataset/database/base_spec.rb +21 -0
  593. data/vendor/plugins/dataset/spec/dataset/record/meta_spec.rb +14 -0
  594. data/vendor/plugins/dataset/spec/dataset/resolver_spec.rb +110 -0
  595. data/vendor/plugins/dataset/spec/dataset/rspec_spec.rb +133 -0
  596. data/vendor/plugins/dataset/spec/dataset/session_binding_spec.rb +198 -0
  597. data/vendor/plugins/dataset/spec/dataset/session_spec.rb +299 -0
  598. data/vendor/plugins/dataset/spec/dataset/test_unit_spec.rb +210 -0
  599. data/vendor/plugins/dataset/spec/fixtures/datasets/constant_not_defined.rb +0 -0
  600. data/vendor/plugins/dataset/spec/fixtures/datasets/ending_with_dataset.rb +2 -0
  601. data/vendor/plugins/dataset/spec/fixtures/datasets/exact_name.rb +2 -0
  602. data/vendor/plugins/dataset/spec/fixtures/datasets/not_a_dataset_base.rb +2 -0
  603. data/vendor/plugins/dataset/spec/fixtures/more_datasets/in_another_directory.rb +2 -0
  604. data/vendor/plugins/dataset/spec/models.rb +18 -0
  605. data/vendor/plugins/dataset/spec/schema.rb +26 -0
  606. data/vendor/plugins/dataset/spec/spec.opts +7 -0
  607. data/vendor/plugins/dataset/spec/spec_helper.rb +47 -0
  608. data/vendor/plugins/dataset/spec/stubs/mini_rails.rb +18 -0
  609. data/vendor/plugins/dataset/spec/stubs/test_help.rb +1 -0
  610. data/vendor/plugins/dataset/tasks/dataset.rake +19 -0
  611. data/vendor/plugins/haml/CONTRIBUTING +4 -0
  612. data/vendor/plugins/haml/MIT-LICENSE +20 -0
  613. data/vendor/plugins/haml/README.md +298 -0
  614. data/vendor/plugins/haml/Rakefile +436 -0
  615. data/vendor/plugins/haml/TODO +53 -0
  616. data/vendor/plugins/haml/VERSION +1 -0
  617. data/vendor/plugins/haml/VERSION_NAME +1 -0
  618. data/vendor/plugins/haml/bin/css2sass +13 -0
  619. data/vendor/plugins/haml/bin/haml +9 -0
  620. data/vendor/plugins/haml/bin/html2haml +7 -0
  621. data/vendor/plugins/haml/bin/sass +8 -0
  622. data/vendor/plugins/haml/doc-src/FAQ.md +187 -0
  623. data/vendor/plugins/haml/doc-src/HAML_CHANGELOG.md +1091 -0
  624. data/vendor/plugins/haml/doc-src/HAML_REFERENCE.md +1344 -0
  625. data/vendor/plugins/haml/doc-src/SASS_CHANGELOG.md +1914 -0
  626. data/vendor/plugins/haml/doc-src/SASS_REFERENCE.md +1680 -0
  627. data/vendor/plugins/haml/extra/haml-mode.el +753 -0
  628. data/vendor/plugins/haml/extra/sass-mode.el +207 -0
  629. data/vendor/plugins/haml/extra/update_watch.rb +13 -0
  630. data/vendor/plugins/haml/haml.gemspec +35 -0
  631. data/vendor/plugins/haml/init.rb +18 -0
  632. data/vendor/plugins/haml/lib/haml.rb +44 -0
  633. data/vendor/plugins/haml/lib/haml/buffer.rb +320 -0
  634. data/vendor/plugins/haml/lib/haml/engine.rb +308 -0
  635. data/vendor/plugins/haml/lib/haml/error.rb +22 -0
  636. data/vendor/plugins/haml/lib/haml/exec.rb +862 -0
  637. data/vendor/plugins/haml/lib/haml/filters.rb +371 -0
  638. data/vendor/plugins/haml/lib/haml/helpers.rb +605 -0
  639. data/vendor/plugins/haml/lib/haml/helpers/action_view_extensions.rb +57 -0
  640. data/vendor/plugins/haml/lib/haml/helpers/action_view_mods.rb +244 -0
  641. data/vendor/plugins/haml/lib/haml/helpers/xss_mods.rb +165 -0
  642. data/vendor/plugins/haml/lib/haml/html.rb +428 -0
  643. data/vendor/plugins/haml/lib/haml/precompiler.rb +1104 -0
  644. data/vendor/plugins/haml/lib/haml/railtie.rb +21 -0
  645. data/vendor/plugins/haml/lib/haml/shared.rb +78 -0
  646. data/vendor/plugins/haml/lib/haml/template.rb +97 -0
  647. data/vendor/plugins/haml/lib/haml/template/patch.rb +58 -0
  648. data/vendor/plugins/haml/lib/haml/template/plugin.rb +122 -0
  649. data/vendor/plugins/haml/lib/haml/util.rb +809 -0
  650. data/vendor/plugins/haml/lib/haml/version.rb +102 -0
  651. data/vendor/plugins/haml/lib/sass.rb +29 -0
  652. data/vendor/plugins/haml/lib/sass/css.rb +294 -0
  653. data/vendor/plugins/haml/lib/sass/engine.rb +720 -0
  654. data/vendor/plugins/haml/lib/sass/environment.rb +143 -0
  655. data/vendor/plugins/haml/lib/sass/error.rb +198 -0
  656. data/vendor/plugins/haml/lib/sass/files.rb +160 -0
  657. data/vendor/plugins/haml/lib/sass/plugin.rb +276 -0
  658. data/vendor/plugins/haml/lib/sass/plugin/merb.rb +37 -0
  659. data/vendor/plugins/haml/lib/sass/plugin/rack.rb +47 -0
  660. data/vendor/plugins/haml/lib/sass/plugin/rails.rb +32 -0
  661. data/vendor/plugins/haml/lib/sass/repl.rb +58 -0
  662. data/vendor/plugins/haml/lib/sass/script.rb +63 -0
  663. data/vendor/plugins/haml/lib/sass/script/bool.rb +18 -0
  664. data/vendor/plugins/haml/lib/sass/script/color.rb +491 -0
  665. data/vendor/plugins/haml/lib/sass/script/funcall.rb +77 -0
  666. data/vendor/plugins/haml/lib/sass/script/functions.rb +861 -0
  667. data/vendor/plugins/haml/lib/sass/script/lexer.rb +337 -0
  668. data/vendor/plugins/haml/lib/sass/script/literal.rb +236 -0
  669. data/vendor/plugins/haml/lib/sass/script/node.rb +112 -0
  670. data/vendor/plugins/haml/lib/sass/script/number.rb +423 -0
  671. data/vendor/plugins/haml/lib/sass/script/operation.rb +95 -0
  672. data/vendor/plugins/haml/lib/sass/script/parser.rb +401 -0
  673. data/vendor/plugins/haml/lib/sass/script/string.rb +67 -0
  674. data/vendor/plugins/haml/lib/sass/script/unary_operation.rb +57 -0
  675. data/vendor/plugins/haml/lib/sass/script/variable.rb +48 -0
  676. data/vendor/plugins/haml/lib/sass/tree/comment_node.rb +128 -0
  677. data/vendor/plugins/haml/lib/sass/tree/debug_node.rb +36 -0
  678. data/vendor/plugins/haml/lib/sass/tree/directive_node.rb +75 -0
  679. data/vendor/plugins/haml/lib/sass/tree/for_node.rb +67 -0
  680. data/vendor/plugins/haml/lib/sass/tree/if_node.rb +81 -0
  681. data/vendor/plugins/haml/lib/sass/tree/import_node.rb +102 -0
  682. data/vendor/plugins/haml/lib/sass/tree/mixin_def_node.rb +60 -0
  683. data/vendor/plugins/haml/lib/sass/tree/mixin_node.rb +123 -0
  684. data/vendor/plugins/haml/lib/sass/tree/node.rb +465 -0
  685. data/vendor/plugins/haml/lib/sass/tree/prop_node.rb +220 -0
  686. data/vendor/plugins/haml/lib/sass/tree/rule_node.rb +273 -0
  687. data/vendor/plugins/haml/lib/sass/tree/variable_node.rb +39 -0
  688. data/vendor/plugins/haml/lib/sass/tree/while_node.rb +48 -0
  689. data/vendor/plugins/haml/rails/init.rb +1 -0
  690. data/vendor/plugins/haml/test/benchmark.rb +99 -0
  691. data/vendor/plugins/haml/test/haml/engine_test.rb +1805 -0
  692. data/vendor/plugins/haml/test/haml/helper_test.rb +450 -0
  693. data/vendor/plugins/haml/test/haml/html2haml_test.rb +336 -0
  694. data/vendor/plugins/haml/test/haml/markaby/standard.mab +52 -0
  695. data/vendor/plugins/haml/test/haml/mocks/article.rb +6 -0
  696. data/vendor/plugins/haml/test/haml/results/content_for_layout.xhtml +12 -0
  697. data/vendor/plugins/haml/test/haml/results/eval_suppressed.xhtml +9 -0
  698. data/vendor/plugins/haml/test/haml/results/filters.xhtml +62 -0
  699. data/vendor/plugins/haml/test/haml/results/helpers.xhtml +70 -0
  700. data/vendor/plugins/haml/test/haml/results/helpful.xhtml +10 -0
  701. data/vendor/plugins/haml/test/haml/results/just_stuff.xhtml +70 -0
  702. data/vendor/plugins/haml/test/haml/results/list.xhtml +12 -0
  703. data/vendor/plugins/haml/test/haml/results/nuke_inner_whitespace.xhtml +40 -0
  704. data/vendor/plugins/haml/test/haml/results/nuke_outer_whitespace.xhtml +148 -0
  705. data/vendor/plugins/haml/test/haml/results/original_engine.xhtml +20 -0
  706. data/vendor/plugins/haml/test/haml/results/partial_layout.xhtml +5 -0
  707. data/vendor/plugins/haml/test/haml/results/partials.xhtml +21 -0
  708. data/vendor/plugins/haml/test/haml/results/render_layout.xhtml +3 -0
  709. data/vendor/plugins/haml/test/haml/results/silent_script.xhtml +74 -0
  710. data/vendor/plugins/haml/test/haml/results/standard.xhtml +162 -0
  711. data/vendor/plugins/haml/test/haml/results/tag_parsing.xhtml +23 -0
  712. data/vendor/plugins/haml/test/haml/results/very_basic.xhtml +5 -0
  713. data/vendor/plugins/haml/test/haml/results/whitespace_handling.xhtml +89 -0
  714. data/vendor/plugins/haml/test/haml/template_test.rb +417 -0
  715. data/vendor/plugins/haml/test/haml/templates/_av_partial_1.haml +9 -0
  716. data/vendor/plugins/haml/test/haml/templates/_av_partial_1_ugly.haml +9 -0
  717. data/vendor/plugins/haml/test/haml/templates/_av_partial_2.haml +5 -0
  718. data/vendor/plugins/haml/test/haml/templates/_av_partial_2_ugly.haml +5 -0
  719. data/vendor/plugins/haml/test/haml/templates/_layout.erb +3 -0
  720. data/vendor/plugins/haml/test/haml/templates/_layout_for_partial.haml +3 -0
  721. data/vendor/plugins/haml/test/haml/templates/_partial.haml +8 -0
  722. data/vendor/plugins/haml/test/haml/templates/_text_area.haml +3 -0
  723. data/vendor/plugins/haml/test/haml/templates/action_view.haml +47 -0
  724. data/vendor/plugins/haml/test/haml/templates/action_view_ugly.haml +47 -0
  725. data/vendor/plugins/haml/test/haml/templates/breakage.haml +8 -0
  726. data/vendor/plugins/haml/test/haml/templates/content_for_layout.haml +8 -0
  727. data/vendor/plugins/haml/test/haml/templates/eval_suppressed.haml +11 -0
  728. data/vendor/plugins/haml/test/haml/templates/filters.haml +66 -0
  729. data/vendor/plugins/haml/test/haml/templates/helpers.haml +55 -0
  730. data/vendor/plugins/haml/test/haml/templates/helpful.haml +11 -0
  731. data/vendor/plugins/haml/test/haml/templates/just_stuff.haml +85 -0
  732. data/vendor/plugins/haml/test/haml/templates/list.haml +12 -0
  733. data/vendor/plugins/haml/test/haml/templates/nuke_inner_whitespace.haml +32 -0
  734. data/vendor/plugins/haml/test/haml/templates/nuke_outer_whitespace.haml +144 -0
  735. data/vendor/plugins/haml/test/haml/templates/original_engine.haml +17 -0
  736. data/vendor/plugins/haml/test/haml/templates/partial_layout.haml +7 -0
  737. data/vendor/plugins/haml/test/haml/templates/partialize.haml +1 -0
  738. data/vendor/plugins/haml/test/haml/templates/partials.haml +12 -0
  739. data/vendor/plugins/haml/test/haml/templates/render_layout.haml +2 -0
  740. data/vendor/plugins/haml/test/haml/templates/silent_script.haml +40 -0
  741. data/vendor/plugins/haml/test/haml/templates/standard.haml +42 -0
  742. data/vendor/plugins/haml/test/haml/templates/standard_ugly.haml +42 -0
  743. data/vendor/plugins/haml/test/haml/templates/tag_parsing.haml +21 -0
  744. data/vendor/plugins/haml/test/haml/templates/very_basic.haml +4 -0
  745. data/vendor/plugins/haml/test/haml/templates/whitespace_handling.haml +87 -0
  746. data/vendor/plugins/haml/test/haml/util_test.rb +268 -0
  747. data/vendor/plugins/haml/test/linked_rails.rb +42 -0
  748. data/vendor/plugins/haml/test/sass/css2sass_test.rb +364 -0
  749. data/vendor/plugins/haml/test/sass/engine_test.rb +2263 -0
  750. data/vendor/plugins/haml/test/sass/functions_test.rb +556 -0
  751. data/vendor/plugins/haml/test/sass/more_results/more1.css +9 -0
  752. data/vendor/plugins/haml/test/sass/more_results/more1_with_line_comments.css +26 -0
  753. data/vendor/plugins/haml/test/sass/more_results/more_import.css +29 -0
  754. data/vendor/plugins/haml/test/sass/more_templates/_more_partial.sass +2 -0
  755. data/vendor/plugins/haml/test/sass/more_templates/more1.sass +23 -0
  756. data/vendor/plugins/haml/test/sass/more_templates/more_import.sass +11 -0
  757. data/vendor/plugins/haml/test/sass/plugin_test.rb +433 -0
  758. data/vendor/plugins/haml/test/sass/results/alt.css +4 -0
  759. data/vendor/plugins/haml/test/sass/results/basic.css +9 -0
  760. data/vendor/plugins/haml/test/sass/results/compact.css +5 -0
  761. data/vendor/plugins/haml/test/sass/results/complex.css +86 -0
  762. data/vendor/plugins/haml/test/sass/results/compressed.css +1 -0
  763. data/vendor/plugins/haml/test/sass/results/expanded.css +19 -0
  764. data/vendor/plugins/haml/test/sass/results/import.css +31 -0
  765. data/vendor/plugins/haml/test/sass/results/line_numbers.css +49 -0
  766. data/vendor/plugins/haml/test/sass/results/mixins.css +95 -0
  767. data/vendor/plugins/haml/test/sass/results/multiline.css +24 -0
  768. data/vendor/plugins/haml/test/sass/results/nested.css +22 -0
  769. data/vendor/plugins/haml/test/sass/results/parent_ref.css +13 -0
  770. data/vendor/plugins/haml/test/sass/results/script.css +16 -0
  771. data/vendor/plugins/haml/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
  772. data/vendor/plugins/haml/test/sass/results/subdir/subdir.css +3 -0
  773. data/vendor/plugins/haml/test/sass/results/units.css +11 -0
  774. data/vendor/plugins/haml/test/sass/script_test.rb +470 -0
  775. data/vendor/plugins/haml/test/sass/templates/_partial.sass +2 -0
  776. data/vendor/plugins/haml/test/sass/templates/alt.sass +16 -0
  777. data/vendor/plugins/haml/test/sass/templates/basic.sass +23 -0
  778. data/vendor/plugins/haml/test/sass/templates/bork2.sass +2 -0
  779. data/vendor/plugins/haml/test/sass/templates/compact.sass +17 -0
  780. data/vendor/plugins/haml/test/sass/templates/complex.sass +305 -0
  781. data/vendor/plugins/haml/test/sass/templates/compressed.sass +15 -0
  782. data/vendor/plugins/haml/test/sass/templates/expanded.sass +17 -0
  783. data/vendor/plugins/haml/test/sass/templates/import.sass +12 -0
  784. data/vendor/plugins/haml/test/sass/templates/importee.sass +19 -0
  785. data/vendor/plugins/haml/test/sass/templates/line_numbers.sass +13 -0
  786. data/vendor/plugins/haml/test/sass/templates/mixins.sass +76 -0
  787. data/vendor/plugins/haml/test/sass/templates/multiline.sass +20 -0
  788. data/vendor/plugins/haml/test/sass/templates/nested.sass +25 -0
  789. data/vendor/plugins/haml/test/sass/templates/parent_ref.sass +25 -0
  790. data/vendor/plugins/haml/test/sass/templates/script.sass +101 -0
  791. data/vendor/plugins/haml/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
  792. data/vendor/plugins/haml/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
  793. data/vendor/plugins/haml/test/sass/templates/subdir/subdir.sass +6 -0
  794. data/vendor/plugins/haml/test/sass/templates/units.sass +11 -0
  795. data/vendor/plugins/haml/test/test_helper.rb +98 -0
  796. data/vendor/plugins/haml/yard/default/fulldoc/html/css/common.sass +26 -0
  797. data/vendor/plugins/haml/yard/default/layout/html/footer.erb +12 -0
  798. data/vendor/plugins/haml/yard/inherited_hash.rb +41 -0
  799. data/vendor/rack-cache/CHANGES +128 -0
  800. data/vendor/rack-cache/COPYING +18 -0
  801. data/vendor/rack-cache/README +110 -0
  802. data/vendor/rack-cache/Rakefile +137 -0
  803. data/vendor/rack-cache/TODO +31 -0
  804. data/vendor/rack-cache/doc/configuration.markdown +86 -0
  805. data/vendor/rack-cache/doc/faq.markdown +141 -0
  806. data/vendor/rack-cache/doc/index.markdown +118 -0
  807. data/vendor/rack-cache/doc/layout.html.erb +34 -0
  808. data/vendor/rack-cache/doc/license.markdown +24 -0
  809. data/vendor/rack-cache/doc/rack-cache.css +362 -0
  810. data/vendor/rack-cache/doc/server.ru +34 -0
  811. data/vendor/rack-cache/doc/storage.markdown +162 -0
  812. data/vendor/rack-cache/example/sinatra/app.rb +25 -0
  813. data/vendor/rack-cache/example/sinatra/views/index.erb +44 -0
  814. data/vendor/rack-cache/lib/rack/cache.rb +45 -0
  815. data/vendor/rack-cache/lib/rack/cache/cachecontrol.rb +193 -0
  816. data/vendor/rack-cache/lib/rack/cache/context.rb +233 -0
  817. data/vendor/rack-cache/lib/rack/cache/entitystore.rb +253 -0
  818. data/vendor/rack-cache/lib/rack/cache/key.rb +52 -0
  819. data/vendor/rack-cache/lib/rack/cache/metastore.rb +328 -0
  820. data/vendor/rack-cache/lib/rack/cache/options.rb +150 -0
  821. data/vendor/rack-cache/lib/rack/cache/request.rb +33 -0
  822. data/vendor/rack-cache/lib/rack/cache/response.rb +267 -0
  823. data/vendor/rack-cache/lib/rack/cache/storage.rb +49 -0
  824. data/vendor/rack-cache/rack-cache.gemspec +69 -0
  825. data/vendor/rack-cache/test/cache_test.rb +38 -0
  826. data/vendor/rack-cache/test/cachecontrol_test.rb +139 -0
  827. data/vendor/rack-cache/test/context_test.rb +727 -0
  828. data/vendor/rack-cache/test/entitystore_test.rb +189 -0
  829. data/vendor/rack-cache/test/key_test.rb +50 -0
  830. data/vendor/rack-cache/test/metastore_test.rb +263 -0
  831. data/vendor/rack-cache/test/options_test.rb +78 -0
  832. data/vendor/rack-cache/test/pony.jpg +0 -0
  833. data/vendor/rack-cache/test/request_test.rb +19 -0
  834. data/vendor/rack-cache/test/response_test.rb +178 -0
  835. data/vendor/rack-cache/test/spec_setup.rb +202 -0
  836. data/vendor/rack-cache/test/storage_test.rb +94 -0
  837. data/vendor/radius/CHANGELOG +33 -0
  838. data/vendor/radius/LICENSE +19 -0
  839. data/vendor/radius/QUICKSTART.rdoc +322 -0
  840. data/vendor/radius/README.rdoc +102 -0
  841. data/vendor/radius/Rakefile +8 -0
  842. data/vendor/radius/VERSION +1 -0
  843. data/vendor/radius/lib/radius.rb +10 -0
  844. data/vendor/radius/lib/radius/context.rb +139 -0
  845. data/vendor/radius/lib/radius/delegating_open_struct.rb +31 -0
  846. data/vendor/radius/lib/radius/error.rb +43 -0
  847. data/vendor/radius/lib/radius/parse_tag.rb +24 -0
  848. data/vendor/radius/lib/radius/parser.rb +65 -0
  849. data/vendor/radius/lib/radius/parser/scan.rb +678 -0
  850. data/vendor/radius/lib/radius/parser/scan.rl +124 -0
  851. data/vendor/radius/lib/radius/tag_binding.rb +71 -0
  852. data/vendor/radius/lib/radius/tag_definitions.rb +78 -0
  853. data/vendor/radius/lib/radius/utility.rb +30 -0
  854. data/vendor/radius/lib/radius/version.rb +8 -0
  855. data/vendor/radius/radius.gemspec +71 -0
  856. data/vendor/radius/tasks/jeweler.rake +21 -0
  857. data/vendor/radius/tasks/rdoc.rake +13 -0
  858. data/vendor/radius/tasks/scan.rake +27 -0
  859. data/vendor/radius/tasks/test.rake +7 -0
  860. data/vendor/radius/test/context_test.rb +61 -0
  861. data/vendor/radius/test/parser_test.rb +295 -0
  862. data/vendor/radius/test/quickstart_test.rb +153 -0
  863. data/vendor/radius/test/test_helper.rb +29 -0
  864. data/vendor/rails/actionmailer/CHANGELOG +388 -0
  865. data/vendor/rails/actionmailer/MIT-LICENSE +21 -0
  866. data/vendor/rails/actionmailer/README +149 -0
  867. data/vendor/rails/actionmailer/Rakefile +99 -0
  868. data/vendor/rails/actionmailer/install.rb +30 -0
  869. data/vendor/rails/actionmailer/lib/action_mailer.rb +62 -0
  870. data/vendor/rails/actionmailer/lib/action_mailer/adv_attr_accessor.rb +30 -0
  871. data/vendor/rails/actionmailer/lib/action_mailer/base.rb +706 -0
  872. data/vendor/rails/actionmailer/lib/action_mailer/helpers.rb +113 -0
  873. data/vendor/rails/actionmailer/lib/action_mailer/mail_helper.rb +17 -0
  874. data/vendor/rails/actionmailer/lib/action_mailer/part.rb +107 -0
  875. data/vendor/rails/actionmailer/lib/action_mailer/part_container.rb +55 -0
  876. data/vendor/rails/actionmailer/lib/action_mailer/quoting.rb +62 -0
  877. data/vendor/rails/actionmailer/lib/action_mailer/test_case.rb +64 -0
  878. data/vendor/rails/actionmailer/lib/action_mailer/test_helper.rb +68 -0
  879. data/vendor/rails/actionmailer/lib/action_mailer/utils.rb +7 -0
  880. data/vendor/rails/actionmailer/lib/action_mailer/vendor/text-format-0.6.3/text/format.rb +1466 -0
  881. data/vendor/rails/actionmailer/lib/action_mailer/vendor/text_format.rb +10 -0
  882. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail.rb +6 -0
  883. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/Makefile +18 -0
  884. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/address.rb +392 -0
  885. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/attachments.rb +65 -0
  886. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/base64.rb +46 -0
  887. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/compat.rb +41 -0
  888. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/config.rb +67 -0
  889. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/core_extensions.rb +63 -0
  890. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/encode.rb +590 -0
  891. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/header.rb +962 -0
  892. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/index.rb +9 -0
  893. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/interface.rb +1162 -0
  894. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/loader.rb +3 -0
  895. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/mail.rb +578 -0
  896. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/mailbox.rb +496 -0
  897. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/main.rb +6 -0
  898. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/mbox.rb +3 -0
  899. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/net.rb +250 -0
  900. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/obsolete.rb +132 -0
  901. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/parser.rb +1060 -0
  902. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/parser.y +416 -0
  903. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/port.rb +379 -0
  904. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/quoting.rb +164 -0
  905. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/require_arch.rb +58 -0
  906. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/scanner.rb +49 -0
  907. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/scanner_r.rb +262 -0
  908. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/stringio.rb +280 -0
  909. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/utils.rb +362 -0
  910. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/COPYING +504 -0
  911. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/README +12 -0
  912. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet.rb +67 -0
  913. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/big5freq.rb +927 -0
  914. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/big5prober.rb +42 -0
  915. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/chardistribution.rb +238 -0
  916. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/charsetgroupprober.rb +112 -0
  917. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/charsetprober.rb +75 -0
  918. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/codingstatemachine.rb +64 -0
  919. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/constants.rb +42 -0
  920. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/escprober.rb +89 -0
  921. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/escsm.rb +244 -0
  922. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/eucjpprober.rb +88 -0
  923. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/euckrfreq.rb +596 -0
  924. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/euckrprober.rb +42 -0
  925. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/euctwfreq.rb +430 -0
  926. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/euctwprober.rb +42 -0
  927. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/gb2312freq.rb +474 -0
  928. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/gb2312prober.rb +42 -0
  929. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/hebrewprober.rb +289 -0
  930. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/jisfreq.rb +570 -0
  931. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/jpcntx.rb +229 -0
  932. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/langbulgarianmodel.rb +229 -0
  933. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/langcyrillicmodel.rb +330 -0
  934. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/langgreekmodel.rb +227 -0
  935. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/langhebrewmodel.rb +202 -0
  936. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/langhungarianmodel.rb +226 -0
  937. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/langthaimodel.rb +201 -0
  938. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/latin1prober.rb +147 -0
  939. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/mbcharsetprober.rb +89 -0
  940. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/mbcsgroupprober.rb +45 -0
  941. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/mbcssm.rb +542 -0
  942. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/sbcharsetprober.rb +124 -0
  943. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/sbcsgroupprober.rb +56 -0
  944. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/sjisprober.rb +88 -0
  945. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/universaldetector.rb +168 -0
  946. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/vendor/rchardet-1.3/lib/rchardet/utf8prober.rb +87 -0
  947. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.7/tmail/version.rb +39 -0
  948. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail.rb +17 -0
  949. data/vendor/rails/actionmailer/lib/action_mailer/version.rb +9 -0
  950. data/vendor/rails/actionmailer/lib/actionmailer.rb +2 -0
  951. data/vendor/rails/actionmailer/test/abstract_unit.rb +62 -0
  952. data/vendor/rails/actionmailer/test/asset_host_test.rb +54 -0
  953. data/vendor/rails/actionmailer/test/delivery_method_test.rb +51 -0
  954. data/vendor/rails/actionmailer/test/fixtures/asset_host_mailer/email_with_asset.html.erb +1 -0
  955. data/vendor/rails/actionmailer/test/fixtures/auto_layout_mailer/hello.html.erb +1 -0
  956. data/vendor/rails/actionmailer/test/fixtures/auto_layout_mailer/multipart.text.html.erb +1 -0
  957. data/vendor/rails/actionmailer/test/fixtures/auto_layout_mailer/multipart.text.plain.erb +1 -0
  958. data/vendor/rails/actionmailer/test/fixtures/explicit_layout_mailer/logout.html.erb +1 -0
  959. data/vendor/rails/actionmailer/test/fixtures/explicit_layout_mailer/signup.html.erb +1 -0
  960. data/vendor/rails/actionmailer/test/fixtures/first_mailer/share.erb +1 -0
  961. data/vendor/rails/actionmailer/test/fixtures/helper_mailer/use_example_helper.erb +1 -0
  962. data/vendor/rails/actionmailer/test/fixtures/helper_mailer/use_helper.erb +1 -0
  963. data/vendor/rails/actionmailer/test/fixtures/helper_mailer/use_helper_method.erb +1 -0
  964. data/vendor/rails/actionmailer/test/fixtures/helper_mailer/use_mail_helper.erb +5 -0
  965. data/vendor/rails/actionmailer/test/fixtures/helpers/example_helper.rb +5 -0
  966. data/vendor/rails/actionmailer/test/fixtures/layouts/auto_layout_mailer.html.erb +1 -0
  967. data/vendor/rails/actionmailer/test/fixtures/layouts/auto_layout_mailer.text.erb +1 -0
  968. data/vendor/rails/actionmailer/test/fixtures/layouts/spam.html.erb +1 -0
  969. data/vendor/rails/actionmailer/test/fixtures/path.with.dots/funky_path_mailer/multipart_with_template_path_with_dots.erb +1 -0
  970. data/vendor/rails/actionmailer/test/fixtures/raw_email +14 -0
  971. data/vendor/rails/actionmailer/test/fixtures/raw_email10 +20 -0
  972. data/vendor/rails/actionmailer/test/fixtures/raw_email12 +32 -0
  973. data/vendor/rails/actionmailer/test/fixtures/raw_email13 +29 -0
  974. data/vendor/rails/actionmailer/test/fixtures/raw_email2 +114 -0
  975. data/vendor/rails/actionmailer/test/fixtures/raw_email3 +70 -0
  976. data/vendor/rails/actionmailer/test/fixtures/raw_email4 +59 -0
  977. data/vendor/rails/actionmailer/test/fixtures/raw_email5 +19 -0
  978. data/vendor/rails/actionmailer/test/fixtures/raw_email6 +20 -0
  979. data/vendor/rails/actionmailer/test/fixtures/raw_email7 +66 -0
  980. data/vendor/rails/actionmailer/test/fixtures/raw_email8 +47 -0
  981. data/vendor/rails/actionmailer/test/fixtures/raw_email9 +28 -0
  982. data/vendor/rails/actionmailer/test/fixtures/raw_email_quoted_with_0d0a +14 -0
  983. data/vendor/rails/actionmailer/test/fixtures/raw_email_with_invalid_characters_in_content_type +104 -0
  984. data/vendor/rails/actionmailer/test/fixtures/raw_email_with_nested_attachment +100 -0
  985. data/vendor/rails/actionmailer/test/fixtures/raw_email_with_partially_quoted_subject +14 -0
  986. data/vendor/rails/actionmailer/test/fixtures/second_mailer/share.erb +1 -0
  987. data/vendor/rails/actionmailer/test/fixtures/templates/signed_up.erb +3 -0
  988. data/vendor/rails/actionmailer/test/fixtures/test_mailer/_subtemplate.text.plain.erb +1 -0
  989. data/vendor/rails/actionmailer/test/fixtures/test_mailer/body_ivar.erb +2 -0
  990. data/vendor/rails/actionmailer/test/fixtures/test_mailer/custom_templating_extension.text.html.haml +6 -0
  991. data/vendor/rails/actionmailer/test/fixtures/test_mailer/custom_templating_extension.text.plain.haml +6 -0
  992. data/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.ignored.erb +1 -0
  993. data/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.html.erb +10 -0
  994. data/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.plain.erb +2 -0
  995. data/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.yaml.erb +1 -0
  996. data/vendor/rails/actionmailer/test/fixtures/test_mailer/included_subtemplate.text.plain.erb +1 -0
  997. data/vendor/rails/actionmailer/test/fixtures/test_mailer/rxml_template.builder +2 -0
  998. data/vendor/rails/actionmailer/test/fixtures/test_mailer/rxml_template.rxml +2 -0
  999. data/vendor/rails/actionmailer/test/fixtures/test_mailer/signed_up.html.erb +3 -0
  1000. data/vendor/rails/actionmailer/test/fixtures/test_mailer/signed_up_with_url.erb +5 -0
  1001. data/vendor/rails/actionmailer/test/mail_helper_test.rb +95 -0
  1002. data/vendor/rails/actionmailer/test/mail_layout_test.rb +123 -0
  1003. data/vendor/rails/actionmailer/test/mail_render_test.rb +116 -0
  1004. data/vendor/rails/actionmailer/test/mail_service_test.rb +1145 -0
  1005. data/vendor/rails/actionmailer/test/quoting_test.rb +105 -0
  1006. data/vendor/rails/actionmailer/test/test_helper_test.rb +129 -0
  1007. data/vendor/rails/actionmailer/test/tmail_test.rb +22 -0
  1008. data/vendor/rails/actionmailer/test/url_test.rb +76 -0
  1009. data/vendor/rails/actionpack/CHANGELOG +5239 -0
  1010. data/vendor/rails/actionpack/MIT-LICENSE +21 -0
  1011. data/vendor/rails/actionpack/README +409 -0
  1012. data/vendor/rails/actionpack/RUNNING_UNIT_TESTS +24 -0
  1013. data/vendor/rails/actionpack/Rakefile +160 -0
  1014. data/vendor/rails/actionpack/install.rb +30 -0
  1015. data/vendor/rails/actionpack/lib/action_controller.rb +113 -0
  1016. data/vendor/rails/actionpack/lib/action_controller/assertions/dom_assertions.rb +55 -0
  1017. data/vendor/rails/actionpack/lib/action_controller/assertions/model_assertions.rb +21 -0
  1018. data/vendor/rails/actionpack/lib/action_controller/assertions/response_assertions.rb +169 -0
  1019. data/vendor/rails/actionpack/lib/action_controller/assertions/routing_assertions.rb +146 -0
  1020. data/vendor/rails/actionpack/lib/action_controller/assertions/selector_assertions.rb +638 -0
  1021. data/vendor/rails/actionpack/lib/action_controller/assertions/tag_assertions.rb +127 -0
  1022. data/vendor/rails/actionpack/lib/action_controller/base.rb +1423 -0
  1023. data/vendor/rails/actionpack/lib/action_controller/benchmarking.rb +107 -0
  1024. data/vendor/rails/actionpack/lib/action_controller/caching.rb +71 -0
  1025. data/vendor/rails/actionpack/lib/action_controller/caching/actions.rb +177 -0
  1026. data/vendor/rails/actionpack/lib/action_controller/caching/fragments.rb +120 -0
  1027. data/vendor/rails/actionpack/lib/action_controller/caching/pages.rb +152 -0
  1028. data/vendor/rails/actionpack/lib/action_controller/caching/sweeper.rb +45 -0
  1029. data/vendor/rails/actionpack/lib/action_controller/caching/sweeping.rb +55 -0
  1030. data/vendor/rails/actionpack/lib/action_controller/cgi_ext.rb +15 -0
  1031. data/vendor/rails/actionpack/lib/action_controller/cgi_ext/cookie.rb +112 -0
  1032. data/vendor/rails/actionpack/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  1033. data/vendor/rails/actionpack/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  1034. data/vendor/rails/actionpack/lib/action_controller/cgi_process.rb +77 -0
  1035. data/vendor/rails/actionpack/lib/action_controller/cookies.rb +191 -0
  1036. data/vendor/rails/actionpack/lib/action_controller/dispatcher.rb +133 -0
  1037. data/vendor/rails/actionpack/lib/action_controller/failsafe.rb +87 -0
  1038. data/vendor/rails/actionpack/lib/action_controller/filters.rb +680 -0
  1039. data/vendor/rails/actionpack/lib/action_controller/flash.rb +213 -0
  1040. data/vendor/rails/actionpack/lib/action_controller/headers.rb +33 -0
  1041. data/vendor/rails/actionpack/lib/action_controller/helpers.rb +225 -0
  1042. data/vendor/rails/actionpack/lib/action_controller/http_authentication.rb +309 -0
  1043. data/vendor/rails/actionpack/lib/action_controller/integration.rb +696 -0
  1044. data/vendor/rails/actionpack/lib/action_controller/layout.rb +286 -0
  1045. data/vendor/rails/actionpack/lib/action_controller/middleware_stack.rb +119 -0
  1046. data/vendor/rails/actionpack/lib/action_controller/middlewares.rb +14 -0
  1047. data/vendor/rails/actionpack/lib/action_controller/mime_responds.rb +193 -0
  1048. data/vendor/rails/actionpack/lib/action_controller/mime_type.rb +212 -0
  1049. data/vendor/rails/actionpack/lib/action_controller/mime_types.rb +21 -0
  1050. data/vendor/rails/actionpack/lib/action_controller/params_parser.rb +77 -0
  1051. data/vendor/rails/actionpack/lib/action_controller/performance_test.rb +15 -0
  1052. data/vendor/rails/actionpack/lib/action_controller/polymorphic_routes.rb +189 -0
  1053. data/vendor/rails/actionpack/lib/action_controller/rack_lint_patch.rb +36 -0
  1054. data/vendor/rails/actionpack/lib/action_controller/record_identifier.rb +104 -0
  1055. data/vendor/rails/actionpack/lib/action_controller/reloader.rb +54 -0
  1056. data/vendor/rails/actionpack/lib/action_controller/request.rb +493 -0
  1057. data/vendor/rails/actionpack/lib/action_controller/request_forgery_protection.rb +113 -0
  1058. data/vendor/rails/actionpack/lib/action_controller/rescue.rb +183 -0
  1059. data/vendor/rails/actionpack/lib/action_controller/resources.rb +682 -0
  1060. data/vendor/rails/actionpack/lib/action_controller/response.rb +236 -0
  1061. data/vendor/rails/actionpack/lib/action_controller/routing.rb +388 -0
  1062. data/vendor/rails/actionpack/lib/action_controller/routing/builder.rb +197 -0
  1063. data/vendor/rails/actionpack/lib/action_controller/routing/optimisations.rb +130 -0
  1064. data/vendor/rails/actionpack/lib/action_controller/routing/recognition_optimisation.rb +167 -0
  1065. data/vendor/rails/actionpack/lib/action_controller/routing/route.rb +265 -0
  1066. data/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb +503 -0
  1067. data/vendor/rails/actionpack/lib/action_controller/routing/routing_ext.rb +49 -0
  1068. data/vendor/rails/actionpack/lib/action_controller/routing/segments.rb +343 -0
  1069. data/vendor/rails/actionpack/lib/action_controller/session/abstract_store.rb +187 -0
  1070. data/vendor/rails/actionpack/lib/action_controller/session/cookie_store.rb +227 -0
  1071. data/vendor/rails/actionpack/lib/action_controller/session/mem_cache_store.rb +51 -0
  1072. data/vendor/rails/actionpack/lib/action_controller/session_management.rb +54 -0
  1073. data/vendor/rails/actionpack/lib/action_controller/status_codes.rb +88 -0
  1074. data/vendor/rails/actionpack/lib/action_controller/streaming.rb +181 -0
  1075. data/vendor/rails/actionpack/lib/action_controller/string_coercion.rb +29 -0
  1076. data/vendor/rails/actionpack/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  1077. data/vendor/rails/actionpack/lib/action_controller/templates/rescues/_trace.erb +26 -0
  1078. data/vendor/rails/actionpack/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  1079. data/vendor/rails/actionpack/lib/action_controller/templates/rescues/layout.erb +29 -0
  1080. data/vendor/rails/actionpack/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  1081. data/vendor/rails/actionpack/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  1082. data/vendor/rails/actionpack/lib/action_controller/templates/rescues/template_error.erb +21 -0
  1083. data/vendor/rails/actionpack/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  1084. data/vendor/rails/actionpack/lib/action_controller/test_case.rb +209 -0
  1085. data/vendor/rails/actionpack/lib/action_controller/test_process.rb +580 -0
  1086. data/vendor/rails/actionpack/lib/action_controller/translation.rb +13 -0
  1087. data/vendor/rails/actionpack/lib/action_controller/uploaded_file.rb +44 -0
  1088. data/vendor/rails/actionpack/lib/action_controller/url_rewriter.rb +219 -0
  1089. data/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner.rb +16 -0
  1090. data/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  1091. data/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  1092. data/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  1093. data/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  1094. data/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  1095. data/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  1096. data/vendor/rails/actionpack/lib/action_controller/verification.rb +130 -0
  1097. data/vendor/rails/actionpack/lib/action_pack.rb +24 -0
  1098. data/vendor/rails/actionpack/lib/action_pack/version.rb +9 -0
  1099. data/vendor/rails/actionpack/lib/action_view.rb +58 -0
  1100. data/vendor/rails/actionpack/lib/action_view/base.rb +362 -0
  1101. data/vendor/rails/actionpack/lib/action_view/helpers.rb +59 -0
  1102. data/vendor/rails/actionpack/lib/action_view/helpers/active_record_helper.rb +305 -0
  1103. data/vendor/rails/actionpack/lib/action_view/helpers/asset_tag_helper.rb +694 -0
  1104. data/vendor/rails/actionpack/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  1105. data/vendor/rails/actionpack/lib/action_view/helpers/benchmark_helper.rb +54 -0
  1106. data/vendor/rails/actionpack/lib/action_view/helpers/cache_helper.rb +39 -0
  1107. data/vendor/rails/actionpack/lib/action_view/helpers/capture_helper.rb +136 -0
  1108. data/vendor/rails/actionpack/lib/action_view/helpers/date_helper.rb +989 -0
  1109. data/vendor/rails/actionpack/lib/action_view/helpers/debug_helper.rb +38 -0
  1110. data/vendor/rails/actionpack/lib/action_view/helpers/form_helper.rb +1111 -0
  1111. data/vendor/rails/actionpack/lib/action_view/helpers/form_options_helper.rb +599 -0
  1112. data/vendor/rails/actionpack/lib/action_view/helpers/form_tag_helper.rb +490 -0
  1113. data/vendor/rails/actionpack/lib/action_view/helpers/javascript_helper.rb +208 -0
  1114. data/vendor/rails/actionpack/lib/action_view/helpers/number_helper.rb +308 -0
  1115. data/vendor/rails/actionpack/lib/action_view/helpers/prototype_helper.rb +1305 -0
  1116. data/vendor/rails/actionpack/lib/action_view/helpers/raw_output_helper.rb +9 -0
  1117. data/vendor/rails/actionpack/lib/action_view/helpers/record_identification_helper.rb +20 -0
  1118. data/vendor/rails/actionpack/lib/action_view/helpers/record_tag_helper.rb +58 -0
  1119. data/vendor/rails/actionpack/lib/action_view/helpers/sanitize_helper.rb +251 -0
  1120. data/vendor/rails/actionpack/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  1121. data/vendor/rails/actionpack/lib/action_view/helpers/tag_helper.rb +151 -0
  1122. data/vendor/rails/actionpack/lib/action_view/helpers/text_helper.rb +587 -0
  1123. data/vendor/rails/actionpack/lib/action_view/helpers/translation_helper.rb +67 -0
  1124. data/vendor/rails/actionpack/lib/action_view/helpers/url_helper.rb +636 -0
  1125. data/vendor/rails/actionpack/lib/action_view/inline_template.rb +19 -0
  1126. data/vendor/rails/actionpack/lib/action_view/locale/en.yml +117 -0
  1127. data/vendor/rails/actionpack/lib/action_view/partials.rb +241 -0
  1128. data/vendor/rails/actionpack/lib/action_view/paths.rb +77 -0
  1129. data/vendor/rails/actionpack/lib/action_view/reloadable_template.rb +117 -0
  1130. data/vendor/rails/actionpack/lib/action_view/renderable.rb +109 -0
  1131. data/vendor/rails/actionpack/lib/action_view/renderable_partial.rb +47 -0
  1132. data/vendor/rails/actionpack/lib/action_view/template.rb +252 -0
  1133. data/vendor/rails/actionpack/lib/action_view/template_error.rb +99 -0
  1134. data/vendor/rails/actionpack/lib/action_view/template_handler.rb +34 -0
  1135. data/vendor/rails/actionpack/lib/action_view/template_handlers.rb +48 -0
  1136. data/vendor/rails/actionpack/lib/action_view/template_handlers/builder.rb +17 -0
  1137. data/vendor/rails/actionpack/lib/action_view/template_handlers/erb.rb +25 -0
  1138. data/vendor/rails/actionpack/lib/action_view/template_handlers/rjs.rb +13 -0
  1139. data/vendor/rails/actionpack/lib/action_view/test_case.rb +162 -0
  1140. data/vendor/rails/actionpack/lib/actionpack.rb +2 -0
  1141. data/vendor/rails/actionpack/test/abstract_unit.rb +61 -0
  1142. data/vendor/rails/actionpack/test/active_record_unit.rb +104 -0
  1143. data/vendor/rails/actionpack/test/activerecord/active_record_store_test.rb +174 -0
  1144. data/vendor/rails/actionpack/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
  1145. data/vendor/rails/actionpack/test/adv_attr_test.rb +20 -0
  1146. data/vendor/rails/actionpack/test/controller/action_pack_assertions_test.rb +545 -0
  1147. data/vendor/rails/actionpack/test/controller/addresses_render_test.rb +37 -0
  1148. data/vendor/rails/actionpack/test/controller/assert_select_test.rb +735 -0
  1149. data/vendor/rails/actionpack/test/controller/base_test.rb +217 -0
  1150. data/vendor/rails/actionpack/test/controller/benchmark_test.rb +32 -0
  1151. data/vendor/rails/actionpack/test/controller/caching_test.rb +743 -0
  1152. data/vendor/rails/actionpack/test/controller/capture_test.rb +66 -0
  1153. data/vendor/rails/actionpack/test/controller/content_type_test.rb +168 -0
  1154. data/vendor/rails/actionpack/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  1155. data/vendor/rails/actionpack/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  1156. data/vendor/rails/actionpack/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  1157. data/vendor/rails/actionpack/test/controller/cookie_test.rb +170 -0
  1158. data/vendor/rails/actionpack/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
  1159. data/vendor/rails/actionpack/test/controller/dispatcher_test.rb +144 -0
  1160. data/vendor/rails/actionpack/test/controller/dom_assertions_test.rb +53 -0
  1161. data/vendor/rails/actionpack/test/controller/failsafe_test.rb +60 -0
  1162. data/vendor/rails/actionpack/test/controller/fake_controllers.rb +33 -0
  1163. data/vendor/rails/actionpack/test/controller/fake_models.rb +19 -0
  1164. data/vendor/rails/actionpack/test/controller/filter_params_test.rb +52 -0
  1165. data/vendor/rails/actionpack/test/controller/filters_test.rb +885 -0
  1166. data/vendor/rails/actionpack/test/controller/flash_test.rb +174 -0
  1167. data/vendor/rails/actionpack/test/controller/header_test.rb +14 -0
  1168. data/vendor/rails/actionpack/test/controller/helper_test.rb +224 -0
  1169. data/vendor/rails/actionpack/test/controller/html-scanner/cdata_node_test.rb +15 -0
  1170. data/vendor/rails/actionpack/test/controller/html-scanner/document_test.rb +148 -0
  1171. data/vendor/rails/actionpack/test/controller/html-scanner/node_test.rb +89 -0
  1172. data/vendor/rails/actionpack/test/controller/html-scanner/sanitizer_test.rb +274 -0
  1173. data/vendor/rails/actionpack/test/controller/html-scanner/tag_node_test.rb +238 -0
  1174. data/vendor/rails/actionpack/test/controller/html-scanner/text_node_test.rb +50 -0
  1175. data/vendor/rails/actionpack/test/controller/html-scanner/tokenizer_test.rb +131 -0
  1176. data/vendor/rails/actionpack/test/controller/http_basic_authentication_test.rb +113 -0
  1177. data/vendor/rails/actionpack/test/controller/http_digest_authentication_test.rb +254 -0
  1178. data/vendor/rails/actionpack/test/controller/integration_test.rb +482 -0
  1179. data/vendor/rails/actionpack/test/controller/layout_test.rb +215 -0
  1180. data/vendor/rails/actionpack/test/controller/localized_templates_test.rb +24 -0
  1181. data/vendor/rails/actionpack/test/controller/logging_test.rb +46 -0
  1182. data/vendor/rails/actionpack/test/controller/middleware_stack_test.rb +90 -0
  1183. data/vendor/rails/actionpack/test/controller/mime_responds_test.rb +536 -0
  1184. data/vendor/rails/actionpack/test/controller/mime_type_test.rb +93 -0
  1185. data/vendor/rails/actionpack/test/controller/output_escaping_test.rb +19 -0
  1186. data/vendor/rails/actionpack/test/controller/polymorphic_routes_test.rb +297 -0
  1187. data/vendor/rails/actionpack/test/controller/rack_test.rb +308 -0
  1188. data/vendor/rails/actionpack/test/controller/record_identifier_test.rb +139 -0
  1189. data/vendor/rails/actionpack/test/controller/redirect_test.rb +285 -0
  1190. data/vendor/rails/actionpack/test/controller/reloader_test.rb +124 -0
  1191. data/vendor/rails/actionpack/test/controller/render_test.rb +1771 -0
  1192. data/vendor/rails/actionpack/test/controller/request/json_params_parsing_test.rb +65 -0
  1193. data/vendor/rails/actionpack/test/controller/request/multipart_params_parsing_test.rb +162 -0
  1194. data/vendor/rails/actionpack/test/controller/request/query_string_parsing_test.rb +120 -0
  1195. data/vendor/rails/actionpack/test/controller/request/test_request_test.rb +35 -0
  1196. data/vendor/rails/actionpack/test/controller/request/url_encoded_params_parsing_test.rb +146 -0
  1197. data/vendor/rails/actionpack/test/controller/request/xml_params_parsing_test.rb +103 -0
  1198. data/vendor/rails/actionpack/test/controller/request_forgery_protection_test.rb +265 -0
  1199. data/vendor/rails/actionpack/test/controller/request_test.rb +395 -0
  1200. data/vendor/rails/actionpack/test/controller/rescue_test.rb +542 -0
  1201. data/vendor/rails/actionpack/test/controller/resources_test.rb +1393 -0
  1202. data/vendor/rails/actionpack/test/controller/routing_test.rb +2592 -0
  1203. data/vendor/rails/actionpack/test/controller/selector_test.rb +628 -0
  1204. data/vendor/rails/actionpack/test/controller/send_file_test.rb +171 -0
  1205. data/vendor/rails/actionpack/test/controller/session/cookie_store_test.rb +216 -0
  1206. data/vendor/rails/actionpack/test/controller/session/mem_cache_store_test.rb +127 -0
  1207. data/vendor/rails/actionpack/test/controller/session/test_session_test.rb +58 -0
  1208. data/vendor/rails/actionpack/test/controller/test_test.rb +700 -0
  1209. data/vendor/rails/actionpack/test/controller/translation_test.rb +26 -0
  1210. data/vendor/rails/actionpack/test/controller/url_rewriter_test.rb +389 -0
  1211. data/vendor/rails/actionpack/test/controller/verification_test.rb +270 -0
  1212. data/vendor/rails/actionpack/test/controller/view_paths_test.rb +141 -0
  1213. data/vendor/rails/actionpack/test/controller/webservice_test.rb +260 -0
  1214. data/vendor/rails/actionpack/test/fixtures/_top_level_partial.html.erb +1 -0
  1215. data/vendor/rails/actionpack/test/fixtures/_top_level_partial_only.erb +1 -0
  1216. data/vendor/rails/actionpack/test/fixtures/addresses/list.erb +1 -0
  1217. data/vendor/rails/actionpack/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
  1218. data/vendor/rails/actionpack/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  1219. data/vendor/rails/actionpack/test/fixtures/companies.yml +24 -0
  1220. data/vendor/rails/actionpack/test/fixtures/company.rb +10 -0
  1221. data/vendor/rails/actionpack/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  1222. data/vendor/rails/actionpack/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  1223. data/vendor/rails/actionpack/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  1224. data/vendor/rails/actionpack/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  1225. data/vendor/rails/actionpack/test/fixtures/customers/_customer.html.erb +1 -0
  1226. data/vendor/rails/actionpack/test/fixtures/db_definitions/sqlite.sql +49 -0
  1227. data/vendor/rails/actionpack/test/fixtures/developer.rb +9 -0
  1228. data/vendor/rails/actionpack/test/fixtures/developers.yml +21 -0
  1229. data/vendor/rails/actionpack/test/fixtures/developers/_developer.erb +1 -0
  1230. data/vendor/rails/actionpack/test/fixtures/developers_projects.yml +13 -0
  1231. data/vendor/rails/actionpack/test/fixtures/failsafe/500.html +1 -0
  1232. data/vendor/rails/actionpack/test/fixtures/fun/games/_game.erb +1 -0
  1233. data/vendor/rails/actionpack/test/fixtures/fun/games/hello_world.erb +1 -0
  1234. data/vendor/rails/actionpack/test/fixtures/fun/serious/games/_game.erb +1 -0
  1235. data/vendor/rails/actionpack/test/fixtures/functional_caching/_partial.erb +3 -0
  1236. data/vendor/rails/actionpack/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
  1237. data/vendor/rails/actionpack/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
  1238. data/vendor/rails/actionpack/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
  1239. data/vendor/rails/actionpack/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  1240. data/vendor/rails/actionpack/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  1241. data/vendor/rails/actionpack/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
  1242. data/vendor/rails/actionpack/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  1243. data/vendor/rails/actionpack/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  1244. data/vendor/rails/actionpack/test/fixtures/helpers/abc_helper.rb +5 -0
  1245. data/vendor/rails/actionpack/test/fixtures/helpers/fun/games_helper.rb +3 -0
  1246. data/vendor/rails/actionpack/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  1247. data/vendor/rails/actionpack/test/fixtures/layout_tests/abs_path_layout.rhtml +1 -0
  1248. data/vendor/rails/actionpack/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  1249. data/vendor/rails/actionpack/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  1250. data/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  1251. data/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  1252. data/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  1253. data/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  1254. data/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  1255. data/vendor/rails/actionpack/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  1256. data/vendor/rails/actionpack/test/fixtures/layouts/_column.html.erb +2 -0
  1257. data/vendor/rails/actionpack/test/fixtures/layouts/block_with_layout.erb +3 -0
  1258. data/vendor/rails/actionpack/test/fixtures/layouts/builder.builder +3 -0
  1259. data/vendor/rails/actionpack/test/fixtures/layouts/default_html.html.erb +1 -0
  1260. data/vendor/rails/actionpack/test/fixtures/layouts/partial_with_layout.erb +3 -0
  1261. data/vendor/rails/actionpack/test/fixtures/layouts/standard.erb +1 -0
  1262. data/vendor/rails/actionpack/test/fixtures/layouts/talk_from_action.erb +2 -0
  1263. data/vendor/rails/actionpack/test/fixtures/layouts/xhr.html.erb +2 -0
  1264. data/vendor/rails/actionpack/test/fixtures/layouts/yield.erb +2 -0
  1265. data/vendor/rails/actionpack/test/fixtures/localized/hello_world.de.html +1 -0
  1266. data/vendor/rails/actionpack/test/fixtures/localized/hello_world.en.html +1 -0
  1267. data/vendor/rails/actionpack/test/fixtures/mascot.rb +3 -0
  1268. data/vendor/rails/actionpack/test/fixtures/mascots.yml +4 -0
  1269. data/vendor/rails/actionpack/test/fixtures/mascots/_mascot.html.erb +1 -0
  1270. data/vendor/rails/actionpack/test/fixtures/multipart/binary_file +0 -0
  1271. data/vendor/rails/actionpack/test/fixtures/multipart/boundary_problem_file +10 -0
  1272. data/vendor/rails/actionpack/test/fixtures/multipart/bracketed_param +5 -0
  1273. data/vendor/rails/actionpack/test/fixtures/multipart/empty +10 -0
  1274. data/vendor/rails/actionpack/test/fixtures/multipart/hello.txt +1 -0
  1275. data/vendor/rails/actionpack/test/fixtures/multipart/large_text_file +10 -0
  1276. data/vendor/rails/actionpack/test/fixtures/multipart/mixed_files +0 -0
  1277. data/vendor/rails/actionpack/test/fixtures/multipart/mona_lisa.jpg +0 -0
  1278. data/vendor/rails/actionpack/test/fixtures/multipart/none +9 -0
  1279. data/vendor/rails/actionpack/test/fixtures/multipart/single_parameter +5 -0
  1280. data/vendor/rails/actionpack/test/fixtures/multipart/text_file +10 -0
  1281. data/vendor/rails/actionpack/test/fixtures/override/test/hello_world.erb +1 -0
  1282. data/vendor/rails/actionpack/test/fixtures/override2/layouts/test/sub.erb +1 -0
  1283. data/vendor/rails/actionpack/test/fixtures/post_test/layouts/post.html.erb +1 -0
  1284. data/vendor/rails/actionpack/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  1285. data/vendor/rails/actionpack/test/fixtures/post_test/post/index.html.erb +1 -0
  1286. data/vendor/rails/actionpack/test/fixtures/post_test/post/index.iphone.erb +1 -0
  1287. data/vendor/rails/actionpack/test/fixtures/post_test/super_post/index.html.erb +1 -0
  1288. data/vendor/rails/actionpack/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  1289. data/vendor/rails/actionpack/test/fixtures/project.rb +3 -0
  1290. data/vendor/rails/actionpack/test/fixtures/projects.yml +7 -0
  1291. data/vendor/rails/actionpack/test/fixtures/projects/_project.erb +1 -0
  1292. data/vendor/rails/actionpack/test/fixtures/public/404.html +1 -0
  1293. data/vendor/rails/actionpack/test/fixtures/public/500.da.html +1 -0
  1294. data/vendor/rails/actionpack/test/fixtures/public/500.html +1 -0
  1295. data/vendor/rails/actionpack/test/fixtures/public/absolute/test.css +23 -0
  1296. data/vendor/rails/actionpack/test/fixtures/public/absolute/test.js +63 -0
  1297. data/vendor/rails/actionpack/test/fixtures/public/images/rails.png +0 -0
  1298. data/vendor/rails/actionpack/test/fixtures/public/javascripts/application.js +1 -0
  1299. data/vendor/rails/actionpack/test/fixtures/public/javascripts/bank.js +1 -0
  1300. data/vendor/rails/actionpack/test/fixtures/public/javascripts/controls.js +1 -0
  1301. data/vendor/rails/actionpack/test/fixtures/public/javascripts/dragdrop.js +1 -0
  1302. data/vendor/rails/actionpack/test/fixtures/public/javascripts/effects.js +1 -0
  1303. data/vendor/rails/actionpack/test/fixtures/public/javascripts/prototype.js +1 -0
  1304. data/vendor/rails/actionpack/test/fixtures/public/javascripts/robber.js +1 -0
  1305. data/vendor/rails/actionpack/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
  1306. data/vendor/rails/actionpack/test/fixtures/public/javascripts/version.1.0.js +1 -0
  1307. data/vendor/rails/actionpack/test/fixtures/public/stylesheets/bank.css +1 -0
  1308. data/vendor/rails/actionpack/test/fixtures/public/stylesheets/robber.css +1 -0
  1309. data/vendor/rails/actionpack/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
  1310. data/vendor/rails/actionpack/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  1311. data/vendor/rails/actionpack/test/fixtures/quiz/questions/_question.html.erb +1 -0
  1312. data/vendor/rails/actionpack/test/fixtures/replies.yml +15 -0
  1313. data/vendor/rails/actionpack/test/fixtures/replies/_reply.erb +1 -0
  1314. data/vendor/rails/actionpack/test/fixtures/reply.rb +7 -0
  1315. data/vendor/rails/actionpack/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  1316. data/vendor/rails/actionpack/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
  1317. data/vendor/rails/actionpack/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  1318. data/vendor/rails/actionpack/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  1319. data/vendor/rails/actionpack/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  1320. data/vendor/rails/actionpack/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  1321. data/vendor/rails/actionpack/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  1322. data/vendor/rails/actionpack/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  1323. data/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  1324. data/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  1325. data/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  1326. data/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  1327. data/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  1328. data/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  1329. data/vendor/rails/actionpack/test/fixtures/scope/test/modgreet.erb +1 -0
  1330. data/vendor/rails/actionpack/test/fixtures/shared.html.erb +1 -0
  1331. data/vendor/rails/actionpack/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  1332. data/vendor/rails/actionpack/test/fixtures/test/_counter.html.erb +1 -0
  1333. data/vendor/rails/actionpack/test/fixtures/test/_customer.erb +1 -0
  1334. data/vendor/rails/actionpack/test/fixtures/test/_customer_counter.erb +1 -0
  1335. data/vendor/rails/actionpack/test/fixtures/test/_customer_counter_with_as.erb +1 -0
  1336. data/vendor/rails/actionpack/test/fixtures/test/_customer_greeting.erb +1 -0
  1337. data/vendor/rails/actionpack/test/fixtures/test/_customer_with_var.erb +1 -0
  1338. data/vendor/rails/actionpack/test/fixtures/test/_form.erb +1 -0
  1339. data/vendor/rails/actionpack/test/fixtures/test/_from_helper.erb +1 -0
  1340. data/vendor/rails/actionpack/test/fixtures/test/_hash_greeting.erb +1 -0
  1341. data/vendor/rails/actionpack/test/fixtures/test/_hash_object.erb +2 -0
  1342. data/vendor/rails/actionpack/test/fixtures/test/_hello.builder +1 -0
  1343. data/vendor/rails/actionpack/test/fixtures/test/_labelling_form.erb +1 -0
  1344. data/vendor/rails/actionpack/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
  1345. data/vendor/rails/actionpack/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  1346. data/vendor/rails/actionpack/test/fixtures/test/_local_inspector.html.erb +1 -0
  1347. data/vendor/rails/actionpack/test/fixtures/test/_one.html.erb +1 -0
  1348. data/vendor/rails/actionpack/test/fixtures/test/_partial.erb +1 -0
  1349. data/vendor/rails/actionpack/test/fixtures/test/_partial.html.erb +1 -0
  1350. data/vendor/rails/actionpack/test/fixtures/test/_partial.js.erb +1 -0
  1351. data/vendor/rails/actionpack/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  1352. data/vendor/rails/actionpack/test/fixtures/test/_partial_only.erb +1 -0
  1353. data/vendor/rails/actionpack/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
  1354. data/vendor/rails/actionpack/test/fixtures/test/_person.erb +2 -0
  1355. data/vendor/rails/actionpack/test/fixtures/test/_raise.html.erb +1 -0
  1356. data/vendor/rails/actionpack/test/fixtures/test/_two.html.erb +1 -0
  1357. data/vendor/rails/actionpack/test/fixtures/test/_utf8_partial.html.erb +1 -0
  1358. data/vendor/rails/actionpack/test/fixtures/test/_utf8_partial_magic.html.erb +2 -0
  1359. data/vendor/rails/actionpack/test/fixtures/test/action_talk_to_layout.erb +2 -0
  1360. data/vendor/rails/actionpack/test/fixtures/test/array_translation.erb +1 -0
  1361. data/vendor/rails/actionpack/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  1362. data/vendor/rails/actionpack/test/fixtures/test/capturing.erb +4 -0
  1363. data/vendor/rails/actionpack/test/fixtures/test/content_for.erb +2 -0
  1364. data/vendor/rails/actionpack/test/fixtures/test/content_for_concatenated.erb +3 -0
  1365. data/vendor/rails/actionpack/test/fixtures/test/content_for_with_parameter.erb +2 -0
  1366. data/vendor/rails/actionpack/test/fixtures/test/delete_with_js.rjs +2 -0
  1367. data/vendor/rails/actionpack/test/fixtures/test/dont_pick_me +1 -0
  1368. data/vendor/rails/actionpack/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  1369. data/vendor/rails/actionpack/test/fixtures/test/enum_rjs_test.rjs +6 -0
  1370. data/vendor/rails/actionpack/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  1371. data/vendor/rails/actionpack/test/fixtures/test/formatted_xml_erb.builder +1 -0
  1372. data/vendor/rails/actionpack/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  1373. data/vendor/rails/actionpack/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  1374. data/vendor/rails/actionpack/test/fixtures/test/greeting.erb +1 -0
  1375. data/vendor/rails/actionpack/test/fixtures/test/greeting.js.rjs +1 -0
  1376. data/vendor/rails/actionpack/test/fixtures/test/hello.builder +4 -0
  1377. data/vendor/rails/actionpack/test/fixtures/test/hello_world.da.html.erb +1 -0
  1378. data/vendor/rails/actionpack/test/fixtures/test/hello_world.erb +1 -0
  1379. data/vendor/rails/actionpack/test/fixtures/test/hello_world.pt-BR.html.erb +1 -0
  1380. data/vendor/rails/actionpack/test/fixtures/test/hello_world_container.builder +3 -0
  1381. data/vendor/rails/actionpack/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  1382. data/vendor/rails/actionpack/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  1383. data/vendor/rails/actionpack/test/fixtures/test/hello_xml_world.builder +11 -0
  1384. data/vendor/rails/actionpack/test/fixtures/test/hyphen-ated.erb +1 -0
  1385. data/vendor/rails/actionpack/test/fixtures/test/implicit_content_type.atom.builder +2 -0
  1386. data/vendor/rails/actionpack/test/fixtures/test/list.erb +1 -0
  1387. data/vendor/rails/actionpack/test/fixtures/test/nested_layout.erb +3 -0
  1388. data/vendor/rails/actionpack/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  1389. data/vendor/rails/actionpack/test/fixtures/test/potential_conflicts.erb +4 -0
  1390. data/vendor/rails/actionpack/test/fixtures/test/render_explicit_html_template.js.rjs +1 -0
  1391. data/vendor/rails/actionpack/test/fixtures/test/render_file_from_template.html.erb +1 -0
  1392. data/vendor/rails/actionpack/test/fixtures/test/render_file_with_ivar.erb +1 -0
  1393. data/vendor/rails/actionpack/test/fixtures/test/render_file_with_locals.erb +1 -0
  1394. data/vendor/rails/actionpack/test/fixtures/test/render_implicit_html_template.js.rjs +1 -0
  1395. data/vendor/rails/actionpack/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
  1396. data/vendor/rails/actionpack/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
  1397. data/vendor/rails/actionpack/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
  1398. data/vendor/rails/actionpack/test/fixtures/test/render_to_string_test.erb +1 -0
  1399. data/vendor/rails/actionpack/test/fixtures/test/scoped_array_translation.erb +1 -0
  1400. data/vendor/rails/actionpack/test/fixtures/test/sub_template_raise.html.erb +1 -0
  1401. data/vendor/rails/actionpack/test/fixtures/test/template.erb +1 -0
  1402. data/vendor/rails/actionpack/test/fixtures/test/translation.erb +1 -0
  1403. data/vendor/rails/actionpack/test/fixtures/test/update_element_with_capture.erb +9 -0
  1404. data/vendor/rails/actionpack/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  1405. data/vendor/rails/actionpack/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
  1406. data/vendor/rails/actionpack/test/fixtures/test/utf8.html.erb +4 -0
  1407. data/vendor/rails/actionpack/test/fixtures/test/utf8_magic.html.erb +5 -0
  1408. data/vendor/rails/actionpack/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +5 -0
  1409. data/vendor/rails/actionpack/test/fixtures/topic.rb +3 -0
  1410. data/vendor/rails/actionpack/test/fixtures/topics.yml +22 -0
  1411. data/vendor/rails/actionpack/test/fixtures/topics/_topic.html.erb +1 -0
  1412. data/vendor/rails/actionpack/test/template/active_record_helper_i18n_test.rb +51 -0
  1413. data/vendor/rails/actionpack/test/template/active_record_helper_test.rb +302 -0
  1414. data/vendor/rails/actionpack/test/template/asset_tag_helper_test.rb +770 -0
  1415. data/vendor/rails/actionpack/test/template/atom_feed_helper_test.rb +315 -0
  1416. data/vendor/rails/actionpack/test/template/benchmark_helper_test.rb +86 -0
  1417. data/vendor/rails/actionpack/test/template/compiled_templates_test.rb +204 -0
  1418. data/vendor/rails/actionpack/test/template/date_helper_i18n_test.rb +121 -0
  1419. data/vendor/rails/actionpack/test/template/date_helper_test.rb +2603 -0
  1420. data/vendor/rails/actionpack/test/template/erb_util_test.rb +36 -0
  1421. data/vendor/rails/actionpack/test/template/form_helper_test.rb +1447 -0
  1422. data/vendor/rails/actionpack/test/template/form_options_helper_i18n_test.rb +27 -0
  1423. data/vendor/rails/actionpack/test/template/form_options_helper_test.rb +807 -0
  1424. data/vendor/rails/actionpack/test/template/form_tag_helper_test.rb +356 -0
  1425. data/vendor/rails/actionpack/test/template/javascript_helper_test.rb +106 -0
  1426. data/vendor/rails/actionpack/test/template/number_helper_i18n_test.rb +69 -0
  1427. data/vendor/rails/actionpack/test/template/number_helper_test.rb +132 -0
  1428. data/vendor/rails/actionpack/test/template/prototype_helper_test.rb +639 -0
  1429. data/vendor/rails/actionpack/test/template/raw_output_helper_test.rb +21 -0
  1430. data/vendor/rails/actionpack/test/template/record_tag_helper_test.rb +58 -0
  1431. data/vendor/rails/actionpack/test/template/render_test.rb +329 -0
  1432. data/vendor/rails/actionpack/test/template/sanitize_helper_test.rb +57 -0
  1433. data/vendor/rails/actionpack/test/template/scriptaculous_helper_test.rb +90 -0
  1434. data/vendor/rails/actionpack/test/template/tag_helper_test.rb +98 -0
  1435. data/vendor/rails/actionpack/test/template/template_test.rb +32 -0
  1436. data/vendor/rails/actionpack/test/template/test_test.rb +54 -0
  1437. data/vendor/rails/actionpack/test/template/text_helper_test.rb +568 -0
  1438. data/vendor/rails/actionpack/test/template/translation_helper_test.rb +95 -0
  1439. data/vendor/rails/actionpack/test/template/url_helper_test.rb +641 -0
  1440. data/vendor/rails/actionpack/test/testing_sandbox.rb +15 -0
  1441. data/vendor/rails/actionpack/test/view/test_case_test.rb +176 -0
  1442. data/vendor/rails/activerecord/CHANGELOG +5901 -0
  1443. data/vendor/rails/activerecord/README +351 -0
  1444. data/vendor/rails/activerecord/RUNNING_UNIT_TESTS +36 -0
  1445. data/vendor/rails/activerecord/Rakefile +270 -0
  1446. data/vendor/rails/activerecord/examples/associations.png +0 -0
  1447. data/vendor/rails/activerecord/examples/performance.rb +162 -0
  1448. data/vendor/rails/activerecord/examples/performance.sql +85 -0
  1449. data/vendor/rails/activerecord/install.rb +30 -0
  1450. data/vendor/rails/activerecord/lib/active_record.rb +83 -0
  1451. data/vendor/rails/activerecord/lib/active_record/aggregations.rb +261 -0
  1452. data/vendor/rails/activerecord/lib/active_record/association_preload.rb +396 -0
  1453. data/vendor/rails/activerecord/lib/active_record/associations.rb +2251 -0
  1454. data/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb +479 -0
  1455. data/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb +288 -0
  1456. data/vendor/rails/activerecord/lib/active_record/associations/belongs_to_association.rb +86 -0
  1457. data/vendor/rails/activerecord/lib/active_record/associations/belongs_to_polymorphic_association.rb +77 -0
  1458. data/vendor/rails/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb +143 -0
  1459. data/vendor/rails/activerecord/lib/active_record/associations/has_many_association.rb +127 -0
  1460. data/vendor/rails/activerecord/lib/active_record/associations/has_many_through_association.rb +266 -0
  1461. data/vendor/rails/activerecord/lib/active_record/associations/has_one_association.rb +142 -0
  1462. data/vendor/rails/activerecord/lib/active_record/associations/has_one_through_association.rb +37 -0
  1463. data/vendor/rails/activerecord/lib/active_record/attribute_methods.rb +392 -0
  1464. data/vendor/rails/activerecord/lib/active_record/autosave_association.rb +395 -0
  1465. data/vendor/rails/activerecord/lib/active_record/base.rb +3206 -0
  1466. data/vendor/rails/activerecord/lib/active_record/batches.rb +85 -0
  1467. data/vendor/rails/activerecord/lib/active_record/calculations.rb +314 -0
  1468. data/vendor/rails/activerecord/lib/active_record/callbacks.rb +360 -0
  1469. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb +371 -0
  1470. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_specification.rb +139 -0
  1471. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/database_limits.rb +57 -0
  1472. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb +289 -0
  1473. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb +94 -0
  1474. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb +65 -0
  1475. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb +722 -0
  1476. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb +488 -0
  1477. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +243 -0
  1478. data/vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +660 -0
  1479. data/vendor/rails/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +1078 -0
  1480. data/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb +34 -0
  1481. data/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb +453 -0
  1482. data/vendor/rails/activerecord/lib/active_record/dirty.rb +183 -0
  1483. data/vendor/rails/activerecord/lib/active_record/dynamic_finder_match.rb +41 -0
  1484. data/vendor/rails/activerecord/lib/active_record/dynamic_scope_match.rb +25 -0
  1485. data/vendor/rails/activerecord/lib/active_record/fixtures.rb +997 -0
  1486. data/vendor/rails/activerecord/lib/active_record/locale/en.yml +58 -0
  1487. data/vendor/rails/activerecord/lib/active_record/locking/optimistic.rb +181 -0
  1488. data/vendor/rails/activerecord/lib/active_record/locking/pessimistic.rb +55 -0
  1489. data/vendor/rails/activerecord/lib/active_record/migration.rb +571 -0
  1490. data/vendor/rails/activerecord/lib/active_record/named_scope.rb +192 -0
  1491. data/vendor/rails/activerecord/lib/active_record/nested_attributes.rb +404 -0
  1492. data/vendor/rails/activerecord/lib/active_record/observer.rb +197 -0
  1493. data/vendor/rails/activerecord/lib/active_record/query_cache.rb +33 -0
  1494. data/vendor/rails/activerecord/lib/active_record/reflection.rb +385 -0
  1495. data/vendor/rails/activerecord/lib/active_record/schema.rb +55 -0
  1496. data/vendor/rails/activerecord/lib/active_record/schema_dumper.rb +185 -0
  1497. data/vendor/rails/activerecord/lib/active_record/serialization.rb +101 -0
  1498. data/vendor/rails/activerecord/lib/active_record/serializers/json_serializer.rb +91 -0
  1499. data/vendor/rails/activerecord/lib/active_record/serializers/xml_serializer.rb +357 -0
  1500. data/vendor/rails/activerecord/lib/active_record/session_store.rb +326 -0
  1501. data/vendor/rails/activerecord/lib/active_record/test_case.rb +66 -0
  1502. data/vendor/rails/activerecord/lib/active_record/timestamp.rb +71 -0
  1503. data/vendor/rails/activerecord/lib/active_record/transactions.rb +235 -0
  1504. data/vendor/rails/activerecord/lib/active_record/validations.rb +1147 -0
  1505. data/vendor/rails/activerecord/lib/active_record/version.rb +9 -0
  1506. data/vendor/rails/activerecord/lib/activerecord.rb +2 -0
  1507. data/vendor/rails/activerecord/test/assets/example.log +1 -0
  1508. data/vendor/rails/activerecord/test/assets/flowers.jpg +0 -0
  1509. data/vendor/rails/activerecord/test/cases/aaa_create_tables_test.rb +24 -0
  1510. data/vendor/rails/activerecord/test/cases/active_schema_test_mysql.rb +122 -0
  1511. data/vendor/rails/activerecord/test/cases/active_schema_test_postgresql.rb +24 -0
  1512. data/vendor/rails/activerecord/test/cases/adapter_test.rb +145 -0
  1513. data/vendor/rails/activerecord/test/cases/aggregations_test.rb +167 -0
  1514. data/vendor/rails/activerecord/test/cases/ar_schema_test.rb +32 -0
  1515. data/vendor/rails/activerecord/test/cases/associations/belongs_to_associations_test.rb +438 -0
  1516. data/vendor/rails/activerecord/test/cases/associations/callbacks_test.rb +161 -0
  1517. data/vendor/rails/activerecord/test/cases/associations/cascaded_eager_loading_test.rb +131 -0
  1518. data/vendor/rails/activerecord/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -0
  1519. data/vendor/rails/activerecord/test/cases/associations/eager_load_nested_include_test.rb +131 -0
  1520. data/vendor/rails/activerecord/test/cases/associations/eager_singularization_test.rb +145 -0
  1521. data/vendor/rails/activerecord/test/cases/associations/eager_test.rb +840 -0
  1522. data/vendor/rails/activerecord/test/cases/associations/extension_test.rb +62 -0
  1523. data/vendor/rails/activerecord/test/cases/associations/habtm_join_table_test.rb +56 -0
  1524. data/vendor/rails/activerecord/test/cases/associations/has_and_belongs_to_many_associations_test.rb +822 -0
  1525. data/vendor/rails/activerecord/test/cases/associations/has_many_associations_test.rb +1160 -0
  1526. data/vendor/rails/activerecord/test/cases/associations/has_many_through_associations_test.rb +346 -0
  1527. data/vendor/rails/activerecord/test/cases/associations/has_one_associations_test.rb +330 -0
  1528. data/vendor/rails/activerecord/test/cases/associations/has_one_through_associations_test.rb +209 -0
  1529. data/vendor/rails/activerecord/test/cases/associations/inner_join_association_test.rb +93 -0
  1530. data/vendor/rails/activerecord/test/cases/associations/inverse_associations_test.rb +566 -0
  1531. data/vendor/rails/activerecord/test/cases/associations/join_model_test.rb +712 -0
  1532. data/vendor/rails/activerecord/test/cases/associations_test.rb +272 -0
  1533. data/vendor/rails/activerecord/test/cases/attribute_methods_test.rb +305 -0
  1534. data/vendor/rails/activerecord/test/cases/autosave_association_test.rb +1218 -0
  1535. data/vendor/rails/activerecord/test/cases/base_test.rb +2183 -0
  1536. data/vendor/rails/activerecord/test/cases/batches_test.rb +81 -0
  1537. data/vendor/rails/activerecord/test/cases/binary_test.rb +30 -0
  1538. data/vendor/rails/activerecord/test/cases/calculations_test.rb +347 -0
  1539. data/vendor/rails/activerecord/test/cases/callbacks_observers_test.rb +38 -0
  1540. data/vendor/rails/activerecord/test/cases/callbacks_test.rb +438 -0
  1541. data/vendor/rails/activerecord/test/cases/class_inheritable_attributes_test.rb +32 -0
  1542. data/vendor/rails/activerecord/test/cases/column_alias_test.rb +17 -0
  1543. data/vendor/rails/activerecord/test/cases/column_definition_test.rb +70 -0
  1544. data/vendor/rails/activerecord/test/cases/connection_pool_test.rb +25 -0
  1545. data/vendor/rails/activerecord/test/cases/connection_test_firebird.rb +8 -0
  1546. data/vendor/rails/activerecord/test/cases/connection_test_mysql.rb +64 -0
  1547. data/vendor/rails/activerecord/test/cases/copy_table_test_sqlite.rb +80 -0
  1548. data/vendor/rails/activerecord/test/cases/database_statements_test.rb +12 -0
  1549. data/vendor/rails/activerecord/test/cases/datatype_test_postgresql.rb +204 -0
  1550. data/vendor/rails/activerecord/test/cases/date_time_test.rb +37 -0
  1551. data/vendor/rails/activerecord/test/cases/default_test_firebird.rb +16 -0
  1552. data/vendor/rails/activerecord/test/cases/defaults_test.rb +111 -0
  1553. data/vendor/rails/activerecord/test/cases/deprecated_finder_test.rb +30 -0
  1554. data/vendor/rails/activerecord/test/cases/dirty_test.rb +316 -0
  1555. data/vendor/rails/activerecord/test/cases/encoding_test.rb +6 -0
  1556. data/vendor/rails/activerecord/test/cases/finder_respond_to_test.rb +76 -0
  1557. data/vendor/rails/activerecord/test/cases/finder_test.rb +1070 -0
  1558. data/vendor/rails/activerecord/test/cases/fixtures_test.rb +661 -0
  1559. data/vendor/rails/activerecord/test/cases/helper.rb +68 -0
  1560. data/vendor/rails/activerecord/test/cases/i18n_test.rb +46 -0
  1561. data/vendor/rails/activerecord/test/cases/inheritance_test.rb +262 -0
  1562. data/vendor/rails/activerecord/test/cases/invalid_date_test.rb +24 -0
  1563. data/vendor/rails/activerecord/test/cases/json_serialization_test.rb +219 -0
  1564. data/vendor/rails/activerecord/test/cases/lifecycle_test.rb +193 -0
  1565. data/vendor/rails/activerecord/test/cases/locking_test.rb +349 -0
  1566. data/vendor/rails/activerecord/test/cases/method_scoping_test.rb +704 -0
  1567. data/vendor/rails/activerecord/test/cases/migration_test.rb +1638 -0
  1568. data/vendor/rails/activerecord/test/cases/migration_test_firebird.rb +124 -0
  1569. data/vendor/rails/activerecord/test/cases/mixin_test.rb +96 -0
  1570. data/vendor/rails/activerecord/test/cases/modules_test.rb +109 -0
  1571. data/vendor/rails/activerecord/test/cases/multiple_db_test.rb +85 -0
  1572. data/vendor/rails/activerecord/test/cases/named_scope_test.rb +361 -0
  1573. data/vendor/rails/activerecord/test/cases/nested_attributes_test.rb +813 -0
  1574. data/vendor/rails/activerecord/test/cases/pk_test.rb +119 -0
  1575. data/vendor/rails/activerecord/test/cases/pooled_connections_test.rb +103 -0
  1576. data/vendor/rails/activerecord/test/cases/query_cache_test.rb +129 -0
  1577. data/vendor/rails/activerecord/test/cases/readonly_test.rb +107 -0
  1578. data/vendor/rails/activerecord/test/cases/reflection_test.rb +234 -0
  1579. data/vendor/rails/activerecord/test/cases/reload_models_test.rb +22 -0
  1580. data/vendor/rails/activerecord/test/cases/repair_helper.rb +50 -0
  1581. data/vendor/rails/activerecord/test/cases/reserved_word_test_mysql.rb +176 -0
  1582. data/vendor/rails/activerecord/test/cases/sanitize_test.rb +25 -0
  1583. data/vendor/rails/activerecord/test/cases/schema_authorization_test_postgresql.rb +75 -0
  1584. data/vendor/rails/activerecord/test/cases/schema_dumper_test.rb +211 -0
  1585. data/vendor/rails/activerecord/test/cases/schema_test_postgresql.rb +178 -0
  1586. data/vendor/rails/activerecord/test/cases/serialization_test.rb +47 -0
  1587. data/vendor/rails/activerecord/test/cases/synonym_test_oracle.rb +17 -0
  1588. data/vendor/rails/activerecord/test/cases/timestamp_test.rb +75 -0
  1589. data/vendor/rails/activerecord/test/cases/transactions_test.rb +522 -0
  1590. data/vendor/rails/activerecord/test/cases/unconnected_test.rb +32 -0
  1591. data/vendor/rails/activerecord/test/cases/validations_i18n_test.rb +925 -0
  1592. data/vendor/rails/activerecord/test/cases/validations_test.rb +1672 -0
  1593. data/vendor/rails/activerecord/test/cases/xml_serialization_test.rb +240 -0
  1594. data/vendor/rails/activerecord/test/cases/yaml_serialization_test.rb +11 -0
  1595. data/vendor/rails/activerecord/test/config.rb +5 -0
  1596. data/vendor/rails/activerecord/test/connections/jdbc_jdbcderby/connection.rb +18 -0
  1597. data/vendor/rails/activerecord/test/connections/jdbc_jdbch2/connection.rb +18 -0
  1598. data/vendor/rails/activerecord/test/connections/jdbc_jdbchsqldb/connection.rb +18 -0
  1599. data/vendor/rails/activerecord/test/connections/jdbc_jdbcmysql/connection.rb +26 -0
  1600. data/vendor/rails/activerecord/test/connections/jdbc_jdbcpostgresql/connection.rb +26 -0
  1601. data/vendor/rails/activerecord/test/connections/jdbc_jdbcsqlite3/connection.rb +25 -0
  1602. data/vendor/rails/activerecord/test/connections/native_db2/connection.rb +25 -0
  1603. data/vendor/rails/activerecord/test/connections/native_firebird/connection.rb +26 -0
  1604. data/vendor/rails/activerecord/test/connections/native_frontbase/connection.rb +27 -0
  1605. data/vendor/rails/activerecord/test/connections/native_mysql/connection.rb +25 -0
  1606. data/vendor/rails/activerecord/test/connections/native_openbase/connection.rb +21 -0
  1607. data/vendor/rails/activerecord/test/connections/native_oracle/connection.rb +27 -0
  1608. data/vendor/rails/activerecord/test/connections/native_postgresql/connection.rb +21 -0
  1609. data/vendor/rails/activerecord/test/connections/native_sqlite/connection.rb +25 -0
  1610. data/vendor/rails/activerecord/test/connections/native_sqlite3/connection.rb +25 -0
  1611. data/vendor/rails/activerecord/test/connections/native_sqlite3/in_memory_connection.rb +18 -0
  1612. data/vendor/rails/activerecord/test/connections/native_sybase/connection.rb +23 -0
  1613. data/vendor/rails/activerecord/test/fixtures/accounts.yml +29 -0
  1614. data/vendor/rails/activerecord/test/fixtures/all/developers.yml +0 -0
  1615. data/vendor/rails/activerecord/test/fixtures/all/people.csv +0 -0
  1616. data/vendor/rails/activerecord/test/fixtures/all/tasks.yml +0 -0
  1617. data/vendor/rails/activerecord/test/fixtures/author_addresses.yml +5 -0
  1618. data/vendor/rails/activerecord/test/fixtures/author_favorites.yml +4 -0
  1619. data/vendor/rails/activerecord/test/fixtures/authors.yml +9 -0
  1620. data/vendor/rails/activerecord/test/fixtures/binaries.yml +132 -0
  1621. data/vendor/rails/activerecord/test/fixtures/books.yml +7 -0
  1622. data/vendor/rails/activerecord/test/fixtures/categories.yml +14 -0
  1623. data/vendor/rails/activerecord/test/fixtures/categories/special_categories.yml +9 -0
  1624. data/vendor/rails/activerecord/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
  1625. data/vendor/rails/activerecord/test/fixtures/categories_ordered.yml +7 -0
  1626. data/vendor/rails/activerecord/test/fixtures/categories_posts.yml +23 -0
  1627. data/vendor/rails/activerecord/test/fixtures/categorizations.yml +17 -0
  1628. data/vendor/rails/activerecord/test/fixtures/clubs.yml +6 -0
  1629. data/vendor/rails/activerecord/test/fixtures/comments.yml +59 -0
  1630. data/vendor/rails/activerecord/test/fixtures/companies.yml +56 -0
  1631. data/vendor/rails/activerecord/test/fixtures/computers.yml +4 -0
  1632. data/vendor/rails/activerecord/test/fixtures/courses.yml +7 -0
  1633. data/vendor/rails/activerecord/test/fixtures/customers.yml +26 -0
  1634. data/vendor/rails/activerecord/test/fixtures/developers.yml +21 -0
  1635. data/vendor/rails/activerecord/test/fixtures/developers_projects.yml +17 -0
  1636. data/vendor/rails/activerecord/test/fixtures/edges.yml +6 -0
  1637. data/vendor/rails/activerecord/test/fixtures/entrants.yml +14 -0
  1638. data/vendor/rails/activerecord/test/fixtures/faces.yml +11 -0
  1639. data/vendor/rails/activerecord/test/fixtures/fixture_database.sqlite +0 -0
  1640. data/vendor/rails/activerecord/test/fixtures/fixture_database.sqlite3 +0 -0
  1641. data/vendor/rails/activerecord/test/fixtures/fixture_database_2.sqlite +0 -0
  1642. data/vendor/rails/activerecord/test/fixtures/fixture_database_2.sqlite3 +0 -0
  1643. data/vendor/rails/activerecord/test/fixtures/fk_test_has_fk.yml +3 -0
  1644. data/vendor/rails/activerecord/test/fixtures/fk_test_has_pk.yml +2 -0
  1645. data/vendor/rails/activerecord/test/fixtures/funny_jokes.yml +10 -0
  1646. data/vendor/rails/activerecord/test/fixtures/interests.yml +33 -0
  1647. data/vendor/rails/activerecord/test/fixtures/items.yml +4 -0
  1648. data/vendor/rails/activerecord/test/fixtures/jobs.yml +7 -0
  1649. data/vendor/rails/activerecord/test/fixtures/legacy_things.yml +3 -0
  1650. data/vendor/rails/activerecord/test/fixtures/mateys.yml +4 -0
  1651. data/vendor/rails/activerecord/test/fixtures/member_types.yml +6 -0
  1652. data/vendor/rails/activerecord/test/fixtures/members.yml +6 -0
  1653. data/vendor/rails/activerecord/test/fixtures/memberships.yml +20 -0
  1654. data/vendor/rails/activerecord/test/fixtures/men.yml +5 -0
  1655. data/vendor/rails/activerecord/test/fixtures/minimalistics.yml +2 -0
  1656. data/vendor/rails/activerecord/test/fixtures/mixed_case_monkeys.yml +6 -0
  1657. data/vendor/rails/activerecord/test/fixtures/mixins.yml +29 -0
  1658. data/vendor/rails/activerecord/test/fixtures/movies.yml +7 -0
  1659. data/vendor/rails/activerecord/test/fixtures/naked/csv/accounts.csv +1 -0
  1660. data/vendor/rails/activerecord/test/fixtures/naked/yml/accounts.yml +1 -0
  1661. data/vendor/rails/activerecord/test/fixtures/naked/yml/companies.yml +1 -0
  1662. data/vendor/rails/activerecord/test/fixtures/naked/yml/courses.yml +1 -0
  1663. data/vendor/rails/activerecord/test/fixtures/organizations.yml +5 -0
  1664. data/vendor/rails/activerecord/test/fixtures/owners.yml +7 -0
  1665. data/vendor/rails/activerecord/test/fixtures/parrots.yml +27 -0
  1666. data/vendor/rails/activerecord/test/fixtures/parrots_pirates.yml +7 -0
  1667. data/vendor/rails/activerecord/test/fixtures/people.yml +15 -0
  1668. data/vendor/rails/activerecord/test/fixtures/pets.yml +14 -0
  1669. data/vendor/rails/activerecord/test/fixtures/pirates.yml +9 -0
  1670. data/vendor/rails/activerecord/test/fixtures/posts.yml +52 -0
  1671. data/vendor/rails/activerecord/test/fixtures/price_estimates.yml +7 -0
  1672. data/vendor/rails/activerecord/test/fixtures/projects.yml +7 -0
  1673. data/vendor/rails/activerecord/test/fixtures/readers.yml +9 -0
  1674. data/vendor/rails/activerecord/test/fixtures/references.yml +17 -0
  1675. data/vendor/rails/activerecord/test/fixtures/reserved_words/distinct.yml +5 -0
  1676. data/vendor/rails/activerecord/test/fixtures/reserved_words/distincts_selects.yml +11 -0
  1677. data/vendor/rails/activerecord/test/fixtures/reserved_words/group.yml +14 -0
  1678. data/vendor/rails/activerecord/test/fixtures/reserved_words/select.yml +8 -0
  1679. data/vendor/rails/activerecord/test/fixtures/reserved_words/values.yml +7 -0
  1680. data/vendor/rails/activerecord/test/fixtures/ships.yml +5 -0
  1681. data/vendor/rails/activerecord/test/fixtures/sponsors.yml +9 -0
  1682. data/vendor/rails/activerecord/test/fixtures/subscribers.yml +7 -0
  1683. data/vendor/rails/activerecord/test/fixtures/subscriptions.yml +12 -0
  1684. data/vendor/rails/activerecord/test/fixtures/taggings.yml +28 -0
  1685. data/vendor/rails/activerecord/test/fixtures/tags.yml +7 -0
  1686. data/vendor/rails/activerecord/test/fixtures/tasks.yml +7 -0
  1687. data/vendor/rails/activerecord/test/fixtures/topics.yml +42 -0
  1688. data/vendor/rails/activerecord/test/fixtures/toys.yml +4 -0
  1689. data/vendor/rails/activerecord/test/fixtures/treasures.yml +10 -0
  1690. data/vendor/rails/activerecord/test/fixtures/vertices.yml +4 -0
  1691. data/vendor/rails/activerecord/test/fixtures/warehouse-things.yml +3 -0
  1692. data/vendor/rails/activerecord/test/fixtures/zines.yml +5 -0
  1693. data/vendor/rails/activerecord/test/migrations/broken/100_migration_that_raises_exception.rb +10 -0
  1694. data/vendor/rails/activerecord/test/migrations/decimal/1_give_me_big_numbers.rb +15 -0
  1695. data/vendor/rails/activerecord/test/migrations/duplicate/1_people_have_last_names.rb +9 -0
  1696. data/vendor/rails/activerecord/test/migrations/duplicate/2_we_need_reminders.rb +12 -0
  1697. data/vendor/rails/activerecord/test/migrations/duplicate/3_foo.rb +7 -0
  1698. data/vendor/rails/activerecord/test/migrations/duplicate/3_innocent_jointable.rb +12 -0
  1699. data/vendor/rails/activerecord/test/migrations/duplicate_names/20080507052938_chunky.rb +7 -0
  1700. data/vendor/rails/activerecord/test/migrations/duplicate_names/20080507053028_chunky.rb +7 -0
  1701. data/vendor/rails/activerecord/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +12 -0
  1702. data/vendor/rails/activerecord/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +9 -0
  1703. data/vendor/rails/activerecord/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +12 -0
  1704. data/vendor/rails/activerecord/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +9 -0
  1705. data/vendor/rails/activerecord/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +8 -0
  1706. data/vendor/rails/activerecord/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +12 -0
  1707. data/vendor/rails/activerecord/test/migrations/missing/1000_people_have_middle_names.rb +9 -0
  1708. data/vendor/rails/activerecord/test/migrations/missing/1_people_have_last_names.rb +9 -0
  1709. data/vendor/rails/activerecord/test/migrations/missing/3_we_need_reminders.rb +12 -0
  1710. data/vendor/rails/activerecord/test/migrations/missing/4_innocent_jointable.rb +12 -0
  1711. data/vendor/rails/activerecord/test/migrations/valid/1_people_have_last_names.rb +9 -0
  1712. data/vendor/rails/activerecord/test/migrations/valid/2_we_need_reminders.rb +12 -0
  1713. data/vendor/rails/activerecord/test/migrations/valid/3_innocent_jointable.rb +12 -0
  1714. data/vendor/rails/activerecord/test/models/author.rb +149 -0
  1715. data/vendor/rails/activerecord/test/models/auto_id.rb +4 -0
  1716. data/vendor/rails/activerecord/test/models/binary.rb +2 -0
  1717. data/vendor/rails/activerecord/test/models/bird.rb +9 -0
  1718. data/vendor/rails/activerecord/test/models/book.rb +4 -0
  1719. data/vendor/rails/activerecord/test/models/categorization.rb +5 -0
  1720. data/vendor/rails/activerecord/test/models/category.rb +34 -0
  1721. data/vendor/rails/activerecord/test/models/citation.rb +6 -0
  1722. data/vendor/rails/activerecord/test/models/club.rb +13 -0
  1723. data/vendor/rails/activerecord/test/models/column_name.rb +3 -0
  1724. data/vendor/rails/activerecord/test/models/comment.rb +29 -0
  1725. data/vendor/rails/activerecord/test/models/company.rb +171 -0
  1726. data/vendor/rails/activerecord/test/models/company_in_module.rb +78 -0
  1727. data/vendor/rails/activerecord/test/models/computer.rb +3 -0
  1728. data/vendor/rails/activerecord/test/models/contact.rb +16 -0
  1729. data/vendor/rails/activerecord/test/models/contract.rb +5 -0
  1730. data/vendor/rails/activerecord/test/models/course.rb +3 -0
  1731. data/vendor/rails/activerecord/test/models/customer.rb +73 -0
  1732. data/vendor/rails/activerecord/test/models/default.rb +2 -0
  1733. data/vendor/rails/activerecord/test/models/developer.rb +101 -0
  1734. data/vendor/rails/activerecord/test/models/edge.rb +5 -0
  1735. data/vendor/rails/activerecord/test/models/entrant.rb +3 -0
  1736. data/vendor/rails/activerecord/test/models/essay.rb +3 -0
  1737. data/vendor/rails/activerecord/test/models/event.rb +3 -0
  1738. data/vendor/rails/activerecord/test/models/event_author.rb +5 -0
  1739. data/vendor/rails/activerecord/test/models/face.rb +7 -0
  1740. data/vendor/rails/activerecord/test/models/guid.rb +2 -0
  1741. data/vendor/rails/activerecord/test/models/interest.rb +5 -0
  1742. data/vendor/rails/activerecord/test/models/invoice.rb +4 -0
  1743. data/vendor/rails/activerecord/test/models/item.rb +7 -0
  1744. data/vendor/rails/activerecord/test/models/job.rb +5 -0
  1745. data/vendor/rails/activerecord/test/models/joke.rb +3 -0
  1746. data/vendor/rails/activerecord/test/models/keyboard.rb +3 -0
  1747. data/vendor/rails/activerecord/test/models/legacy_thing.rb +3 -0
  1748. data/vendor/rails/activerecord/test/models/line_item.rb +3 -0
  1749. data/vendor/rails/activerecord/test/models/man.rb +9 -0
  1750. data/vendor/rails/activerecord/test/models/matey.rb +4 -0
  1751. data/vendor/rails/activerecord/test/models/member.rb +12 -0
  1752. data/vendor/rails/activerecord/test/models/member_detail.rb +5 -0
  1753. data/vendor/rails/activerecord/test/models/member_type.rb +3 -0
  1754. data/vendor/rails/activerecord/test/models/membership.rb +9 -0
  1755. data/vendor/rails/activerecord/test/models/minimalistic.rb +2 -0
  1756. data/vendor/rails/activerecord/test/models/mixed_case_monkey.rb +3 -0
  1757. data/vendor/rails/activerecord/test/models/movie.rb +5 -0
  1758. data/vendor/rails/activerecord/test/models/order.rb +4 -0
  1759. data/vendor/rails/activerecord/test/models/organization.rb +6 -0
  1760. data/vendor/rails/activerecord/test/models/owner.rb +5 -0
  1761. data/vendor/rails/activerecord/test/models/parrot.rb +22 -0
  1762. data/vendor/rails/activerecord/test/models/person.rb +16 -0
  1763. data/vendor/rails/activerecord/test/models/pet.rb +5 -0
  1764. data/vendor/rails/activerecord/test/models/pirate.rb +80 -0
  1765. data/vendor/rails/activerecord/test/models/post.rb +100 -0
  1766. data/vendor/rails/activerecord/test/models/price_estimate.rb +3 -0
  1767. data/vendor/rails/activerecord/test/models/project.rb +30 -0
  1768. data/vendor/rails/activerecord/test/models/reader.rb +4 -0
  1769. data/vendor/rails/activerecord/test/models/reference.rb +4 -0
  1770. data/vendor/rails/activerecord/test/models/reply.rb +46 -0
  1771. data/vendor/rails/activerecord/test/models/ship.rb +19 -0
  1772. data/vendor/rails/activerecord/test/models/ship_part.rb +7 -0
  1773. data/vendor/rails/activerecord/test/models/sponsor.rb +4 -0
  1774. data/vendor/rails/activerecord/test/models/subject.rb +4 -0
  1775. data/vendor/rails/activerecord/test/models/subscriber.rb +8 -0
  1776. data/vendor/rails/activerecord/test/models/subscription.rb +4 -0
  1777. data/vendor/rails/activerecord/test/models/tag.rb +7 -0
  1778. data/vendor/rails/activerecord/test/models/tagging.rb +10 -0
  1779. data/vendor/rails/activerecord/test/models/task.rb +3 -0
  1780. data/vendor/rails/activerecord/test/models/topic.rb +80 -0
  1781. data/vendor/rails/activerecord/test/models/toy.rb +6 -0
  1782. data/vendor/rails/activerecord/test/models/treasure.rb +8 -0
  1783. data/vendor/rails/activerecord/test/models/vertex.rb +9 -0
  1784. data/vendor/rails/activerecord/test/models/warehouse_thing.rb +5 -0
  1785. data/vendor/rails/activerecord/test/models/zine.rb +3 -0
  1786. data/vendor/rails/activerecord/test/schema/mysql_specific_schema.rb +24 -0
  1787. data/vendor/rails/activerecord/test/schema/postgresql_specific_schema.rb +114 -0
  1788. data/vendor/rails/activerecord/test/schema/schema.rb +534 -0
  1789. data/vendor/rails/activerecord/test/schema/schema2.rb +6 -0
  1790. data/vendor/rails/activerecord/test/schema/sqlite_specific_schema.rb +25 -0
  1791. data/vendor/rails/activeresource/CHANGELOG +307 -0
  1792. data/vendor/rails/activeresource/README +165 -0
  1793. data/vendor/rails/activeresource/Rakefile +139 -0
  1794. data/vendor/rails/activeresource/lib/active_resource.rb +44 -0
  1795. data/vendor/rails/activeresource/lib/active_resource/base.rb +1166 -0
  1796. data/vendor/rails/activeresource/lib/active_resource/connection.rb +283 -0
  1797. data/vendor/rails/activeresource/lib/active_resource/custom_methods.rb +120 -0
  1798. data/vendor/rails/activeresource/lib/active_resource/exceptions.rb +66 -0
  1799. data/vendor/rails/activeresource/lib/active_resource/formats.rb +14 -0
  1800. data/vendor/rails/activeresource/lib/active_resource/formats/json_format.rb +23 -0
  1801. data/vendor/rails/activeresource/lib/active_resource/formats/xml_format.rb +34 -0
  1802. data/vendor/rails/activeresource/lib/active_resource/http_mock.rb +207 -0
  1803. data/vendor/rails/activeresource/lib/active_resource/validations.rb +290 -0
  1804. data/vendor/rails/activeresource/lib/active_resource/version.rb +9 -0
  1805. data/vendor/rails/activeresource/lib/activeresource.rb +2 -0
  1806. data/vendor/rails/activeresource/test/abstract_unit.rb +21 -0
  1807. data/vendor/rails/activeresource/test/authorization_test.rb +122 -0
  1808. data/vendor/rails/activeresource/test/base/custom_methods_test.rb +100 -0
  1809. data/vendor/rails/activeresource/test/base/equality_test.rb +52 -0
  1810. data/vendor/rails/activeresource/test/base/load_test.rb +161 -0
  1811. data/vendor/rails/activeresource/test/base_errors_test.rb +98 -0
  1812. data/vendor/rails/activeresource/test/base_test.rb +1087 -0
  1813. data/vendor/rails/activeresource/test/connection_test.rb +238 -0
  1814. data/vendor/rails/activeresource/test/debug.log +80350 -0
  1815. data/vendor/rails/activeresource/test/fixtures/beast.rb +14 -0
  1816. data/vendor/rails/activeresource/test/fixtures/customer.rb +3 -0
  1817. data/vendor/rails/activeresource/test/fixtures/person.rb +3 -0
  1818. data/vendor/rails/activeresource/test/fixtures/proxy.rb +4 -0
  1819. data/vendor/rails/activeresource/test/fixtures/street_address.rb +4 -0
  1820. data/vendor/rails/activeresource/test/format_test.rb +112 -0
  1821. data/vendor/rails/activeresource/test/setter_trap.rb +26 -0
  1822. data/vendor/rails/activesupport/CHANGELOG +1367 -0
  1823. data/vendor/rails/activesupport/README +43 -0
  1824. data/vendor/rails/activesupport/lib/active_support.rb +60 -0
  1825. data/vendor/rails/activesupport/lib/active_support/all.rb +8 -0
  1826. data/vendor/rails/activesupport/lib/active_support/backtrace_cleaner.rb +72 -0
  1827. data/vendor/rails/activesupport/lib/active_support/base64.rb +33 -0
  1828. data/vendor/rails/activesupport/lib/active_support/basic_object.rb +24 -0
  1829. data/vendor/rails/activesupport/lib/active_support/buffered_logger.rb +127 -0
  1830. data/vendor/rails/activesupport/lib/active_support/cache.rb +248 -0
  1831. data/vendor/rails/activesupport/lib/active_support/cache/compressed_mem_cache_store.rb +20 -0
  1832. data/vendor/rails/activesupport/lib/active_support/cache/drb_store.rb +14 -0
  1833. data/vendor/rails/activesupport/lib/active_support/cache/file_store.rb +72 -0
  1834. data/vendor/rails/activesupport/lib/active_support/cache/mem_cache_store.rb +143 -0
  1835. data/vendor/rails/activesupport/lib/active_support/cache/memory_store.rb +58 -0
  1836. data/vendor/rails/activesupport/lib/active_support/cache/strategy/local_cache.rb +104 -0
  1837. data/vendor/rails/activesupport/lib/active_support/cache/synchronized_memory_store.rb +47 -0
  1838. data/vendor/rails/activesupport/lib/active_support/callbacks.rb +279 -0
  1839. data/vendor/rails/activesupport/lib/active_support/core_ext.rb +8 -0
  1840. data/vendor/rails/activesupport/lib/active_support/core_ext/array.rb +15 -0
  1841. data/vendor/rails/activesupport/lib/active_support/core_ext/array/access.rb +53 -0
  1842. data/vendor/rails/activesupport/lib/active_support/core_ext/array/conversions.rb +197 -0
  1843. data/vendor/rails/activesupport/lib/active_support/core_ext/array/extract_options.rb +20 -0
  1844. data/vendor/rails/activesupport/lib/active_support/core_ext/array/grouping.rb +106 -0
  1845. data/vendor/rails/activesupport/lib/active_support/core_ext/array/random_access.rb +22 -0
  1846. data/vendor/rails/activesupport/lib/active_support/core_ext/array/wrapper.rb +24 -0
  1847. data/vendor/rails/activesupport/lib/active_support/core_ext/base64.rb +4 -0
  1848. data/vendor/rails/activesupport/lib/active_support/core_ext/base64/encoding.rb +16 -0
  1849. data/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb +19 -0
  1850. data/vendor/rails/activesupport/lib/active_support/core_ext/bigdecimal.rb +6 -0
  1851. data/vendor/rails/activesupport/lib/active_support/core_ext/bigdecimal/conversions.rb +37 -0
  1852. data/vendor/rails/activesupport/lib/active_support/core_ext/blank.rb +2 -0
  1853. data/vendor/rails/activesupport/lib/active_support/core_ext/cgi.rb +5 -0
  1854. data/vendor/rails/activesupport/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +23 -0
  1855. data/vendor/rails/activesupport/lib/active_support/core_ext/class.rb +4 -0
  1856. data/vendor/rails/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb +61 -0
  1857. data/vendor/rails/activesupport/lib/active_support/core_ext/class/delegating_attributes.rb +47 -0
  1858. data/vendor/rails/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb +140 -0
  1859. data/vendor/rails/activesupport/lib/active_support/core_ext/class/removal.rb +50 -0
  1860. data/vendor/rails/activesupport/lib/active_support/core_ext/date.rb +10 -0
  1861. data/vendor/rails/activesupport/lib/active_support/core_ext/date/behavior.rb +42 -0
  1862. data/vendor/rails/activesupport/lib/active_support/core_ext/date/calculations.rb +241 -0
  1863. data/vendor/rails/activesupport/lib/active_support/core_ext/date/conversions.rb +107 -0
  1864. data/vendor/rails/activesupport/lib/active_support/core_ext/date_time.rb +12 -0
  1865. data/vendor/rails/activesupport/lib/active_support/core_ext/date_time/calculations.rb +126 -0
  1866. data/vendor/rails/activesupport/lib/active_support/core_ext/date_time/conversions.rb +107 -0
  1867. data/vendor/rails/activesupport/lib/active_support/core_ext/duplicable.rb +43 -0
  1868. data/vendor/rails/activesupport/lib/active_support/core_ext/enumerable.rb +120 -0
  1869. data/vendor/rails/activesupport/lib/active_support/core_ext/exception.rb +45 -0
  1870. data/vendor/rails/activesupport/lib/active_support/core_ext/file.rb +5 -0
  1871. data/vendor/rails/activesupport/lib/active_support/core_ext/file/atomic.rb +47 -0
  1872. data/vendor/rails/activesupport/lib/active_support/core_ext/float.rb +7 -0
  1873. data/vendor/rails/activesupport/lib/active_support/core_ext/float/rounding.rb +24 -0
  1874. data/vendor/rails/activesupport/lib/active_support/core_ext/float/time.rb +27 -0
  1875. data/vendor/rails/activesupport/lib/active_support/core_ext/hash.rb +14 -0
  1876. data/vendor/rails/activesupport/lib/active_support/core_ext/hash/conversions.rb +247 -0
  1877. data/vendor/rails/activesupport/lib/active_support/core_ext/hash/deep_merge.rb +23 -0
  1878. data/vendor/rails/activesupport/lib/active_support/core_ext/hash/diff.rb +19 -0
  1879. data/vendor/rails/activesupport/lib/active_support/core_ext/hash/except.rb +25 -0
  1880. data/vendor/rails/activesupport/lib/active_support/core_ext/hash/indifferent_access.rb +143 -0
  1881. data/vendor/rails/activesupport/lib/active_support/core_ext/hash/keys.rb +52 -0
  1882. data/vendor/rails/activesupport/lib/active_support/core_ext/hash/reverse_merge.rb +35 -0
  1883. data/vendor/rails/activesupport/lib/active_support/core_ext/hash/slice.rb +40 -0
  1884. data/vendor/rails/activesupport/lib/active_support/core_ext/integer.rb +9 -0
  1885. data/vendor/rails/activesupport/lib/active_support/core_ext/integer/even_odd.rb +29 -0
  1886. data/vendor/rails/activesupport/lib/active_support/core_ext/integer/inflections.rb +20 -0
  1887. data/vendor/rails/activesupport/lib/active_support/core_ext/integer/time.rb +45 -0
  1888. data/vendor/rails/activesupport/lib/active_support/core_ext/kernel.rb +5 -0
  1889. data/vendor/rails/activesupport/lib/active_support/core_ext/kernel/agnostics.rb +11 -0
  1890. data/vendor/rails/activesupport/lib/active_support/core_ext/kernel/daemonizing.rb +7 -0
  1891. data/vendor/rails/activesupport/lib/active_support/core_ext/kernel/debugger.rb +16 -0
  1892. data/vendor/rails/activesupport/lib/active_support/core_ext/kernel/reporting.rb +59 -0
  1893. data/vendor/rails/activesupport/lib/active_support/core_ext/kernel/requires.rb +24 -0
  1894. data/vendor/rails/activesupport/lib/active_support/core_ext/load_error.rb +38 -0
  1895. data/vendor/rails/activesupport/lib/active_support/core_ext/logger.rb +145 -0
  1896. data/vendor/rails/activesupport/lib/active_support/core_ext/module.rb +23 -0
  1897. data/vendor/rails/activesupport/lib/active_support/core_ext/module/aliasing.rb +74 -0
  1898. data/vendor/rails/activesupport/lib/active_support/core_ext/module/attr_accessor_with_default.rb +31 -0
  1899. data/vendor/rails/activesupport/lib/active_support/core_ext/module/attr_internal.rb +32 -0
  1900. data/vendor/rails/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb +67 -0
  1901. data/vendor/rails/activesupport/lib/active_support/core_ext/module/delegation.rb +135 -0
  1902. data/vendor/rails/activesupport/lib/active_support/core_ext/module/inclusion.rb +30 -0
  1903. data/vendor/rails/activesupport/lib/active_support/core_ext/module/introspection.rb +90 -0
  1904. data/vendor/rails/activesupport/lib/active_support/core_ext/module/loading.rb +23 -0
  1905. data/vendor/rails/activesupport/lib/active_support/core_ext/module/model_naming.rb +25 -0
  1906. data/vendor/rails/activesupport/lib/active_support/core_ext/module/synchronization.rb +39 -0
  1907. data/vendor/rails/activesupport/lib/active_support/core_ext/name_error.rb +19 -0
  1908. data/vendor/rails/activesupport/lib/active_support/core_ext/numeric.rb +9 -0
  1909. data/vendor/rails/activesupport/lib/active_support/core_ext/numeric/bytes.rb +50 -0
  1910. data/vendor/rails/activesupport/lib/active_support/core_ext/numeric/conversions.rb +19 -0
  1911. data/vendor/rails/activesupport/lib/active_support/core_ext/numeric/time.rb +81 -0
  1912. data/vendor/rails/activesupport/lib/active_support/core_ext/object.rb +7 -0
  1913. data/vendor/rails/activesupport/lib/active_support/core_ext/object/blank.rb +76 -0
  1914. data/vendor/rails/activesupport/lib/active_support/core_ext/object/conversions.rb +15 -0
  1915. data/vendor/rails/activesupport/lib/active_support/core_ext/object/extending.rb +80 -0
  1916. data/vendor/rails/activesupport/lib/active_support/core_ext/object/instance_variables.rb +74 -0
  1917. data/vendor/rails/activesupport/lib/active_support/core_ext/object/metaclass.rb +14 -0
  1918. data/vendor/rails/activesupport/lib/active_support/core_ext/object/misc.rb +90 -0
  1919. data/vendor/rails/activesupport/lib/active_support/core_ext/object/singleton_class.rb +13 -0
  1920. data/vendor/rails/activesupport/lib/active_support/core_ext/pathname.rb +7 -0
  1921. data/vendor/rails/activesupport/lib/active_support/core_ext/pathname/clean_within.rb +14 -0
  1922. data/vendor/rails/activesupport/lib/active_support/core_ext/proc.rb +12 -0
  1923. data/vendor/rails/activesupport/lib/active_support/core_ext/process.rb +1 -0
  1924. data/vendor/rails/activesupport/lib/active_support/core_ext/process/daemon.rb +25 -0
  1925. data/vendor/rails/activesupport/lib/active_support/core_ext/range.rb +11 -0
  1926. data/vendor/rails/activesupport/lib/active_support/core_ext/range/blockless_step.rb +32 -0
  1927. data/vendor/rails/activesupport/lib/active_support/core_ext/range/conversions.rb +27 -0
  1928. data/vendor/rails/activesupport/lib/active_support/core_ext/range/include_range.rb +30 -0
  1929. data/vendor/rails/activesupport/lib/active_support/core_ext/range/overlaps.rb +15 -0
  1930. data/vendor/rails/activesupport/lib/active_support/core_ext/rexml.rb +41 -0
  1931. data/vendor/rails/activesupport/lib/active_support/core_ext/string.rb +24 -0
  1932. data/vendor/rails/activesupport/lib/active_support/core_ext/string/access.rb +106 -0
  1933. data/vendor/rails/activesupport/lib/active_support/core_ext/string/behavior.rb +13 -0
  1934. data/vendor/rails/activesupport/lib/active_support/core_ext/string/bytesize.rb +5 -0
  1935. data/vendor/rails/activesupport/lib/active_support/core_ext/string/conversions.rb +28 -0
  1936. data/vendor/rails/activesupport/lib/active_support/core_ext/string/filters.rb +26 -0
  1937. data/vendor/rails/activesupport/lib/active_support/core_ext/string/inflections.rb +167 -0
  1938. data/vendor/rails/activesupport/lib/active_support/core_ext/string/iterators.rb +23 -0
  1939. data/vendor/rails/activesupport/lib/active_support/core_ext/string/multibyte.rb +81 -0
  1940. data/vendor/rails/activesupport/lib/active_support/core_ext/string/output_safety.rb +112 -0
  1941. data/vendor/rails/activesupport/lib/active_support/core_ext/string/starts_ends_with.rb +33 -0
  1942. data/vendor/rails/activesupport/lib/active_support/core_ext/string/xchar.rb +11 -0
  1943. data/vendor/rails/activesupport/lib/active_support/core_ext/symbol.rb +14 -0
  1944. data/vendor/rails/activesupport/lib/active_support/core_ext/time.rb +46 -0
  1945. data/vendor/rails/activesupport/lib/active_support/core_ext/time/behavior.rb +13 -0
  1946. data/vendor/rails/activesupport/lib/active_support/core_ext/time/calculations.rb +313 -0
  1947. data/vendor/rails/activesupport/lib/active_support/core_ext/time/conversions.rb +90 -0
  1948. data/vendor/rails/activesupport/lib/active_support/core_ext/time/zones.rb +86 -0
  1949. data/vendor/rails/activesupport/lib/active_support/core_ext/try.rb +36 -0
  1950. data/vendor/rails/activesupport/lib/active_support/core_ext/uri.rb +16 -0
  1951. data/vendor/rails/activesupport/lib/active_support/dependencies.rb +625 -0
  1952. data/vendor/rails/activesupport/lib/active_support/deprecation.rb +197 -0
  1953. data/vendor/rails/activesupport/lib/active_support/duration.rb +100 -0
  1954. data/vendor/rails/activesupport/lib/active_support/gzip.rb +25 -0
  1955. data/vendor/rails/activesupport/lib/active_support/inflections.rb +56 -0
  1956. data/vendor/rails/activesupport/lib/active_support/inflector.rb +409 -0
  1957. data/vendor/rails/activesupport/lib/active_support/json.rb +2 -0
  1958. data/vendor/rails/activesupport/lib/active_support/json/backends/jsongem.rb +37 -0
  1959. data/vendor/rails/activesupport/lib/active_support/json/backends/yajl.rb +40 -0
  1960. data/vendor/rails/activesupport/lib/active_support/json/backends/yaml.rb +87 -0
  1961. data/vendor/rails/activesupport/lib/active_support/json/decoding.rb +50 -0
  1962. data/vendor/rails/activesupport/lib/active_support/json/encoders/date.rb +22 -0
  1963. data/vendor/rails/activesupport/lib/active_support/json/encoders/date_time.rb +22 -0
  1964. data/vendor/rails/activesupport/lib/active_support/json/encoders/enumerable.rb +17 -0
  1965. data/vendor/rails/activesupport/lib/active_support/json/encoders/false_class.rb +7 -0
  1966. data/vendor/rails/activesupport/lib/active_support/json/encoders/hash.rb +56 -0
  1967. data/vendor/rails/activesupport/lib/active_support/json/encoders/nil_class.rb +7 -0
  1968. data/vendor/rails/activesupport/lib/active_support/json/encoders/numeric.rb +21 -0
  1969. data/vendor/rails/activesupport/lib/active_support/json/encoders/object.rb +10 -0
  1970. data/vendor/rails/activesupport/lib/active_support/json/encoders/regexp.rb +9 -0
  1971. data/vendor/rails/activesupport/lib/active_support/json/encoders/string.rb +9 -0
  1972. data/vendor/rails/activesupport/lib/active_support/json/encoders/symbol.rb +5 -0
  1973. data/vendor/rails/activesupport/lib/active_support/json/encoders/time.rb +22 -0
  1974. data/vendor/rails/activesupport/lib/active_support/json/encoders/true_class.rb +7 -0
  1975. data/vendor/rails/activesupport/lib/active_support/json/encoding.rb +111 -0
  1976. data/vendor/rails/activesupport/lib/active_support/json/variable.rb +10 -0
  1977. data/vendor/rails/activesupport/lib/active_support/locale/en.yml +33 -0
  1978. data/vendor/rails/activesupport/lib/active_support/memoizable.rb +100 -0
  1979. data/vendor/rails/activesupport/lib/active_support/message_encryptor.rb +70 -0
  1980. data/vendor/rails/activesupport/lib/active_support/message_verifier.rb +79 -0
  1981. data/vendor/rails/activesupport/lib/active_support/multibyte.rb +57 -0
  1982. data/vendor/rails/activesupport/lib/active_support/multibyte/chars.rb +707 -0
  1983. data/vendor/rails/activesupport/lib/active_support/multibyte/exceptions.rb +8 -0
  1984. data/vendor/rails/activesupport/lib/active_support/multibyte/unicode_database.rb +71 -0
  1985. data/vendor/rails/activesupport/lib/active_support/multibyte/utils.rb +60 -0
  1986. data/vendor/rails/activesupport/lib/active_support/option_merger.rb +23 -0
  1987. data/vendor/rails/activesupport/lib/active_support/ordered_hash.rb +158 -0
  1988. data/vendor/rails/activesupport/lib/active_support/ordered_options.rb +19 -0
  1989. data/vendor/rails/activesupport/lib/active_support/rescuable.rb +108 -0
  1990. data/vendor/rails/activesupport/lib/active_support/secure_random.rb +199 -0
  1991. data/vendor/rails/activesupport/lib/active_support/string_inquirer.rb +21 -0
  1992. data/vendor/rails/activesupport/lib/active_support/test_case.rb +40 -0
  1993. data/vendor/rails/activesupport/lib/active_support/testing/assertions.rb +79 -0
  1994. data/vendor/rails/activesupport/lib/active_support/testing/declarative.rb +21 -0
  1995. data/vendor/rails/activesupport/lib/active_support/testing/default.rb +9 -0
  1996. data/vendor/rails/activesupport/lib/active_support/testing/deprecation.rb +57 -0
  1997. data/vendor/rails/activesupport/lib/active_support/testing/performance.rb +452 -0
  1998. data/vendor/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb +91 -0
  1999. data/vendor/rails/activesupport/lib/active_support/time_with_zone.rb +335 -0
  2000. data/vendor/rails/activesupport/lib/active_support/values/time_zone.rb +412 -0
  2001. data/vendor/rails/activesupport/lib/active_support/values/unicode_tables.dat +0 -0
  2002. data/vendor/rails/activesupport/lib/active_support/vendor.rb +36 -0
  2003. data/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/blankslate.rb +113 -0
  2004. data/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder.rb +13 -0
  2005. data/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb +20 -0
  2006. data/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/css.rb +250 -0
  2007. data/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb +115 -0
  2008. data/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb +139 -0
  2009. data/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb +63 -0
  2010. data/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb +328 -0
  2011. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n.rb +335 -0
  2012. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend.rb +19 -0
  2013. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/active_record.rb +66 -0
  2014. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/active_record/missing.rb +67 -0
  2015. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/active_record/store_procs.rb +38 -0
  2016. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/active_record/translation.rb +88 -0
  2017. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/base.rb +266 -0
  2018. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/cache.rb +76 -0
  2019. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/cascade.rb +58 -0
  2020. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/chain.rb +75 -0
  2021. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/cldr.rb +100 -0
  2022. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/fallbacks.rb +69 -0
  2023. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/fast.rb +69 -0
  2024. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/gettext.rb +75 -0
  2025. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/helpers.rb +68 -0
  2026. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/interpolation_compiler.rb +119 -0
  2027. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/links.rb +34 -0
  2028. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/metadata.rb +73 -0
  2029. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/pluralization.rb +57 -0
  2030. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/backend/simple.rb +22 -0
  2031. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/core_ext/hash/except.rb +8 -0
  2032. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/core_ext/hash/slice.rb +8 -0
  2033. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/core_ext/object/meta_class.rb +5 -0
  2034. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/core_ext/string/interpolate.rb +99 -0
  2035. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/exceptions.rb +61 -0
  2036. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/gettext.rb +25 -0
  2037. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/gettext/po_parser.rb +329 -0
  2038. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/helpers.rb +5 -0
  2039. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/helpers/gettext.rb +65 -0
  2040. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/locale.rb +6 -0
  2041. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/locale/fallbacks.rb +98 -0
  2042. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/locale/tag.rb +28 -0
  2043. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/locale/tag/parents.rb +24 -0
  2044. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/locale/tag/rfc4646.rb +76 -0
  2045. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/locale/tag/simple.rb +41 -0
  2046. data/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.3.7/i18n/version.rb +3 -0
  2047. data/vendor/rails/activesupport/lib/active_support/vendor/memcache-client-1.7.4/memcache.rb +1107 -0
  2048. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo.rb +33 -0
  2049. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone.rb +47 -0
  2050. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone_info.rb +228 -0
  2051. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Algiers.rb +55 -0
  2052. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Cairo.rb +219 -0
  2053. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Casablanca.rb +40 -0
  2054. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Harare.rb +18 -0
  2055. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Johannesburg.rb +25 -0
  2056. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Monrovia.rb +22 -0
  2057. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Nairobi.rb +23 -0
  2058. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +166 -0
  2059. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/San_Juan.rb +86 -0
  2060. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Bogota.rb +23 -0
  2061. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Caracas.rb +23 -0
  2062. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chicago.rb +283 -0
  2063. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chihuahua.rb +136 -0
  2064. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Denver.rb +204 -0
  2065. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Godthab.rb +161 -0
  2066. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Guatemala.rb +27 -0
  2067. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Halifax.rb +274 -0
  2068. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Indiana/Indianapolis.rb +149 -0
  2069. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Juneau.rb +194 -0
  2070. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/La_Paz.rb +22 -0
  2071. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Lima.rb +35 -0
  2072. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Los_Angeles.rb +232 -0
  2073. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mazatlan.rb +139 -0
  2074. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mexico_City.rb +144 -0
  2075. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Monterrey.rb +131 -0
  2076. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/New_York.rb +282 -0
  2077. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Phoenix.rb +30 -0
  2078. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Regina.rb +74 -0
  2079. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Santiago.rb +205 -0
  2080. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Sao_Paulo.rb +171 -0
  2081. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/St_Johns.rb +288 -0
  2082. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Tijuana.rb +196 -0
  2083. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Almaty.rb +67 -0
  2084. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baghdad.rb +73 -0
  2085. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baku.rb +161 -0
  2086. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Bangkok.rb +20 -0
  2087. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Chongqing.rb +33 -0
  2088. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Colombo.rb +30 -0
  2089. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Dhaka.rb +27 -0
  2090. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Hong_Kong.rb +87 -0
  2091. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Irkutsk.rb +165 -0
  2092. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jakarta.rb +30 -0
  2093. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jerusalem.rb +163 -0
  2094. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kabul.rb +20 -0
  2095. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kamchatka.rb +163 -0
  2096. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Karachi.rb +30 -0
  2097. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Katmandu.rb +20 -0
  2098. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kolkata.rb +25 -0
  2099. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Krasnoyarsk.rb +163 -0
  2100. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuala_Lumpur.rb +31 -0
  2101. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuwait.rb +18 -0
  2102. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Magadan.rb +163 -0
  2103. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Muscat.rb +18 -0
  2104. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Novosibirsk.rb +164 -0
  2105. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Rangoon.rb +24 -0
  2106. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Riyadh.rb +18 -0
  2107. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Seoul.rb +34 -0
  2108. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Shanghai.rb +35 -0
  2109. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Singapore.rb +33 -0
  2110. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Taipei.rb +59 -0
  2111. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tashkent.rb +47 -0
  2112. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tbilisi.rb +78 -0
  2113. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tehran.rb +121 -0
  2114. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tokyo.rb +30 -0
  2115. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Ulaanbaatar.rb +65 -0
  2116. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Urumqi.rb +33 -0
  2117. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Vladivostok.rb +164 -0
  2118. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yakutsk.rb +163 -0
  2119. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yekaterinburg.rb +165 -0
  2120. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yerevan.rb +165 -0
  2121. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Azores.rb +270 -0
  2122. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Cape_Verde.rb +23 -0
  2123. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/South_Georgia.rb +18 -0
  2124. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Adelaide.rb +187 -0
  2125. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Brisbane.rb +35 -0
  2126. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Darwin.rb +29 -0
  2127. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Hobart.rb +193 -0
  2128. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Melbourne.rb +185 -0
  2129. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Perth.rb +37 -0
  2130. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Sydney.rb +185 -0
  2131. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Etc/UTC.rb +16 -0
  2132. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Amsterdam.rb +228 -0
  2133. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Athens.rb +185 -0
  2134. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Belgrade.rb +163 -0
  2135. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Berlin.rb +188 -0
  2136. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bratislava.rb +13 -0
  2137. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Brussels.rb +232 -0
  2138. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bucharest.rb +181 -0
  2139. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Budapest.rb +197 -0
  2140. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Copenhagen.rb +179 -0
  2141. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Dublin.rb +276 -0
  2142. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Helsinki.rb +163 -0
  2143. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Istanbul.rb +218 -0
  2144. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Kiev.rb +168 -0
  2145. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Lisbon.rb +268 -0
  2146. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Ljubljana.rb +13 -0
  2147. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/London.rb +288 -0
  2148. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Madrid.rb +211 -0
  2149. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Minsk.rb +170 -0
  2150. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Moscow.rb +181 -0
  2151. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Paris.rb +232 -0
  2152. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Prague.rb +187 -0
  2153. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Riga.rb +176 -0
  2154. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Rome.rb +215 -0
  2155. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sarajevo.rb +13 -0
  2156. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Skopje.rb +13 -0
  2157. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sofia.rb +173 -0
  2158. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Stockholm.rb +165 -0
  2159. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Tallinn.rb +172 -0
  2160. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vienna.rb +183 -0
  2161. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vilnius.rb +170 -0
  2162. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Warsaw.rb +212 -0
  2163. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Zagreb.rb +13 -0
  2164. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Auckland.rb +202 -0
  2165. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Fiji.rb +23 -0
  2166. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Guam.rb +22 -0
  2167. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Honolulu.rb +28 -0
  2168. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Majuro.rb +20 -0
  2169. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Midway.rb +25 -0
  2170. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Noumea.rb +25 -0
  2171. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Pago_Pago.rb +26 -0
  2172. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Port_Moresby.rb +20 -0
  2173. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Tongatapu.rb +27 -0
  2174. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/info_timezone.rb +52 -0
  2175. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone.rb +51 -0
  2176. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone_info.rb +44 -0
  2177. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/offset_rationals.rb +98 -0
  2178. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/ruby_core_support.rb +56 -0
  2179. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/time_or_datetime.rb +292 -0
  2180. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone.rb +508 -0
  2181. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_definition.rb +56 -0
  2182. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_info.rb +40 -0
  2183. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_offset_info.rb +94 -0
  2184. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_period.rb +198 -0
  2185. data/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_transition_info.rb +129 -0
  2186. data/vendor/rails/activesupport/lib/active_support/version.rb +9 -0
  2187. data/vendor/rails/activesupport/lib/active_support/whiny_nil.rb +64 -0
  2188. data/vendor/rails/activesupport/lib/active_support/xml_mini.rb +31 -0
  2189. data/vendor/rails/activesupport/lib/active_support/xml_mini/jdom.rb +162 -0
  2190. data/vendor/rails/activesupport/lib/active_support/xml_mini/libxml.rb +73 -0
  2191. data/vendor/rails/activesupport/lib/active_support/xml_mini/libxmlsax.rb +74 -0
  2192. data/vendor/rails/activesupport/lib/active_support/xml_mini/nokogiri.rb +72 -0
  2193. data/vendor/rails/activesupport/lib/active_support/xml_mini/nokogirisax.rb +73 -0
  2194. data/vendor/rails/activesupport/lib/active_support/xml_mini/rexml.rb +108 -0
  2195. data/vendor/rails/activesupport/lib/activesupport.rb +2 -0
  2196. data/vendor/rails/railties/CHANGELOG +2188 -0
  2197. data/vendor/rails/railties/MIT-LICENSE +20 -0
  2198. data/vendor/rails/railties/README +243 -0
  2199. data/vendor/rails/railties/Rakefile +368 -0
  2200. data/vendor/rails/railties/bin/about +4 -0
  2201. data/vendor/rails/railties/bin/console +3 -0
  2202. data/vendor/rails/railties/bin/dbconsole +3 -0
  2203. data/vendor/rails/railties/bin/destroy +3 -0
  2204. data/vendor/rails/railties/bin/generate +3 -0
  2205. data/vendor/rails/railties/bin/performance/benchmarker +3 -0
  2206. data/vendor/rails/railties/bin/performance/profiler +3 -0
  2207. data/vendor/rails/railties/bin/plugin +3 -0
  2208. data/vendor/rails/railties/bin/rails +21 -0
  2209. data/vendor/rails/railties/bin/runner +3 -0
  2210. data/vendor/rails/railties/bin/server +3 -0
  2211. data/vendor/rails/railties/builtin/rails_info/rails/info.rb +131 -0
  2212. data/vendor/rails/railties/builtin/rails_info/rails/info_controller.rb +9 -0
  2213. data/vendor/rails/railties/builtin/rails_info/rails/info_helper.rb +2 -0
  2214. data/vendor/rails/railties/builtin/rails_info/rails_info_controller.rb +2 -0
  2215. data/vendor/rails/railties/configs/databases/frontbase.yml +28 -0
  2216. data/vendor/rails/railties/configs/databases/ibm_db.yml +62 -0
  2217. data/vendor/rails/railties/configs/databases/mysql.yml +60 -0
  2218. data/vendor/rails/railties/configs/databases/oracle.yml +39 -0
  2219. data/vendor/rails/railties/configs/databases/postgresql.yml +51 -0
  2220. data/vendor/rails/railties/configs/databases/sqlite2.yml +19 -0
  2221. data/vendor/rails/railties/configs/databases/sqlite3.yml +22 -0
  2222. data/vendor/rails/railties/configs/empty.log +0 -0
  2223. data/vendor/rails/railties/configs/initializers/backtrace_silencers.rb +7 -0
  2224. data/vendor/rails/railties/configs/initializers/cookie_verification_secret.rb +7 -0
  2225. data/vendor/rails/railties/configs/initializers/inflections.rb +10 -0
  2226. data/vendor/rails/railties/configs/initializers/mime_types.rb +5 -0
  2227. data/vendor/rails/railties/configs/initializers/new_rails_defaults.rb +21 -0
  2228. data/vendor/rails/railties/configs/initializers/session_store.rb +15 -0
  2229. data/vendor/rails/railties/configs/locales/en.yml +5 -0
  2230. data/vendor/rails/railties/configs/routes.rb +43 -0
  2231. data/vendor/rails/railties/configs/seeds.rb +7 -0
  2232. data/vendor/rails/railties/dispatches/config.ru +7 -0
  2233. data/vendor/rails/railties/dispatches/dispatch.fcgi +24 -0
  2234. data/vendor/rails/railties/dispatches/dispatch.rb +10 -0
  2235. data/vendor/rails/railties/dispatches/gateway.cgi +97 -0
  2236. data/vendor/rails/railties/doc/README_FOR_APP +2 -0
  2237. data/vendor/rails/railties/environments/boot.rb +110 -0
  2238. data/vendor/rails/railties/environments/development.rb +17 -0
  2239. data/vendor/rails/railties/environments/environment.rb +41 -0
  2240. data/vendor/rails/railties/environments/production.rb +28 -0
  2241. data/vendor/rails/railties/environments/test.rb +28 -0
  2242. data/vendor/rails/railties/fresh_rakefile +10 -0
  2243. data/vendor/rails/railties/guides/files/javascripts/code_highlighter.js +188 -0
  2244. data/vendor/rails/railties/guides/files/javascripts/guides.js +8 -0
  2245. data/vendor/rails/railties/guides/files/javascripts/highlighters.js +90 -0
  2246. data/vendor/rails/railties/guides/files/stylesheets/main.css +441 -0
  2247. data/vendor/rails/railties/guides/files/stylesheets/print.css +52 -0
  2248. data/vendor/rails/railties/guides/files/stylesheets/reset.css +43 -0
  2249. data/vendor/rails/railties/guides/files/stylesheets/style.css +13 -0
  2250. data/vendor/rails/railties/guides/files/stylesheets/syntax.css +31 -0
  2251. data/vendor/rails/railties/guides/images/belongs_to.png +0 -0
  2252. data/vendor/rails/railties/guides/images/book_icon.gif +0 -0
  2253. data/vendor/rails/railties/guides/images/bullet.gif +0 -0
  2254. data/vendor/rails/railties/guides/images/chapters_icon.gif +0 -0
  2255. data/vendor/rails/railties/guides/images/check_bullet.gif +0 -0
  2256. data/vendor/rails/railties/guides/images/credits_pic_blank.gif +0 -0
  2257. data/vendor/rails/railties/guides/images/csrf.png +0 -0
  2258. data/vendor/rails/railties/guides/images/customized_error_messages.png +0 -0
  2259. data/vendor/rails/railties/guides/images/error_messages.png +0 -0
  2260. data/vendor/rails/railties/guides/images/feature_tile.gif +0 -0
  2261. data/vendor/rails/railties/guides/images/footer_tile.gif +0 -0
  2262. data/vendor/rails/railties/guides/images/fxn.jpg +0 -0
  2263. data/vendor/rails/railties/guides/images/grey_bullet.gif +0 -0
  2264. data/vendor/rails/railties/guides/images/habtm.png +0 -0
  2265. data/vendor/rails/railties/guides/images/has_many.png +0 -0
  2266. data/vendor/rails/railties/guides/images/has_many_through.png +0 -0
  2267. data/vendor/rails/railties/guides/images/has_one.png +0 -0
  2268. data/vendor/rails/railties/guides/images/has_one_through.png +0 -0
  2269. data/vendor/rails/railties/guides/images/header_backdrop.png +0 -0
  2270. data/vendor/rails/railties/guides/images/header_tile.gif +0 -0
  2271. data/vendor/rails/railties/guides/images/i18n/demo_localized_pirate.png +0 -0
  2272. data/vendor/rails/railties/guides/images/i18n/demo_translated_en.png +0 -0
  2273. data/vendor/rails/railties/guides/images/i18n/demo_translated_pirate.png +0 -0
  2274. data/vendor/rails/railties/guides/images/i18n/demo_translation_missing.png +0 -0
  2275. data/vendor/rails/railties/guides/images/i18n/demo_untranslated.png +0 -0
  2276. data/vendor/rails/railties/guides/images/icons/README +5 -0
  2277. data/vendor/rails/railties/guides/images/icons/callouts/1.png +0 -0
  2278. data/vendor/rails/railties/guides/images/icons/callouts/10.png +0 -0
  2279. data/vendor/rails/railties/guides/images/icons/callouts/11.png +0 -0
  2280. data/vendor/rails/railties/guides/images/icons/callouts/12.png +0 -0
  2281. data/vendor/rails/railties/guides/images/icons/callouts/13.png +0 -0
  2282. data/vendor/rails/railties/guides/images/icons/callouts/14.png +0 -0
  2283. data/vendor/rails/railties/guides/images/icons/callouts/15.png +0 -0
  2284. data/vendor/rails/railties/guides/images/icons/callouts/2.png +0 -0
  2285. data/vendor/rails/railties/guides/images/icons/callouts/3.png +0 -0
  2286. data/vendor/rails/railties/guides/images/icons/callouts/4.png +0 -0
  2287. data/vendor/rails/railties/guides/images/icons/callouts/5.png +0 -0
  2288. data/vendor/rails/railties/guides/images/icons/callouts/6.png +0 -0
  2289. data/vendor/rails/railties/guides/images/icons/callouts/7.png +0 -0
  2290. data/vendor/rails/railties/guides/images/icons/callouts/8.png +0 -0
  2291. data/vendor/rails/railties/guides/images/icons/callouts/9.png +0 -0
  2292. data/vendor/rails/railties/guides/images/icons/caution.png +0 -0
  2293. data/vendor/rails/railties/guides/images/icons/example.png +0 -0
  2294. data/vendor/rails/railties/guides/images/icons/home.png +0 -0
  2295. data/vendor/rails/railties/guides/images/icons/important.png +0 -0
  2296. data/vendor/rails/railties/guides/images/icons/next.png +0 -0
  2297. data/vendor/rails/railties/guides/images/icons/note.png +0 -0
  2298. data/vendor/rails/railties/guides/images/icons/prev.png +0 -0
  2299. data/vendor/rails/railties/guides/images/icons/tip.png +0 -0
  2300. data/vendor/rails/railties/guides/images/icons/up.png +0 -0
  2301. data/vendor/rails/railties/guides/images/icons/warning.png +0 -0
  2302. data/vendor/rails/railties/guides/images/nav_arrow.gif +0 -0
  2303. data/vendor/rails/railties/guides/images/polymorphic.png +0 -0
  2304. data/vendor/rails/railties/guides/images/posts_index.png +0 -0
  2305. data/vendor/rails/railties/guides/images/rails_guides_logo.gif +0 -0
  2306. data/vendor/rails/railties/guides/images/rails_logo_remix.gif +0 -0
  2307. data/vendor/rails/railties/guides/images/rails_welcome.png +0 -0
  2308. data/vendor/rails/railties/guides/images/session_fixation.png +0 -0
  2309. data/vendor/rails/railties/guides/images/tab_grey.gif +0 -0
  2310. data/vendor/rails/railties/guides/images/tab_info.gif +0 -0
  2311. data/vendor/rails/railties/guides/images/tab_note.gif +0 -0
  2312. data/vendor/rails/railties/guides/images/tab_red.gif +0 -0
  2313. data/vendor/rails/railties/guides/images/tab_yellow.gif +0 -0
  2314. data/vendor/rails/railties/guides/images/tab_yellow.png +0 -0
  2315. data/vendor/rails/railties/guides/images/validation_error_messages.png +0 -0
  2316. data/vendor/rails/railties/guides/rails_guides.rb +42 -0
  2317. data/vendor/rails/railties/guides/rails_guides/generator.rb +138 -0
  2318. data/vendor/rails/railties/guides/rails_guides/helpers.rb +34 -0
  2319. data/vendor/rails/railties/guides/rails_guides/indexer.rb +55 -0
  2320. data/vendor/rails/railties/guides/rails_guides/textile_extensions.rb +41 -0
  2321. data/vendor/rails/railties/guides/source/2_2_release_notes.textile +422 -0
  2322. data/vendor/rails/railties/guides/source/2_3_release_notes.textile +610 -0
  2323. data/vendor/rails/railties/guides/source/action_controller_overview.textile +776 -0
  2324. data/vendor/rails/railties/guides/source/action_mailer_basics.textile +424 -0
  2325. data/vendor/rails/railties/guides/source/active_record_basics.textile +135 -0
  2326. data/vendor/rails/railties/guides/source/active_record_querying.textile +969 -0
  2327. data/vendor/rails/railties/guides/source/activerecord_validations_callbacks.textile +1086 -0
  2328. data/vendor/rails/railties/guides/source/association_basics.textile +1781 -0
  2329. data/vendor/rails/railties/guides/source/caching_with_rails.textile +524 -0
  2330. data/vendor/rails/railties/guides/source/command_line.textile +589 -0
  2331. data/vendor/rails/railties/guides/source/configuring.textile +234 -0
  2332. data/vendor/rails/railties/guides/source/contribute.textile +71 -0
  2333. data/vendor/rails/railties/guides/source/contributing_to_rails.textile +239 -0
  2334. data/vendor/rails/railties/guides/source/credits.erb.textile +52 -0
  2335. data/vendor/rails/railties/guides/source/debugging_rails_applications.textile +709 -0
  2336. data/vendor/rails/railties/guides/source/form_helpers.textile +766 -0
  2337. data/vendor/rails/railties/guides/source/getting_started.textile +1297 -0
  2338. data/vendor/rails/railties/guides/source/i18n.textile +912 -0
  2339. data/vendor/rails/railties/guides/source/index.erb.textile +124 -0
  2340. data/vendor/rails/railties/guides/source/layout.html.erb +103 -0
  2341. data/vendor/rails/railties/guides/source/layouts_and_rendering.textile +979 -0
  2342. data/vendor/rails/railties/guides/source/migrations.textile +591 -0
  2343. data/vendor/rails/railties/guides/source/nested_model_forms.textile +222 -0
  2344. data/vendor/rails/railties/guides/source/performance_testing.textile +531 -0
  2345. data/vendor/rails/railties/guides/source/plugins.textile +1512 -0
  2346. data/vendor/rails/railties/guides/source/rails_on_rack.textile +309 -0
  2347. data/vendor/rails/railties/guides/source/routing.textile +903 -0
  2348. data/vendor/rails/railties/guides/source/security.textile +986 -0
  2349. data/vendor/rails/railties/guides/source/testing.textile +951 -0
  2350. data/vendor/rails/railties/helpers/application_controller.rb +10 -0
  2351. data/vendor/rails/railties/helpers/application_helper.rb +3 -0
  2352. data/vendor/rails/railties/helpers/performance_test.rb +9 -0
  2353. data/vendor/rails/railties/helpers/test_helper.rb +38 -0
  2354. data/vendor/rails/railties/html/404.html +30 -0
  2355. data/vendor/rails/railties/html/422.html +30 -0
  2356. data/vendor/rails/railties/html/500.html +30 -0
  2357. data/vendor/rails/railties/html/favicon.ico +0 -0
  2358. data/vendor/rails/railties/html/images/rails.png +0 -0
  2359. data/vendor/rails/railties/html/index.html +275 -0
  2360. data/vendor/rails/railties/html/javascripts/application.js +2 -0
  2361. data/vendor/rails/railties/html/javascripts/controls.js +963 -0
  2362. data/vendor/rails/railties/html/javascripts/dragdrop.js +973 -0
  2363. data/vendor/rails/railties/html/javascripts/effects.js +1128 -0
  2364. data/vendor/rails/railties/html/javascripts/prototype.js +4320 -0
  2365. data/vendor/rails/railties/html/robots.txt +5 -0
  2366. data/vendor/rails/railties/lib/code_statistics.rb +107 -0
  2367. data/vendor/rails/railties/lib/commands.rb +17 -0
  2368. data/vendor/rails/railties/lib/commands/about.rb +3 -0
  2369. data/vendor/rails/railties/lib/commands/console.rb +45 -0
  2370. data/vendor/rails/railties/lib/commands/dbconsole.rb +87 -0
  2371. data/vendor/rails/railties/lib/commands/destroy.rb +6 -0
  2372. data/vendor/rails/railties/lib/commands/generate.rb +6 -0
  2373. data/vendor/rails/railties/lib/commands/ncgi/listener +86 -0
  2374. data/vendor/rails/railties/lib/commands/ncgi/tracker +69 -0
  2375. data/vendor/rails/railties/lib/commands/performance/benchmarker.rb +24 -0
  2376. data/vendor/rails/railties/lib/commands/performance/profiler.rb +50 -0
  2377. data/vendor/rails/railties/lib/commands/plugin.rb +968 -0
  2378. data/vendor/rails/railties/lib/commands/runner.rb +54 -0
  2379. data/vendor/rails/railties/lib/commands/server.rb +114 -0
  2380. data/vendor/rails/railties/lib/commands/update.rb +4 -0
  2381. data/vendor/rails/railties/lib/console_app.rb +30 -0
  2382. data/vendor/rails/railties/lib/console_sandbox.rb +6 -0
  2383. data/vendor/rails/railties/lib/console_with_helpers.rb +5 -0
  2384. data/vendor/rails/railties/lib/dispatcher.rb +24 -0
  2385. data/vendor/rails/railties/lib/fcgi_handler.rb +239 -0
  2386. data/vendor/rails/railties/lib/initializer.rb +1128 -0
  2387. data/vendor/rails/railties/lib/performance_test_help.rb +5 -0
  2388. data/vendor/rails/railties/lib/rails/backtrace_cleaner.rb +54 -0
  2389. data/vendor/rails/railties/lib/rails/gem_builder.rb +21 -0
  2390. data/vendor/rails/railties/lib/rails/gem_dependency.rb +318 -0
  2391. data/vendor/rails/railties/lib/rails/plugin.rb +179 -0
  2392. data/vendor/rails/railties/lib/rails/plugin/loader.rb +198 -0
  2393. data/vendor/rails/railties/lib/rails/plugin/locator.rb +100 -0
  2394. data/vendor/rails/railties/lib/rails/rack.rb +8 -0
  2395. data/vendor/rails/railties/lib/rails/rack/debugger.rb +23 -0
  2396. data/vendor/rails/railties/lib/rails/rack/log_tailer.rb +35 -0
  2397. data/vendor/rails/railties/lib/rails/rack/metal.rb +51 -0
  2398. data/vendor/rails/railties/lib/rails/rack/static.rb +46 -0
  2399. data/vendor/rails/railties/lib/rails/vendor_gem_source_index.rb +140 -0
  2400. data/vendor/rails/railties/lib/rails/version.rb +9 -0
  2401. data/vendor/rails/railties/lib/rails_generator.rb +46 -0
  2402. data/vendor/rails/railties/lib/rails_generator/base.rb +266 -0
  2403. data/vendor/rails/railties/lib/rails_generator/commands.rb +621 -0
  2404. data/vendor/rails/railties/lib/rails_generator/generated_attribute.rb +47 -0
  2405. data/vendor/rails/railties/lib/rails_generator/generators/applications/app/USAGE +9 -0
  2406. data/vendor/rails/railties/lib/rails_generator/generators/applications/app/app_generator.rb +266 -0
  2407. data/vendor/rails/railties/lib/rails_generator/generators/applications/app/scm/scm.rb +8 -0
  2408. data/vendor/rails/railties/lib/rails_generator/generators/applications/app/scm/svn.rb +7 -0
  2409. data/vendor/rails/railties/lib/rails_generator/generators/applications/app/template_runner.rb +401 -0
  2410. data/vendor/rails/railties/lib/rails_generator/generators/components/controller/USAGE +30 -0
  2411. data/vendor/rails/railties/lib/rails_generator/generators/components/controller/controller_generator.rb +43 -0
  2412. data/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/controller.rb +7 -0
  2413. data/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/functional_test.rb +8 -0
  2414. data/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/helper.rb +2 -0
  2415. data/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/helper_test.rb +4 -0
  2416. data/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/view.html.erb +2 -0
  2417. data/vendor/rails/railties/lib/rails_generator/generators/components/helper/USAGE +24 -0
  2418. data/vendor/rails/railties/lib/rails_generator/generators/components/helper/helper_generator.rb +25 -0
  2419. data/vendor/rails/railties/lib/rails_generator/generators/components/helper/templates/helper.rb +2 -0
  2420. data/vendor/rails/railties/lib/rails_generator/generators/components/helper/templates/helper_test.rb +4 -0
  2421. data/vendor/rails/railties/lib/rails_generator/generators/components/integration_test/USAGE +8 -0
  2422. data/vendor/rails/railties/lib/rails_generator/generators/components/integration_test/integration_test_generator.rb +16 -0
  2423. data/vendor/rails/railties/lib/rails_generator/generators/components/integration_test/templates/integration_test.rb +10 -0
  2424. data/vendor/rails/railties/lib/rails_generator/generators/components/mailer/USAGE +16 -0
  2425. data/vendor/rails/railties/lib/rails_generator/generators/components/mailer/mailer_generator.rb +30 -0
  2426. data/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/fixture.erb +3 -0
  2427. data/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/fixture.rhtml +0 -0
  2428. data/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/mailer.rb +15 -0
  2429. data/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/unit_test.rb +20 -0
  2430. data/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/view.erb +3 -0
  2431. data/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/view.rhtml +0 -0
  2432. data/vendor/rails/railties/lib/rails_generator/generators/components/metal/USAGE +8 -0
  2433. data/vendor/rails/railties/lib/rails_generator/generators/components/metal/metal_generator.rb +8 -0
  2434. data/vendor/rails/railties/lib/rails_generator/generators/components/metal/templates/metal.rb +12 -0
  2435. data/vendor/rails/railties/lib/rails_generator/generators/components/migration/USAGE +29 -0
  2436. data/vendor/rails/railties/lib/rails_generator/generators/components/migration/migration_generator.rb +20 -0
  2437. data/vendor/rails/railties/lib/rails_generator/generators/components/migration/templates/migration.rb +11 -0
  2438. data/vendor/rails/railties/lib/rails_generator/generators/components/model/USAGE +27 -0
  2439. data/vendor/rails/railties/lib/rails_generator/generators/components/model/model_generator.rb +52 -0
  2440. data/vendor/rails/railties/lib/rails_generator/generators/components/model/templates/fixtures.yml +23 -0
  2441. data/vendor/rails/railties/lib/rails_generator/generators/components/model/templates/migration.rb +16 -0
  2442. data/vendor/rails/railties/lib/rails_generator/generators/components/model/templates/model.rb +5 -0
  2443. data/vendor/rails/railties/lib/rails_generator/generators/components/model/templates/unit_test.rb +8 -0
  2444. data/vendor/rails/railties/lib/rails_generator/generators/components/observer/USAGE +13 -0
  2445. data/vendor/rails/railties/lib/rails_generator/generators/components/observer/observer_generator.rb +16 -0
  2446. data/vendor/rails/railties/lib/rails_generator/generators/components/observer/templates/observer.rb +2 -0
  2447. data/vendor/rails/railties/lib/rails_generator/generators/components/observer/templates/unit_test.rb +8 -0
  2448. data/vendor/rails/railties/lib/rails_generator/generators/components/performance_test/USAGE +8 -0
  2449. data/vendor/rails/railties/lib/rails_generator/generators/components/performance_test/performance_test_generator.rb +16 -0
  2450. data/vendor/rails/railties/lib/rails_generator/generators/components/performance_test/templates/performance_test.rb +9 -0
  2451. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/USAGE +25 -0
  2452. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/plugin_generator.rb +39 -0
  2453. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/MIT-LICENSE +20 -0
  2454. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/README +13 -0
  2455. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/Rakefile +23 -0
  2456. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/USAGE +8 -0
  2457. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/generator.rb +8 -0
  2458. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/init.rb +1 -0
  2459. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/install.rb +1 -0
  2460. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/plugin.rb +1 -0
  2461. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/tasks.rake +4 -0
  2462. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/test_helper.rb +3 -0
  2463. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/uninstall.rb +1 -0
  2464. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/unit_test.rb +8 -0
  2465. data/vendor/rails/railties/lib/rails_generator/generators/components/resource/USAGE +23 -0
  2466. data/vendor/rails/railties/lib/rails_generator/generators/components/resource/resource_generator.rb +76 -0
  2467. data/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/controller.rb +2 -0
  2468. data/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/functional_test.rb +8 -0
  2469. data/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/helper.rb +2 -0
  2470. data/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/helper_test.rb +4 -0
  2471. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/USAGE +29 -0
  2472. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +103 -0
  2473. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/controller.rb +83 -0
  2474. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/functional_test.rb +45 -0
  2475. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/helper.rb +2 -0
  2476. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/helper_test.rb +4 -0
  2477. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/layout.html.erb +17 -0
  2478. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/style.css +54 -0
  2479. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/view_edit.html.erb +18 -0
  2480. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/view_index.html.erb +24 -0
  2481. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/view_new.html.erb +17 -0
  2482. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/view_show.html.erb +10 -0
  2483. data/vendor/rails/railties/lib/rails_generator/generators/components/session_migration/USAGE +10 -0
  2484. data/vendor/rails/railties/lib/rails_generator/generators/components/session_migration/session_migration_generator.rb +18 -0
  2485. data/vendor/rails/railties/lib/rails_generator/generators/components/session_migration/templates/migration.rb +16 -0
  2486. data/vendor/rails/railties/lib/rails_generator/lookup.rb +249 -0
  2487. data/vendor/rails/railties/lib/rails_generator/manifest.rb +53 -0
  2488. data/vendor/rails/railties/lib/rails_generator/options.rb +150 -0
  2489. data/vendor/rails/railties/lib/rails_generator/scripts.rb +89 -0
  2490. data/vendor/rails/railties/lib/rails_generator/scripts/destroy.rb +29 -0
  2491. data/vendor/rails/railties/lib/rails_generator/scripts/generate.rb +7 -0
  2492. data/vendor/rails/railties/lib/rails_generator/scripts/update.rb +12 -0
  2493. data/vendor/rails/railties/lib/rails_generator/secret_key_generator.rb +24 -0
  2494. data/vendor/rails/railties/lib/rails_generator/simple_logger.rb +46 -0
  2495. data/vendor/rails/railties/lib/rails_generator/spec.rb +44 -0
  2496. data/vendor/rails/railties/lib/railties_path.rb +1 -0
  2497. data/vendor/rails/railties/lib/ruby_version_check.rb +17 -0
  2498. data/vendor/rails/railties/lib/rubyprof_ext.rb +35 -0
  2499. data/vendor/rails/railties/lib/source_annotation_extractor.rb +102 -0
  2500. data/vendor/rails/railties/lib/tasks/annotations.rake +20 -0
  2501. data/vendor/rails/railties/lib/tasks/databases.rake +436 -0
  2502. data/vendor/rails/railties/lib/tasks/documentation.rake +88 -0
  2503. data/vendor/rails/railties/lib/tasks/framework.rake +146 -0
  2504. data/vendor/rails/railties/lib/tasks/gems.rake +78 -0
  2505. data/vendor/rails/railties/lib/tasks/log.rake +9 -0
  2506. data/vendor/rails/railties/lib/tasks/middleware.rake +7 -0
  2507. data/vendor/rails/railties/lib/tasks/misc.rake +63 -0
  2508. data/vendor/rails/railties/lib/tasks/rails.rb +14 -0
  2509. data/vendor/rails/railties/lib/tasks/routes.rake +18 -0
  2510. data/vendor/rails/railties/lib/tasks/statistics.rake +17 -0
  2511. data/vendor/rails/railties/lib/tasks/testing.rake +139 -0
  2512. data/vendor/rails/railties/lib/test_help.rb +38 -0
  2513. data/vendor/rails/railties/lib/webrick_server.rb +156 -0
  2514. data/vendor/redcloth/Rakefile +196 -0
  2515. data/vendor/redcloth/bin/redcloth +3 -0
  2516. data/vendor/redcloth/doc/CHANGELOG +160 -0
  2517. data/vendor/redcloth/doc/COPYING +25 -0
  2518. data/vendor/redcloth/doc/README +106 -0
  2519. data/vendor/redcloth/doc/REFERENCE +216 -0
  2520. data/vendor/redcloth/doc/make.rb +359 -0
  2521. data/vendor/redcloth/lib/rctodb.rb +1107 -0
  2522. data/vendor/redcloth/lib/redcloth.rb +1130 -0
  2523. data/vendor/redcloth/run-tests.rb +28 -0
  2524. data/vendor/redcloth/setup.rb +1376 -0
  2525. data/vendor/redcloth/tests/code.yml +105 -0
  2526. data/vendor/redcloth/tests/images.yml +171 -0
  2527. data/vendor/redcloth/tests/instiki.yml +39 -0
  2528. data/vendor/redcloth/tests/links.yml +155 -0
  2529. data/vendor/redcloth/tests/lists.yml +77 -0
  2530. data/vendor/redcloth/tests/markdown.yml +218 -0
  2531. data/vendor/redcloth/tests/poignant.yml +64 -0
  2532. data/vendor/redcloth/tests/table.yml +198 -0
  2533. data/vendor/redcloth/tests/textism.yml +406 -0
  2534. metadata +2741 -0
@@ -0,0 +1,395 @@
1
+ module ActiveRecord
2
+ # AutosaveAssociation is a module that takes care of automatically saving
3
+ # your associations when the parent is saved. In addition to saving, it
4
+ # also destroys any associations that were marked for destruction.
5
+ # (See mark_for_destruction and marked_for_destruction?)
6
+ #
7
+ # Saving of the parent, its associations, and the destruction of marked
8
+ # associations, all happen inside 1 transaction. This should never leave the
9
+ # database in an inconsistent state after, for instance, mass assigning
10
+ # attributes and saving them.
11
+ #
12
+ # If validations for any of the associations fail, their error messages will
13
+ # be applied to the parent.
14
+ #
15
+ # Note that it also means that associations marked for destruction won't
16
+ # be destroyed directly. They will however still be marked for destruction.
17
+ #
18
+ # === One-to-one Example
19
+ #
20
+ # Consider a Post model with one Author:
21
+ #
22
+ # class Post
23
+ # has_one :author, :autosave => true
24
+ # end
25
+ #
26
+ # Saving changes to the parent and its associated model can now be performed
27
+ # automatically _and_ atomically:
28
+ #
29
+ # post = Post.find(1)
30
+ # post.title # => "The current global position of migrating ducks"
31
+ # post.author.name # => "alloy"
32
+ #
33
+ # post.title = "On the migration of ducks"
34
+ # post.author.name = "Eloy Duran"
35
+ #
36
+ # post.save
37
+ # post.reload
38
+ # post.title # => "On the migration of ducks"
39
+ # post.author.name # => "Eloy Duran"
40
+ #
41
+ # Destroying an associated model, as part of the parent's save action, is as
42
+ # simple as marking it for destruction:
43
+ #
44
+ # post.author.mark_for_destruction
45
+ # post.author.marked_for_destruction? # => true
46
+ #
47
+ # Note that the model is _not_ yet removed from the database:
48
+ # id = post.author.id
49
+ # Author.find_by_id(id).nil? # => false
50
+ #
51
+ # post.save
52
+ # post.reload.author # => nil
53
+ #
54
+ # Now it _is_ removed from the database:
55
+ # Author.find_by_id(id).nil? # => true
56
+ #
57
+ # === One-to-many Example
58
+ #
59
+ # Consider a Post model with many Comments:
60
+ #
61
+ # class Post
62
+ # has_many :comments, :autosave => true
63
+ # end
64
+ #
65
+ # Saving changes to the parent and its associated model can now be performed
66
+ # automatically _and_ atomically:
67
+ #
68
+ # post = Post.find(1)
69
+ # post.title # => "The current global position of migrating ducks"
70
+ # post.comments.first.body # => "Wow, awesome info thanks!"
71
+ # post.comments.last.body # => "Actually, your article should be named differently."
72
+ #
73
+ # post.title = "On the migration of ducks"
74
+ # post.comments.last.body = "Actually, your article should be named differently. [UPDATED]: You are right, thanks."
75
+ #
76
+ # post.save
77
+ # post.reload
78
+ # post.title # => "On the migration of ducks"
79
+ # post.comments.last.body # => "Actually, your article should be named differently. [UPDATED]: You are right, thanks."
80
+ #
81
+ # Destroying one of the associated models members, as part of the parent's
82
+ # save action, is as simple as marking it for destruction:
83
+ #
84
+ # post.comments.last.mark_for_destruction
85
+ # post.comments.last.marked_for_destruction? # => true
86
+ # post.comments.length # => 2
87
+ #
88
+ # Note that the model is _not_ yet removed from the database:
89
+ # id = post.comments.last.id
90
+ # Comment.find_by_id(id).nil? # => false
91
+ #
92
+ # post.save
93
+ # post.reload.comments.length # => 1
94
+ #
95
+ # Now it _is_ removed from the database:
96
+ # Comment.find_by_id(id).nil? # => true
97
+ #
98
+ # === Validation
99
+ #
100
+ # Validation is performed on the parent as usual, but also on all autosave
101
+ # enabled associations. If any of the associations fail validation, its
102
+ # error messages will be applied on the parents errors object and validation
103
+ # of the parent will fail.
104
+ #
105
+ # Consider a Post model with Author which validates the presence of its name
106
+ # attribute:
107
+ #
108
+ # class Post
109
+ # has_one :author, :autosave => true
110
+ # end
111
+ #
112
+ # class Author
113
+ # validates_presence_of :name
114
+ # end
115
+ #
116
+ # post = Post.find(1)
117
+ # post.author.name = ''
118
+ # post.save # => false
119
+ # post.errors # => #<ActiveRecord::Errors:0x174498c @errors={"author_name"=>["can't be blank"]}, @base=#<Post ...>>
120
+ #
121
+ # No validations will be performed on the associated models when validations
122
+ # are skipped for the parent:
123
+ #
124
+ # post = Post.find(1)
125
+ # post.author.name = ''
126
+ # post.save(false) # => true
127
+ module AutosaveAssociation
128
+ ASSOCIATION_TYPES = %w{ has_one belongs_to has_many has_and_belongs_to_many }
129
+
130
+ def self.included(base)
131
+ base.class_eval do
132
+ base.extend(ClassMethods)
133
+ alias_method_chain :reload, :autosave_associations
134
+
135
+ ASSOCIATION_TYPES.each do |type|
136
+ base.send("valid_keys_for_#{type}_association") << :autosave
137
+ end
138
+ end
139
+ end
140
+
141
+ module ClassMethods
142
+ private
143
+
144
+ # def belongs_to(name, options = {})
145
+ # super
146
+ # add_autosave_association_callbacks(reflect_on_association(name))
147
+ # end
148
+ ASSOCIATION_TYPES.each do |type|
149
+ module_eval %{
150
+ def #{type}(name, options = {})
151
+ super
152
+ add_autosave_association_callbacks(reflect_on_association(name))
153
+ end
154
+ }
155
+ end
156
+
157
+ # Adds a validate and save callback for the association as specified by
158
+ # the +reflection+.
159
+ #
160
+ # For performance reasons, we don't check whether to validate at runtime,
161
+ # but instead only define the method and callback when needed. However,
162
+ # this can change, for instance, when using nested attributes, which is
163
+ # called _after_ the association has been defined. Since we don't want
164
+ # the callbacks to get defined multiple times, there are guards that
165
+ # check if the save or validation methods have already been defined
166
+ # before actually defining them.
167
+ def add_autosave_association_callbacks(reflection)
168
+ save_method = :"autosave_associated_records_for_#{reflection.name}"
169
+ validation_method = :"validate_associated_records_for_#{reflection.name}"
170
+ collection = reflection.collection?
171
+
172
+ unless method_defined?(save_method)
173
+ if collection
174
+ before_save :before_save_collection_association
175
+
176
+ define_method(save_method) { save_collection_association(reflection) }
177
+ # Doesn't use after_save as that would save associations added in after_create/after_update twice
178
+ after_create save_method
179
+ after_update save_method
180
+ else
181
+ if reflection.macro == :has_one
182
+ define_method(save_method) { save_has_one_association(reflection) }
183
+ after_save save_method
184
+ else
185
+ define_method(save_method) { save_belongs_to_association(reflection) }
186
+ before_save save_method
187
+ end
188
+ end
189
+ end
190
+
191
+ if reflection.validate? && !method_defined?(validation_method)
192
+ method = (collection ? :validate_collection_association : :validate_single_association)
193
+ define_method(validation_method) { send(method, reflection) }
194
+ validate validation_method
195
+ end
196
+ end
197
+ end
198
+
199
+ # Reloads the attributes of the object as usual and removes a mark for destruction.
200
+ def reload_with_autosave_associations(options = nil)
201
+ @marked_for_destruction = false
202
+ reload_without_autosave_associations(options)
203
+ end
204
+
205
+ # Marks this record to be destroyed as part of the parents save transaction.
206
+ # This does _not_ actually destroy the record yet, rather it will be destroyed when <tt>parent.save</tt> is called.
207
+ #
208
+ # Only useful if the <tt>:autosave</tt> option on the parent is enabled for this associated model.
209
+ def mark_for_destruction
210
+ @marked_for_destruction = true
211
+ end
212
+
213
+ # Returns whether or not this record will be destroyed as part of the parents save transaction.
214
+ #
215
+ # Only useful if the <tt>:autosave</tt> option on the parent is enabled for this associated model.
216
+ def marked_for_destruction?
217
+ @marked_for_destruction
218
+ end
219
+
220
+ # Returns whether or not this record has been changed in any way (including whether
221
+ # any of its nested autosave associations are likewise changed)
222
+ def changed_for_autosave?
223
+ new_record? || changed? || marked_for_destruction? || nested_records_changed_for_autosave?
224
+ end
225
+
226
+ private
227
+
228
+ # Returns the record for an association collection that should be validated
229
+ # or saved. If +autosave+ is +false+ only new records will be returned,
230
+ # unless the parent is/was a new record itself.
231
+ def associated_records_to_validate_or_save(association, new_record, autosave)
232
+ if new_record
233
+ association
234
+ elsif autosave
235
+ association.target.select { |record| record.changed_for_autosave? }
236
+ else
237
+ association.target.select { |record| record.new_record? }
238
+ end
239
+ end
240
+
241
+ # go through nested autosave associations that are loaded in memory (without loading
242
+ # any new ones), and return true if is changed for autosave
243
+ def nested_records_changed_for_autosave?
244
+ self.class.reflect_on_all_autosave_associations.each do |reflection|
245
+ if association = association_instance_get(reflection.name)
246
+ if [:belongs_to, :has_one].include?(reflection.macro)
247
+ return true if association.target && association.target.changed_for_autosave?
248
+ else
249
+ association.target.each {|record| return true if record.changed_for_autosave? }
250
+ end
251
+ end
252
+ end
253
+ false
254
+ end
255
+
256
+ # Validate the association if <tt>:validate</tt> or <tt>:autosave</tt> is
257
+ # turned on for the association specified by +reflection+.
258
+ def validate_single_association(reflection)
259
+ if (association = association_instance_get(reflection.name)) && !association.target.nil?
260
+ association_valid?(reflection, association)
261
+ end
262
+ end
263
+
264
+ # Validate the associated records if <tt>:validate</tt> or
265
+ # <tt>:autosave</tt> is turned on for the association specified by
266
+ # +reflection+.
267
+ def validate_collection_association(reflection)
268
+ if association = association_instance_get(reflection.name)
269
+ if records = associated_records_to_validate_or_save(association, new_record?, reflection.options[:autosave])
270
+ records.each { |record| association_valid?(reflection, record) }
271
+ end
272
+ end
273
+ end
274
+
275
+ # Returns whether or not the association is valid and applies any errors to
276
+ # the parent, <tt>self</tt>, if it wasn't. Skips any <tt>:autosave</tt>
277
+ # enabled records if they're marked_for_destruction? or destroyed.
278
+ def association_valid?(reflection, association)
279
+ return true if association.destroyed? || association.marked_for_destruction?
280
+
281
+ unless valid = association.valid?
282
+ if reflection.options[:autosave]
283
+ association.errors.each_error do |attribute, error|
284
+ attribute = "#{reflection.name}.#{attribute}"
285
+ errors.add(attribute, error.dup) unless errors.on(attribute)
286
+ end
287
+ else
288
+ errors.add(reflection.name)
289
+ end
290
+ end
291
+ valid
292
+ end
293
+
294
+ # Is used as a before_save callback to check while saving a collection
295
+ # association whether or not the parent was a new record before saving.
296
+ def before_save_collection_association
297
+ @new_record_before_save = new_record?
298
+ true
299
+ end
300
+
301
+ # Saves any new associated records, or all loaded autosave associations if
302
+ # <tt>:autosave</tt> is enabled on the association.
303
+ #
304
+ # In addition, it destroys all children that were marked for destruction
305
+ # with mark_for_destruction.
306
+ #
307
+ # This all happens inside a transaction, _if_ the Transactions module is included into
308
+ # ActiveRecord::Base after the AutosaveAssociation module, which it does by default.
309
+ def save_collection_association(reflection)
310
+ if association = association_instance_get(reflection.name)
311
+ autosave = reflection.options[:autosave]
312
+
313
+ if records = associated_records_to_validate_or_save(association, @new_record_before_save, autosave)
314
+ records.each do |record|
315
+ next if record.destroyed?
316
+
317
+ if autosave && record.marked_for_destruction?
318
+ association.destroy(record)
319
+ elsif autosave != false && (@new_record_before_save || record.new_record?)
320
+ if autosave
321
+ saved = association.send(:insert_record, record, false, false)
322
+ else
323
+ association.send(:insert_record, record)
324
+ end
325
+ elsif autosave
326
+ saved = record.save(false)
327
+ end
328
+
329
+ raise ActiveRecord::Rollback if saved == false
330
+ end
331
+ end
332
+
333
+ # reconstruct the SQL queries now that we know the owner's id
334
+ association.send(:construct_sql) if association.respond_to?(:construct_sql)
335
+ end
336
+ end
337
+
338
+ # Saves the associated record if it's new or <tt>:autosave</tt> is enabled
339
+ # on the association.
340
+ #
341
+ # In addition, it will destroy the association if it was marked for
342
+ # destruction with mark_for_destruction.
343
+ #
344
+ # This all happens inside a transaction, _if_ the Transactions module is included into
345
+ # ActiveRecord::Base after the AutosaveAssociation module, which it does by default.
346
+ def save_has_one_association(reflection)
347
+ if (association = association_instance_get(reflection.name)) && !association.target.nil? && !association.destroyed?
348
+ autosave = reflection.options[:autosave]
349
+
350
+ if autosave && association.marked_for_destruction?
351
+ association.destroy
352
+ else
353
+ key = reflection.options[:primary_key] ? send(reflection.options[:primary_key]) : id
354
+ if autosave != false && (new_record? || association.new_record? || association[reflection.primary_key_name] != key || autosave)
355
+ association[reflection.primary_key_name] = key
356
+ saved = association.save(!autosave)
357
+ raise ActiveRecord::Rollback if !saved && autosave
358
+ saved
359
+ end
360
+ end
361
+ end
362
+ end
363
+
364
+ # Saves the associated record if it's new or <tt>:autosave</tt> is enabled
365
+ # on the association.
366
+ #
367
+ # In addition, it will destroy the association if it was marked for
368
+ # destruction with mark_for_destruction.
369
+ #
370
+ # This all happens inside a transaction, _if_ the Transactions module is included into
371
+ # ActiveRecord::Base after the AutosaveAssociation module, which it does by default.
372
+ def save_belongs_to_association(reflection)
373
+ if (association = association_instance_get(reflection.name)) && !association.destroyed?
374
+ autosave = reflection.options[:autosave]
375
+
376
+ if autosave && association.marked_for_destruction?
377
+ association.destroy
378
+ elsif autosave != false
379
+ saved = association.save(!autosave) if association.new_record? || autosave
380
+
381
+ if association.updated?
382
+ association_id = association.send(reflection.options[:primary_key] || :id)
383
+ self[reflection.primary_key_name] = association_id
384
+ # TODO: Removing this code doesn't seem to matter…
385
+ if reflection.options[:polymorphic]
386
+ self[reflection.options[:foreign_type]] = association.class.base_class.name.to_s
387
+ end
388
+ end
389
+
390
+ saved if autosave
391
+ end
392
+ end
393
+ end
394
+ end
395
+ end
@@ -0,0 +1,3206 @@
1
+ require 'yaml'
2
+ require 'set'
3
+
4
+ module ActiveRecord #:nodoc:
5
+ # Generic Active Record exception class.
6
+ class ActiveRecordError < StandardError
7
+ end
8
+
9
+ # Raised when the single-table inheritance mechanism fails to locate the subclass
10
+ # (for example due to improper usage of column that +inheritance_column+ points to).
11
+ class SubclassNotFound < ActiveRecordError #:nodoc:
12
+ end
13
+
14
+ # Raised when an object assigned to an association has an incorrect type.
15
+ #
16
+ # class Ticket < ActiveRecord::Base
17
+ # has_many :patches
18
+ # end
19
+ #
20
+ # class Patch < ActiveRecord::Base
21
+ # belongs_to :ticket
22
+ # end
23
+ #
24
+ # # Comments are not patches, this assignment raises AssociationTypeMismatch.
25
+ # @ticket.patches << Comment.new(:content => "Please attach tests to your patch.")
26
+ class AssociationTypeMismatch < ActiveRecordError
27
+ end
28
+
29
+ # Raised when unserialized object's type mismatches one specified for serializable field.
30
+ class SerializationTypeMismatch < ActiveRecordError
31
+ end
32
+
33
+ # Raised when adapter not specified on connection (or configuration file <tt>config/database.yml</tt> misses adapter field).
34
+ class AdapterNotSpecified < ActiveRecordError
35
+ end
36
+
37
+ # Raised when Active Record cannot find database adapter specified in <tt>config/database.yml</tt> or programmatically.
38
+ class AdapterNotFound < ActiveRecordError
39
+ end
40
+
41
+ # Raised when connection to the database could not been established (for example when <tt>connection=</tt> is given a nil object).
42
+ class ConnectionNotEstablished < ActiveRecordError
43
+ end
44
+
45
+ # Raised when Active Record cannot find record by given id or set of ids.
46
+ class RecordNotFound < ActiveRecordError
47
+ end
48
+
49
+ # Raised by ActiveRecord::Base.save! and ActiveRecord::Base.create! methods when record cannot be
50
+ # saved because record is invalid.
51
+ class RecordNotSaved < ActiveRecordError
52
+ end
53
+
54
+ # Raised when SQL statement cannot be executed by the database (for example, it's often the case for MySQL when Ruby driver used is too old).
55
+ class StatementInvalid < ActiveRecordError
56
+ end
57
+
58
+ # Raised when number of bind variables in statement given to <tt>:condition</tt> key (for example, when using +find+ method)
59
+ # does not match number of expected variables.
60
+ #
61
+ # For example, in
62
+ #
63
+ # Location.find :all, :conditions => ["lat = ? AND lng = ?", 53.7362]
64
+ #
65
+ # two placeholders are given but only one variable to fill them.
66
+ class PreparedStatementInvalid < ActiveRecordError
67
+ end
68
+
69
+ # Raised on attempt to save stale record. Record is stale when it's being saved in another query after
70
+ # instantiation, for example, when two users edit the same wiki page and one starts editing and saves
71
+ # the page before the other.
72
+ #
73
+ # Read more about optimistic locking in ActiveRecord::Locking module RDoc.
74
+ class StaleObjectError < ActiveRecordError
75
+ end
76
+
77
+ # Raised when association is being configured improperly or
78
+ # user tries to use offset and limit together with has_many or has_and_belongs_to_many associations.
79
+ class ConfigurationError < ActiveRecordError
80
+ end
81
+
82
+ # Raised on attempt to update record that is instantiated as read only.
83
+ class ReadOnlyRecord < ActiveRecordError
84
+ end
85
+
86
+ # ActiveRecord::Transactions::ClassMethods.transaction uses this exception
87
+ # to distinguish a deliberate rollback from other exceptional situations.
88
+ # Normally, raising an exception will cause the +transaction+ method to rollback
89
+ # the database transaction *and* pass on the exception. But if you raise an
90
+ # ActiveRecord::Rollback exception, then the database transaction will be rolled back,
91
+ # without passing on the exception.
92
+ #
93
+ # For example, you could do this in your controller to rollback a transaction:
94
+ #
95
+ # class BooksController < ActionController::Base
96
+ # def create
97
+ # Book.transaction do
98
+ # book = Book.new(params[:book])
99
+ # book.save!
100
+ # if today_is_friday?
101
+ # # The system must fail on Friday so that our support department
102
+ # # won't be out of job. We silently rollback this transaction
103
+ # # without telling the user.
104
+ # raise ActiveRecord::Rollback, "Call tech support!"
105
+ # end
106
+ # end
107
+ # # ActiveRecord::Rollback is the only exception that won't be passed on
108
+ # # by ActiveRecord::Base.transaction, so this line will still be reached
109
+ # # even on Friday.
110
+ # redirect_to root_url
111
+ # end
112
+ # end
113
+ class Rollback < ActiveRecordError
114
+ end
115
+
116
+ # Raised when attribute has a name reserved by Active Record (when attribute has name of one of Active Record instance methods).
117
+ class DangerousAttributeError < ActiveRecordError
118
+ end
119
+
120
+ # Raised when you've tried to access a column which wasn't loaded by your finder.
121
+ # Typically this is because <tt>:select</tt> has been specified.
122
+ class MissingAttributeError < NoMethodError
123
+ end
124
+
125
+ # Raised when unknown attributes are supplied via mass assignment.
126
+ class UnknownAttributeError < NoMethodError
127
+ end
128
+
129
+ # Raised when an error occurred while doing a mass assignment to an attribute through the
130
+ # <tt>attributes=</tt> method. The exception has an +attribute+ property that is the name of the
131
+ # offending attribute.
132
+ class AttributeAssignmentError < ActiveRecordError
133
+ attr_reader :exception, :attribute
134
+ def initialize(message, exception, attribute)
135
+ @exception = exception
136
+ @attribute = attribute
137
+ @message = message
138
+ end
139
+ end
140
+
141
+ # Raised when there are multiple errors while doing a mass assignment through the +attributes+
142
+ # method. The exception has an +errors+ property that contains an array of AttributeAssignmentError
143
+ # objects, each corresponding to the error while assigning to an attribute.
144
+ class MultiparameterAssignmentErrors < ActiveRecordError
145
+ attr_reader :errors
146
+ def initialize(errors)
147
+ @errors = errors
148
+ end
149
+ end
150
+
151
+ # Active Record objects don't specify their attributes directly, but rather infer them from the table definition with
152
+ # which they're linked. Adding, removing, and changing attributes and their type is done directly in the database. Any change
153
+ # is instantly reflected in the Active Record objects. The mapping that binds a given Active Record class to a certain
154
+ # database table will happen automatically in most common cases, but can be overwritten for the uncommon ones.
155
+ #
156
+ # See the mapping rules in table_name and the full example in link:files/README.html for more insight.
157
+ #
158
+ # == Creation
159
+ #
160
+ # Active Records accept constructor parameters either in a hash or as a block. The hash method is especially useful when
161
+ # you're receiving the data from somewhere else, like an HTTP request. It works like this:
162
+ #
163
+ # user = User.new(:name => "David", :occupation => "Code Artist")
164
+ # user.name # => "David"
165
+ #
166
+ # You can also use block initialization:
167
+ #
168
+ # user = User.new do |u|
169
+ # u.name = "David"
170
+ # u.occupation = "Code Artist"
171
+ # end
172
+ #
173
+ # And of course you can just create a bare object and specify the attributes after the fact:
174
+ #
175
+ # user = User.new
176
+ # user.name = "David"
177
+ # user.occupation = "Code Artist"
178
+ #
179
+ # == Conditions
180
+ #
181
+ # Conditions can either be specified as a string, array, or hash representing the WHERE-part of an SQL statement.
182
+ # The array form is to be used when the condition input is tainted and requires sanitization. The string form can
183
+ # be used for statements that don't involve tainted data. The hash form works much like the array form, except
184
+ # only equality and range is possible. Examples:
185
+ #
186
+ # class User < ActiveRecord::Base
187
+ # def self.authenticate_unsafely(user_name, password)
188
+ # find(:first, :conditions => "user_name = '#{user_name}' AND password = '#{password}'")
189
+ # end
190
+ #
191
+ # def self.authenticate_safely(user_name, password)
192
+ # find(:first, :conditions => [ "user_name = ? AND password = ?", user_name, password ])
193
+ # end
194
+ #
195
+ # def self.authenticate_safely_simply(user_name, password)
196
+ # find(:first, :conditions => { :user_name => user_name, :password => password })
197
+ # end
198
+ # end
199
+ #
200
+ # The <tt>authenticate_unsafely</tt> method inserts the parameters directly into the query and is thus susceptible to SQL-injection
201
+ # attacks if the <tt>user_name</tt> and +password+ parameters come directly from an HTTP request. The <tt>authenticate_safely</tt> and
202
+ # <tt>authenticate_safely_simply</tt> both will sanitize the <tt>user_name</tt> and +password+ before inserting them in the query,
203
+ # which will ensure that an attacker can't escape the query and fake the login (or worse).
204
+ #
205
+ # When using multiple parameters in the conditions, it can easily become hard to read exactly what the fourth or fifth
206
+ # question mark is supposed to represent. In those cases, you can resort to named bind variables instead. That's done by replacing
207
+ # the question marks with symbols and supplying a hash with values for the matching symbol keys:
208
+ #
209
+ # Company.find(:first, :conditions => [
210
+ # "id = :id AND name = :name AND division = :division AND created_at > :accounting_date",
211
+ # { :id => 3, :name => "37signals", :division => "First", :accounting_date => '2005-01-01' }
212
+ # ])
213
+ #
214
+ # Similarly, a simple hash without a statement will generate conditions based on equality with the SQL AND
215
+ # operator. For instance:
216
+ #
217
+ # Student.find(:all, :conditions => { :first_name => "Harvey", :status => 1 })
218
+ # Student.find(:all, :conditions => params[:student])
219
+ #
220
+ # A range may be used in the hash to use the SQL BETWEEN operator:
221
+ #
222
+ # Student.find(:all, :conditions => { :grade => 9..12 })
223
+ #
224
+ # An array may be used in the hash to use the SQL IN operator:
225
+ #
226
+ # Student.find(:all, :conditions => { :grade => [9,11,12] })
227
+ #
228
+ # == Overwriting default accessors
229
+ #
230
+ # All column values are automatically available through basic accessors on the Active Record object, but sometimes you
231
+ # want to specialize this behavior. This can be done by overwriting the default accessors (using the same
232
+ # name as the attribute) and calling <tt>read_attribute(attr_name)</tt> and <tt>write_attribute(attr_name, value)</tt> to actually change things.
233
+ # Example:
234
+ #
235
+ # class Song < ActiveRecord::Base
236
+ # # Uses an integer of seconds to hold the length of the song
237
+ #
238
+ # def length=(minutes)
239
+ # write_attribute(:length, minutes.to_i * 60)
240
+ # end
241
+ #
242
+ # def length
243
+ # read_attribute(:length) / 60
244
+ # end
245
+ # end
246
+ #
247
+ # You can alternatively use <tt>self[:attribute]=(value)</tt> and <tt>self[:attribute]</tt> instead of <tt>write_attribute(:attribute, value)</tt> and
248
+ # <tt>read_attribute(:attribute)</tt> as a shorter form.
249
+ #
250
+ # == Attribute query methods
251
+ #
252
+ # In addition to the basic accessors, query methods are also automatically available on the Active Record object.
253
+ # Query methods allow you to test whether an attribute value is present.
254
+ #
255
+ # For example, an Active Record User with the <tt>name</tt> attribute has a <tt>name?</tt> method that you can call
256
+ # to determine whether the user has a name:
257
+ #
258
+ # user = User.new(:name => "David")
259
+ # user.name? # => true
260
+ #
261
+ # anonymous = User.new(:name => "")
262
+ # anonymous.name? # => false
263
+ #
264
+ # == Accessing attributes before they have been typecasted
265
+ #
266
+ # Sometimes you want to be able to read the raw attribute data without having the column-determined typecast run its course first.
267
+ # That can be done by using the <tt><attribute>_before_type_cast</tt> accessors that all attributes have. For example, if your Account model
268
+ # has a <tt>balance</tt> attribute, you can call <tt>account.balance_before_type_cast</tt> or <tt>account.id_before_type_cast</tt>.
269
+ #
270
+ # This is especially useful in validation situations where the user might supply a string for an integer field and you want to display
271
+ # the original string back in an error message. Accessing the attribute normally would typecast the string to 0, which isn't what you
272
+ # want.
273
+ #
274
+ # == Dynamic attribute-based finders
275
+ #
276
+ # Dynamic attribute-based finders are a cleaner way of getting (and/or creating) objects by simple queries without turning to SQL. They work by
277
+ # appending the name of an attribute to <tt>find_by_</tt>, <tt>find_last_by_</tt>, or <tt>find_all_by_</tt>, so you get finders like <tt>Person.find_by_user_name</tt>,
278
+ # <tt>Person.find_all_by_last_name</tt>, and <tt>Payment.find_by_transaction_id</tt>. So instead of writing
279
+ # <tt>Person.find(:first, :conditions => ["user_name = ?", user_name])</tt>, you just do <tt>Person.find_by_user_name(user_name)</tt>.
280
+ # And instead of writing <tt>Person.find(:all, :conditions => ["last_name = ?", last_name])</tt>, you just do <tt>Person.find_all_by_last_name(last_name)</tt>.
281
+ #
282
+ # It's also possible to use multiple attributes in the same find by separating them with "_and_", so you get finders like
283
+ # <tt>Person.find_by_user_name_and_password</tt> or even <tt>Payment.find_by_purchaser_and_state_and_country</tt>. So instead of writing
284
+ # <tt>Person.find(:first, :conditions => ["user_name = ? AND password = ?", user_name, password])</tt>, you just do
285
+ # <tt>Person.find_by_user_name_and_password(user_name, password)</tt>.
286
+ #
287
+ # It's even possible to use all the additional parameters to find. For example, the full interface for <tt>Payment.find_all_by_amount</tt>
288
+ # is actually <tt>Payment.find_all_by_amount(amount, options)</tt>. And the full interface to <tt>Person.find_by_user_name</tt> is
289
+ # actually <tt>Person.find_by_user_name(user_name, options)</tt>. So you could call <tt>Payment.find_all_by_amount(50, :order => "created_on")</tt>.
290
+ # Also you may call <tt>Payment.find_last_by_amount(amount, options)</tt> returning the last record matching that amount and options.
291
+ #
292
+ # The same dynamic finder style can be used to create the object if it doesn't already exist. This dynamic finder is called with
293
+ # <tt>find_or_create_by_</tt> and will return the object if it already exists and otherwise creates it, then returns it. Protected attributes won't be set unless they are given in a block. For example:
294
+ #
295
+ # # No 'Summer' tag exists
296
+ # Tag.find_or_create_by_name("Summer") # equal to Tag.create(:name => "Summer")
297
+ #
298
+ # # Now the 'Summer' tag does exist
299
+ # Tag.find_or_create_by_name("Summer") # equal to Tag.find_by_name("Summer")
300
+ #
301
+ # # Now 'Bob' exist and is an 'admin'
302
+ # User.find_or_create_by_name('Bob', :age => 40) { |u| u.admin = true }
303
+ #
304
+ # Use the <tt>find_or_initialize_by_</tt> finder if you want to return a new record without saving it first. Protected attributes won't be set unless they are given in a block. For example:
305
+ #
306
+ # # No 'Winter' tag exists
307
+ # winter = Tag.find_or_initialize_by_name("Winter")
308
+ # winter.new_record? # true
309
+ #
310
+ # To find by a subset of the attributes to be used for instantiating a new object, pass a hash instead of
311
+ # a list of parameters. For example:
312
+ #
313
+ # Tag.find_or_create_by_name(:name => "rails", :creator => current_user)
314
+ #
315
+ # That will either find an existing tag named "rails", or create a new one while setting the user that created it.
316
+ #
317
+ # == Saving arrays, hashes, and other non-mappable objects in text columns
318
+ #
319
+ # Active Record can serialize any object in text columns using YAML. To do so, you must specify this with a call to the class method +serialize+.
320
+ # This makes it possible to store arrays, hashes, and other non-mappable objects without doing any additional work. Example:
321
+ #
322
+ # class User < ActiveRecord::Base
323
+ # serialize :preferences
324
+ # end
325
+ #
326
+ # user = User.create(:preferences => { "background" => "black", "display" => large })
327
+ # User.find(user.id).preferences # => { "background" => "black", "display" => large }
328
+ #
329
+ # You can also specify a class option as the second parameter that'll raise an exception if a serialized object is retrieved as a
330
+ # descendant of a class not in the hierarchy. Example:
331
+ #
332
+ # class User < ActiveRecord::Base
333
+ # serialize :preferences, Hash
334
+ # end
335
+ #
336
+ # user = User.create(:preferences => %w( one two three ))
337
+ # User.find(user.id).preferences # raises SerializationTypeMismatch
338
+ #
339
+ # == Single table inheritance
340
+ #
341
+ # Active Record allows inheritance by storing the name of the class in a column that by default is named "type" (can be changed
342
+ # by overwriting <tt>Base.inheritance_column</tt>). This means that an inheritance looking like this:
343
+ #
344
+ # class Company < ActiveRecord::Base; end
345
+ # class Firm < Company; end
346
+ # class Client < Company; end
347
+ # class PriorityClient < Client; end
348
+ #
349
+ # When you do <tt>Firm.create(:name => "37signals")</tt>, this record will be saved in the companies table with type = "Firm". You can then
350
+ # fetch this row again using <tt>Company.find(:first, "name = '37signals'")</tt> and it will return a Firm object.
351
+ #
352
+ # If you don't have a type column defined in your table, single-table inheritance won't be triggered. In that case, it'll work just
353
+ # like normal subclasses with no special magic for differentiating between them or reloading the right type with find.
354
+ #
355
+ # Note, all the attributes for all the cases are kept in the same table. Read more:
356
+ # http://www.martinfowler.com/eaaCatalog/singleTableInheritance.html
357
+ #
358
+ # == Connection to multiple databases in different models
359
+ #
360
+ # Connections are usually created through ActiveRecord::Base.establish_connection and retrieved by ActiveRecord::Base.connection.
361
+ # All classes inheriting from ActiveRecord::Base will use this connection. But you can also set a class-specific connection.
362
+ # For example, if Course is an ActiveRecord::Base, but resides in a different database, you can just say <tt>Course.establish_connection</tt>
363
+ # and Course and all of its subclasses will use this connection instead.
364
+ #
365
+ # This feature is implemented by keeping a connection pool in ActiveRecord::Base that is a Hash indexed by the class. If a connection is
366
+ # requested, the retrieve_connection method will go up the class-hierarchy until a connection is found in the connection pool.
367
+ #
368
+ # == Exceptions
369
+ #
370
+ # * ActiveRecordError - Generic error class and superclass of all other errors raised by Active Record.
371
+ # * AdapterNotSpecified - The configuration hash used in <tt>establish_connection</tt> didn't include an
372
+ # <tt>:adapter</tt> key.
373
+ # * AdapterNotFound - The <tt>:adapter</tt> key used in <tt>establish_connection</tt> specified a non-existent adapter
374
+ # (or a bad spelling of an existing one).
375
+ # * AssociationTypeMismatch - The object assigned to the association wasn't of the type specified in the association definition.
376
+ # * SerializationTypeMismatch - The serialized object wasn't of the class specified as the second parameter.
377
+ # * ConnectionNotEstablished+ - No connection has been established. Use <tt>establish_connection</tt> before querying.
378
+ # * RecordNotFound - No record responded to the +find+ method. Either the row with the given ID doesn't exist
379
+ # or the row didn't meet the additional restrictions. Some +find+ calls do not raise this exception to signal
380
+ # nothing was found, please check its documentation for further details.
381
+ # * StatementInvalid - The database server rejected the SQL statement. The precise error is added in the message.
382
+ # * MultiparameterAssignmentErrors - Collection of errors that occurred during a mass assignment using the
383
+ # <tt>attributes=</tt> method. The +errors+ property of this exception contains an array of AttributeAssignmentError
384
+ # objects that should be inspected to determine which attributes triggered the errors.
385
+ # * AttributeAssignmentError - An error occurred while doing a mass assignment through the <tt>attributes=</tt> method.
386
+ # You can inspect the +attribute+ property of the exception object to determine which attribute triggered the error.
387
+ #
388
+ # *Note*: The attributes listed are class-level attributes (accessible from both the class and instance level).
389
+ # So it's possible to assign a logger to the class through <tt>Base.logger=</tt> which will then be used by all
390
+ # instances in the current object space.
391
+ class Base
392
+ ##
393
+ # :singleton-method:
394
+ # Accepts a logger conforming to the interface of Log4r or the default Ruby 1.8+ Logger class, which is then passed
395
+ # on to any new database connections made and which can be retrieved on both a class and instance level by calling +logger+.
396
+ cattr_accessor :logger, :instance_writer => false
397
+
398
+ def self.inherited(child) #:nodoc:
399
+ @@subclasses[self] ||= []
400
+ @@subclasses[self] << child
401
+ super
402
+ end
403
+
404
+ def self.reset_subclasses #:nodoc:
405
+ nonreloadables = []
406
+ subclasses.each do |klass|
407
+ unless ActiveSupport::Dependencies.autoloaded? klass
408
+ nonreloadables << klass
409
+ next
410
+ end
411
+ klass.instance_variables.each { |var| klass.send(:remove_instance_variable, var) }
412
+ klass.instance_methods(false).each { |m| klass.send :undef_method, m }
413
+ end
414
+ @@subclasses = {}
415
+ nonreloadables.each { |klass| (@@subclasses[klass.superclass] ||= []) << klass }
416
+ end
417
+
418
+ @@subclasses = {}
419
+
420
+ ##
421
+ # :singleton-method:
422
+ # Contains the database configuration - as is typically stored in config/database.yml -
423
+ # as a Hash.
424
+ #
425
+ # For example, the following database.yml...
426
+ #
427
+ # development:
428
+ # adapter: sqlite3
429
+ # database: db/development.sqlite3
430
+ #
431
+ # production:
432
+ # adapter: sqlite3
433
+ # database: db/production.sqlite3
434
+ #
435
+ # ...would result in ActiveRecord::Base.configurations to look like this:
436
+ #
437
+ # {
438
+ # 'development' => {
439
+ # 'adapter' => 'sqlite3',
440
+ # 'database' => 'db/development.sqlite3'
441
+ # },
442
+ # 'production' => {
443
+ # 'adapter' => 'sqlite3',
444
+ # 'database' => 'db/production.sqlite3'
445
+ # }
446
+ # }
447
+ cattr_accessor :configurations, :instance_writer => false
448
+ @@configurations = {}
449
+
450
+ ##
451
+ # :singleton-method:
452
+ # Accessor for the prefix type that will be prepended to every primary key column name. The options are :table_name and
453
+ # :table_name_with_underscore. If the first is specified, the Product class will look for "productid" instead of "id" as
454
+ # the primary column. If the latter is specified, the Product class will look for "product_id" instead of "id". Remember
455
+ # that this is a global setting for all Active Records.
456
+ cattr_accessor :primary_key_prefix_type, :instance_writer => false
457
+ @@primary_key_prefix_type = nil
458
+
459
+ ##
460
+ # :singleton-method:
461
+ # Accessor for the name of the prefix string to prepend to every table name. So if set to "basecamp_", all
462
+ # table names will be named like "basecamp_projects", "basecamp_people", etc. This is a convenient way of creating a namespace
463
+ # for tables in a shared database. By default, the prefix is the empty string.
464
+ #
465
+ # If you are organising your models within modules you can add a prefix to the models within a namespace by defining
466
+ # a singleton method in the parent module called table_name_prefix which returns your chosen prefix.
467
+ cattr_accessor :table_name_prefix, :instance_writer => false
468
+ @@table_name_prefix = ""
469
+
470
+ ##
471
+ # :singleton-method:
472
+ # Works like +table_name_prefix+, but appends instead of prepends (set to "_basecamp" gives "projects_basecamp",
473
+ # "people_basecamp"). By default, the suffix is the empty string.
474
+ cattr_accessor :table_name_suffix, :instance_writer => false
475
+ @@table_name_suffix = ""
476
+
477
+ ##
478
+ # :singleton-method:
479
+ # Indicates whether table names should be the pluralized versions of the corresponding class names.
480
+ # If true, the default table name for a Product class will be +products+. If false, it would just be +product+.
481
+ # See table_name for the full rules on table/class naming. This is true, by default.
482
+ cattr_accessor :pluralize_table_names, :instance_writer => false
483
+ @@pluralize_table_names = true
484
+
485
+ ##
486
+ # :singleton-method:
487
+ # Determines whether to use ANSI codes to colorize the logging statements committed by the connection adapter. These colors
488
+ # make it much easier to overview things during debugging (when used through a reader like +tail+ and on a black background), but
489
+ # may complicate matters if you use software like syslog. This is true, by default.
490
+ cattr_accessor :colorize_logging, :instance_writer => false
491
+ @@colorize_logging = true
492
+
493
+ ##
494
+ # :singleton-method:
495
+ # Determines whether to use Time.local (using :local) or Time.utc (using :utc) when pulling dates and times from the database.
496
+ # This is set to :local by default.
497
+ cattr_accessor :default_timezone, :instance_writer => false
498
+ @@default_timezone = :local
499
+
500
+ ##
501
+ # :singleton-method:
502
+ # Specifies the format to use when dumping the database schema with Rails'
503
+ # Rakefile. If :sql, the schema is dumped as (potentially database-
504
+ # specific) SQL statements. If :ruby, the schema is dumped as an
505
+ # ActiveRecord::Schema file which can be loaded into any database that
506
+ # supports migrations. Use :ruby if you want to have different database
507
+ # adapters for, e.g., your development and test environments.
508
+ cattr_accessor :schema_format , :instance_writer => false
509
+ @@schema_format = :ruby
510
+
511
+ ##
512
+ # :singleton-method:
513
+ # Specify whether or not to use timestamps for migration numbers
514
+ cattr_accessor :timestamped_migrations , :instance_writer => false
515
+ @@timestamped_migrations = true
516
+
517
+ # Determine whether to store the full constant name including namespace when using STI
518
+ superclass_delegating_accessor :store_full_sti_class
519
+ self.store_full_sti_class = false
520
+
521
+ # Stores the default scope for the class
522
+ class_inheritable_accessor :default_scoping, :instance_writer => false
523
+ self.default_scoping = []
524
+
525
+ class << self # Class methods
526
+ # Find operates with four different retrieval approaches:
527
+ #
528
+ # * Find by id - This can either be a specific id (1), a list of ids (1, 5, 6), or an array of ids ([5, 6, 10]).
529
+ # If no record can be found for all of the listed ids, then RecordNotFound will be raised.
530
+ # * Find first - This will return the first record matched by the options used. These options can either be specific
531
+ # conditions or merely an order. If no record can be matched, +nil+ is returned. Use
532
+ # <tt>Model.find(:first, *args)</tt> or its shortcut <tt>Model.first(*args)</tt>.
533
+ # * Find last - This will return the last record matched by the options used. These options can either be specific
534
+ # conditions or merely an order. If no record can be matched, +nil+ is returned. Use
535
+ # <tt>Model.find(:last, *args)</tt> or its shortcut <tt>Model.last(*args)</tt>.
536
+ # * Find all - This will return all the records matched by the options used.
537
+ # If no records are found, an empty array is returned. Use
538
+ # <tt>Model.find(:all, *args)</tt> or its shortcut <tt>Model.all(*args)</tt>.
539
+ #
540
+ # All approaches accept an options hash as their last parameter.
541
+ #
542
+ # ==== Parameters
543
+ #
544
+ # * <tt>:conditions</tt> - An SQL fragment like "administrator = 1", <tt>[ "user_name = ?", username ]</tt>, or <tt>["user_name = :user_name", { :user_name => user_name }]</tt>. See conditions in the intro.
545
+ # * <tt>:order</tt> - An SQL fragment like "created_at DESC, name".
546
+ # * <tt>:group</tt> - An attribute name by which the result should be grouped. Uses the <tt>GROUP BY</tt> SQL-clause.
547
+ # * <tt>:having</tt> - Combined with +:group+ this can be used to filter the records that a <tt>GROUP BY</tt> returns. Uses the <tt>HAVING</tt> SQL-clause.
548
+ # * <tt>:limit</tt> - An integer determining the limit on the number of rows that should be returned.
549
+ # * <tt>:offset</tt> - An integer determining the offset from where the rows should be fetched. So at 5, it would skip rows 0 through 4.
550
+ # * <tt>:joins</tt> - Either an SQL fragment for additional joins like "LEFT JOIN comments ON comments.post_id = id" (rarely needed),
551
+ # named associations in the same form used for the <tt>:include</tt> option, which will perform an <tt>INNER JOIN</tt> on the associated table(s),
552
+ # or an array containing a mixture of both strings and named associations.
553
+ # If the value is a string, then the records will be returned read-only since they will have attributes that do not correspond to the table's columns.
554
+ # Pass <tt>:readonly => false</tt> to override.
555
+ # * <tt>:include</tt> - Names associations that should be loaded alongside. The symbols named refer
556
+ # to already defined associations. See eager loading under Associations.
557
+ # * <tt>:select</tt> - By default, this is "*" as in "SELECT * FROM", but can be changed if you, for example, want to do a join but not
558
+ # include the joined columns. Takes a string with the SELECT SQL fragment (e.g. "id, name").
559
+ # * <tt>:from</tt> - By default, this is the table name of the class, but can be changed to an alternate table name (or even the name
560
+ # of a database view).
561
+ # * <tt>:readonly</tt> - Mark the returned records read-only so they cannot be saved or updated.
562
+ # * <tt>:lock</tt> - An SQL fragment like "FOR UPDATE" or "LOCK IN SHARE MODE".
563
+ # <tt>:lock => true</tt> gives connection's default exclusive lock, usually "FOR UPDATE".
564
+ #
565
+ # ==== Examples
566
+ #
567
+ # # find by id
568
+ # Person.find(1) # returns the object for ID = 1
569
+ # Person.find(1, 2, 6) # returns an array for objects with IDs in (1, 2, 6)
570
+ # Person.find([7, 17]) # returns an array for objects with IDs in (7, 17)
571
+ # Person.find([1]) # returns an array for the object with ID = 1
572
+ # Person.find(1, :conditions => "administrator = 1", :order => "created_on DESC")
573
+ #
574
+ # Note that returned records may not be in the same order as the ids you
575
+ # provide since database rows are unordered. Give an explicit <tt>:order</tt>
576
+ # to ensure the results are sorted.
577
+ #
578
+ # ==== Examples
579
+ #
580
+ # # find first
581
+ # Person.find(:first) # returns the first object fetched by SELECT * FROM people
582
+ # Person.find(:first, :conditions => [ "user_name = ?", user_name])
583
+ # Person.find(:first, :conditions => [ "user_name = :u", { :u => user_name }])
584
+ # Person.find(:first, :order => "created_on DESC", :offset => 5)
585
+ #
586
+ # # find last
587
+ # Person.find(:last) # returns the last object fetched by SELECT * FROM people
588
+ # Person.find(:last, :conditions => [ "user_name = ?", user_name])
589
+ # Person.find(:last, :order => "created_on DESC", :offset => 5)
590
+ #
591
+ # # find all
592
+ # Person.find(:all) # returns an array of objects for all the rows fetched by SELECT * FROM people
593
+ # Person.find(:all, :conditions => [ "category IN (?)", categories], :limit => 50)
594
+ # Person.find(:all, :conditions => { :friends => ["Bob", "Steve", "Fred"] }
595
+ # Person.find(:all, :offset => 10, :limit => 10)
596
+ # Person.find(:all, :include => [ :account, :friends ])
597
+ # Person.find(:all, :group => "category")
598
+ #
599
+ # Example for find with a lock: Imagine two concurrent transactions:
600
+ # each will read <tt>person.visits == 2</tt>, add 1 to it, and save, resulting
601
+ # in two saves of <tt>person.visits = 3</tt>. By locking the row, the second
602
+ # transaction has to wait until the first is finished; we get the
603
+ # expected <tt>person.visits == 4</tt>.
604
+ #
605
+ # Person.transaction do
606
+ # person = Person.find(1, :lock => true)
607
+ # person.visits += 1
608
+ # person.save!
609
+ # end
610
+ def find(*args)
611
+ options = args.extract_options!
612
+ validate_find_options(options)
613
+ set_readonly_option!(options)
614
+
615
+ case args.first
616
+ when :first then find_initial(options)
617
+ when :last then find_last(options)
618
+ when :all then find_every(options)
619
+ else find_from_ids(args, options)
620
+ end
621
+ end
622
+
623
+ # A convenience wrapper for <tt>find(:first, *args)</tt>. You can pass in all the
624
+ # same arguments to this method as you can to <tt>find(:first)</tt>.
625
+ def first(*args)
626
+ find(:first, *args)
627
+ end
628
+
629
+ # A convenience wrapper for <tt>find(:last, *args)</tt>. You can pass in all the
630
+ # same arguments to this method as you can to <tt>find(:last)</tt>.
631
+ def last(*args)
632
+ find(:last, *args)
633
+ end
634
+
635
+ # This is an alias for find(:all). You can pass in all the same arguments to this method as you can
636
+ # to find(:all)
637
+ def all(*args)
638
+ find(:all, *args)
639
+ end
640
+
641
+ # Executes a custom SQL query against your database and returns all the results. The results will
642
+ # be returned as an array with columns requested encapsulated as attributes of the model you call
643
+ # this method from. If you call <tt>Product.find_by_sql</tt> then the results will be returned in
644
+ # a Product object with the attributes you specified in the SQL query.
645
+ #
646
+ # If you call a complicated SQL query which spans multiple tables the columns specified by the
647
+ # SELECT will be attributes of the model, whether or not they are columns of the corresponding
648
+ # table.
649
+ #
650
+ # The +sql+ parameter is a full SQL query as a string. It will be called as is, there will be
651
+ # no database agnostic conversions performed. This should be a last resort because using, for example,
652
+ # MySQL specific terms will lock you to using that particular database engine or require you to
653
+ # change your call if you switch engines.
654
+ #
655
+ # ==== Examples
656
+ # # A simple SQL query spanning multiple tables
657
+ # Post.find_by_sql "SELECT p.title, c.author FROM posts p, comments c WHERE p.id = c.post_id"
658
+ # > [#<Post:0x36bff9c @attributes={"title"=>"Ruby Meetup", "first_name"=>"Quentin"}>, ...]
659
+ #
660
+ # # You can use the same string replacement techniques as you can with ActiveRecord#find
661
+ # Post.find_by_sql ["SELECT title FROM posts WHERE author = ? AND created > ?", author_id, start_date]
662
+ # > [#<Post:0x36bff9c @attributes={"first_name"=>"The Cheap Man Buys Twice"}>, ...]
663
+ def find_by_sql(sql)
664
+ connection.select_all(sanitize_sql(sql), "#{name} Load").collect! { |record| instantiate(record) }
665
+ end
666
+
667
+ # Returns true if a record exists in the table that matches the +id+ or
668
+ # conditions given, or false otherwise. The argument can take five forms:
669
+ #
670
+ # * Integer - Finds the record with this primary key.
671
+ # * String - Finds the record with a primary key corresponding to this
672
+ # string (such as <tt>'5'</tt>).
673
+ # * Array - Finds the record that matches these +find+-style conditions
674
+ # (such as <tt>['color = ?', 'red']</tt>).
675
+ # * Hash - Finds the record that matches these +find+-style conditions
676
+ # (such as <tt>{:color => 'red'}</tt>).
677
+ # * No args - Returns false if the table is empty, true otherwise.
678
+ #
679
+ # For more information about specifying conditions as a Hash or Array,
680
+ # see the Conditions section in the introduction to ActiveRecord::Base.
681
+ #
682
+ # Note: You can't pass in a condition as a string (like <tt>name =
683
+ # 'Jamie'</tt>), since it would be sanitized and then queried against
684
+ # the primary key column, like <tt>id = 'name = \'Jamie\''</tt>.
685
+ #
686
+ # ==== Examples
687
+ # Person.exists?(5)
688
+ # Person.exists?('5')
689
+ # Person.exists?(:name => "David")
690
+ # Person.exists?(['name LIKE ?', "%#{query}%"])
691
+ # Person.exists?
692
+ def exists?(id_or_conditions = {})
693
+ find_initial(
694
+ :select => "#{quoted_table_name}.#{primary_key}",
695
+ :conditions => expand_id_conditions(id_or_conditions)) ? true : false
696
+ end
697
+
698
+ # Creates an object (or multiple objects) and saves it to the database, if validations pass.
699
+ # The resulting object is returned whether the object was saved successfully to the database or not.
700
+ #
701
+ # The +attributes+ parameter can be either be a Hash or an Array of Hashes. These Hashes describe the
702
+ # attributes on the objects that are to be created.
703
+ #
704
+ # ==== Examples
705
+ # # Create a single new object
706
+ # User.create(:first_name => 'Jamie')
707
+ #
708
+ # # Create an Array of new objects
709
+ # User.create([{ :first_name => 'Jamie' }, { :first_name => 'Jeremy' }])
710
+ #
711
+ # # Create a single object and pass it into a block to set other attributes.
712
+ # User.create(:first_name => 'Jamie') do |u|
713
+ # u.is_admin = false
714
+ # end
715
+ #
716
+ # # Creating an Array of new objects using a block, where the block is executed for each object:
717
+ # User.create([{ :first_name => 'Jamie' }, { :first_name => 'Jeremy' }]) do |u|
718
+ # u.is_admin = false
719
+ # end
720
+ def create(attributes = nil, &block)
721
+ if attributes.is_a?(Array)
722
+ attributes.collect { |attr| create(attr, &block) }
723
+ else
724
+ object = new(attributes)
725
+ yield(object) if block_given?
726
+ object.save
727
+ object
728
+ end
729
+ end
730
+
731
+ # Updates an object (or multiple objects) and saves it to the database, if validations pass.
732
+ # The resulting object is returned whether the object was saved successfully to the database or not.
733
+ #
734
+ # ==== Parameters
735
+ #
736
+ # * +id+ - This should be the id or an array of ids to be updated.
737
+ # * +attributes+ - This should be a hash of attributes to be set on the object, or an array of hashes.
738
+ #
739
+ # ==== Examples
740
+ #
741
+ # # Updating one record:
742
+ # Person.update(15, :user_name => 'Samuel', :group => 'expert')
743
+ #
744
+ # # Updating multiple records:
745
+ # people = { 1 => { "first_name" => "David" }, 2 => { "first_name" => "Jeremy" } }
746
+ # Person.update(people.keys, people.values)
747
+ def update(id, attributes)
748
+ if id.is_a?(Array)
749
+ idx = -1
750
+ id.collect { |one_id| idx += 1; update(one_id, attributes[idx]) }
751
+ else
752
+ object = find(id)
753
+ object.update_attributes(attributes)
754
+ object
755
+ end
756
+ end
757
+
758
+ # Deletes the row with a primary key matching the +id+ argument, using a
759
+ # SQL +DELETE+ statement, and returns the number of rows deleted. Active
760
+ # Record objects are not instantiated, so the object's callbacks are not
761
+ # executed, including any <tt>:dependent</tt> association options or
762
+ # Observer methods.
763
+ #
764
+ # You can delete multiple rows at once by passing an Array of <tt>id</tt>s.
765
+ #
766
+ # Note: Although it is often much faster than the alternative,
767
+ # <tt>#destroy</tt>, skipping callbacks might bypass business logic in
768
+ # your application that ensures referential integrity or performs other
769
+ # essential jobs.
770
+ #
771
+ # ==== Examples
772
+ #
773
+ # # Delete a single row
774
+ # Todo.delete(1)
775
+ #
776
+ # # Delete multiple rows
777
+ # Todo.delete([2,3,4])
778
+ def delete(id)
779
+ delete_all([ "#{connection.quote_column_name(primary_key)} IN (?)", id ])
780
+ end
781
+
782
+ # Destroy an object (or multiple objects) that has the given id, the object is instantiated first,
783
+ # therefore all callbacks and filters are fired off before the object is deleted. This method is
784
+ # less efficient than ActiveRecord#delete but allows cleanup methods and other actions to be run.
785
+ #
786
+ # This essentially finds the object (or multiple objects) with the given id, creates a new object
787
+ # from the attributes, and then calls destroy on it.
788
+ #
789
+ # ==== Parameters
790
+ #
791
+ # * +id+ - Can be either an Integer or an Array of Integers.
792
+ #
793
+ # ==== Examples
794
+ #
795
+ # # Destroy a single object
796
+ # Todo.destroy(1)
797
+ #
798
+ # # Destroy multiple objects
799
+ # todos = [1,2,3]
800
+ # Todo.destroy(todos)
801
+ def destroy(id)
802
+ if id.is_a?(Array)
803
+ id.map { |one_id| destroy(one_id) }
804
+ else
805
+ find(id).destroy
806
+ end
807
+ end
808
+
809
+ # Updates all records with details given if they match a set of conditions supplied, limits and order can
810
+ # also be supplied. This method constructs a single SQL UPDATE statement and sends it straight to the
811
+ # database. It does not instantiate the involved models and it does not trigger Active Record callbacks.
812
+ #
813
+ # ==== Parameters
814
+ #
815
+ # * +updates+ - A string of column and value pairs that will be set on any records that match conditions. This creates the SET clause of the generated SQL.
816
+ # * +conditions+ - An SQL fragment like "administrator = 1" or [ "user_name = ?", username ]. See conditions in the intro for more info.
817
+ # * +options+ - Additional options are <tt>:limit</tt> and <tt>:order</tt>, see the examples for usage.
818
+ #
819
+ # ==== Examples
820
+ #
821
+ # # Update all billing objects with the 3 different attributes given
822
+ # Billing.update_all( "category = 'authorized', approved = 1, author = 'David'" )
823
+ #
824
+ # # Update records that match our conditions
825
+ # Billing.update_all( "author = 'David'", "title LIKE '%Rails%'" )
826
+ #
827
+ # # Update records that match our conditions but limit it to 5 ordered by date
828
+ # Billing.update_all( "author = 'David'", "title LIKE '%Rails%'",
829
+ # :order => 'created_at', :limit => 5 )
830
+ def update_all(updates, conditions = nil, options = {})
831
+ sql = "UPDATE #{quoted_table_name} SET #{sanitize_sql_for_assignment(updates)} "
832
+
833
+ scope = scope(:find)
834
+
835
+ select_sql = ""
836
+ add_conditions!(select_sql, conditions, scope)
837
+
838
+ if options.has_key?(:limit) || (scope && scope[:limit])
839
+ # Only take order from scope if limit is also provided by scope, this
840
+ # is useful for updating a has_many association with a limit.
841
+ add_order!(select_sql, options[:order], scope)
842
+
843
+ add_limit!(select_sql, options, scope)
844
+ sql.concat(connection.limited_update_conditions(select_sql, quoted_table_name, connection.quote_column_name(primary_key)))
845
+ else
846
+ add_order!(select_sql, options[:order], nil)
847
+ sql.concat(select_sql)
848
+ end
849
+
850
+ connection.update(sql, "#{name} Update")
851
+ end
852
+
853
+ # Destroys the records matching +conditions+ by instantiating each
854
+ # record and calling its +destroy+ method. Each object's callbacks are
855
+ # executed (including <tt>:dependent</tt> association options and
856
+ # +before_destroy+/+after_destroy+ Observer methods). Returns the
857
+ # collection of objects that were destroyed; each will be frozen, to
858
+ # reflect that no changes should be made (since they can't be
859
+ # persisted).
860
+ #
861
+ # Note: Instantiation, callback execution, and deletion of each
862
+ # record can be time consuming when you're removing many records at
863
+ # once. It generates at least one SQL +DELETE+ query per record (or
864
+ # possibly more, to enforce your callbacks). If you want to delete many
865
+ # rows quickly, without concern for their associations or callbacks, use
866
+ # +delete_all+ instead.
867
+ #
868
+ # ==== Parameters
869
+ #
870
+ # * +conditions+ - A string, array, or hash that specifies which records
871
+ # to destroy. If omitted, all records are destroyed. See the
872
+ # Conditions section in the introduction to ActiveRecord::Base for
873
+ # more information.
874
+ #
875
+ # ==== Examples
876
+ #
877
+ # Person.destroy_all("last_login < '2004-04-04'")
878
+ # Person.destroy_all(:status => "inactive")
879
+ def destroy_all(conditions = nil)
880
+ find(:all, :conditions => conditions).each { |object| object.destroy }
881
+ end
882
+
883
+ # Deletes the records matching +conditions+ without instantiating the records first, and hence not
884
+ # calling the +destroy+ method nor invoking callbacks. This is a single SQL DELETE statement that
885
+ # goes straight to the database, much more efficient than +destroy_all+. Be careful with relations
886
+ # though, in particular <tt>:dependent</tt> rules defined on associations are not honored. Returns
887
+ # the number of rows affected.
888
+ #
889
+ # ==== Parameters
890
+ #
891
+ # * +conditions+ - Conditions are specified the same way as with +find+ method.
892
+ #
893
+ # ==== Example
894
+ #
895
+ # Post.delete_all("person_id = 5 AND (category = 'Something' OR category = 'Else')")
896
+ # Post.delete_all(["person_id = ? AND (category = ? OR category = ?)", 5, 'Something', 'Else'])
897
+ #
898
+ # Both calls delete the affected posts all at once with a single DELETE statement. If you need to destroy dependent
899
+ # associations or call your <tt>before_*</tt> or +after_destroy+ callbacks, use the +destroy_all+ method instead.
900
+ def delete_all(conditions = nil)
901
+ sql = "DELETE FROM #{quoted_table_name} "
902
+ add_conditions!(sql, conditions, scope(:find))
903
+ connection.delete(sql, "#{name} Delete all")
904
+ end
905
+
906
+ # Returns the result of an SQL statement that should only include a COUNT(*) in the SELECT part.
907
+ # The use of this method should be restricted to complicated SQL queries that can't be executed
908
+ # using the ActiveRecord::Calculations class methods. Look into those before using this.
909
+ #
910
+ # ==== Parameters
911
+ #
912
+ # * +sql+ - An SQL statement which should return a count query from the database, see the example below.
913
+ #
914
+ # ==== Examples
915
+ #
916
+ # Product.count_by_sql "SELECT COUNT(*) FROM sales s, customers c WHERE s.customer_id = c.id"
917
+ def count_by_sql(sql)
918
+ sql = sanitize_conditions(sql)
919
+ connection.select_value(sql, "#{name} Count").to_i
920
+ end
921
+
922
+ # Resets one or more counter caches to their correct value using an SQL
923
+ # count query. This is useful when adding new counter caches, or if the
924
+ # counter has been corrupted or modified directly by SQL.
925
+ #
926
+ # ==== Parameters
927
+ #
928
+ # * +id+ - The id of the object you wish to reset a counter on.
929
+ # * +counters+ - One or more counter names to reset
930
+ #
931
+ # ==== Examples
932
+ #
933
+ # # For Post with id #1 records reset the comments_count
934
+ # Post.reset_counters(1, :comments)
935
+ def reset_counters(id, *counters)
936
+ object = find(id)
937
+ counters.each do |association|
938
+ child_class = reflect_on_association(association).klass
939
+ counter_name = child_class.reflect_on_association(self.name.downcase.to_sym).counter_cache_column
940
+
941
+ connection.update("UPDATE #{quoted_table_name} SET #{connection.quote_column_name(counter_name)} = #{object.send(association).count} WHERE #{connection.quote_column_name(primary_key)} = #{quote_value(object.id)}", "#{name} UPDATE")
942
+ end
943
+ end
944
+
945
+ # A generic "counter updater" implementation, intended primarily to be
946
+ # used by increment_counter and decrement_counter, but which may also
947
+ # be useful on its own. It simply does a direct SQL update for the record
948
+ # with the given ID, altering the given hash of counters by the amount
949
+ # given by the corresponding value:
950
+ #
951
+ # ==== Parameters
952
+ #
953
+ # * +id+ - The id of the object you wish to update a counter on or an Array of ids.
954
+ # * +counters+ - An Array of Hashes containing the names of the fields
955
+ # to update as keys and the amount to update the field by as values.
956
+ #
957
+ # ==== Examples
958
+ #
959
+ # # For the Post with id of 5, decrement the comment_count by 1, and
960
+ # # increment the action_count by 1
961
+ # Post.update_counters 5, :comment_count => -1, :action_count => 1
962
+ # # Executes the following SQL:
963
+ # # UPDATE posts
964
+ # # SET comment_count = comment_count - 1,
965
+ # # action_count = action_count + 1
966
+ # # WHERE id = 5
967
+ #
968
+ # # For the Posts with id of 10 and 15, increment the comment_count by 1
969
+ # Post.update_counters [10, 15], :comment_count => 1
970
+ # # Executes the following SQL:
971
+ # # UPDATE posts
972
+ # # SET comment_count = comment_count + 1,
973
+ # # WHERE id IN (10, 15)
974
+ def update_counters(id, counters)
975
+ updates = counters.inject([]) { |list, (counter_name, increment)|
976
+ sign = increment < 0 ? "-" : "+"
977
+ list << "#{connection.quote_column_name(counter_name)} = COALESCE(#{connection.quote_column_name(counter_name)}, 0) #{sign} #{increment.abs}"
978
+ }.join(", ")
979
+
980
+ if id.is_a?(Array)
981
+ ids_list = id.map {|i| quote_value(i)}.join(', ')
982
+ condition = "IN (#{ids_list})"
983
+ else
984
+ condition = "= #{quote_value(id)}"
985
+ end
986
+
987
+ update_all(updates, "#{connection.quote_column_name(primary_key)} #{condition}")
988
+ end
989
+
990
+ # Increment a number field by one, usually representing a count.
991
+ #
992
+ # This is used for caching aggregate values, so that they don't need to be computed every time.
993
+ # For example, a DiscussionBoard may cache post_count and comment_count otherwise every time the board is
994
+ # shown it would have to run an SQL query to find how many posts and comments there are.
995
+ #
996
+ # ==== Parameters
997
+ #
998
+ # * +counter_name+ - The name of the field that should be incremented.
999
+ # * +id+ - The id of the object that should be incremented.
1000
+ #
1001
+ # ==== Examples
1002
+ #
1003
+ # # Increment the post_count column for the record with an id of 5
1004
+ # DiscussionBoard.increment_counter(:post_count, 5)
1005
+ def increment_counter(counter_name, id)
1006
+ update_counters(id, counter_name => 1)
1007
+ end
1008
+
1009
+ # Decrement a number field by one, usually representing a count.
1010
+ #
1011
+ # This works the same as increment_counter but reduces the column value by 1 instead of increasing it.
1012
+ #
1013
+ # ==== Parameters
1014
+ #
1015
+ # * +counter_name+ - The name of the field that should be decremented.
1016
+ # * +id+ - The id of the object that should be decremented.
1017
+ #
1018
+ # ==== Examples
1019
+ #
1020
+ # # Decrement the post_count column for the record with an id of 5
1021
+ # DiscussionBoard.decrement_counter(:post_count, 5)
1022
+ def decrement_counter(counter_name, id)
1023
+ update_counters(id, counter_name => -1)
1024
+ end
1025
+
1026
+ # Attributes named in this macro are protected from mass-assignment,
1027
+ # such as <tt>new(attributes)</tt>,
1028
+ # <tt>update_attributes(attributes)</tt>, or
1029
+ # <tt>attributes=(attributes)</tt>.
1030
+ #
1031
+ # Mass-assignment to these attributes will simply be ignored, to assign
1032
+ # to them you can use direct writer methods. This is meant to protect
1033
+ # sensitive attributes from being overwritten by malicious users
1034
+ # tampering with URLs or forms.
1035
+ #
1036
+ # class Customer < ActiveRecord::Base
1037
+ # attr_protected :credit_rating
1038
+ # end
1039
+ #
1040
+ # customer = Customer.new("name" => David, "credit_rating" => "Excellent")
1041
+ # customer.credit_rating # => nil
1042
+ # customer.attributes = { "description" => "Jolly fellow", "credit_rating" => "Superb" }
1043
+ # customer.credit_rating # => nil
1044
+ #
1045
+ # customer.credit_rating = "Average"
1046
+ # customer.credit_rating # => "Average"
1047
+ #
1048
+ # To start from an all-closed default and enable attributes as needed,
1049
+ # have a look at +attr_accessible+.
1050
+ def attr_protected(*attributes)
1051
+ write_inheritable_attribute(:attr_protected, Set.new(attributes.map(&:to_s)) + (protected_attributes || []))
1052
+ end
1053
+
1054
+ # Returns an array of all the attributes that have been protected from mass-assignment.
1055
+ def protected_attributes # :nodoc:
1056
+ read_inheritable_attribute(:attr_protected)
1057
+ end
1058
+
1059
+ # Specifies a white list of model attributes that can be set via
1060
+ # mass-assignment, such as <tt>new(attributes)</tt>,
1061
+ # <tt>update_attributes(attributes)</tt>, or
1062
+ # <tt>attributes=(attributes)</tt>
1063
+ #
1064
+ # This is the opposite of the +attr_protected+ macro: Mass-assignment
1065
+ # will only set attributes in this list, to assign to the rest of
1066
+ # attributes you can use direct writer methods. This is meant to protect
1067
+ # sensitive attributes from being overwritten by malicious users
1068
+ # tampering with URLs or forms. If you'd rather start from an all-open
1069
+ # default and restrict attributes as needed, have a look at
1070
+ # +attr_protected+.
1071
+ #
1072
+ # class Customer < ActiveRecord::Base
1073
+ # attr_accessible :name, :nickname
1074
+ # end
1075
+ #
1076
+ # customer = Customer.new(:name => "David", :nickname => "Dave", :credit_rating => "Excellent")
1077
+ # customer.credit_rating # => nil
1078
+ # customer.attributes = { :name => "Jolly fellow", :credit_rating => "Superb" }
1079
+ # customer.credit_rating # => nil
1080
+ #
1081
+ # customer.credit_rating = "Average"
1082
+ # customer.credit_rating # => "Average"
1083
+ def attr_accessible(*attributes)
1084
+ write_inheritable_attribute(:attr_accessible, Set.new(attributes.map(&:to_s)) + (accessible_attributes || []))
1085
+ end
1086
+
1087
+ # Returns an array of all the attributes that have been made accessible to mass-assignment.
1088
+ def accessible_attributes # :nodoc:
1089
+ read_inheritable_attribute(:attr_accessible)
1090
+ end
1091
+
1092
+ # Attributes listed as readonly can be set for a new record, but will be ignored in database updates afterwards.
1093
+ def attr_readonly(*attributes)
1094
+ write_inheritable_attribute(:attr_readonly, Set.new(attributes.map(&:to_s)) + (readonly_attributes || []))
1095
+ end
1096
+
1097
+ # Returns an array of all the attributes that have been specified as readonly.
1098
+ def readonly_attributes
1099
+ read_inheritable_attribute(:attr_readonly)
1100
+ end
1101
+
1102
+ # If you have an attribute that needs to be saved to the database as an object, and retrieved as the same object,
1103
+ # then specify the name of that attribute using this method and it will be handled automatically.
1104
+ # The serialization is done through YAML. If +class_name+ is specified, the serialized object must be of that
1105
+ # class on retrieval or SerializationTypeMismatch will be raised.
1106
+ #
1107
+ # ==== Parameters
1108
+ #
1109
+ # * +attr_name+ - The field name that should be serialized.
1110
+ # * +class_name+ - Optional, class name that the object type should be equal to.
1111
+ #
1112
+ # ==== Example
1113
+ # # Serialize a preferences attribute
1114
+ # class User
1115
+ # serialize :preferences
1116
+ # end
1117
+ def serialize(attr_name, class_name = Object)
1118
+ serialized_attributes[attr_name.to_s] = class_name
1119
+ end
1120
+
1121
+ # Returns a hash of all the attributes that have been specified for serialization as keys and their class restriction as values.
1122
+ def serialized_attributes
1123
+ read_inheritable_attribute(:attr_serialized) or write_inheritable_attribute(:attr_serialized, {})
1124
+ end
1125
+
1126
+ # Guesses the table name (in forced lower-case) based on the name of the class in the inheritance hierarchy descending
1127
+ # directly from ActiveRecord::Base. So if the hierarchy looks like: Reply < Message < ActiveRecord::Base, then Message is used
1128
+ # to guess the table name even when called on Reply. The rules used to do the guess are handled by the Inflector class
1129
+ # in Active Support, which knows almost all common English inflections. You can add new inflections in config/initializers/inflections.rb.
1130
+ #
1131
+ # Nested classes are given table names prefixed by the singular form of
1132
+ # the parent's table name. Enclosing modules are not considered.
1133
+ #
1134
+ # ==== Examples
1135
+ #
1136
+ # class Invoice < ActiveRecord::Base; end;
1137
+ # file class table_name
1138
+ # invoice.rb Invoice invoices
1139
+ #
1140
+ # class Invoice < ActiveRecord::Base; class Lineitem < ActiveRecord::Base; end; end;
1141
+ # file class table_name
1142
+ # invoice.rb Invoice::Lineitem invoice_lineitems
1143
+ #
1144
+ # module Invoice; class Lineitem < ActiveRecord::Base; end; end;
1145
+ # file class table_name
1146
+ # invoice/lineitem.rb Invoice::Lineitem lineitems
1147
+ #
1148
+ # Additionally, the class-level +table_name_prefix+ is prepended and the
1149
+ # +table_name_suffix+ is appended. So if you have "myapp_" as a prefix,
1150
+ # the table name guess for an Invoice class becomes "myapp_invoices".
1151
+ # Invoice::Lineitem becomes "myapp_invoice_lineitems".
1152
+ #
1153
+ # You can also overwrite this class method to allow for unguessable
1154
+ # links, such as a Mouse class with a link to a "mice" table. Example:
1155
+ #
1156
+ # class Mouse < ActiveRecord::Base
1157
+ # set_table_name "mice"
1158
+ # end
1159
+ def table_name
1160
+ reset_table_name
1161
+ end
1162
+
1163
+ def reset_table_name #:nodoc:
1164
+ base = base_class
1165
+
1166
+ name =
1167
+ # STI subclasses always use their superclass' table.
1168
+ unless self == base
1169
+ base.table_name
1170
+ else
1171
+ # Nested classes are prefixed with singular parent table name.
1172
+ if parent < ActiveRecord::Base && !parent.abstract_class?
1173
+ contained = parent.table_name
1174
+ contained = contained.singularize if parent.pluralize_table_names
1175
+ contained << '_'
1176
+ end
1177
+ name = "#{full_table_name_prefix}#{contained}#{undecorated_table_name(base.name)}#{table_name_suffix}"
1178
+ end
1179
+
1180
+ set_table_name(name)
1181
+ name
1182
+ end
1183
+
1184
+ # Defines the primary key field -- can be overridden in subclasses. Overwriting will negate any effect of the
1185
+ # primary_key_prefix_type setting, though.
1186
+ def primary_key
1187
+ reset_primary_key
1188
+ end
1189
+
1190
+ def reset_primary_key #:nodoc:
1191
+ key = get_primary_key(base_class.name)
1192
+ set_primary_key(key)
1193
+ key
1194
+ end
1195
+
1196
+ def get_primary_key(base_name) #:nodoc:
1197
+ key = 'id'
1198
+ case primary_key_prefix_type
1199
+ when :table_name
1200
+ key = base_name.to_s.foreign_key(false)
1201
+ when :table_name_with_underscore
1202
+ key = base_name.to_s.foreign_key
1203
+ end
1204
+ key
1205
+ end
1206
+
1207
+ def full_table_name_prefix #:nodoc:
1208
+ (parents.detect{ |p| p.respond_to?(:table_name_prefix) } || self).table_name_prefix
1209
+ end
1210
+
1211
+ # Defines the column name for use with single table inheritance
1212
+ # -- can be set in subclasses like so: self.inheritance_column = "type_id"
1213
+ def inheritance_column
1214
+ @inheritance_column ||= "type".freeze
1215
+ end
1216
+
1217
+ # Lazy-set the sequence name to the connection's default. This method
1218
+ # is only ever called once since set_sequence_name overrides it.
1219
+ def sequence_name #:nodoc:
1220
+ reset_sequence_name
1221
+ end
1222
+
1223
+ def reset_sequence_name #:nodoc:
1224
+ default = connection.default_sequence_name(table_name, primary_key)
1225
+ set_sequence_name(default)
1226
+ default
1227
+ end
1228
+
1229
+ # Sets the table name to use to the given value, or (if the value
1230
+ # is nil or false) to the value returned by the given block.
1231
+ #
1232
+ # class Project < ActiveRecord::Base
1233
+ # set_table_name "project"
1234
+ # end
1235
+ def set_table_name(value = nil, &block)
1236
+ define_attr_method :table_name, value, &block
1237
+ end
1238
+ alias :table_name= :set_table_name
1239
+
1240
+ # Sets the name of the primary key column to use to the given value,
1241
+ # or (if the value is nil or false) to the value returned by the given
1242
+ # block.
1243
+ #
1244
+ # class Project < ActiveRecord::Base
1245
+ # set_primary_key "sysid"
1246
+ # end
1247
+ def set_primary_key(value = nil, &block)
1248
+ define_attr_method :primary_key, value, &block
1249
+ end
1250
+ alias :primary_key= :set_primary_key
1251
+
1252
+ # Sets the name of the inheritance column to use to the given value,
1253
+ # or (if the value # is nil or false) to the value returned by the
1254
+ # given block.
1255
+ #
1256
+ # class Project < ActiveRecord::Base
1257
+ # set_inheritance_column do
1258
+ # original_inheritance_column + "_id"
1259
+ # end
1260
+ # end
1261
+ def set_inheritance_column(value = nil, &block)
1262
+ define_attr_method :inheritance_column, value, &block
1263
+ end
1264
+ alias :inheritance_column= :set_inheritance_column
1265
+
1266
+ # Sets the name of the sequence to use when generating ids to the given
1267
+ # value, or (if the value is nil or false) to the value returned by the
1268
+ # given block. This is required for Oracle and is useful for any
1269
+ # database which relies on sequences for primary key generation.
1270
+ #
1271
+ # If a sequence name is not explicitly set when using Oracle or Firebird,
1272
+ # it will default to the commonly used pattern of: #{table_name}_seq
1273
+ #
1274
+ # If a sequence name is not explicitly set when using PostgreSQL, it
1275
+ # will discover the sequence corresponding to your primary key for you.
1276
+ #
1277
+ # class Project < ActiveRecord::Base
1278
+ # set_sequence_name "projectseq" # default would have been "project_seq"
1279
+ # end
1280
+ def set_sequence_name(value = nil, &block)
1281
+ define_attr_method :sequence_name, value, &block
1282
+ end
1283
+ alias :sequence_name= :set_sequence_name
1284
+
1285
+ # Turns the +table_name+ back into a class name following the reverse rules of +table_name+.
1286
+ def class_name(table_name = table_name) # :nodoc:
1287
+ # remove any prefix and/or suffix from the table name
1288
+ class_name = table_name[table_name_prefix.length..-(table_name_suffix.length + 1)].camelize
1289
+ class_name = class_name.singularize if pluralize_table_names
1290
+ class_name
1291
+ end
1292
+
1293
+ # Indicates whether the table associated with this class exists
1294
+ def table_exists?
1295
+ connection.table_exists?(table_name)
1296
+ end
1297
+
1298
+ # Returns an array of column objects for the table associated with this class.
1299
+ def columns
1300
+ unless defined?(@columns) && @columns
1301
+ @columns = connection.columns(table_name, "#{name} Columns")
1302
+ @columns.each { |column| column.primary = column.name == primary_key }
1303
+ end
1304
+ @columns
1305
+ end
1306
+
1307
+ # Returns a hash of column objects for the table associated with this class.
1308
+ def columns_hash
1309
+ @columns_hash ||= columns.inject({}) { |hash, column| hash[column.name] = column; hash }
1310
+ end
1311
+
1312
+ # Returns an array of column names as strings.
1313
+ def column_names
1314
+ @column_names ||= columns.map { |column| column.name }
1315
+ end
1316
+
1317
+ # Returns an array of column objects where the primary id, all columns ending in "_id" or "_count",
1318
+ # and columns used for single table inheritance have been removed.
1319
+ def content_columns
1320
+ @content_columns ||= columns.reject { |c| c.primary || c.name =~ /(_id|_count)$/ || c.name == inheritance_column }
1321
+ end
1322
+
1323
+ # Returns a hash of all the methods added to query each of the columns in the table with the name of the method as the key
1324
+ # and true as the value. This makes it possible to do O(1) lookups in respond_to? to check if a given method for attribute
1325
+ # is available.
1326
+ def column_methods_hash #:nodoc:
1327
+ @dynamic_methods_hash ||= column_names.inject(Hash.new(false)) do |methods, attr|
1328
+ attr_name = attr.to_s
1329
+ methods[attr.to_sym] = attr_name
1330
+ methods["#{attr}=".to_sym] = attr_name
1331
+ methods["#{attr}?".to_sym] = attr_name
1332
+ methods["#{attr}_before_type_cast".to_sym] = attr_name
1333
+ methods
1334
+ end
1335
+ end
1336
+
1337
+ # Resets all the cached information about columns, which will cause them
1338
+ # to be reloaded on the next request.
1339
+ #
1340
+ # The most common usage pattern for this method is probably in a migration,
1341
+ # when just after creating a table you want to populate it with some default
1342
+ # values, eg:
1343
+ #
1344
+ # class CreateJobLevels < ActiveRecord::Migration
1345
+ # def self.up
1346
+ # create_table :job_levels do |t|
1347
+ # t.integer :id
1348
+ # t.string :name
1349
+ #
1350
+ # t.timestamps
1351
+ # end
1352
+ #
1353
+ # JobLevel.reset_column_information
1354
+ # %w{assistant executive manager director}.each do |type|
1355
+ # JobLevel.create(:name => type)
1356
+ # end
1357
+ # end
1358
+ #
1359
+ # def self.down
1360
+ # drop_table :job_levels
1361
+ # end
1362
+ # end
1363
+ def reset_column_information
1364
+ generated_methods.each { |name| undef_method(name) }
1365
+ @column_names = @columns = @columns_hash = @content_columns = @dynamic_methods_hash = @generated_methods = @inheritance_column = nil
1366
+ end
1367
+
1368
+ def reset_column_information_and_inheritable_attributes_for_all_subclasses#:nodoc:
1369
+ subclasses.each { |klass| klass.reset_inheritable_attributes; klass.reset_column_information }
1370
+ end
1371
+
1372
+ def self_and_descendants_from_active_record#nodoc:
1373
+ klass = self
1374
+ classes = [klass]
1375
+ while klass != klass.base_class
1376
+ classes << klass = klass.superclass
1377
+ end
1378
+ classes
1379
+ rescue
1380
+ # OPTIMIZE this rescue is to fix this test: ./test/cases/reflection_test.rb:56:in `test_human_name_for_column'
1381
+ # Appearantly the method base_class causes some trouble.
1382
+ # It now works for sure.
1383
+ [self]
1384
+ end
1385
+
1386
+ # Transforms attribute key names into a more humane format, such as "First name" instead of "first_name". Example:
1387
+ # Person.human_attribute_name("first_name") # => "First name"
1388
+ # This used to be depricated in favor of humanize, but is now preferred, because it automatically uses the I18n
1389
+ # module now.
1390
+ # Specify +options+ with additional translating options.
1391
+ def human_attribute_name(attribute_key_name, options = {})
1392
+ defaults = self_and_descendants_from_active_record.map do |klass|
1393
+ :"#{klass.name.underscore}.#{attribute_key_name}"
1394
+ end
1395
+ defaults << options[:default] if options[:default]
1396
+ defaults.flatten!
1397
+ defaults << attribute_key_name.to_s.humanize
1398
+ options[:count] ||= 1
1399
+ I18n.translate(defaults.shift, options.merge(:default => defaults, :scope => [:activerecord, :attributes]))
1400
+ end
1401
+
1402
+ # Transform the modelname into a more humane format, using I18n.
1403
+ # Defaults to the basic humanize method.
1404
+ # Default scope of the translation is activerecord.models
1405
+ # Specify +options+ with additional translating options.
1406
+ def human_name(options = {})
1407
+ defaults = self_and_descendants_from_active_record.map do |klass|
1408
+ :"#{klass.name.underscore}"
1409
+ end
1410
+ defaults << self.name.humanize
1411
+ I18n.translate(defaults.shift, {:scope => [:activerecord, :models], :count => 1, :default => defaults}.merge(options))
1412
+ end
1413
+
1414
+ # True if this isn't a concrete subclass needing a STI type condition.
1415
+ def descends_from_active_record?
1416
+ if superclass.abstract_class?
1417
+ superclass.descends_from_active_record?
1418
+ else
1419
+ superclass == Base || !columns_hash.include?(inheritance_column)
1420
+ end
1421
+ end
1422
+
1423
+ def finder_needs_type_condition? #:nodoc:
1424
+ # This is like this because benchmarking justifies the strange :false stuff
1425
+ :true == (@finder_needs_type_condition ||= descends_from_active_record? ? :false : :true)
1426
+ end
1427
+
1428
+ # Returns a string like 'Post id:integer, title:string, body:text'
1429
+ def inspect
1430
+ if self == Base
1431
+ super
1432
+ elsif abstract_class?
1433
+ "#{super}(abstract)"
1434
+ elsif table_exists?
1435
+ attr_list = columns.map { |c| "#{c.name}: #{c.type}" } * ', '
1436
+ "#{super}(#{attr_list})"
1437
+ else
1438
+ "#{super}(Table doesn't exist)"
1439
+ end
1440
+ end
1441
+
1442
+ def quote_value(value, column = nil) #:nodoc:
1443
+ connection.quote(value,column)
1444
+ end
1445
+
1446
+ # Used to sanitize objects before they're used in an SQL SELECT statement. Delegates to <tt>connection.quote</tt>.
1447
+ def sanitize(object) #:nodoc:
1448
+ connection.quote(object)
1449
+ end
1450
+
1451
+ # Log and benchmark multiple statements in a single block. Example:
1452
+ #
1453
+ # Project.benchmark("Creating project") do
1454
+ # project = Project.create("name" => "stuff")
1455
+ # project.create_manager("name" => "David")
1456
+ # project.milestones << Milestone.find(:all)
1457
+ # end
1458
+ #
1459
+ # The benchmark is only recorded if the current level of the logger is less than or equal to the <tt>log_level</tt>,
1460
+ # which makes it easy to include benchmarking statements in production software that will remain inexpensive because
1461
+ # the benchmark will only be conducted if the log level is low enough.
1462
+ #
1463
+ # The logging of the multiple statements is turned off unless <tt>use_silence</tt> is set to false.
1464
+ def benchmark(title, log_level = Logger::DEBUG, use_silence = true)
1465
+ if logger && logger.level <= log_level
1466
+ result = nil
1467
+ ms = Benchmark.ms { result = use_silence ? silence { yield } : yield }
1468
+ logger.add(log_level, '%s (%.1fms)' % [title, ms])
1469
+ result
1470
+ else
1471
+ yield
1472
+ end
1473
+ end
1474
+
1475
+ # Silences the logger for the duration of the block.
1476
+ def silence
1477
+ old_logger_level, logger.level = logger.level, Logger::ERROR if logger
1478
+ yield
1479
+ ensure
1480
+ logger.level = old_logger_level if logger
1481
+ end
1482
+
1483
+ # Overwrite the default class equality method to provide support for association proxies.
1484
+ def ===(object)
1485
+ object.is_a?(self)
1486
+ end
1487
+
1488
+ # Returns the base AR subclass that this class descends from. If A
1489
+ # extends AR::Base, A.base_class will return A. If B descends from A
1490
+ # through some arbitrarily deep hierarchy, B.base_class will return A.
1491
+ def base_class
1492
+ class_of_active_record_descendant(self)
1493
+ end
1494
+
1495
+ # Set this to true if this is an abstract class (see <tt>abstract_class?</tt>).
1496
+ attr_accessor :abstract_class
1497
+
1498
+ # Returns whether this class is a base AR class. If A is a base class and
1499
+ # B descends from A, then B.base_class will return B.
1500
+ def abstract_class?
1501
+ defined?(@abstract_class) && @abstract_class == true
1502
+ end
1503
+
1504
+ def respond_to?(method_id, include_private = false)
1505
+ if match = DynamicFinderMatch.match(method_id)
1506
+ return true if all_attributes_exists?(match.attribute_names)
1507
+ elsif match = DynamicScopeMatch.match(method_id)
1508
+ return true if all_attributes_exists?(match.attribute_names)
1509
+ end
1510
+
1511
+ super
1512
+ end
1513
+
1514
+ def sti_name
1515
+ store_full_sti_class ? name : name.demodulize
1516
+ end
1517
+
1518
+ # Merges conditions so that the result is a valid +condition+
1519
+ def merge_conditions(*conditions)
1520
+ segments = []
1521
+
1522
+ conditions.each do |condition|
1523
+ unless condition.blank?
1524
+ sql = sanitize_sql(condition)
1525
+ segments << sql unless sql.blank?
1526
+ end
1527
+ end
1528
+
1529
+ "(#{segments.join(') AND (')})" unless segments.empty?
1530
+ end
1531
+
1532
+ private
1533
+ def find_initial(options)
1534
+ options.update(:limit => 1)
1535
+ find_every(options).first
1536
+ end
1537
+
1538
+ def find_last(options)
1539
+ order = options[:order]
1540
+
1541
+ if order
1542
+ order = reverse_sql_order(order)
1543
+ elsif !scoped?(:find, :order)
1544
+ order = "#{table_name}.#{primary_key} DESC"
1545
+ end
1546
+
1547
+ if scoped?(:find, :order)
1548
+ scope = scope(:find)
1549
+ original_scoped_order = scope[:order]
1550
+ scope[:order] = reverse_sql_order(original_scoped_order)
1551
+ end
1552
+
1553
+ begin
1554
+ find_initial(options.merge({ :order => order }))
1555
+ ensure
1556
+ scope[:order] = original_scoped_order if original_scoped_order
1557
+ end
1558
+ end
1559
+
1560
+ def reverse_sql_order(order_query)
1561
+ reversed_query = order_query.to_s.split(/,/).each { |s|
1562
+ if s.match(/\s(asc|ASC)$/)
1563
+ s.gsub!(/\s(asc|ASC)$/, ' DESC')
1564
+ elsif s.match(/\s(desc|DESC)$/)
1565
+ s.gsub!(/\s(desc|DESC)$/, ' ASC')
1566
+ elsif !s.match(/\s(asc|ASC|desc|DESC)$/)
1567
+ s.concat(' DESC')
1568
+ end
1569
+ }.join(',')
1570
+ end
1571
+
1572
+ def find_every(options)
1573
+ include_associations = merge_includes(scope(:find, :include), options[:include])
1574
+
1575
+ if include_associations.any? && references_eager_loaded_tables?(options)
1576
+ records = find_with_associations(options)
1577
+ else
1578
+ records = find_by_sql(construct_finder_sql(options))
1579
+ if include_associations.any?
1580
+ preload_associations(records, include_associations)
1581
+ end
1582
+ end
1583
+
1584
+ records.each { |record| record.readonly! } if options[:readonly]
1585
+
1586
+ records
1587
+ end
1588
+
1589
+ def find_from_ids(ids, options)
1590
+ expects_array = ids.first.kind_of?(Array)
1591
+ return ids.first if expects_array && ids.first.empty?
1592
+
1593
+ ids = ids.flatten.compact.uniq
1594
+
1595
+ case ids.size
1596
+ when 0
1597
+ raise RecordNotFound, "Couldn't find #{name} without an ID"
1598
+ when 1
1599
+ result = find_one(ids.first, options)
1600
+ expects_array ? [ result ] : result
1601
+ else
1602
+ find_some(ids, options)
1603
+ end
1604
+ end
1605
+
1606
+ def find_one(id, options)
1607
+ conditions = " AND (#{sanitize_sql(options[:conditions])})" if options[:conditions]
1608
+ options.update :conditions => "#{quoted_table_name}.#{connection.quote_column_name(primary_key)} = #{quote_value(id,columns_hash[primary_key])}#{conditions}"
1609
+
1610
+ # Use find_every(options).first since the primary key condition
1611
+ # already ensures we have a single record. Using find_initial adds
1612
+ # a superfluous :limit => 1.
1613
+ if result = find_every(options).first
1614
+ result
1615
+ else
1616
+ raise RecordNotFound, "Couldn't find #{name} with ID=#{id}#{conditions}"
1617
+ end
1618
+ end
1619
+
1620
+ def find_some(ids, options)
1621
+ conditions = " AND (#{sanitize_sql(options[:conditions])})" if options[:conditions]
1622
+ ids_list = ids.map { |id| quote_value(id,columns_hash[primary_key]) }.join(',')
1623
+ options.update :conditions => "#{quoted_table_name}.#{connection.quote_column_name(primary_key)} IN (#{ids_list})#{conditions}"
1624
+
1625
+ result = find_every(options)
1626
+
1627
+ # Determine expected size from limit and offset, not just ids.size.
1628
+ expected_size =
1629
+ if options[:limit] && ids.size > options[:limit]
1630
+ options[:limit]
1631
+ else
1632
+ ids.size
1633
+ end
1634
+
1635
+ # 11 ids with limit 3, offset 9 should give 2 results.
1636
+ if options[:offset] && (ids.size - options[:offset] < expected_size)
1637
+ expected_size = ids.size - options[:offset]
1638
+ end
1639
+
1640
+ if result.size == expected_size
1641
+ result
1642
+ else
1643
+ raise RecordNotFound, "Couldn't find all #{name.pluralize} with IDs (#{ids_list})#{conditions} (found #{result.size} results, but was looking for #{expected_size})"
1644
+ end
1645
+ end
1646
+
1647
+ # Finder methods must instantiate through this method to work with the
1648
+ # single-table inheritance model that makes it possible to create
1649
+ # objects of different types from the same table.
1650
+ def instantiate(record)
1651
+ object =
1652
+ if subclass_name = record[inheritance_column]
1653
+ # No type given.
1654
+ if subclass_name.empty?
1655
+ allocate
1656
+
1657
+ else
1658
+ # Ignore type if no column is present since it was probably
1659
+ # pulled in from a sloppy join.
1660
+ unless columns_hash.include?(inheritance_column)
1661
+ allocate
1662
+
1663
+ else
1664
+ begin
1665
+ compute_type(subclass_name).allocate
1666
+ rescue NameError
1667
+ raise SubclassNotFound,
1668
+ "The single-table inheritance mechanism failed to locate the subclass: '#{record[inheritance_column]}'. " +
1669
+ "This error is raised because the column '#{inheritance_column}' is reserved for storing the class in case of inheritance. " +
1670
+ "Please rename this column if you didn't intend it to be used for storing the inheritance class " +
1671
+ "or overwrite #{self.to_s}.inheritance_column to use another column for that information."
1672
+ end
1673
+ end
1674
+ end
1675
+ else
1676
+ allocate
1677
+ end
1678
+
1679
+ object.instance_variable_set("@attributes", record)
1680
+ object.instance_variable_set("@attributes_cache", Hash.new)
1681
+
1682
+ if object.respond_to_without_attributes?(:after_find)
1683
+ object.send(:callback, :after_find)
1684
+ end
1685
+
1686
+ if object.respond_to_without_attributes?(:after_initialize)
1687
+ object.send(:callback, :after_initialize)
1688
+ end
1689
+
1690
+ object
1691
+ end
1692
+
1693
+ # Nest the type name in the same module as this class.
1694
+ # Bar is "MyApp::Business::Bar" relative to MyApp::Business::Foo
1695
+ def type_name_with_module(type_name)
1696
+ if store_full_sti_class
1697
+ type_name
1698
+ else
1699
+ (/^::/ =~ type_name) ? type_name : "#{parent.name}::#{type_name}"
1700
+ end
1701
+ end
1702
+
1703
+ def default_select(qualified)
1704
+ if qualified
1705
+ quoted_table_name + '.*'
1706
+ else
1707
+ '*'
1708
+ end
1709
+ end
1710
+
1711
+ def construct_finder_sql(options)
1712
+ scope = scope(:find)
1713
+ sql = "SELECT #{options[:select] || (scope && scope[:select]) || default_select(options[:joins] || (scope && scope[:joins]))} "
1714
+ sql << "FROM #{options[:from] || (scope && scope[:from]) || quoted_table_name} "
1715
+
1716
+ add_joins!(sql, options[:joins], scope)
1717
+ add_conditions!(sql, options[:conditions], scope)
1718
+
1719
+ add_group!(sql, options[:group], options[:having], scope)
1720
+ add_order!(sql, options[:order], scope)
1721
+ add_limit!(sql, options, scope)
1722
+ add_lock!(sql, options, scope)
1723
+
1724
+ sql
1725
+ end
1726
+
1727
+ # Merges includes so that the result is a valid +include+
1728
+ def merge_includes(first, second)
1729
+ (safe_to_array(first) + safe_to_array(second)).uniq
1730
+ end
1731
+
1732
+ def merge_joins(*joins)
1733
+ if joins.any?{|j| j.is_a?(String) || array_of_strings?(j) }
1734
+ joins = joins.collect do |join|
1735
+ join = [join] if join.is_a?(String)
1736
+ unless array_of_strings?(join)
1737
+ join_dependency = ActiveRecord::Associations::ClassMethods::InnerJoinDependency.new(self, join, nil)
1738
+ join = join_dependency.join_associations.collect { |assoc| assoc.association_join }
1739
+ end
1740
+ join
1741
+ end
1742
+ joins.flatten.map{|j| j.strip}.uniq
1743
+ else
1744
+ joins.collect{|j| safe_to_array(j)}.flatten.uniq
1745
+ end
1746
+ end
1747
+
1748
+ # Object#to_a is deprecated, though it does have the desired behavior
1749
+ def safe_to_array(o)
1750
+ case o
1751
+ when NilClass
1752
+ []
1753
+ when Array
1754
+ o
1755
+ else
1756
+ [o]
1757
+ end
1758
+ end
1759
+
1760
+ def array_of_strings?(o)
1761
+ o.is_a?(Array) && o.all?{|obj| obj.is_a?(String)}
1762
+ end
1763
+
1764
+ def add_order!(sql, order, scope = :auto)
1765
+ scope = scope(:find) if :auto == scope
1766
+ scoped_order = scope[:order] if scope
1767
+ if order
1768
+ sql << " ORDER BY #{order}"
1769
+ if scoped_order && scoped_order != order
1770
+ sql << ", #{scoped_order}"
1771
+ end
1772
+ else
1773
+ sql << " ORDER BY #{scoped_order}" if scoped_order
1774
+ end
1775
+ end
1776
+
1777
+ def add_group!(sql, group, having, scope = :auto)
1778
+ if group
1779
+ sql << " GROUP BY #{group}"
1780
+ sql << " HAVING #{sanitize_sql_for_conditions(having)}" if having
1781
+ else
1782
+ scope = scope(:find) if :auto == scope
1783
+ if scope && (scoped_group = scope[:group])
1784
+ sql << " GROUP BY #{scoped_group}"
1785
+ sql << " HAVING #{sanitize_sql_for_conditions(scope[:having])}" if scope[:having]
1786
+ end
1787
+ end
1788
+ end
1789
+
1790
+ # The optional scope argument is for the current <tt>:find</tt> scope.
1791
+ def add_limit!(sql, options, scope = :auto)
1792
+ scope = scope(:find) if :auto == scope
1793
+
1794
+ if scope
1795
+ options[:limit] ||= scope[:limit]
1796
+ options[:offset] ||= scope[:offset]
1797
+ end
1798
+
1799
+ connection.add_limit_offset!(sql, options)
1800
+ end
1801
+
1802
+ # The optional scope argument is for the current <tt>:find</tt> scope.
1803
+ # The <tt>:lock</tt> option has precedence over a scoped <tt>:lock</tt>.
1804
+ def add_lock!(sql, options, scope = :auto)
1805
+ scope = scope(:find) if :auto == scope
1806
+ options = options.reverse_merge(:lock => scope[:lock]) if scope
1807
+ connection.add_lock!(sql, options)
1808
+ end
1809
+
1810
+ # The optional scope argument is for the current <tt>:find</tt> scope.
1811
+ def add_joins!(sql, joins, scope = :auto)
1812
+ scope = scope(:find) if :auto == scope
1813
+ merged_joins = scope && scope[:joins] && joins ? merge_joins(scope[:joins], joins) : (joins || scope && scope[:joins])
1814
+ case merged_joins
1815
+ when Symbol, Hash, Array
1816
+ if array_of_strings?(merged_joins)
1817
+ sql << merged_joins.join(' ') + " "
1818
+ else
1819
+ join_dependency = ActiveRecord::Associations::ClassMethods::InnerJoinDependency.new(self, merged_joins, nil)
1820
+ sql << " #{join_dependency.join_associations.collect { |assoc| assoc.association_join }.join} "
1821
+ end
1822
+ when String
1823
+ sql << " #{merged_joins} "
1824
+ end
1825
+ end
1826
+
1827
+ # Adds a sanitized version of +conditions+ to the +sql+ string. Note that the passed-in +sql+ string is changed.
1828
+ # The optional scope argument is for the current <tt>:find</tt> scope.
1829
+ def add_conditions!(sql, conditions, scope = :auto)
1830
+ scope = scope(:find) if :auto == scope
1831
+ conditions = [conditions]
1832
+ conditions << scope[:conditions] if scope
1833
+ conditions << type_condition if finder_needs_type_condition?
1834
+ merged_conditions = merge_conditions(*conditions)
1835
+ sql << "WHERE #{merged_conditions} " unless merged_conditions.blank?
1836
+ end
1837
+
1838
+ def type_condition(table_alias=nil)
1839
+ quoted_table_alias = self.connection.quote_table_name(table_alias || table_name)
1840
+ quoted_inheritance_column = connection.quote_column_name(inheritance_column)
1841
+ type_condition = subclasses.inject("#{quoted_table_alias}.#{quoted_inheritance_column} = '#{sti_name}' ") do |condition, subclass|
1842
+ condition << "OR #{quoted_table_alias}.#{quoted_inheritance_column} = '#{subclass.sti_name}' "
1843
+ end
1844
+
1845
+ " (#{type_condition}) "
1846
+ end
1847
+
1848
+ # Guesses the table name, but does not decorate it with prefix and suffix information.
1849
+ def undecorated_table_name(class_name = base_class.name)
1850
+ table_name = class_name.to_s.demodulize.underscore
1851
+ table_name = table_name.pluralize if pluralize_table_names
1852
+ table_name
1853
+ end
1854
+
1855
+ # Enables dynamic finders like <tt>find_by_user_name(user_name)</tt> and <tt>find_by_user_name_and_password(user_name, password)</tt>
1856
+ # that are turned into <tt>find(:first, :conditions => ["user_name = ?", user_name])</tt> and
1857
+ # <tt>find(:first, :conditions => ["user_name = ? AND password = ?", user_name, password])</tt> respectively. Also works for
1858
+ # <tt>find(:all)</tt> by using <tt>find_all_by_amount(50)</tt> that is turned into <tt>find(:all, :conditions => ["amount = ?", 50])</tt>.
1859
+ #
1860
+ # It's even possible to use all the additional parameters to +find+. For example, the full interface for +find_all_by_amount+
1861
+ # is actually <tt>find_all_by_amount(amount, options)</tt>.
1862
+ #
1863
+ # Also enables dynamic scopes like scoped_by_user_name(user_name) and scoped_by_user_name_and_password(user_name, password) that
1864
+ # are turned into scoped(:conditions => ["user_name = ?", user_name]) and scoped(:conditions => ["user_name = ? AND password = ?", user_name, password])
1865
+ # respectively.
1866
+ #
1867
+ # Each dynamic finder, scope or initializer/creator is also defined in the class after it is first invoked, so that future
1868
+ # attempts to use it do not run through method_missing.
1869
+ def method_missing(method_id, *arguments, &block)
1870
+ if match = DynamicFinderMatch.match(method_id)
1871
+ attribute_names = match.attribute_names
1872
+ super unless all_attributes_exists?(attribute_names)
1873
+ if match.finder?
1874
+ finder = match.finder
1875
+ bang = match.bang?
1876
+ # def self.find_by_login_and_activated(*args)
1877
+ # options = args.extract_options!
1878
+ # attributes = construct_attributes_from_arguments(
1879
+ # [:login,:activated],
1880
+ # args
1881
+ # )
1882
+ # finder_options = { :conditions => attributes }
1883
+ # validate_find_options(options)
1884
+ # set_readonly_option!(options)
1885
+ #
1886
+ # if options[:conditions]
1887
+ # with_scope(:find => finder_options) do
1888
+ # find(:first, options)
1889
+ # end
1890
+ # else
1891
+ # find(:first, options.merge(finder_options))
1892
+ # end
1893
+ # end
1894
+ self.class_eval <<-EOS, __FILE__, __LINE__ + 1
1895
+ def self.#{method_id}(*args)
1896
+ options = args.extract_options!
1897
+ attributes = construct_attributes_from_arguments(
1898
+ [:#{attribute_names.join(',:')}],
1899
+ args
1900
+ )
1901
+ finder_options = { :conditions => attributes }
1902
+ validate_find_options(options)
1903
+ set_readonly_option!(options)
1904
+
1905
+ #{'result = ' if bang}if options[:conditions]
1906
+ with_scope(:find => finder_options) do
1907
+ find(:#{finder}, options)
1908
+ end
1909
+ else
1910
+ find(:#{finder}, options.merge(finder_options))
1911
+ end
1912
+ #{'result || raise(RecordNotFound, "Couldn\'t find #{name} with #{attributes.to_a.collect {|pair| "#{pair.first} = #{pair.second}"}.join(\', \')}")' if bang}
1913
+ end
1914
+ EOS
1915
+ send(method_id, *arguments)
1916
+ elsif match.instantiator?
1917
+ instantiator = match.instantiator
1918
+ # def self.find_or_create_by_user_id(*args)
1919
+ # guard_protected_attributes = false
1920
+ #
1921
+ # if args[0].is_a?(Hash)
1922
+ # guard_protected_attributes = true
1923
+ # attributes = args[0].with_indifferent_access
1924
+ # find_attributes = attributes.slice(*[:user_id])
1925
+ # else
1926
+ # find_attributes = attributes = construct_attributes_from_arguments([:user_id], args)
1927
+ # end
1928
+ #
1929
+ # options = { :conditions => find_attributes }
1930
+ # set_readonly_option!(options)
1931
+ #
1932
+ # record = find(:first, options)
1933
+ #
1934
+ # if record.nil?
1935
+ # record = self.new { |r| r.send(:attributes=, attributes, guard_protected_attributes) }
1936
+ # yield(record) if block_given?
1937
+ # record.save
1938
+ # record
1939
+ # else
1940
+ # record
1941
+ # end
1942
+ # end
1943
+ self.class_eval <<-EOS, __FILE__, __LINE__ + 1
1944
+ def self.#{method_id}(*args)
1945
+ attributes = [:#{attribute_names.join(',:')}]
1946
+ protected_attributes_for_create, unprotected_attributes_for_create = {}, {}
1947
+ args.each_with_index do |arg, i|
1948
+ if arg.is_a?(Hash)
1949
+ protected_attributes_for_create = args[i].with_indifferent_access
1950
+ else
1951
+ unprotected_attributes_for_create[attributes[i]] = args[i]
1952
+ end
1953
+ end
1954
+
1955
+ find_attributes = (protected_attributes_for_create.merge(unprotected_attributes_for_create)).slice(*attributes)
1956
+
1957
+ options = { :conditions => find_attributes }
1958
+ set_readonly_option!(options)
1959
+
1960
+ record = find(:first, options)
1961
+
1962
+ if record.nil?
1963
+ record = self.new do |r|
1964
+ r.send(:attributes=, protected_attributes_for_create, true) unless protected_attributes_for_create.empty?
1965
+ r.send(:attributes=, unprotected_attributes_for_create, false) unless unprotected_attributes_for_create.empty?
1966
+ end
1967
+ #{'yield(record) if block_given?'}
1968
+ #{'record.save' if instantiator == :create}
1969
+ record
1970
+ else
1971
+ record
1972
+ end
1973
+ end
1974
+ EOS
1975
+ send(method_id, *arguments, &block)
1976
+ end
1977
+ elsif match = DynamicScopeMatch.match(method_id)
1978
+ attribute_names = match.attribute_names
1979
+ super unless all_attributes_exists?(attribute_names)
1980
+ if match.scope?
1981
+ self.class_eval <<-EOS, __FILE__, __LINE__ + 1
1982
+ def self.#{method_id}(*args) # def self.scoped_by_user_name_and_password(*args)
1983
+ options = args.extract_options! # options = args.extract_options!
1984
+ attributes = construct_attributes_from_arguments( # attributes = construct_attributes_from_arguments(
1985
+ [:#{attribute_names.join(',:')}], args # [:user_name, :password], args
1986
+ ) # )
1987
+ #
1988
+ scoped(:conditions => attributes) # scoped(:conditions => attributes)
1989
+ end # end
1990
+ EOS
1991
+ send(method_id, *arguments)
1992
+ end
1993
+ else
1994
+ super
1995
+ end
1996
+ end
1997
+
1998
+ def construct_attributes_from_arguments(attribute_names, arguments)
1999
+ attributes = {}
2000
+ attribute_names.each_with_index { |name, idx| attributes[name] = arguments[idx] }
2001
+ attributes
2002
+ end
2003
+
2004
+ # Similar in purpose to +expand_hash_conditions_for_aggregates+.
2005
+ def expand_attribute_names_for_aggregates(attribute_names)
2006
+ expanded_attribute_names = []
2007
+ attribute_names.each do |attribute_name|
2008
+ unless (aggregation = reflect_on_aggregation(attribute_name.to_sym)).nil?
2009
+ aggregate_mapping(aggregation).each do |field_attr, aggregate_attr|
2010
+ expanded_attribute_names << field_attr
2011
+ end
2012
+ else
2013
+ expanded_attribute_names << attribute_name
2014
+ end
2015
+ end
2016
+ expanded_attribute_names
2017
+ end
2018
+
2019
+ def all_attributes_exists?(attribute_names)
2020
+ attribute_names = expand_attribute_names_for_aggregates(attribute_names)
2021
+ attribute_names.all? { |name| column_methods_hash.include?(name.to_sym) }
2022
+ end
2023
+
2024
+ def attribute_condition(quoted_column_name, argument)
2025
+ case argument
2026
+ when nil then "#{quoted_column_name} IS ?"
2027
+ when Array, ActiveRecord::Associations::AssociationCollection, ActiveRecord::NamedScope::Scope then "#{quoted_column_name} IN (?)"
2028
+ when Range then if argument.exclude_end?
2029
+ "#{quoted_column_name} >= ? AND #{quoted_column_name} < ?"
2030
+ else
2031
+ "#{quoted_column_name} BETWEEN ? AND ?"
2032
+ end
2033
+ else "#{quoted_column_name} = ?"
2034
+ end
2035
+ end
2036
+
2037
+ # Interpret Array and Hash as conditions and anything else as an id.
2038
+ def expand_id_conditions(id_or_conditions)
2039
+ case id_or_conditions
2040
+ when Array, Hash then id_or_conditions
2041
+ else sanitize_sql(primary_key => id_or_conditions)
2042
+ end
2043
+ end
2044
+
2045
+ # Defines an "attribute" method (like +inheritance_column+ or
2046
+ # +table_name+). A new (class) method will be created with the
2047
+ # given name. If a value is specified, the new method will
2048
+ # return that value (as a string). Otherwise, the given block
2049
+ # will be used to compute the value of the method.
2050
+ #
2051
+ # The original method will be aliased, with the new name being
2052
+ # prefixed with "original_". This allows the new method to
2053
+ # access the original value.
2054
+ #
2055
+ # Example:
2056
+ #
2057
+ # class A < ActiveRecord::Base
2058
+ # define_attr_method :primary_key, "sysid"
2059
+ # define_attr_method( :inheritance_column ) do
2060
+ # original_inheritance_column + "_id"
2061
+ # end
2062
+ # end
2063
+ def define_attr_method(name, value=nil, &block)
2064
+ sing = class << self; self; end
2065
+ sing.send :alias_method, "original_#{name}", name
2066
+ if block_given?
2067
+ sing.send :define_method, name, &block
2068
+ else
2069
+ # use eval instead of a block to work around a memory leak in dev
2070
+ # mode in fcgi
2071
+ sing.class_eval "def #{name}; #{value.to_s.inspect}; end"
2072
+ end
2073
+ end
2074
+
2075
+ protected
2076
+ # Scope parameters to method calls within the block. Takes a hash of method_name => parameters hash.
2077
+ # method_name may be <tt>:find</tt> or <tt>:create</tt>. <tt>:find</tt> parameters may include the <tt>:conditions</tt>, <tt>:joins</tt>,
2078
+ # <tt>:include</tt>, <tt>:offset</tt>, <tt>:limit</tt>, and <tt>:readonly</tt> options. <tt>:create</tt> parameters are an attributes hash.
2079
+ #
2080
+ # class Article < ActiveRecord::Base
2081
+ # def self.create_with_scope
2082
+ # with_scope(:find => { :conditions => "blog_id = 1" }, :create => { :blog_id => 1 }) do
2083
+ # find(1) # => SELECT * from articles WHERE blog_id = 1 AND id = 1
2084
+ # a = create(1)
2085
+ # a.blog_id # => 1
2086
+ # end
2087
+ # end
2088
+ # end
2089
+ #
2090
+ # In nested scopings, all previous parameters are overwritten by the innermost rule, with the exception of
2091
+ # <tt>:conditions</tt>, <tt>:include</tt>, and <tt>:joins</tt> options in <tt>:find</tt>, which are merged.
2092
+ #
2093
+ # <tt>:joins</tt> options are uniqued so multiple scopes can join in the same table without table aliasing
2094
+ # problems. If you need to join multiple tables, but still want one of the tables to be uniqued, use the
2095
+ # array of strings format for your joins.
2096
+ #
2097
+ # class Article < ActiveRecord::Base
2098
+ # def self.find_with_scope
2099
+ # with_scope(:find => { :conditions => "blog_id = 1", :limit => 1 }, :create => { :blog_id => 1 }) do
2100
+ # with_scope(:find => { :limit => 10 })
2101
+ # find(:all) # => SELECT * from articles WHERE blog_id = 1 LIMIT 10
2102
+ # end
2103
+ # with_scope(:find => { :conditions => "author_id = 3" })
2104
+ # find(:all) # => SELECT * from articles WHERE blog_id = 1 AND author_id = 3 LIMIT 1
2105
+ # end
2106
+ # end
2107
+ # end
2108
+ # end
2109
+ #
2110
+ # You can ignore any previous scopings by using the <tt>with_exclusive_scope</tt> method.
2111
+ #
2112
+ # class Article < ActiveRecord::Base
2113
+ # def self.find_with_exclusive_scope
2114
+ # with_scope(:find => { :conditions => "blog_id = 1", :limit => 1 }) do
2115
+ # with_exclusive_scope(:find => { :limit => 10 })
2116
+ # find(:all) # => SELECT * from articles LIMIT 10
2117
+ # end
2118
+ # end
2119
+ # end
2120
+ # end
2121
+ #
2122
+ # *Note*: the +:find+ scope also has effect on update and deletion methods,
2123
+ # like +update_all+ and +delete_all+.
2124
+ def with_scope(method_scoping = {}, action = :merge, &block)
2125
+ method_scoping = method_scoping.method_scoping if method_scoping.respond_to?(:method_scoping)
2126
+
2127
+ # Dup first and second level of hash (method and params).
2128
+ method_scoping = method_scoping.inject({}) do |hash, (method, params)|
2129
+ hash[method] = (params == true) ? params : params.dup
2130
+ hash
2131
+ end
2132
+
2133
+ method_scoping.assert_valid_keys([ :find, :create ])
2134
+
2135
+ if f = method_scoping[:find]
2136
+ f.assert_valid_keys(VALID_FIND_OPTIONS)
2137
+ set_readonly_option! f
2138
+ end
2139
+
2140
+ # Merge scopings
2141
+ if [:merge, :reverse_merge].include?(action) && current_scoped_methods
2142
+ method_scoping = current_scoped_methods.inject(method_scoping) do |hash, (method, params)|
2143
+ case hash[method]
2144
+ when Hash
2145
+ if method == :find
2146
+ (hash[method].keys + params.keys).uniq.each do |key|
2147
+ merge = hash[method][key] && params[key] # merge if both scopes have the same key
2148
+ if key == :conditions && merge
2149
+ if params[key].is_a?(Hash) && hash[method][key].is_a?(Hash)
2150
+ hash[method][key] = merge_conditions(hash[method][key].deep_merge(params[key]))
2151
+ else
2152
+ hash[method][key] = merge_conditions(params[key], hash[method][key])
2153
+ end
2154
+ elsif key == :include && merge
2155
+ hash[method][key] = merge_includes(hash[method][key], params[key]).uniq
2156
+ elsif key == :joins && merge
2157
+ hash[method][key] = merge_joins(params[key], hash[method][key])
2158
+ else
2159
+ hash[method][key] = hash[method][key] || params[key]
2160
+ end
2161
+ end
2162
+ else
2163
+ if action == :reverse_merge
2164
+ hash[method] = hash[method].merge(params)
2165
+ else
2166
+ hash[method] = params.merge(hash[method])
2167
+ end
2168
+ end
2169
+ else
2170
+ hash[method] = params
2171
+ end
2172
+ hash
2173
+ end
2174
+ end
2175
+
2176
+ self.scoped_methods << method_scoping
2177
+ begin
2178
+ yield
2179
+ ensure
2180
+ self.scoped_methods.pop
2181
+ end
2182
+ end
2183
+
2184
+ # Works like with_scope, but discards any nested properties.
2185
+ def with_exclusive_scope(method_scoping = {}, &block)
2186
+ with_scope(method_scoping, :overwrite, &block)
2187
+ end
2188
+
2189
+ def subclasses #:nodoc:
2190
+ @@subclasses[self] ||= []
2191
+ @@subclasses[self] + extra = @@subclasses[self].inject([]) {|list, subclass| list + subclass.subclasses }
2192
+ end
2193
+
2194
+ # Sets the default options for the model. The format of the
2195
+ # <tt>options</tt> argument is the same as in find.
2196
+ #
2197
+ # class Person < ActiveRecord::Base
2198
+ # default_scope :order => 'last_name, first_name'
2199
+ # end
2200
+ def default_scope(options = {})
2201
+ self.default_scoping << { :find => options, :create => options[:conditions].is_a?(Hash) ? options[:conditions] : {} }
2202
+ end
2203
+
2204
+ # Test whether the given method and optional key are scoped.
2205
+ def scoped?(method, key = nil) #:nodoc:
2206
+ if current_scoped_methods && (scope = current_scoped_methods[method])
2207
+ !key || !scope[key].nil?
2208
+ end
2209
+ end
2210
+
2211
+ # Retrieve the scope for the given method and optional key.
2212
+ def scope(method, key = nil) #:nodoc:
2213
+ if current_scoped_methods && (scope = current_scoped_methods[method])
2214
+ key ? scope[key] : scope
2215
+ end
2216
+ end
2217
+
2218
+ def scoped_methods #:nodoc:
2219
+ Thread.current[:"#{self}_scoped_methods"] ||= self.default_scoping.dup
2220
+ end
2221
+
2222
+ def current_scoped_methods #:nodoc:
2223
+ scoped_methods.last
2224
+ end
2225
+
2226
+ # Returns the class type of the record using the current module as a prefix. So descendants of
2227
+ # MyApp::Business::Account would appear as MyApp::Business::AccountSubclass.
2228
+ def compute_type(type_name)
2229
+ modularized_name = type_name_with_module(type_name)
2230
+ silence_warnings do
2231
+ begin
2232
+ class_eval(modularized_name, __FILE__)
2233
+ rescue NameError
2234
+ class_eval(type_name, __FILE__)
2235
+ end
2236
+ end
2237
+ end
2238
+
2239
+ # Returns the class descending directly from ActiveRecord::Base or an
2240
+ # abstract class, if any, in the inheritance hierarchy.
2241
+ def class_of_active_record_descendant(klass)
2242
+ if klass.superclass == Base || klass.superclass.abstract_class?
2243
+ klass
2244
+ elsif klass.superclass.nil?
2245
+ raise ActiveRecordError, "#{name} doesn't belong in a hierarchy descending from ActiveRecord"
2246
+ else
2247
+ class_of_active_record_descendant(klass.superclass)
2248
+ end
2249
+ end
2250
+
2251
+ # Returns the name of the class descending directly from Active Record in the inheritance hierarchy.
2252
+ def class_name_of_active_record_descendant(klass) #:nodoc:
2253
+ klass.base_class.name
2254
+ end
2255
+
2256
+ # Accepts an array, hash, or string of SQL conditions and sanitizes
2257
+ # them into a valid SQL fragment for a WHERE clause.
2258
+ # ["name='%s' and group_id='%s'", "foo'bar", 4] returns "name='foo''bar' and group_id='4'"
2259
+ # { :name => "foo'bar", :group_id => 4 } returns "name='foo''bar' and group_id='4'"
2260
+ # "name='foo''bar' and group_id='4'" returns "name='foo''bar' and group_id='4'"
2261
+ def sanitize_sql_for_conditions(condition, table_name = quoted_table_name)
2262
+ return nil if condition.blank?
2263
+
2264
+ case condition
2265
+ when Array; sanitize_sql_array(condition)
2266
+ when Hash; sanitize_sql_hash_for_conditions(condition, table_name)
2267
+ else condition
2268
+ end
2269
+ end
2270
+ alias_method :sanitize_sql, :sanitize_sql_for_conditions
2271
+
2272
+ # Accepts an array, hash, or string of SQL conditions and sanitizes
2273
+ # them into a valid SQL fragment for a SET clause.
2274
+ # { :name => nil, :group_id => 4 } returns "name = NULL , group_id='4'"
2275
+ def sanitize_sql_for_assignment(assignments)
2276
+ case assignments
2277
+ when Array; sanitize_sql_array(assignments)
2278
+ when Hash; sanitize_sql_hash_for_assignment(assignments)
2279
+ else assignments
2280
+ end
2281
+ end
2282
+
2283
+ def aggregate_mapping(reflection)
2284
+ mapping = reflection.options[:mapping] || [reflection.name, reflection.name]
2285
+ mapping.first.is_a?(Array) ? mapping : [mapping]
2286
+ end
2287
+
2288
+ # Accepts a hash of SQL conditions and replaces those attributes
2289
+ # that correspond to a +composed_of+ relationship with their expanded
2290
+ # aggregate attribute values.
2291
+ # Given:
2292
+ # class Person < ActiveRecord::Base
2293
+ # composed_of :address, :class_name => "Address",
2294
+ # :mapping => [%w(address_street street), %w(address_city city)]
2295
+ # end
2296
+ # Then:
2297
+ # { :address => Address.new("813 abc st.", "chicago") }
2298
+ # # => { :address_street => "813 abc st.", :address_city => "chicago" }
2299
+ def expand_hash_conditions_for_aggregates(attrs)
2300
+ expanded_attrs = {}
2301
+ attrs.each do |attr, value|
2302
+ unless (aggregation = reflect_on_aggregation(attr.to_sym)).nil?
2303
+ mapping = aggregate_mapping(aggregation)
2304
+ mapping.each do |field_attr, aggregate_attr|
2305
+ if mapping.size == 1 && !value.respond_to?(aggregate_attr)
2306
+ expanded_attrs[field_attr] = value
2307
+ else
2308
+ expanded_attrs[field_attr] = value.send(aggregate_attr)
2309
+ end
2310
+ end
2311
+ else
2312
+ expanded_attrs[attr] = value
2313
+ end
2314
+ end
2315
+ expanded_attrs
2316
+ end
2317
+
2318
+ # Sanitizes a hash of attribute/value pairs into SQL conditions for a WHERE clause.
2319
+ # { :name => "foo'bar", :group_id => 4 }
2320
+ # # => "name='foo''bar' and group_id= 4"
2321
+ # { :status => nil, :group_id => [1,2,3] }
2322
+ # # => "status IS NULL and group_id IN (1,2,3)"
2323
+ # { :age => 13..18 }
2324
+ # # => "age BETWEEN 13 AND 18"
2325
+ # { 'other_records.id' => 7 }
2326
+ # # => "`other_records`.`id` = 7"
2327
+ # { :other_records => { :id => 7 } }
2328
+ # # => "`other_records`.`id` = 7"
2329
+ # And for value objects on a composed_of relationship:
2330
+ # { :address => Address.new("123 abc st.", "chicago") }
2331
+ # # => "address_street='123 abc st.' and address_city='chicago'"
2332
+ def sanitize_sql_hash_for_conditions(attrs, default_table_name = quoted_table_name)
2333
+ attrs = expand_hash_conditions_for_aggregates(attrs)
2334
+
2335
+ conditions = attrs.map do |attr, value|
2336
+ table_name = default_table_name
2337
+
2338
+ unless value.is_a?(Hash)
2339
+ attr = attr.to_s
2340
+
2341
+ # Extract table name from qualified attribute names.
2342
+ if attr.include?('.')
2343
+ attr_table_name, attr = attr.split('.', 2)
2344
+ attr_table_name = connection.quote_table_name(attr_table_name)
2345
+ else
2346
+ attr_table_name = table_name
2347
+ end
2348
+
2349
+ attribute_condition("#{attr_table_name}.#{connection.quote_column_name(attr)}", value)
2350
+ else
2351
+ sanitize_sql_hash_for_conditions(value, connection.quote_table_name(attr.to_s))
2352
+ end
2353
+ end.join(' AND ')
2354
+
2355
+ replace_bind_variables(conditions, expand_range_bind_variables(attrs.values))
2356
+ end
2357
+ alias_method :sanitize_sql_hash, :sanitize_sql_hash_for_conditions
2358
+
2359
+ # Sanitizes a hash of attribute/value pairs into SQL conditions for a SET clause.
2360
+ # { :status => nil, :group_id => 1 }
2361
+ # # => "status = NULL , group_id = 1"
2362
+ def sanitize_sql_hash_for_assignment(attrs)
2363
+ attrs.map do |attr, value|
2364
+ "#{connection.quote_column_name(attr)} = #{quote_bound_value(value)}"
2365
+ end.join(', ')
2366
+ end
2367
+
2368
+ # Accepts an array of conditions. The array has each value
2369
+ # sanitized and interpolated into the SQL statement.
2370
+ # ["name='%s' and group_id='%s'", "foo'bar", 4] returns "name='foo''bar' and group_id='4'"
2371
+ def sanitize_sql_array(ary)
2372
+ statement, *values = ary
2373
+ if values.first.is_a?(Hash) and statement =~ /:\w+/
2374
+ replace_named_bind_variables(statement, values.first)
2375
+ elsif statement.include?('?')
2376
+ replace_bind_variables(statement, values)
2377
+ else
2378
+ statement % values.collect { |value| connection.quote_string(value.to_s) }
2379
+ end
2380
+ end
2381
+
2382
+ alias_method :sanitize_conditions, :sanitize_sql
2383
+
2384
+ def replace_bind_variables(statement, values) #:nodoc:
2385
+ raise_if_bind_arity_mismatch(statement, statement.count('?'), values.size)
2386
+ bound = values.dup
2387
+ statement.gsub('?') { quote_bound_value(bound.shift) }
2388
+ end
2389
+
2390
+ def replace_named_bind_variables(statement, bind_vars) #:nodoc:
2391
+ statement.gsub(/(:?):([a-zA-Z]\w*)/) do
2392
+ if $1 == ':' # skip postgresql casts
2393
+ $& # return the whole match
2394
+ elsif bind_vars.include?(match = $2.to_sym)
2395
+ quote_bound_value(bind_vars[match])
2396
+ else
2397
+ raise PreparedStatementInvalid, "missing value for :#{match} in #{statement}"
2398
+ end
2399
+ end
2400
+ end
2401
+
2402
+ def expand_range_bind_variables(bind_vars) #:nodoc:
2403
+ expanded = []
2404
+
2405
+ bind_vars.each do |var|
2406
+ next if var.is_a?(Hash)
2407
+
2408
+ if var.is_a?(Range)
2409
+ expanded << var.first
2410
+ expanded << var.last
2411
+ else
2412
+ expanded << var
2413
+ end
2414
+ end
2415
+
2416
+ expanded
2417
+ end
2418
+
2419
+ def quote_bound_value(value) #:nodoc:
2420
+ if value.respond_to?(:map) && !value.acts_like?(:string)
2421
+ if value.respond_to?(:empty?) && value.empty?
2422
+ connection.quote(nil)
2423
+ else
2424
+ value.map { |v| connection.quote(v) }.join(',')
2425
+ end
2426
+ else
2427
+ connection.quote(value)
2428
+ end
2429
+ end
2430
+
2431
+ def raise_if_bind_arity_mismatch(statement, expected, provided) #:nodoc:
2432
+ unless expected == provided
2433
+ raise PreparedStatementInvalid, "wrong number of bind variables (#{provided} for #{expected}) in: #{statement}"
2434
+ end
2435
+ end
2436
+
2437
+ VALID_FIND_OPTIONS = [ :conditions, :include, :joins, :limit, :offset,
2438
+ :order, :select, :readonly, :group, :having, :from, :lock ]
2439
+
2440
+ def validate_find_options(options) #:nodoc:
2441
+ options.assert_valid_keys(VALID_FIND_OPTIONS)
2442
+ end
2443
+
2444
+ def set_readonly_option!(options) #:nodoc:
2445
+ # Inherit :readonly from finder scope if set. Otherwise,
2446
+ # if :joins is not blank then :readonly defaults to true.
2447
+ unless options.has_key?(:readonly)
2448
+ if scoped_readonly = scope(:find, :readonly)
2449
+ options[:readonly] = scoped_readonly
2450
+ elsif !options[:joins].blank? && !options[:select]
2451
+ options[:readonly] = true
2452
+ end
2453
+ end
2454
+ end
2455
+
2456
+ def encode_quoted_value(value) #:nodoc:
2457
+ quoted_value = connection.quote(value)
2458
+ quoted_value = "'#{quoted_value[1..-2].gsub(/\'/, "\\\\'")}'" if quoted_value.include?("\\\'") # (for ruby mode) "
2459
+ quoted_value
2460
+ end
2461
+ end
2462
+
2463
+ public
2464
+ # New objects can be instantiated as either empty (pass no construction parameter) or pre-set with
2465
+ # attributes but not yet saved (pass a hash with key names matching the associated table column names).
2466
+ # In both instances, valid attribute keys are determined by the column names of the associated table --
2467
+ # hence you can't have attributes that aren't part of the table columns.
2468
+ def initialize(attributes = nil)
2469
+ @attributes = attributes_from_column_definition
2470
+ @attributes_cache = {}
2471
+ @new_record = true
2472
+ ensure_proper_type
2473
+ self.attributes = attributes unless attributes.nil?
2474
+ assign_attributes(self.class.send(:scope, :create)) if self.class.send(:scoped?, :create)
2475
+ result = yield self if block_given?
2476
+ callback(:after_initialize) if respond_to_without_attributes?(:after_initialize)
2477
+ result
2478
+ end
2479
+
2480
+ # A model instance's primary key is always available as model.id
2481
+ # whether you name it the default 'id' or set it to something else.
2482
+ def id
2483
+ attr_name = self.class.primary_key
2484
+ column = column_for_attribute(attr_name)
2485
+
2486
+ self.class.send(:define_read_method, :id, attr_name, column)
2487
+ # now that the method exists, call it
2488
+ self.send attr_name.to_sym
2489
+
2490
+ end
2491
+
2492
+ # Returns a String, which Action Pack uses for constructing an URL to this
2493
+ # object. The default implementation returns this record's id as a String,
2494
+ # or nil if this record's unsaved.
2495
+ #
2496
+ # For example, suppose that you have a User model, and that you have a
2497
+ # <tt>map.resources :users</tt> route. Normally, +user_path+ will
2498
+ # construct a path with the user object's 'id' in it:
2499
+ #
2500
+ # user = User.find_by_name('Phusion')
2501
+ # user_path(user) # => "/users/1"
2502
+ #
2503
+ # You can override +to_param+ in your model to make +user_path+ construct
2504
+ # a path using the user's name instead of the user's id:
2505
+ #
2506
+ # class User < ActiveRecord::Base
2507
+ # def to_param # overridden
2508
+ # name
2509
+ # end
2510
+ # end
2511
+ #
2512
+ # user = User.find_by_name('Phusion')
2513
+ # user_path(user) # => "/users/Phusion"
2514
+ def to_param
2515
+ # We can't use alias_method here, because method 'id' optimizes itself on the fly.
2516
+ (id = self.id) ? id.to_s : nil # Be sure to stringify the id for routes
2517
+ end
2518
+
2519
+ # Returns a cache key that can be used to identify this record.
2520
+ #
2521
+ # ==== Examples
2522
+ #
2523
+ # Product.new.cache_key # => "products/new"
2524
+ # Product.find(5).cache_key # => "products/5" (updated_at not available)
2525
+ # Person.find(5).cache_key # => "people/5-20071224150000" (updated_at available)
2526
+ def cache_key
2527
+ case
2528
+ when new_record?
2529
+ "#{self.class.model_name.cache_key}/new"
2530
+ when timestamp = self[:updated_at]
2531
+ "#{self.class.model_name.cache_key}/#{id}-#{timestamp.to_s(:number)}"
2532
+ else
2533
+ "#{self.class.model_name.cache_key}/#{id}"
2534
+ end
2535
+ end
2536
+
2537
+ def id_before_type_cast #:nodoc:
2538
+ read_attribute_before_type_cast(self.class.primary_key)
2539
+ end
2540
+
2541
+ def quoted_id #:nodoc:
2542
+ quote_value(id, column_for_attribute(self.class.primary_key))
2543
+ end
2544
+
2545
+ # Sets the primary ID.
2546
+ def id=(value)
2547
+ write_attribute(self.class.primary_key, value)
2548
+ end
2549
+
2550
+ # Returns true if this object hasn't been saved yet -- that is, a record for the object doesn't exist yet; otherwise, returns false.
2551
+ def new_record?
2552
+ @new_record || false
2553
+ end
2554
+
2555
+ # :call-seq:
2556
+ # save(perform_validation = true)
2557
+ #
2558
+ # Saves the model.
2559
+ #
2560
+ # If the model is new a record gets created in the database, otherwise
2561
+ # the existing record gets updated.
2562
+ #
2563
+ # If +perform_validation+ is true validations run. If any of them fail
2564
+ # the action is cancelled and +save+ returns +false+. If the flag is
2565
+ # false validations are bypassed altogether. See
2566
+ # ActiveRecord::Validations for more information.
2567
+ #
2568
+ # There's a series of callbacks associated with +save+. If any of the
2569
+ # <tt>before_*</tt> callbacks return +false+ the action is cancelled and
2570
+ # +save+ returns +false+. See ActiveRecord::Callbacks for further
2571
+ # details.
2572
+ def save
2573
+ create_or_update
2574
+ end
2575
+
2576
+ # Saves the model.
2577
+ #
2578
+ # If the model is new a record gets created in the database, otherwise
2579
+ # the existing record gets updated.
2580
+ #
2581
+ # With <tt>save!</tt> validations always run. If any of them fail
2582
+ # ActiveRecord::RecordInvalid gets raised. See ActiveRecord::Validations
2583
+ # for more information.
2584
+ #
2585
+ # There's a series of callbacks associated with <tt>save!</tt>. If any of
2586
+ # the <tt>before_*</tt> callbacks return +false+ the action is cancelled
2587
+ # and <tt>save!</tt> raises ActiveRecord::RecordNotSaved. See
2588
+ # ActiveRecord::Callbacks for further details.
2589
+ def save!
2590
+ create_or_update || raise(RecordNotSaved)
2591
+ end
2592
+
2593
+ # Deletes the record in the database and freezes this instance to
2594
+ # reflect that no changes should be made (since they can't be
2595
+ # persisted). Returns the frozen instance.
2596
+ #
2597
+ # The row is simply removed with a SQL +DELETE+ statement on the
2598
+ # record's primary key, and no callbacks are executed.
2599
+ #
2600
+ # To enforce the object's +before_destroy+ and +after_destroy+
2601
+ # callbacks, Observer methods, or any <tt>:dependent</tt> association
2602
+ # options, use <tt>#destroy</tt>.
2603
+ def delete
2604
+ self.class.delete(id) unless new_record?
2605
+ @destroyed = true
2606
+ freeze
2607
+ end
2608
+
2609
+ # Deletes the record in the database and freezes this instance to reflect that no changes should
2610
+ # be made (since they can't be persisted).
2611
+ def destroy
2612
+ unless new_record?
2613
+ connection.delete(
2614
+ "DELETE FROM #{self.class.quoted_table_name} " +
2615
+ "WHERE #{connection.quote_column_name(self.class.primary_key)} = #{quoted_id}",
2616
+ "#{self.class.name} Destroy"
2617
+ )
2618
+ end
2619
+
2620
+ @destroyed = true
2621
+ freeze
2622
+ end
2623
+
2624
+ # Returns a clone of the record that hasn't been assigned an id yet and
2625
+ # is treated as a new record. Note that this is a "shallow" clone:
2626
+ # it copies the object's attributes only, not its associations.
2627
+ # The extent of a "deep" clone is application-specific and is therefore
2628
+ # left to the application to implement according to its need.
2629
+ def clone
2630
+ attrs = clone_attributes(:read_attribute_before_type_cast)
2631
+ attrs.delete(self.class.primary_key)
2632
+ record = self.class.new
2633
+ record.send :instance_variable_set, '@attributes', attrs
2634
+ record
2635
+ end
2636
+
2637
+ # Returns an instance of the specified +klass+ with the attributes of the current record. This is mostly useful in relation to
2638
+ # single-table inheritance structures where you want a subclass to appear as the superclass. This can be used along with record
2639
+ # identification in Action Pack to allow, say, <tt>Client < Company</tt> to do something like render <tt>:partial => @client.becomes(Company)</tt>
2640
+ # to render that instance using the companies/company partial instead of clients/client.
2641
+ #
2642
+ # Note: The new instance will share a link to the same attributes as the original class. So any change to the attributes in either
2643
+ # instance will affect the other.
2644
+ def becomes(klass)
2645
+ returning klass.new do |became|
2646
+ became.instance_variable_set("@attributes", @attributes)
2647
+ became.instance_variable_set("@attributes_cache", @attributes_cache)
2648
+ became.instance_variable_set("@new_record", new_record?)
2649
+ end
2650
+ end
2651
+
2652
+ # Updates a single attribute and saves the record without going through the normal validation procedure.
2653
+ # This is especially useful for boolean flags on existing records. The regular +update_attribute+ method
2654
+ # in Base is replaced with this when the validations module is mixed in, which it is by default.
2655
+ def update_attribute(name, value)
2656
+ send(name.to_s + '=', value)
2657
+ save(false)
2658
+ end
2659
+
2660
+ # Updates all the attributes from the passed-in Hash and saves the record. If the object is invalid, the saving will
2661
+ # fail and false will be returned.
2662
+ def update_attributes(attributes)
2663
+ self.attributes = attributes
2664
+ save
2665
+ end
2666
+
2667
+ # Updates an object just like Base.update_attributes but calls save! instead of save so an exception is raised if the record is invalid.
2668
+ def update_attributes!(attributes)
2669
+ self.attributes = attributes
2670
+ save!
2671
+ end
2672
+
2673
+ # Initializes +attribute+ to zero if +nil+ and adds the value passed as +by+ (default is 1).
2674
+ # The increment is performed directly on the underlying attribute, no setter is invoked.
2675
+ # Only makes sense for number-based attributes. Returns +self+.
2676
+ def increment(attribute, by = 1)
2677
+ self[attribute] ||= 0
2678
+ self[attribute] += by
2679
+ self
2680
+ end
2681
+
2682
+ # Wrapper around +increment+ that saves the record. This method differs from
2683
+ # its non-bang version in that it passes through the attribute setter.
2684
+ # Saving is not subjected to validation checks. Returns +true+ if the
2685
+ # record could be saved.
2686
+ def increment!(attribute, by = 1)
2687
+ increment(attribute, by).update_attribute(attribute, self[attribute])
2688
+ end
2689
+
2690
+ # Initializes +attribute+ to zero if +nil+ and subtracts the value passed as +by+ (default is 1).
2691
+ # The decrement is performed directly on the underlying attribute, no setter is invoked.
2692
+ # Only makes sense for number-based attributes. Returns +self+.
2693
+ def decrement(attribute, by = 1)
2694
+ self[attribute] ||= 0
2695
+ self[attribute] -= by
2696
+ self
2697
+ end
2698
+
2699
+ # Wrapper around +decrement+ that saves the record. This method differs from
2700
+ # its non-bang version in that it passes through the attribute setter.
2701
+ # Saving is not subjected to validation checks. Returns +true+ if the
2702
+ # record could be saved.
2703
+ def decrement!(attribute, by = 1)
2704
+ decrement(attribute, by).update_attribute(attribute, self[attribute])
2705
+ end
2706
+
2707
+ # Assigns to +attribute+ the boolean opposite of <tt>attribute?</tt>. So
2708
+ # if the predicate returns +true+ the attribute will become +false+. This
2709
+ # method toggles directly the underlying value without calling any setter.
2710
+ # Returns +self+.
2711
+ def toggle(attribute)
2712
+ self[attribute] = !send("#{attribute}?")
2713
+ self
2714
+ end
2715
+
2716
+ # Wrapper around +toggle+ that saves the record. This method differs from
2717
+ # its non-bang version in that it passes through the attribute setter.
2718
+ # Saving is not subjected to validation checks. Returns +true+ if the
2719
+ # record could be saved.
2720
+ def toggle!(attribute)
2721
+ toggle(attribute).update_attribute(attribute, self[attribute])
2722
+ end
2723
+
2724
+ # Reloads the attributes of this object from the database.
2725
+ # The optional options argument is passed to find when reloading so you
2726
+ # may do e.g. record.reload(:lock => true) to reload the same record with
2727
+ # an exclusive row lock.
2728
+ def reload(options = nil)
2729
+ clear_aggregation_cache
2730
+ clear_association_cache
2731
+ @attributes.update(self.class.send(:with_exclusive_scope) { self.class.find(self.id, options) }.instance_variable_get('@attributes'))
2732
+ @attributes_cache = {}
2733
+ self
2734
+ end
2735
+
2736
+ # Returns the value of the attribute identified by <tt>attr_name</tt> after it has been typecast (for example,
2737
+ # "2004-12-12" in a data column is cast to a date object, like Date.new(2004, 12, 12)).
2738
+ # (Alias for the protected read_attribute method).
2739
+ def [](attr_name)
2740
+ read_attribute(attr_name)
2741
+ end
2742
+
2743
+ # Updates the attribute identified by <tt>attr_name</tt> with the specified +value+.
2744
+ # (Alias for the protected write_attribute method).
2745
+ def []=(attr_name, value)
2746
+ write_attribute(attr_name, value)
2747
+ end
2748
+
2749
+ # Allows you to set all the attributes at once by passing in a hash with keys
2750
+ # matching the attribute names (which again matches the column names).
2751
+ #
2752
+ # If +guard_protected_attributes+ is true (the default), then sensitive
2753
+ # attributes can be protected from this form of mass-assignment by using
2754
+ # the +attr_protected+ macro. Or you can alternatively specify which
2755
+ # attributes *can* be accessed with the +attr_accessible+ macro. Then all the
2756
+ # attributes not included in that won't be allowed to be mass-assigned.
2757
+ #
2758
+ # class User < ActiveRecord::Base
2759
+ # attr_protected :is_admin
2760
+ # end
2761
+ #
2762
+ # user = User.new
2763
+ # user.attributes = { :username => 'Phusion', :is_admin => true }
2764
+ # user.username # => "Phusion"
2765
+ # user.is_admin? # => false
2766
+ #
2767
+ # user.send(:attributes=, { :username => 'Phusion', :is_admin => true }, false)
2768
+ # user.is_admin? # => true
2769
+ def attributes=(new_attributes, guard_protected_attributes = true)
2770
+ return if new_attributes.nil?
2771
+ attributes = new_attributes.dup
2772
+ attributes.stringify_keys!
2773
+
2774
+ attributes = remove_attributes_protected_from_mass_assignment(attributes) if guard_protected_attributes
2775
+ assign_attributes(attributes) if attributes and attributes.any?
2776
+ end
2777
+
2778
+ # Returns a hash of all the attributes with their names as keys and the values of the attributes as values.
2779
+ def attributes
2780
+ attrs = {}
2781
+ attribute_names.each { |name| attrs[name] = read_attribute(name) }
2782
+ attrs
2783
+ end
2784
+
2785
+ # Returns a hash of attributes before typecasting and deserialization.
2786
+ def attributes_before_type_cast
2787
+ self.attribute_names.inject({}) do |attrs, name|
2788
+ attrs[name] = read_attribute_before_type_cast(name)
2789
+ attrs
2790
+ end
2791
+ end
2792
+
2793
+ # Returns an <tt>#inspect</tt>-like string for the value of the
2794
+ # attribute +attr_name+. String attributes are elided after 50
2795
+ # characters, and Date and Time attributes are returned in the
2796
+ # <tt>:db</tt> format. Other attributes return the value of
2797
+ # <tt>#inspect</tt> without modification.
2798
+ #
2799
+ # person = Person.create!(:name => "David Heinemeier Hansson " * 3)
2800
+ #
2801
+ # person.attribute_for_inspect(:name)
2802
+ # # => '"David Heinemeier Hansson David Heinemeier Hansson D..."'
2803
+ #
2804
+ # person.attribute_for_inspect(:created_at)
2805
+ # # => '"2009-01-12 04:48:57"'
2806
+ def attribute_for_inspect(attr_name)
2807
+ value = read_attribute(attr_name)
2808
+
2809
+ if value.is_a?(String) && value.length > 50
2810
+ "#{value[0..50]}...".inspect
2811
+ elsif value.is_a?(Date) || value.is_a?(Time)
2812
+ %("#{value.to_s(:db)}")
2813
+ else
2814
+ value.inspect
2815
+ end
2816
+ end
2817
+
2818
+ # Returns true if the specified +attribute+ has been set by the user or by a database load and is neither
2819
+ # nil nor empty? (the latter only applies to objects that respond to empty?, most notably Strings).
2820
+ def attribute_present?(attribute)
2821
+ value = read_attribute(attribute)
2822
+ !value.blank?
2823
+ end
2824
+
2825
+ # Returns true if the given attribute is in the attributes hash
2826
+ def has_attribute?(attr_name)
2827
+ @attributes.has_key?(attr_name.to_s)
2828
+ end
2829
+
2830
+ # Returns an array of names for the attributes available on this object sorted alphabetically.
2831
+ def attribute_names
2832
+ @attributes.keys.sort
2833
+ end
2834
+
2835
+ # Returns the column object for the named attribute.
2836
+ def column_for_attribute(name)
2837
+ self.class.columns_hash[name.to_s]
2838
+ end
2839
+
2840
+ # Returns true if the +comparison_object+ is the same object, or is of the same type and has the same id.
2841
+ def ==(comparison_object)
2842
+ comparison_object.equal?(self) ||
2843
+ (comparison_object.instance_of?(self.class) &&
2844
+ comparison_object.id == id &&
2845
+ !comparison_object.new_record?)
2846
+ end
2847
+
2848
+ # Delegates to ==
2849
+ def eql?(comparison_object)
2850
+ self == (comparison_object)
2851
+ end
2852
+
2853
+ # Delegates to id in order to allow two records of the same type and id to work with something like:
2854
+ # [ Person.find(1), Person.find(2), Person.find(3) ] & [ Person.find(1), Person.find(4) ] # => [ Person.find(1) ]
2855
+ def hash
2856
+ id.hash
2857
+ end
2858
+
2859
+ # Freeze the attributes hash such that associations are still accessible, even on destroyed records.
2860
+ def freeze
2861
+ @attributes.freeze; self
2862
+ end
2863
+
2864
+ # Returns +true+ if the attributes hash has been frozen.
2865
+ def frozen?
2866
+ @attributes.frozen?
2867
+ end
2868
+
2869
+ # Returns +true+ if the record has been destroyed.
2870
+ def destroyed?
2871
+ @destroyed
2872
+ end
2873
+
2874
+ # Returns +true+ if the record is read only. Records loaded through joins with piggy-back
2875
+ # attributes will be marked as read only since they cannot be saved.
2876
+ def readonly?
2877
+ defined?(@readonly) && @readonly == true
2878
+ end
2879
+
2880
+ # Marks this record as read only.
2881
+ def readonly!
2882
+ @readonly = true
2883
+ end
2884
+
2885
+ # Returns the contents of the record as a nicely formatted string.
2886
+ def inspect
2887
+ attributes_as_nice_string = self.class.column_names.collect { |name|
2888
+ if has_attribute?(name) || new_record?
2889
+ "#{name}: #{attribute_for_inspect(name)}"
2890
+ end
2891
+ }.compact.join(", ")
2892
+ "#<#{self.class} #{attributes_as_nice_string}>"
2893
+ end
2894
+
2895
+ private
2896
+ # Assigns attributes, dealing nicely with both multi and single paramater attributes
2897
+ # Assumes attributes is a hash
2898
+
2899
+ def assign_attributes(attributes={})
2900
+ multiparameter_attributes = []
2901
+
2902
+ attributes.each do |k, v|
2903
+ if k.to_s.include?("(")
2904
+ multiparameter_attributes << [ k, v ]
2905
+ else
2906
+ respond_to?(:"#{k}=") ? send(:"#{k}=", v) : raise(UnknownAttributeError, "unknown attribute: #{k}")
2907
+ end
2908
+ end
2909
+
2910
+ assign_multiparameter_attributes(multiparameter_attributes) unless multiparameter_attributes.empty?
2911
+ end
2912
+
2913
+ def create_or_update
2914
+ raise ReadOnlyRecord if readonly?
2915
+ result = new_record? ? create : update
2916
+ result != false
2917
+ end
2918
+
2919
+ # Updates the associated record with values matching those of the instance attributes.
2920
+ # Returns the number of affected rows.
2921
+ def update(attribute_names = @attributes.keys)
2922
+ quoted_attributes = attributes_with_quotes(false, false, attribute_names)
2923
+ return 0 if quoted_attributes.empty?
2924
+ connection.update(
2925
+ "UPDATE #{self.class.quoted_table_name} " +
2926
+ "SET #{quoted_comma_pair_list(connection, quoted_attributes)} " +
2927
+ "WHERE #{connection.quote_column_name(self.class.primary_key)} = #{quote_value(id)}",
2928
+ "#{self.class.name} Update"
2929
+ )
2930
+ end
2931
+
2932
+ # Creates a record with values matching those of the instance attributes
2933
+ # and returns its id.
2934
+ def create
2935
+ if self.id.nil? && connection.prefetch_primary_key?(self.class.table_name)
2936
+ self.id = connection.next_sequence_value(self.class.sequence_name)
2937
+ end
2938
+
2939
+ quoted_attributes = attributes_with_quotes
2940
+
2941
+ statement = if quoted_attributes.empty?
2942
+ connection.empty_insert_statement(self.class.table_name)
2943
+ else
2944
+ "INSERT INTO #{self.class.quoted_table_name} " +
2945
+ "(#{quoted_column_names.join(', ')}) " +
2946
+ "VALUES(#{quoted_attributes.values.join(', ')})"
2947
+ end
2948
+
2949
+ self.id = connection.insert(statement, "#{self.class.name} Create",
2950
+ self.class.primary_key, self.id, self.class.sequence_name)
2951
+
2952
+ @new_record = false
2953
+ id
2954
+ end
2955
+
2956
+ # Sets the attribute used for single table inheritance to this class name if this is not the ActiveRecord::Base descendant.
2957
+ # Considering the hierarchy Reply < Message < ActiveRecord::Base, this makes it possible to do Reply.new without having to
2958
+ # set <tt>Reply[Reply.inheritance_column] = "Reply"</tt> yourself. No such attribute would be set for objects of the
2959
+ # Message class in that example.
2960
+ def ensure_proper_type
2961
+ unless self.class.descends_from_active_record?
2962
+ write_attribute(self.class.inheritance_column, self.class.sti_name)
2963
+ end
2964
+ end
2965
+
2966
+ def convert_number_column_value(value)
2967
+ if value == false
2968
+ 0
2969
+ elsif value == true
2970
+ 1
2971
+ elsif value.is_a?(String) && value.blank?
2972
+ nil
2973
+ else
2974
+ value
2975
+ end
2976
+ end
2977
+
2978
+ def remove_attributes_protected_from_mass_assignment(attributes)
2979
+ safe_attributes =
2980
+ if self.class.accessible_attributes.nil? && self.class.protected_attributes.nil?
2981
+ attributes.reject { |key, value| attributes_protected_by_default.include?(key.gsub(/\(.+/, "")) }
2982
+ elsif self.class.protected_attributes.nil?
2983
+ attributes.reject { |key, value| !self.class.accessible_attributes.include?(key.gsub(/\(.+/, "")) || attributes_protected_by_default.include?(key.gsub(/\(.+/, "")) }
2984
+ elsif self.class.accessible_attributes.nil?
2985
+ attributes.reject { |key, value| self.class.protected_attributes.include?(key.gsub(/\(.+/,"")) || attributes_protected_by_default.include?(key.gsub(/\(.+/, "")) }
2986
+ else
2987
+ raise "Declare either attr_protected or attr_accessible for #{self.class}, but not both."
2988
+ end
2989
+
2990
+ removed_attributes = attributes.keys - safe_attributes.keys
2991
+
2992
+ if removed_attributes.any?
2993
+ log_protected_attribute_removal(removed_attributes)
2994
+ end
2995
+
2996
+ safe_attributes
2997
+ end
2998
+
2999
+ # Removes attributes which have been marked as readonly.
3000
+ def remove_readonly_attributes(attributes)
3001
+ unless self.class.readonly_attributes.nil?
3002
+ attributes.delete_if { |key, value| self.class.readonly_attributes.include?(key.gsub(/\(.+/,"")) }
3003
+ else
3004
+ attributes
3005
+ end
3006
+ end
3007
+
3008
+ def log_protected_attribute_removal(*attributes)
3009
+ logger.debug "WARNING: Can't mass-assign these protected attributes: #{attributes.join(', ')}"
3010
+ end
3011
+
3012
+ # The primary key and inheritance column can never be set by mass-assignment for security reasons.
3013
+ def attributes_protected_by_default
3014
+ default = [ self.class.primary_key, self.class.inheritance_column ]
3015
+ default << 'id' unless self.class.primary_key.eql? 'id'
3016
+ default
3017
+ end
3018
+
3019
+ # Returns a copy of the attributes hash where all the values have been safely quoted for use in
3020
+ # an SQL statement.
3021
+ def attributes_with_quotes(include_primary_key = true, include_readonly_attributes = true, attribute_names = @attributes.keys)
3022
+ quoted = {}
3023
+ connection = self.class.connection
3024
+ attribute_names.each do |name|
3025
+ if (column = column_for_attribute(name)) && (include_primary_key || !column.primary)
3026
+ value = read_attribute(name)
3027
+
3028
+ # We need explicit to_yaml because quote() does not properly convert Time/Date fields to YAML.
3029
+ if value && self.class.serialized_attributes.has_key?(name) && (value.acts_like?(:date) || value.acts_like?(:time))
3030
+ value = value.to_yaml
3031
+ end
3032
+
3033
+ quoted[name] = connection.quote(value, column)
3034
+ end
3035
+ end
3036
+ include_readonly_attributes ? quoted : remove_readonly_attributes(quoted)
3037
+ end
3038
+
3039
+ # Quote strings appropriately for SQL statements.
3040
+ def quote_value(value, column = nil)
3041
+ self.class.connection.quote(value, column)
3042
+ end
3043
+
3044
+ # Interpolate custom SQL string in instance context.
3045
+ # Optional record argument is meant for custom insert_sql.
3046
+ def interpolate_sql(sql, record = nil)
3047
+ instance_eval("%@#{sql.gsub('@', '\@')}@")
3048
+ end
3049
+
3050
+ # Initializes the attributes array with keys matching the columns from the linked table and
3051
+ # the values matching the corresponding default value of that column, so
3052
+ # that a new instance, or one populated from a passed-in Hash, still has all the attributes
3053
+ # that instances loaded from the database would.
3054
+ def attributes_from_column_definition
3055
+ self.class.columns.inject({}) do |attributes, column|
3056
+ attributes[column.name] = column.default unless column.name == self.class.primary_key
3057
+ attributes
3058
+ end
3059
+ end
3060
+
3061
+ # Instantiates objects for all attribute classes that needs more than one constructor parameter. This is done
3062
+ # by calling new on the column type or aggregation type (through composed_of) object with these parameters.
3063
+ # So having the pairs written_on(1) = "2004", written_on(2) = "6", written_on(3) = "24", will instantiate
3064
+ # written_on (a date type) with Date.new("2004", "6", "24"). You can also specify a typecast character in the
3065
+ # parentheses to have the parameters typecasted before they're used in the constructor. Use i for Fixnum, f for Float,
3066
+ # s for String, and a for Array. If all the values for a given attribute are empty, the attribute will be set to nil.
3067
+ def assign_multiparameter_attributes(pairs)
3068
+ execute_callstack_for_multiparameter_attributes(
3069
+ extract_callstack_for_multiparameter_attributes(pairs)
3070
+ )
3071
+ end
3072
+
3073
+ def instantiate_time_object(name, values)
3074
+ if self.class.send(:create_time_zone_conversion_attribute?, name, column_for_attribute(name))
3075
+ Time.zone.local(*values)
3076
+ else
3077
+ Time.time_with_datetime_fallback(@@default_timezone, *values)
3078
+ end
3079
+ end
3080
+
3081
+ def execute_callstack_for_multiparameter_attributes(callstack)
3082
+ errors = []
3083
+ callstack.each do |name, values_with_empty_parameters|
3084
+ begin
3085
+ klass = (self.class.reflect_on_aggregation(name.to_sym) || column_for_attribute(name)).klass
3086
+ # in order to allow a date to be set without a year, we must keep the empty values.
3087
+ # Otherwise, we wouldn't be able to distinguish it from a date with an empty day.
3088
+ values = values_with_empty_parameters.reject(&:nil?)
3089
+
3090
+ if values.empty?
3091
+ send(name + "=", nil)
3092
+ else
3093
+
3094
+ value = if Time == klass
3095
+ instantiate_time_object(name, values)
3096
+ elsif Date == klass
3097
+ begin
3098
+ values = values_with_empty_parameters.collect do |v| v.nil? ? 1 : v end
3099
+ Date.new(*values)
3100
+ rescue ArgumentError => ex # if Date.new raises an exception on an invalid date
3101
+ instantiate_time_object(name, values).to_date # we instantiate Time object and convert it back to a date thus using Time's logic in handling invalid dates
3102
+ end
3103
+ else
3104
+ klass.new(*values)
3105
+ end
3106
+
3107
+ send(name + "=", value)
3108
+ end
3109
+ rescue => ex
3110
+ errors << AttributeAssignmentError.new("error on assignment #{values.inspect} to #{name}", ex, name)
3111
+ end
3112
+ end
3113
+ unless errors.empty?
3114
+ raise MultiparameterAssignmentErrors.new(errors), "#{errors.size} error(s) on assignment of multiparameter attributes"
3115
+ end
3116
+ end
3117
+
3118
+ def extract_callstack_for_multiparameter_attributes(pairs)
3119
+ attributes = { }
3120
+
3121
+ for pair in pairs
3122
+ multiparameter_name, value = pair
3123
+ attribute_name = multiparameter_name.split("(").first
3124
+ attributes[attribute_name] = [] unless attributes.include?(attribute_name)
3125
+
3126
+ parameter_value = value.empty? ? nil : type_cast_attribute_value(multiparameter_name, value)
3127
+ attributes[attribute_name] << [ find_parameter_position(multiparameter_name), parameter_value ]
3128
+ end
3129
+
3130
+ attributes.each { |name, values| attributes[name] = values.sort_by{ |v| v.first }.collect { |v| v.last } }
3131
+ end
3132
+
3133
+ def type_cast_attribute_value(multiparameter_name, value)
3134
+ multiparameter_name =~ /\([0-9]*([if])\)/ ? value.send("to_" + $1) : value
3135
+ end
3136
+
3137
+ def find_parameter_position(multiparameter_name)
3138
+ multiparameter_name.scan(/\(([0-9]*).*\)/).first.first
3139
+ end
3140
+
3141
+ # Returns a comma-separated pair list, like "key1 = val1, key2 = val2".
3142
+ def comma_pair_list(hash)
3143
+ hash.map { |k,v| "#{k} = #{v}" }.join(", ")
3144
+ end
3145
+
3146
+ def quoted_column_names(attributes = attributes_with_quotes)
3147
+ connection = self.class.connection
3148
+ attributes.keys.collect do |column_name|
3149
+ connection.quote_column_name(column_name)
3150
+ end
3151
+ end
3152
+
3153
+ def self.quoted_table_name
3154
+ self.connection.quote_table_name(self.table_name)
3155
+ end
3156
+
3157
+ def quote_columns(quoter, hash)
3158
+ hash.inject({}) do |quoted, (name, value)|
3159
+ quoted[quoter.quote_column_name(name)] = value
3160
+ quoted
3161
+ end
3162
+ end
3163
+
3164
+ def quoted_comma_pair_list(quoter, hash)
3165
+ comma_pair_list(quote_columns(quoter, hash))
3166
+ end
3167
+
3168
+ def object_from_yaml(string)
3169
+ return string unless string.is_a?(String) && string =~ /^---/
3170
+ YAML::load(string) rescue string
3171
+ end
3172
+
3173
+ def clone_attributes(reader_method = :read_attribute, attributes = {})
3174
+ self.attribute_names.inject(attributes) do |attrs, name|
3175
+ attrs[name] = clone_attribute_value(reader_method, name)
3176
+ attrs
3177
+ end
3178
+ end
3179
+
3180
+ def clone_attribute_value(reader_method, attribute_name)
3181
+ value = send(reader_method, attribute_name)
3182
+ value.duplicable? ? value.clone : value
3183
+ rescue TypeError, NoMethodError
3184
+ value
3185
+ end
3186
+ end
3187
+
3188
+ Base.class_eval do
3189
+ extend QueryCache::ClassMethods
3190
+ include Validations
3191
+ include Locking::Optimistic, Locking::Pessimistic
3192
+ include AttributeMethods
3193
+ include Dirty
3194
+ include Callbacks, Observing, Timestamp
3195
+ include Associations, AssociationPreload, NamedScope
3196
+
3197
+ # AutosaveAssociation needs to be included before Transactions, because we want
3198
+ # #save_with_autosave_associations to be wrapped inside a transaction.
3199
+ include AutosaveAssociation, NestedAttributes
3200
+
3201
+ include Aggregations, Transactions, Reflection, Batches, Calculations, Serialization
3202
+ end
3203
+ end
3204
+
3205
+ # TODO: Remove this and make it work with LAZY flag
3206
+ require 'active_record/connection_adapters/abstract_adapter'