radiant 0.5.2 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of radiant might be problematic. Click here for more details.

Files changed (1442) hide show
  1. data/CHANGELOG +70 -1
  2. data/CONTRIBUTORS +22 -5
  3. data/INSTALL +36 -0
  4. data/LICENSE +16 -4
  5. data/README +17 -54
  6. data/Rakefile +6 -5
  7. data/app/controllers/admin/{model_controller.rb → abstract_model_controller.rb} +32 -21
  8. data/app/controllers/admin/export_controller.rb +1 -3
  9. data/app/controllers/admin/extension_controller.rb +10 -0
  10. data/app/controllers/admin/layout_controller.rb +1 -3
  11. data/app/controllers/admin/page_controller.rb +58 -56
  12. data/app/controllers/admin/snippet_controller.rb +1 -4
  13. data/app/controllers/admin/user_controller.rb +3 -5
  14. data/app/controllers/admin/welcome_controller.rb +8 -10
  15. data/app/controllers/application.rb +13 -7
  16. data/app/controllers/site_controller.rb +14 -8
  17. data/app/helpers/admin/export_helper.rb +1 -1
  18. data/app/helpers/admin/extension_helper.rb +2 -0
  19. data/app/helpers/admin/page_helper.rb +29 -4
  20. data/app/helpers/application_helper.rb +30 -13
  21. data/app/models/archive_day_index_page.rb +28 -0
  22. data/app/models/archive_finder.rb +7 -4
  23. data/app/models/archive_month_index_page.rb +28 -0
  24. data/app/models/archive_page.rb +36 -0
  25. data/app/models/archive_year_index_page.rb +28 -0
  26. data/app/{behaviors/env_behavior.rb → models/env_dump_page.rb} +5 -6
  27. data/app/models/file_not_found_page.rb +28 -0
  28. data/app/models/layout.rb +4 -1
  29. data/app/models/page.rb +193 -30
  30. data/app/models/page_context.rb +6 -493
  31. data/app/models/page_part.rb +5 -1
  32. data/app/models/radiant/config.rb +18 -5
  33. data/app/models/radiant/extension_meta.rb +5 -0
  34. data/app/models/response_cache.rb +89 -28
  35. data/app/models/snippet.rb +5 -2
  36. data/app/models/standard_tags.rb +601 -0
  37. data/app/models/status.rb +2 -2
  38. data/app/models/text_filter.rb +20 -6
  39. data/app/models/user.rb +3 -0
  40. data/app/views/admin/extension/index.rhtml +45 -0
  41. data/app/views/admin/layout/{new.rhtml → edit.rhtml} +6 -4
  42. data/app/views/admin/layout/index.rhtml +3 -3
  43. data/app/views/admin/layout/remove.rhtml +1 -1
  44. data/app/views/admin/page/_meta_row.rhtml +4 -0
  45. data/app/views/admin/page/_node.rhtml +9 -9
  46. data/app/views/admin/page/_part.rhtml +3 -2
  47. data/app/views/admin/page/_tag_reference.rhtml +4 -0
  48. data/app/views/admin/page/{new.rhtml → edit.rhtml} +223 -164
  49. data/app/views/admin/page/filter_reference.rjs +5 -0
  50. data/app/views/admin/page/index.rhtml +3 -168
  51. data/app/views/admin/page/tag_reference.rjs +5 -0
  52. data/app/views/admin/snippet/{new.rhtml → edit.rhtml} +2 -1
  53. data/app/views/admin/snippet/index.rhtml +3 -3
  54. data/app/views/admin/user/{new.rhtml → edit.rhtml} +7 -1
  55. data/app/views/admin/user/index.rhtml +2 -2
  56. data/app/views/layouts/application.rhtml +45 -37
  57. data/bin/radiant +44 -421
  58. data/config/boot.rb +14 -60
  59. data/config/database.mysql.yml +5 -0
  60. data/config/database.postgresql.yml +5 -0
  61. data/config/database.sqlite.yml +11 -15
  62. data/config/database.sqlserver.yml +20 -0
  63. data/config/environment.rb +13 -18
  64. data/config/environments/production.rb +1 -3
  65. data/config/environments/test.rb +2 -0
  66. data/config/routes.rb +8 -0
  67. data/db/migrate/001_create_radiant_tables.rb +6 -6
  68. data/db/migrate/002_insert_initial_data.rb +5 -45
  69. data/db/migrate/006_integer_columns_to_boolean.rb +26 -1
  70. data/db/migrate/010_merge_behaviors_and_pages.rb +57 -0
  71. data/db/migrate/011_rename_type_column_on_page_to_class_name.rb +9 -0
  72. data/db/migrate/012_create_extension_meta.rb +13 -0
  73. data/db/migrate/013_add_notes_field_to_user.rb +9 -0
  74. data/db/migrate/014_rename_config_default_parts_key.rb +17 -0
  75. data/db/migrate/015_add_optimistic_locking.rb +15 -0
  76. data/db/schema.rb +54 -43
  77. data/db/templates/simple-blog.yml +3 -3
  78. data/db/templates/styled-blog.yml +3 -3
  79. data/lib/annotatable.rb +52 -0
  80. data/lib/archive_index_tags_and_methods.rb +57 -0
  81. data/lib/generators/extension/USAGE +28 -0
  82. data/lib/generators/extension/extension_generator.rb +38 -0
  83. data/lib/generators/extension/templates/README +3 -0
  84. data/lib/generators/extension/templates/Rakefile +25 -0
  85. data/lib/generators/extension/templates/extension.rb +21 -0
  86. data/lib/generators/extension/templates/functional_test.rb +15 -0
  87. data/lib/generators/extension/templates/migration.rb +9 -0
  88. data/lib/generators/extension/templates/tasks.rake +17 -0
  89. data/lib/generators/extension/templates/test_helper.rb +18 -0
  90. data/lib/generators/extension_controller/USAGE +34 -0
  91. data/lib/generators/extension_controller/extension_controller_generator.rb +26 -0
  92. data/lib/generators/extension_controller/templates/controller.rb +14 -0
  93. data/lib/generators/extension_controller/templates/functional_test.rb +17 -0
  94. data/lib/generators/extension_controller/templates/helper.rb +2 -0
  95. data/lib/generators/extension_controller/templates/view.rhtml +2 -0
  96. data/lib/generators/extension_model/USAGE +34 -0
  97. data/lib/generators/extension_model/extension_model_generator.rb +26 -0
  98. data/lib/generators/extension_model/templates/fixtures.yml +11 -0
  99. data/lib/generators/extension_model/templates/migration.rb +13 -0
  100. data/lib/generators/extension_model/templates/model.rb +2 -0
  101. data/lib/generators/extension_model/templates/unit_test.rb +10 -0
  102. data/lib/generators/instance/instance_generator.rb +116 -0
  103. data/lib/generators/instance/templates/databases/mysql.yml +47 -0
  104. data/lib/generators/instance/templates/databases/postgresql.yml +44 -0
  105. data/lib/generators/instance/templates/databases/sqlite3.yml +16 -0
  106. data/lib/generators/instance/templates/databases/sqlserver.yml +20 -0
  107. data/lib/generators/instance/templates/instance_boot.rb +41 -0
  108. data/lib/generators/instance/templates/instance_environment.rb +6 -0
  109. data/lib/generators/instance/templates/instance_generate +16 -0
  110. data/lib/generators/instance/templates/instance_rakefile +3 -0
  111. data/lib/generators/instance/templates/instance_routes.rb +1 -0
  112. data/lib/inheritable_class_attributes.rb +1 -1
  113. data/lib/login_system.rb +2 -2
  114. data/lib/method_observer.rb +50 -0
  115. data/lib/plugins/active_record_extensions/init.rb +1 -0
  116. data/lib/plugins/active_record_extensions/lib/active_record_extensions.rb +18 -0
  117. data/lib/plugins/extension_patches/init.rb +5 -0
  118. data/lib/plugins/extension_patches/lib/fixture_loading_extension.rb +49 -0
  119. data/lib/plugins/extension_patches/lib/generator_base_extension.rb +24 -0
  120. data/lib/plugins/extension_patches/lib/mailer_view_paths_extension.rb +88 -0
  121. data/lib/plugins/extension_patches/lib/routing_extension.rb +31 -0
  122. data/lib/plugins/extension_patches/lib/view_paths_extension.rb +23 -0
  123. data/lib/plugins/object_extensions/init.rb +1 -0
  124. data/lib/plugins/object_extensions/lib/object_extensions.rb +5 -0
  125. data/lib/plugins/response_cache_timeout/init.rb +3 -0
  126. data/lib/plugins/string_extensions/init.rb +1 -0
  127. data/lib/plugins/string_extensions/lib/string_extensions.rb +11 -0
  128. data/lib/radiant.rb +9 -3
  129. data/lib/radiant/admin_ui.rb +82 -0
  130. data/lib/radiant/extension.rb +77 -0
  131. data/lib/radiant/extension_loader.rb +107 -0
  132. data/lib/radiant/extension_migrator.rb +47 -0
  133. data/lib/radiant/initializer.rb +66 -0
  134. data/lib/radiant/setup.rb +209 -0
  135. data/lib/radiant/taggable.rb +74 -0
  136. data/lib/simpleton.rb +21 -0
  137. data/lib/tasks/database.rake +32 -0
  138. data/lib/tasks/environments.rake +11 -0
  139. data/lib/tasks/extensions.rake +27 -0
  140. data/lib/tasks/framework.rake +123 -0
  141. data/lib/tasks/instance.rake +23 -0
  142. data/lib/tasks/release.rake +27 -26
  143. data/lib/tasks/undefine.rake +24 -0
  144. data/log/.keep +0 -0
  145. data/public/images/{add-child.png → admin/add-child.png} +0 -0
  146. data/public/images/{brown-bottom-line.gif → admin/brown-bottom-line.gif} +0 -0
  147. data/public/images/{clear-page-cache.png → admin/clear-page-cache.png} +0 -0
  148. data/public/images/{collapse.png → admin/collapse.png} +0 -0
  149. data/public/images/{expand.png → admin/expand.png} +0 -0
  150. data/public/images/{layout.png → admin/layout.png} +0 -0
  151. data/public/images/{minus.png → admin/minus.png} +0 -0
  152. data/public/images/{new-homepage.png → admin/new-homepage.png} +0 -0
  153. data/public/images/{new-layout.png → admin/new-layout.png} +0 -0
  154. data/public/images/{new-snippet.png → admin/new-snippet.png} +0 -0
  155. data/public/images/{new-user.png → admin/new-user.png} +0 -0
  156. data/public/images/{page.png → admin/page.png} +0 -0
  157. data/public/images/{plus.png → admin/plus.png} +0 -0
  158. data/public/images/{remove-disabled.png → admin/remove-disabled.png} +0 -0
  159. data/public/images/{remove.png → admin/remove.png} +0 -0
  160. data/public/images/{snippet.png → admin/snippet.png} +0 -0
  161. data/public/images/{spinner.gif → admin/spinner.gif} +0 -0
  162. data/public/images/{view-site.gif → admin/view-site.gif} +0 -0
  163. data/public/images/{virtual-page.png → admin/virtual-page.png} +0 -0
  164. data/public/javascripts/controls.js +41 -23
  165. data/public/javascripts/dragdrop.js +105 -76
  166. data/public/javascripts/effects.js +293 -163
  167. data/public/javascripts/pngfix.js +1 -40
  168. data/public/javascripts/prototype.js +679 -300
  169. data/public/javascripts/sitemap.js +176 -0
  170. data/public/javascripts/tag_reference_search.js +30 -0
  171. data/public/stylesheets/{admin.css → admin/main.css} +167 -21
  172. data/script/process/inspector +3 -0
  173. data/test/fixtures/extensions/basic/app/controllers/basic_extension_controller.rb +7 -0
  174. data/test/fixtures/extensions/basic/app/models/basic_extension_mailer.rb +4 -0
  175. data/test/fixtures/extensions/basic/app/models/basic_extension_model.rb +2 -0
  176. data/test/fixtures/extensions/basic/app/views/basic_extension/index.rhtml +1 -0
  177. data/test/fixtures/extensions/basic/app/views/basic_extension/override.rhtml +1 -0
  178. data/test/fixtures/extensions/basic/app/views/basic_extension_mailer/message.rhtml +1 -0
  179. data/test/fixtures/extensions/basic/basic_extension.rb +17 -0
  180. data/test/fixtures/extensions/basic/db/migrate/001_create_initial_schema.rb +8 -0
  181. data/test/fixtures/extensions/basic/db/migrate/002_modify_initial_schema.rb +8 -0
  182. data/test/fixtures/extensions/overriding/app/views/basic_extension/override.rhtml +1 -0
  183. data/test/fixtures/extensions/overriding/overriding_extension.rb +11 -0
  184. data/test/fixtures/pages.yml +14 -12
  185. data/test/fixtures/sample.txt +1 -0
  186. data/test/fixtures/snippets.yml +9 -1
  187. data/test/functional/admin/abstract_model_controller_test.rb +125 -0
  188. data/test/functional/admin/export_controller_test.rb +3 -3
  189. data/test/functional/admin/extension_controller_test.rb +40 -0
  190. data/test/functional/admin/layout_controller_test.rb +3 -3
  191. data/test/functional/admin/page_controller_test.rb +54 -6
  192. data/test/functional/admin/user_controller_test.rb +6 -6
  193. data/test/functional/admin/welcome_controller_test.rb +6 -6
  194. data/test/functional/application_controller_test.rb +11 -11
  195. data/test/functional/extension_initialization_test.rb +94 -0
  196. data/test/functional/login_system_test.rb +45 -72
  197. data/test/functional/site_controller_test.rb +20 -13
  198. data/test/helpers/archive_index_test_helper.rb +2 -0
  199. data/test/helpers/extension_fixture_test_helper.rb +40 -0
  200. data/test/helpers/extension_tag_test_helper.rb +17 -0
  201. data/test/helpers/page_test_helper.rb +33 -1
  202. data/test/helpers/render_test_helper.rb +57 -0
  203. data/test/helpers/routing_test_helper.rb +19 -0
  204. data/test/test_helper.rb +26 -7
  205. data/test/unit/admin_ui_test.rb +93 -0
  206. data/test/unit/annotatable_test.rb +76 -0
  207. data/test/unit/{behaviors/archive_day_index_behavior_test.rb → archive_day_index_page_test.rb} +4 -3
  208. data/test/unit/{behaviors/archive_month_index_behavior_test.rb → archive_month_index_page_test.rb} +5 -4
  209. data/test/unit/{behaviors/archive_behavior_test.rb → archive_page_test.rb} +3 -2
  210. data/test/unit/{behaviors/archive_year_index_behavior_test.rb → archive_year_index_page_test.rb} +5 -4
  211. data/test/unit/extension_migrator_test.rb +17 -0
  212. data/test/unit/extension_test.rb +42 -0
  213. data/test/unit/{behaviors/page_missing_behavior_test.rb → file_not_found_page_test.rb} +4 -4
  214. data/test/unit/method_observer_test.rb +53 -0
  215. data/test/unit/page_context_test.rb +8 -356
  216. data/test/unit/page_test.rb +250 -64
  217. data/test/unit/radiant/config_test.rb +11 -0
  218. data/test/unit/radiant/taggable_test.rb +105 -0
  219. data/test/unit/response_cache_test.rb +69 -15
  220. data/test/unit/simpleton_test.rb +42 -0
  221. data/test/unit/standard_tags_test.rb +424 -0
  222. data/test/unit/text_filter_test.rb +31 -3
  223. data/test/unit/user_test.rb +1 -2
  224. data/vendor/bluecloth/CHANGES +366 -0
  225. data/vendor/bluecloth/LICENSE +340 -0
  226. data/vendor/bluecloth/README +99 -0
  227. data/vendor/bluecloth/bin/bluecloth +83 -0
  228. data/vendor/bluecloth/install.rb +150 -0
  229. data/vendor/bluecloth/lib/bluecloth.rb +1144 -0
  230. data/vendor/bluecloth/test.rb +117 -0
  231. data/vendor/bluecloth/tests/00_Class.tests.rb +71 -0
  232. data/vendor/bluecloth/tests/05_Markdown.tests.rb +1527 -0
  233. data/vendor/bluecloth/tests/10_Bug.tests.rb +57 -0
  234. data/vendor/bluecloth/tests/15_Contrib.tests.rb +132 -0
  235. data/vendor/bluecloth/tests/bctestcase.rb +274 -0
  236. data/vendor/bluecloth/tests/data/antsugar.txt +34 -0
  237. data/vendor/bluecloth/tests/data/ml-announce.txt +17 -0
  238. data/vendor/bluecloth/tests/data/re-overflow.txt +67 -0
  239. data/vendor/bluecloth/tests/data/re-overflow2.txt +281 -0
  240. data/vendor/bluecloth/utils.rb +553 -0
  241. data/vendor/extensions/markdown_filter/README +1 -0
  242. data/vendor/extensions/markdown_filter/Rakefile +25 -0
  243. data/vendor/extensions/markdown_filter/lib/markdown_filter.rb +9 -0
  244. data/vendor/extensions/markdown_filter/lib/smarty_pants_filter.rb +9 -0
  245. data/vendor/extensions/markdown_filter/lib/tasks/textile_filter_extension_tasks.rake +0 -0
  246. data/vendor/extensions/markdown_filter/markdown.html +123 -0
  247. data/vendor/extensions/markdown_filter/markdown_filter_extension.rb +10 -0
  248. data/vendor/extensions/markdown_filter/smartypants.html +47 -0
  249. data/vendor/extensions/markdown_filter/test/test_helper.rb +10 -0
  250. data/vendor/extensions/markdown_filter/test/unit/markdown_filter_test.rb +18 -0
  251. data/vendor/extensions/markdown_filter/test/unit/smarty_pants_filter_test.rb +14 -0
  252. data/vendor/extensions/textile_filter/README +1 -0
  253. data/vendor/extensions/textile_filter/Rakefile +25 -0
  254. data/vendor/extensions/textile_filter/lib/tasks/textile_filter_extension_tasks.rake +0 -0
  255. data/vendor/extensions/textile_filter/lib/textile_filter.rb +8 -0
  256. data/vendor/extensions/textile_filter/test/test_helper.rb +10 -0
  257. data/vendor/extensions/textile_filter/test/unit/textile_filter_test.rb +13 -0
  258. data/vendor/extensions/textile_filter/textile.html +115 -0
  259. data/vendor/extensions/textile_filter/textile_filter_extension.rb +9 -0
  260. data/vendor/highline/AUTHORS +2 -0
  261. data/vendor/highline/CHANGELOG +183 -0
  262. data/vendor/highline/COPYING +340 -0
  263. data/vendor/highline/INSTALL +35 -0
  264. data/vendor/highline/LICENSE +7 -0
  265. data/vendor/highline/README +63 -0
  266. data/vendor/highline/Rakefile +82 -0
  267. data/vendor/highline/TODO +6 -0
  268. data/vendor/highline/examples/ansi_colors.rb +38 -0
  269. data/vendor/highline/examples/asking_for_arrays.rb +18 -0
  270. data/vendor/highline/examples/basic_usage.rb +75 -0
  271. data/vendor/highline/examples/color_scheme.rb +32 -0
  272. data/vendor/highline/examples/menus.rb +65 -0
  273. data/vendor/highline/examples/overwrite.rb +19 -0
  274. data/vendor/highline/examples/page_and_wrap.rb +322 -0
  275. data/vendor/highline/examples/password.rb +7 -0
  276. data/vendor/highline/examples/trapping_eof.rb +22 -0
  277. data/vendor/highline/examples/using_readline.rb +17 -0
  278. data/vendor/highline/lib/highline.rb +704 -0
  279. data/vendor/highline/lib/highline/color_scheme.rb +120 -0
  280. data/vendor/highline/lib/highline/import.rb +43 -0
  281. data/vendor/highline/lib/highline/menu.rb +395 -0
  282. data/vendor/highline/lib/highline/question.rb +462 -0
  283. data/vendor/highline/lib/highline/system_extensions.rb +125 -0
  284. data/vendor/highline/setup.rb +1360 -0
  285. data/vendor/highline/site/highline.css +65 -0
  286. data/vendor/highline/site/images/logo.png +0 -0
  287. data/vendor/highline/site/index.html +59 -0
  288. data/vendor/highline/test/tc_color_scheme.rb +56 -0
  289. data/vendor/highline/test/tc_highline.rb +780 -0
  290. data/vendor/highline/test/tc_import.rb +54 -0
  291. data/vendor/highline/test/tc_menu.rb +429 -0
  292. data/vendor/highline/test/ts_all.rb +15 -0
  293. data/vendor/plugins/default_order/README +35 -0
  294. data/vendor/plugins/default_order/Rakefile +22 -0
  295. data/vendor/plugins/default_order/init.rb +1 -0
  296. data/vendor/plugins/default_order/lib/default_order.rb +32 -0
  297. data/vendor/plugins/default_order/test/default_order_test.rb +5 -0
  298. data/vendor/radius/CHANGELOG +25 -0
  299. data/vendor/radius/QUICKSTART +323 -0
  300. data/vendor/radius/README +97 -0
  301. data/vendor/radius/ROADMAP +12 -0
  302. data/vendor/radius/Rakefile +86 -0
  303. data/vendor/radius/lib/radius.rb +497 -0
  304. data/vendor/radius/test/radius_test.rb +321 -0
  305. data/vendor/rails/actionmailer/CHANGELOG +297 -0
  306. data/vendor/rails/actionmailer/MIT-LICENSE +21 -0
  307. data/vendor/rails/actionmailer/README +145 -0
  308. data/vendor/rails/actionmailer/Rakefile +95 -0
  309. data/vendor/rails/actionmailer/install.rb +30 -0
  310. data/vendor/rails/actionmailer/lib/action_mailer.rb +50 -0
  311. data/vendor/rails/actionmailer/lib/action_mailer/adv_attr_accessor.rb +30 -0
  312. data/vendor/rails/actionmailer/lib/action_mailer/base.rb +582 -0
  313. data/vendor/rails/actionmailer/lib/action_mailer/helpers.rb +111 -0
  314. data/vendor/rails/actionmailer/lib/action_mailer/mail_helper.rb +19 -0
  315. data/vendor/rails/actionmailer/lib/action_mailer/part.rb +113 -0
  316. data/vendor/rails/actionmailer/lib/action_mailer/part_container.rb +51 -0
  317. data/vendor/rails/actionmailer/lib/action_mailer/quoting.rb +59 -0
  318. data/vendor/rails/actionmailer/lib/action_mailer/utils.rb +8 -0
  319. data/vendor/rails/actionmailer/lib/action_mailer/vendor/text/format.rb +1466 -0
  320. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail.rb +3 -0
  321. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/address.rb +242 -0
  322. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/attachments.rb +39 -0
  323. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/base64.rb +71 -0
  324. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/config.rb +69 -0
  325. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/encode.rb +467 -0
  326. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/facade.rb +552 -0
  327. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/header.rb +914 -0
  328. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/info.rb +35 -0
  329. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/loader.rb +1 -0
  330. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/mail.rb +447 -0
  331. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/mailbox.rb +433 -0
  332. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/mbox.rb +1 -0
  333. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/net.rb +280 -0
  334. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/obsolete.rb +135 -0
  335. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/parser.rb +1522 -0
  336. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/port.rb +377 -0
  337. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/quoting.rb +131 -0
  338. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/scanner.rb +41 -0
  339. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/scanner_r.rb +263 -0
  340. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/stringio.rb +277 -0
  341. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/tmail.rb +1 -0
  342. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/utils.rb +238 -0
  343. data/vendor/rails/actionmailer/lib/action_mailer/version.rb +9 -0
  344. data/vendor/rails/actionmailer/test/abstract_unit.rb +30 -0
  345. data/vendor/rails/actionmailer/test/fixtures/first_mailer/share.rhtml +1 -0
  346. data/vendor/rails/actionmailer/test/fixtures/helper_mailer/use_helper.rhtml +1 -0
  347. data/vendor/rails/actionmailer/test/fixtures/helper_mailer/use_helper_method.rhtml +1 -0
  348. data/vendor/rails/actionmailer/test/fixtures/helper_mailer/use_mail_helper.rhtml +5 -0
  349. data/vendor/rails/actionmailer/test/fixtures/helper_mailer/use_test_helper.rhtml +1 -0
  350. data/vendor/rails/actionmailer/test/fixtures/helpers/test_helper.rb +5 -0
  351. data/vendor/rails/actionmailer/test/fixtures/path.with.dots/funky_path_mailer/multipart_with_template_path_with_dots.rhtml +1 -0
  352. data/vendor/rails/actionmailer/test/fixtures/path.with.dots/multipart_with_template_path_with_dots.rhtml +0 -0
  353. data/vendor/rails/actionmailer/test/fixtures/raw_email +14 -0
  354. data/vendor/rails/actionmailer/test/fixtures/raw_email10 +20 -0
  355. data/vendor/rails/actionmailer/test/fixtures/raw_email11 +34 -0
  356. data/vendor/rails/actionmailer/test/fixtures/raw_email12 +32 -0
  357. data/vendor/rails/actionmailer/test/fixtures/raw_email13 +29 -0
  358. data/vendor/rails/actionmailer/test/fixtures/raw_email2 +114 -0
  359. data/vendor/rails/actionmailer/test/fixtures/raw_email3 +70 -0
  360. data/vendor/rails/actionmailer/test/fixtures/raw_email4 +59 -0
  361. data/vendor/rails/actionmailer/test/fixtures/raw_email5 +19 -0
  362. data/vendor/rails/actionmailer/test/fixtures/raw_email6 +20 -0
  363. data/vendor/rails/actionmailer/test/fixtures/raw_email7 +66 -0
  364. data/vendor/rails/actionmailer/test/fixtures/raw_email8 +47 -0
  365. data/vendor/rails/actionmailer/test/fixtures/raw_email9 +28 -0
  366. data/vendor/rails/actionmailer/test/fixtures/raw_email_quoted_with_0d0a +14 -0
  367. data/vendor/rails/actionmailer/test/fixtures/raw_email_with_partially_quoted_subject +14 -0
  368. data/vendor/rails/actionmailer/test/fixtures/second_mailer/share.rhtml +1 -0
  369. data/vendor/rails/actionmailer/test/fixtures/templates/signed_up.rhtml +3 -0
  370. data/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.ignored.rhtml +1 -0
  371. data/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.html.rhtml +10 -0
  372. data/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.plain.rhtml +2 -0
  373. data/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.yaml.rhtml +1 -0
  374. data/vendor/rails/actionmailer/test/fixtures/test_mailer/signed_up.rhtml +3 -0
  375. data/vendor/rails/actionmailer/test/fixtures/test_mailer/signed_up_with_url.rhtml +3 -0
  376. data/vendor/rails/actionmailer/test/mail_helper_test.rb +91 -0
  377. data/vendor/rails/actionmailer/test/mail_render_test.rb +79 -0
  378. data/vendor/rails/actionmailer/test/mail_service_test.rb +816 -0
  379. data/vendor/rails/actionmailer/test/quoting_test.rb +57 -0
  380. data/vendor/rails/actionmailer/test/tmail_test.rb +13 -0
  381. data/vendor/rails/actionmailer/test/url_test.rb +68 -0
  382. data/vendor/rails/actionpack/CHANGELOG +3138 -0
  383. data/vendor/rails/actionpack/MIT-LICENSE +21 -0
  384. data/vendor/rails/actionpack/README +469 -0
  385. data/vendor/rails/actionpack/RUNNING_UNIT_TESTS +25 -0
  386. data/vendor/rails/actionpack/Rakefile +154 -0
  387. data/vendor/rails/actionpack/examples/address_book/index.rhtml +33 -0
  388. data/vendor/rails/actionpack/examples/address_book/layout.rhtml +8 -0
  389. data/vendor/rails/actionpack/examples/address_book_controller.cgi +9 -0
  390. data/vendor/rails/actionpack/examples/address_book_controller.fcgi +6 -0
  391. data/vendor/rails/actionpack/examples/address_book_controller.rb +52 -0
  392. data/vendor/rails/actionpack/examples/address_book_controller.rbx +4 -0
  393. data/vendor/rails/actionpack/examples/benchmark.rb +52 -0
  394. data/vendor/rails/actionpack/examples/benchmark_with_ar.fcgi +89 -0
  395. data/vendor/rails/actionpack/examples/blog_controller.cgi +53 -0
  396. data/vendor/rails/actionpack/examples/debate/index.rhtml +14 -0
  397. data/vendor/rails/actionpack/examples/debate/new_topic.rhtml +22 -0
  398. data/vendor/rails/actionpack/examples/debate/topic.rhtml +32 -0
  399. data/vendor/rails/actionpack/examples/debate_controller.cgi +57 -0
  400. data/vendor/rails/actionpack/install.rb +30 -0
  401. data/vendor/rails/actionpack/lib/action_controller.rb +83 -0
  402. data/vendor/rails/actionpack/lib/action_controller/assertions.rb +82 -0
  403. data/vendor/rails/actionpack/lib/action_controller/assertions/deprecated_assertions.rb +228 -0
  404. data/vendor/rails/actionpack/lib/action_controller/assertions/dom_assertions.rb +25 -0
  405. data/vendor/rails/actionpack/lib/action_controller/assertions/model_assertions.rb +12 -0
  406. data/vendor/rails/actionpack/lib/action_controller/assertions/response_assertions.rb +140 -0
  407. data/vendor/rails/actionpack/lib/action_controller/assertions/routing_assertions.rb +98 -0
  408. data/vendor/rails/actionpack/lib/action_controller/assertions/selector_assertions.rb +571 -0
  409. data/vendor/rails/actionpack/lib/action_controller/assertions/tag_assertions.rb +117 -0
  410. data/vendor/rails/actionpack/lib/action_controller/base.rb +1231 -0
  411. data/vendor/rails/actionpack/lib/action_controller/benchmarking.rb +89 -0
  412. data/vendor/rails/actionpack/lib/action_controller/caching.rb +616 -0
  413. data/vendor/rails/actionpack/lib/action_controller/cgi_ext/cgi_ext.rb +36 -0
  414. data/vendor/rails/actionpack/lib/action_controller/cgi_ext/cgi_methods.rb +211 -0
  415. data/vendor/rails/actionpack/lib/action_controller/cgi_ext/cookie_performance_fix.rb +125 -0
  416. data/vendor/rails/actionpack/lib/action_controller/cgi_ext/raw_post_data_fix.rb +95 -0
  417. data/vendor/rails/actionpack/lib/action_controller/cgi_ext/session_performance_fix.rb +30 -0
  418. data/vendor/rails/actionpack/lib/action_controller/cgi_process.rb +231 -0
  419. data/vendor/rails/actionpack/lib/action_controller/components.rb +182 -0
  420. data/vendor/rails/actionpack/lib/action_controller/cookies.rb +78 -0
  421. data/vendor/rails/actionpack/lib/action_controller/deprecated_dependencies.rb +65 -0
  422. data/vendor/rails/actionpack/lib/action_controller/deprecated_redirects.rb +17 -0
  423. data/vendor/rails/actionpack/lib/action_controller/deprecated_request_methods.rb +34 -0
  424. data/vendor/rails/actionpack/lib/action_controller/filters.rb +667 -0
  425. data/vendor/rails/actionpack/lib/action_controller/flash.rb +182 -0
  426. data/vendor/rails/actionpack/lib/action_controller/helpers.rb +131 -0
  427. data/vendor/rails/actionpack/lib/action_controller/integration.rb +552 -0
  428. data/vendor/rails/actionpack/lib/action_controller/layout.rb +313 -0
  429. data/vendor/rails/actionpack/lib/action_controller/macros/auto_complete.rb +53 -0
  430. data/vendor/rails/actionpack/lib/action_controller/macros/in_place_editing.rb +33 -0
  431. data/vendor/rails/actionpack/lib/action_controller/mime_responds.rb +181 -0
  432. data/vendor/rails/actionpack/lib/action_controller/mime_type.rb +200 -0
  433. data/vendor/rails/actionpack/lib/action_controller/pagination.rb +402 -0
  434. data/vendor/rails/actionpack/lib/action_controller/request.rb +265 -0
  435. data/vendor/rails/actionpack/lib/action_controller/rescue.rb +142 -0
  436. data/vendor/rails/actionpack/lib/action_controller/resources.rb +405 -0
  437. data/vendor/rails/actionpack/lib/action_controller/response.rb +35 -0
  438. data/vendor/rails/actionpack/lib/action_controller/routing.rb +1340 -0
  439. data/vendor/rails/actionpack/lib/action_controller/scaffolding.rb +189 -0
  440. data/vendor/rails/actionpack/lib/action_controller/session/active_record_store.rb +335 -0
  441. data/vendor/rails/actionpack/lib/action_controller/session/drb_server.rb +32 -0
  442. data/vendor/rails/actionpack/lib/action_controller/session/drb_store.rb +35 -0
  443. data/vendor/rails/actionpack/lib/action_controller/session/mem_cache_store.rb +105 -0
  444. data/vendor/rails/actionpack/lib/action_controller/session_management.rb +142 -0
  445. data/vendor/rails/actionpack/lib/action_controller/status_codes.rb +88 -0
  446. data/vendor/rails/actionpack/lib/action_controller/streaming.rb +138 -0
  447. data/vendor/rails/actionpack/lib/action_controller/templates/rescues/_request_and_response.rhtml +44 -0
  448. data/vendor/rails/actionpack/lib/action_controller/templates/rescues/_trace.rhtml +26 -0
  449. data/vendor/rails/actionpack/lib/action_controller/templates/rescues/diagnostics.rhtml +11 -0
  450. data/vendor/rails/actionpack/lib/action_controller/templates/rescues/layout.rhtml +29 -0
  451. data/vendor/rails/actionpack/lib/action_controller/templates/rescues/missing_template.rhtml +2 -0
  452. data/vendor/rails/actionpack/lib/action_controller/templates/rescues/routing_error.rhtml +10 -0
  453. data/vendor/rails/actionpack/lib/action_controller/templates/rescues/template_error.rhtml +21 -0
  454. data/vendor/rails/actionpack/lib/action_controller/templates/rescues/unknown_action.rhtml +2 -0
  455. data/vendor/rails/actionpack/lib/action_controller/templates/scaffolds/edit.rhtml +7 -0
  456. data/vendor/rails/actionpack/lib/action_controller/templates/scaffolds/layout.rhtml +69 -0
  457. data/vendor/rails/actionpack/lib/action_controller/templates/scaffolds/list.rhtml +27 -0
  458. data/vendor/rails/actionpack/lib/action_controller/templates/scaffolds/new.rhtml +6 -0
  459. data/vendor/rails/actionpack/lib/action_controller/templates/scaffolds/show.rhtml +9 -0
  460. data/vendor/rails/actionpack/lib/action_controller/test_process.rb +504 -0
  461. data/vendor/rails/actionpack/lib/action_controller/url_rewriter.rb +108 -0
  462. data/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/node.rb +530 -0
  463. data/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/selector.rb +823 -0
  464. data/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  465. data/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  466. data/vendor/rails/actionpack/lib/action_controller/vendor/xml_node.rb +97 -0
  467. data/vendor/rails/actionpack/lib/action_controller/verification.rb +107 -0
  468. data/vendor/rails/actionpack/lib/action_pack.rb +24 -0
  469. data/vendor/rails/actionpack/lib/action_pack/version.rb +9 -0
  470. data/vendor/rails/actionpack/lib/action_view.rb +32 -0
  471. data/vendor/rails/actionpack/lib/action_view/base.rb +538 -0
  472. data/vendor/rails/actionpack/lib/action_view/compiled_templates.rb +70 -0
  473. data/vendor/rails/actionpack/lib/action_view/helpers/active_record_helper.rb +237 -0
  474. data/vendor/rails/actionpack/lib/action_view/helpers/asset_tag_helper.rb +218 -0
  475. data/vendor/rails/actionpack/lib/action_view/helpers/benchmark_helper.rb +24 -0
  476. data/vendor/rails/actionpack/lib/action_view/helpers/cache_helper.rb +10 -0
  477. data/vendor/rails/actionpack/lib/action_view/helpers/capture_helper.rb +128 -0
  478. data/vendor/rails/actionpack/lib/action_view/helpers/date_helper.rb +429 -0
  479. data/vendor/rails/actionpack/lib/action_view/helpers/debug_helper.rb +17 -0
  480. data/vendor/rails/actionpack/lib/action_view/helpers/deprecated_helper.rb +34 -0
  481. data/vendor/rails/actionpack/lib/action_view/helpers/form_helper.rb +446 -0
  482. data/vendor/rails/actionpack/lib/action_view/helpers/form_options_helper.rb +363 -0
  483. data/vendor/rails/actionpack/lib/action_view/helpers/form_tag_helper.rb +176 -0
  484. data/vendor/rails/actionpack/lib/action_view/helpers/java_script_macros_helper.rb +233 -0
  485. data/vendor/rails/actionpack/lib/action_view/helpers/javascript_helper.rb +193 -0
  486. data/vendor/rails/actionpack/lib/action_view/helpers/javascripts/controls.js +833 -0
  487. data/vendor/rails/actionpack/lib/action_view/helpers/javascripts/dragdrop.js +942 -0
  488. data/vendor/rails/actionpack/lib/action_view/helpers/javascripts/effects.js +1088 -0
  489. data/vendor/rails/actionpack/lib/action_view/helpers/javascripts/prototype.js +2515 -0
  490. data/vendor/rails/actionpack/lib/action_view/helpers/number_helper.rb +155 -0
  491. data/vendor/rails/actionpack/lib/action_view/helpers/pagination_helper.rb +86 -0
  492. data/vendor/rails/actionpack/lib/action_view/helpers/prototype_helper.rb +876 -0
  493. data/vendor/rails/actionpack/lib/action_view/helpers/scriptaculous_helper.rb +140 -0
  494. data/vendor/rails/actionpack/lib/action_view/helpers/tag_helper.rb +103 -0
  495. data/vendor/rails/actionpack/lib/action_view/helpers/text_helper.rb +406 -0
  496. data/vendor/rails/actionpack/lib/action_view/helpers/url_helper.rb +406 -0
  497. data/vendor/rails/actionpack/lib/action_view/partials.rb +128 -0
  498. data/vendor/rails/actionpack/lib/action_view/template_error.rb +110 -0
  499. data/vendor/rails/actionpack/test/abstract_unit.rb +16 -0
  500. data/vendor/rails/actionpack/test/active_record_unit.rb +116 -0
  501. data/vendor/rails/actionpack/test/activerecord/active_record_assertions_test.rb +92 -0
  502. data/vendor/rails/actionpack/test/activerecord/active_record_store_test.rb +142 -0
  503. data/vendor/rails/actionpack/test/activerecord/pagination_test.rb +156 -0
  504. data/vendor/rails/actionpack/test/controller/action_pack_assertions_test.rb +610 -0
  505. data/vendor/rails/actionpack/test/controller/addresses_render_test.rb +45 -0
  506. data/vendor/rails/actionpack/test/controller/assert_select_test.rb +576 -0
  507. data/vendor/rails/actionpack/test/controller/base_test.rb +136 -0
  508. data/vendor/rails/actionpack/test/controller/benchmark_test.rb +33 -0
  509. data/vendor/rails/actionpack/test/controller/caching_test.rb +228 -0
  510. data/vendor/rails/actionpack/test/controller/capture_test.rb +82 -0
  511. data/vendor/rails/actionpack/test/controller/cgi_test.rb +440 -0
  512. data/vendor/rails/actionpack/test/controller/components_test.rb +151 -0
  513. data/vendor/rails/actionpack/test/controller/content_type_test.rb +139 -0
  514. data/vendor/rails/actionpack/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  515. data/vendor/rails/actionpack/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  516. data/vendor/rails/actionpack/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  517. data/vendor/rails/actionpack/test/controller/cookie_test.rb +88 -0
  518. data/vendor/rails/actionpack/test/controller/custom_handler_test.rb +41 -0
  519. data/vendor/rails/actionpack/test/controller/deprecated_instance_variables_test.rb +48 -0
  520. data/vendor/rails/actionpack/test/controller/deprecation/deprecated_base_methods_test.rb +60 -0
  521. data/vendor/rails/actionpack/test/controller/fake_controllers.rb +16 -0
  522. data/vendor/rails/actionpack/test/controller/filter_params_test.rb +42 -0
  523. data/vendor/rails/actionpack/test/controller/filters_test.rb +695 -0
  524. data/vendor/rails/actionpack/test/controller/flash_test.rb +102 -0
  525. data/vendor/rails/actionpack/test/controller/fragment_store_setting_test.rb +45 -0
  526. data/vendor/rails/actionpack/test/controller/helper_test.rb +187 -0
  527. data/vendor/rails/actionpack/test/controller/integration_test.rb +154 -0
  528. data/vendor/rails/actionpack/test/controller/layout_test.rb +187 -0
  529. data/vendor/rails/actionpack/test/controller/mime_responds_test.rb +351 -0
  530. data/vendor/rails/actionpack/test/controller/mime_type_test.rb +33 -0
  531. data/vendor/rails/actionpack/test/controller/new_render_test.rb +750 -0
  532. data/vendor/rails/actionpack/test/controller/raw_post_test.rb +68 -0
  533. data/vendor/rails/actionpack/test/controller/redirect_test.rb +156 -0
  534. data/vendor/rails/actionpack/test/controller/render_test.rb +293 -0
  535. data/vendor/rails/actionpack/test/controller/request_test.rb +317 -0
  536. data/vendor/rails/actionpack/test/controller/resources_test.rb +482 -0
  537. data/vendor/rails/actionpack/test/controller/routing_test.rb +1801 -0
  538. data/vendor/rails/actionpack/test/controller/selector_test.rb +628 -0
  539. data/vendor/rails/actionpack/test/controller/send_file_test.rb +117 -0
  540. data/vendor/rails/actionpack/test/controller/session_management_test.rb +156 -0
  541. data/vendor/rails/actionpack/test/controller/test_test.rb +495 -0
  542. data/vendor/rails/actionpack/test/controller/url_rewriter_test.rb +115 -0
  543. data/vendor/rails/actionpack/test/controller/verification_test.rb +227 -0
  544. data/vendor/rails/actionpack/test/controller/webservice_test.rb +248 -0
  545. data/vendor/rails/actionpack/test/fixtures/addresses/list.rhtml +1 -0
  546. data/vendor/rails/actionpack/test/fixtures/companies.yml +24 -0
  547. data/vendor/rails/actionpack/test/fixtures/company.rb +9 -0
  548. data/vendor/rails/actionpack/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  549. data/vendor/rails/actionpack/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  550. data/vendor/rails/actionpack/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  551. data/vendor/rails/actionpack/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  552. data/vendor/rails/actionpack/test/fixtures/db_definitions/sqlite.sql +42 -0
  553. data/vendor/rails/actionpack/test/fixtures/deprecated_instance_variables/_cookies_ivar.rhtml +1 -0
  554. data/vendor/rails/actionpack/test/fixtures/deprecated_instance_variables/_cookies_method.rhtml +1 -0
  555. data/vendor/rails/actionpack/test/fixtures/deprecated_instance_variables/_flash_ivar.rhtml +1 -0
  556. data/vendor/rails/actionpack/test/fixtures/deprecated_instance_variables/_flash_method.rhtml +1 -0
  557. data/vendor/rails/actionpack/test/fixtures/deprecated_instance_variables/_headers_ivar.rhtml +1 -0
  558. data/vendor/rails/actionpack/test/fixtures/deprecated_instance_variables/_headers_method.rhtml +1 -0
  559. data/vendor/rails/actionpack/test/fixtures/deprecated_instance_variables/_params_ivar.rhtml +1 -0
  560. data/vendor/rails/actionpack/test/fixtures/deprecated_instance_variables/_params_method.rhtml +1 -0
  561. data/vendor/rails/actionpack/test/fixtures/deprecated_instance_variables/_request_ivar.rhtml +1 -0
  562. data/vendor/rails/actionpack/test/fixtures/deprecated_instance_variables/_request_method.rhtml +1 -0
  563. data/vendor/rails/actionpack/test/fixtures/deprecated_instance_variables/_response_ivar.rhtml +1 -0
  564. data/vendor/rails/actionpack/test/fixtures/deprecated_instance_variables/_response_method.rhtml +1 -0
  565. data/vendor/rails/actionpack/test/fixtures/deprecated_instance_variables/_session_ivar.rhtml +1 -0
  566. data/vendor/rails/actionpack/test/fixtures/deprecated_instance_variables/_session_method.rhtml +1 -0
  567. data/vendor/rails/actionpack/test/fixtures/developer.rb +7 -0
  568. data/vendor/rails/actionpack/test/fixtures/developers.yml +21 -0
  569. data/vendor/rails/actionpack/test/fixtures/developers_projects.yml +13 -0
  570. data/vendor/rails/actionpack/test/fixtures/fun/games/hello_world.rhtml +1 -0
  571. data/vendor/rails/actionpack/test/fixtures/helpers/abc_helper.rb +5 -0
  572. data/vendor/rails/actionpack/test/fixtures/helpers/fun/games_helper.rb +3 -0
  573. data/vendor/rails/actionpack/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  574. data/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  575. data/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  576. data/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  577. data/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  578. data/vendor/rails/actionpack/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  579. data/vendor/rails/actionpack/test/fixtures/layouts/builder.rxml +3 -0
  580. data/vendor/rails/actionpack/test/fixtures/layouts/standard.rhtml +1 -0
  581. data/vendor/rails/actionpack/test/fixtures/layouts/talk_from_action.rhtml +2 -0
  582. data/vendor/rails/actionpack/test/fixtures/layouts/yield.rhtml +2 -0
  583. data/vendor/rails/actionpack/test/fixtures/multipart/binary_file +0 -0
  584. data/vendor/rails/actionpack/test/fixtures/multipart/large_text_file +10 -0
  585. data/vendor/rails/actionpack/test/fixtures/multipart/mixed_files +0 -0
  586. data/vendor/rails/actionpack/test/fixtures/multipart/mona_lisa.jpg +0 -0
  587. data/vendor/rails/actionpack/test/fixtures/multipart/single_parameter +5 -0
  588. data/vendor/rails/actionpack/test/fixtures/multipart/text_file +10 -0
  589. data/vendor/rails/actionpack/test/fixtures/project.rb +3 -0
  590. data/vendor/rails/actionpack/test/fixtures/projects.yml +7 -0
  591. data/vendor/rails/actionpack/test/fixtures/public/images/rails.png +0 -0
  592. data/vendor/rails/actionpack/test/fixtures/public/javascripts/application.js +1 -0
  593. data/vendor/rails/actionpack/test/fixtures/replies.yml +13 -0
  594. data/vendor/rails/actionpack/test/fixtures/reply.rb +5 -0
  595. data/vendor/rails/actionpack/test/fixtures/respond_to/all_types_with_layout.rhtml +1 -0
  596. data/vendor/rails/actionpack/test/fixtures/respond_to/all_types_with_layout.rjs +1 -0
  597. data/vendor/rails/actionpack/test/fixtures/respond_to/layouts/standard.rhtml +1 -0
  598. data/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults.rhtml +1 -0
  599. data/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults.rjs +1 -0
  600. data/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults.rxml +1 -0
  601. data/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults_with_type_list.rhtml +1 -0
  602. data/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults_with_type_list.rjs +1 -0
  603. data/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults_with_type_list.rxml +1 -0
  604. data/vendor/rails/actionpack/test/fixtures/scope/test/modgreet.rhtml +1 -0
  605. data/vendor/rails/actionpack/test/fixtures/test/_customer.rhtml +1 -0
  606. data/vendor/rails/actionpack/test/fixtures/test/_customer_greeting.rhtml +1 -0
  607. data/vendor/rails/actionpack/test/fixtures/test/_hash_object.rhtml +1 -0
  608. data/vendor/rails/actionpack/test/fixtures/test/_hello.rxml +1 -0
  609. data/vendor/rails/actionpack/test/fixtures/test/_partial_only.rhtml +1 -0
  610. data/vendor/rails/actionpack/test/fixtures/test/_person.rhtml +2 -0
  611. data/vendor/rails/actionpack/test/fixtures/test/action_talk_to_layout.rhtml +2 -0
  612. data/vendor/rails/actionpack/test/fixtures/test/block_content_for.rhtml +2 -0
  613. data/vendor/rails/actionpack/test/fixtures/test/capturing.rhtml +4 -0
  614. data/vendor/rails/actionpack/test/fixtures/test/content_for.rhtml +2 -0
  615. data/vendor/rails/actionpack/test/fixtures/test/delete_with_js.rjs +2 -0
  616. data/vendor/rails/actionpack/test/fixtures/test/dot.directory/render_file_with_ivar.rhtml +1 -0
  617. data/vendor/rails/actionpack/test/fixtures/test/enum_rjs_test.rjs +6 -0
  618. data/vendor/rails/actionpack/test/fixtures/test/erb_content_for.rhtml +2 -0
  619. data/vendor/rails/actionpack/test/fixtures/test/greeting.rhtml +1 -0
  620. data/vendor/rails/actionpack/test/fixtures/test/hello.rxml +4 -0
  621. data/vendor/rails/actionpack/test/fixtures/test/hello_world.rhtml +1 -0
  622. data/vendor/rails/actionpack/test/fixtures/test/hello_world.rxml +3 -0
  623. data/vendor/rails/actionpack/test/fixtures/test/hello_world_container.rxml +3 -0
  624. data/vendor/rails/actionpack/test/fixtures/test/hello_world_with_layout_false.rhtml +1 -0
  625. data/vendor/rails/actionpack/test/fixtures/test/hello_xml_world.rxml +11 -0
  626. data/vendor/rails/actionpack/test/fixtures/test/list.rhtml +1 -0
  627. data/vendor/rails/actionpack/test/fixtures/test/non_erb_block_content_for.rxml +4 -0
  628. data/vendor/rails/actionpack/test/fixtures/test/potential_conflicts.rhtml +4 -0
  629. data/vendor/rails/actionpack/test/fixtures/test/render_file_with_ivar.rhtml +1 -0
  630. data/vendor/rails/actionpack/test/fixtures/test/render_file_with_locals.rhtml +1 -0
  631. data/vendor/rails/actionpack/test/fixtures/test/render_to_string_test.rhtml +1 -0
  632. data/vendor/rails/actionpack/test/fixtures/test/update_element_with_capture.rhtml +9 -0
  633. data/vendor/rails/actionpack/test/fixtures/topic.rb +3 -0
  634. data/vendor/rails/actionpack/test/fixtures/topics.yml +22 -0
  635. data/vendor/rails/actionpack/test/template/active_record_helper_test.rb +204 -0
  636. data/vendor/rails/actionpack/test/template/asset_tag_helper_test.rb +232 -0
  637. data/vendor/rails/actionpack/test/template/benchmark_helper_test.rb +72 -0
  638. data/vendor/rails/actionpack/test/template/compiled_templates_test.rb +135 -0
  639. data/vendor/rails/actionpack/test/template/date_helper_test.rb +1322 -0
  640. data/vendor/rails/actionpack/test/template/deprecated_helper_test.rb +36 -0
  641. data/vendor/rails/actionpack/test/template/deprecated_instance_variables_test.rb +43 -0
  642. data/vendor/rails/actionpack/test/template/form_helper_test.rb +499 -0
  643. data/vendor/rails/actionpack/test/template/form_options_helper_test.rb +489 -0
  644. data/vendor/rails/actionpack/test/template/form_tag_helper_test.rb +172 -0
  645. data/vendor/rails/actionpack/test/template/java_script_macros_helper_test.rb +109 -0
  646. data/vendor/rails/actionpack/test/template/javascript_helper_test.rb +67 -0
  647. data/vendor/rails/actionpack/test/template/number_helper_test.rb +92 -0
  648. data/vendor/rails/actionpack/test/template/prototype_helper_test.rb +466 -0
  649. data/vendor/rails/actionpack/test/template/scriptaculous_helper_test.rb +90 -0
  650. data/vendor/rails/actionpack/test/template/tag_helper_test.rb +69 -0
  651. data/vendor/rails/actionpack/test/template/text_helper_test.rb +349 -0
  652. data/vendor/rails/actionpack/test/template/url_helper_test.rb +366 -0
  653. data/vendor/rails/actionpack/test/testing_sandbox.rb +11 -0
  654. data/vendor/rails/actionwebservice/CHANGELOG +279 -0
  655. data/vendor/rails/actionwebservice/MIT-LICENSE +21 -0
  656. data/vendor/rails/actionwebservice/README +364 -0
  657. data/vendor/rails/actionwebservice/Rakefile +171 -0
  658. data/vendor/rails/actionwebservice/TODO +32 -0
  659. data/vendor/rails/actionwebservice/examples/googlesearch/README +143 -0
  660. data/vendor/rails/actionwebservice/examples/googlesearch/autoloading/google_search_api.rb +50 -0
  661. data/vendor/rails/actionwebservice/examples/googlesearch/autoloading/google_search_controller.rb +57 -0
  662. data/vendor/rails/actionwebservice/examples/googlesearch/delegated/google_search_service.rb +108 -0
  663. data/vendor/rails/actionwebservice/examples/googlesearch/delegated/search_controller.rb +7 -0
  664. data/vendor/rails/actionwebservice/examples/googlesearch/direct/google_search_api.rb +50 -0
  665. data/vendor/rails/actionwebservice/examples/googlesearch/direct/search_controller.rb +58 -0
  666. data/vendor/rails/actionwebservice/examples/metaWeblog/README +17 -0
  667. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/blogger_api.rb +60 -0
  668. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/blogger_service.rb +34 -0
  669. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/meta_weblog_api.rb +67 -0
  670. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/meta_weblog_service.rb +48 -0
  671. data/vendor/rails/actionwebservice/examples/metaWeblog/controllers/xmlrpc_controller.rb +16 -0
  672. data/vendor/rails/actionwebservice/install.rb +30 -0
  673. data/vendor/rails/actionwebservice/lib/action_web_service.rb +66 -0
  674. data/vendor/rails/actionwebservice/lib/action_web_service/api.rb +249 -0
  675. data/vendor/rails/actionwebservice/lib/action_web_service/base.rb +42 -0
  676. data/vendor/rails/actionwebservice/lib/action_web_service/casting.rb +136 -0
  677. data/vendor/rails/actionwebservice/lib/action_web_service/client.rb +3 -0
  678. data/vendor/rails/actionwebservice/lib/action_web_service/client/base.rb +28 -0
  679. data/vendor/rails/actionwebservice/lib/action_web_service/client/soap_client.rb +113 -0
  680. data/vendor/rails/actionwebservice/lib/action_web_service/client/xmlrpc_client.rb +58 -0
  681. data/vendor/rails/actionwebservice/lib/action_web_service/container.rb +3 -0
  682. data/vendor/rails/actionwebservice/lib/action_web_service/container/action_controller_container.rb +93 -0
  683. data/vendor/rails/actionwebservice/lib/action_web_service/container/delegated_container.rb +86 -0
  684. data/vendor/rails/actionwebservice/lib/action_web_service/container/direct_container.rb +69 -0
  685. data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher.rb +2 -0
  686. data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher/abstract.rb +203 -0
  687. data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +376 -0
  688. data/vendor/rails/actionwebservice/lib/action_web_service/invocation.rb +202 -0
  689. data/vendor/rails/actionwebservice/lib/action_web_service/protocol.rb +4 -0
  690. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/abstract.rb +112 -0
  691. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/discovery.rb +37 -0
  692. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/soap_protocol.rb +176 -0
  693. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/soap_protocol/marshaler.rb +241 -0
  694. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/xmlrpc_protocol.rb +110 -0
  695. data/vendor/rails/actionwebservice/lib/action_web_service/scaffolding.rb +283 -0
  696. data/vendor/rails/actionwebservice/lib/action_web_service/struct.rb +68 -0
  697. data/vendor/rails/actionwebservice/lib/action_web_service/support/class_inheritable_options.rb +26 -0
  698. data/vendor/rails/actionwebservice/lib/action_web_service/support/signature_types.rb +222 -0
  699. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/layout.rhtml +65 -0
  700. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/methods.rhtml +6 -0
  701. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/parameters.rhtml +29 -0
  702. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/result.rhtml +30 -0
  703. data/vendor/rails/actionwebservice/lib/action_web_service/test_invoke.rb +110 -0
  704. data/vendor/rails/actionwebservice/lib/action_web_service/version.rb +9 -0
  705. data/vendor/rails/actionwebservice/setup.rb +1379 -0
  706. data/vendor/rails/actionwebservice/test/abstract_client.rb +183 -0
  707. data/vendor/rails/actionwebservice/test/abstract_dispatcher.rb +505 -0
  708. data/vendor/rails/actionwebservice/test/abstract_unit.rb +45 -0
  709. data/vendor/rails/actionwebservice/test/api_test.rb +102 -0
  710. data/vendor/rails/actionwebservice/test/apis/auto_load_api.rb +3 -0
  711. data/vendor/rails/actionwebservice/test/apis/broken_auto_load_api.rb +2 -0
  712. data/vendor/rails/actionwebservice/test/base_test.rb +42 -0
  713. data/vendor/rails/actionwebservice/test/casting_test.rb +86 -0
  714. data/vendor/rails/actionwebservice/test/client_soap_test.rb +152 -0
  715. data/vendor/rails/actionwebservice/test/client_xmlrpc_test.rb +151 -0
  716. data/vendor/rails/actionwebservice/test/container_test.rb +73 -0
  717. data/vendor/rails/actionwebservice/test/dispatcher_action_controller_soap_test.rb +137 -0
  718. data/vendor/rails/actionwebservice/test/dispatcher_action_controller_xmlrpc_test.rb +59 -0
  719. data/vendor/rails/actionwebservice/test/fixtures/db_definitions/mysql.sql +7 -0
  720. data/vendor/rails/actionwebservice/test/fixtures/users.yml +10 -0
  721. data/vendor/rails/actionwebservice/test/gencov +3 -0
  722. data/vendor/rails/actionwebservice/test/invocation_test.rb +185 -0
  723. data/vendor/rails/actionwebservice/test/run +6 -0
  724. data/vendor/rails/actionwebservice/test/scaffolded_controller_test.rb +146 -0
  725. data/vendor/rails/actionwebservice/test/struct_test.rb +52 -0
  726. data/vendor/rails/actionwebservice/test/test_invoke_test.rb +112 -0
  727. data/vendor/rails/activerecord/CHANGELOG +3043 -0
  728. data/vendor/rails/activerecord/MIT-LICENSE +20 -0
  729. data/vendor/rails/activerecord/README +360 -0
  730. data/vendor/rails/activerecord/RUNNING_UNIT_TESTS +64 -0
  731. data/vendor/rails/activerecord/Rakefile +226 -0
  732. data/vendor/rails/activerecord/benchmarks/benchmark.rb +26 -0
  733. data/vendor/rails/activerecord/benchmarks/mysql_benchmark.rb +19 -0
  734. data/vendor/rails/activerecord/examples/associations.png +0 -0
  735. data/vendor/rails/activerecord/examples/associations.rb +87 -0
  736. data/vendor/rails/activerecord/examples/shared_setup.rb +15 -0
  737. data/vendor/rails/activerecord/examples/validation.rb +85 -0
  738. data/vendor/rails/activerecord/install.rb +30 -0
  739. data/vendor/rails/activerecord/lib/active_record.rb +85 -0
  740. data/vendor/rails/activerecord/lib/active_record/acts/list.rb +244 -0
  741. data/vendor/rails/activerecord/lib/active_record/acts/nested_set.rb +211 -0
  742. data/vendor/rails/activerecord/lib/active_record/acts/tree.rb +89 -0
  743. data/vendor/rails/activerecord/lib/active_record/aggregations.rb +191 -0
  744. data/vendor/rails/activerecord/lib/active_record/associations.rb +1627 -0
  745. data/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb +190 -0
  746. data/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb +158 -0
  747. data/vendor/rails/activerecord/lib/active_record/associations/belongs_to_association.rb +56 -0
  748. data/vendor/rails/activerecord/lib/active_record/associations/belongs_to_polymorphic_association.rb +50 -0
  749. data/vendor/rails/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb +169 -0
  750. data/vendor/rails/activerecord/lib/active_record/associations/has_many_association.rb +210 -0
  751. data/vendor/rails/activerecord/lib/active_record/associations/has_many_through_association.rb +247 -0
  752. data/vendor/rails/activerecord/lib/active_record/associations/has_one_association.rb +80 -0
  753. data/vendor/rails/activerecord/lib/active_record/attribute_methods.rb +75 -0
  754. data/vendor/rails/activerecord/lib/active_record/base.rb +2164 -0
  755. data/vendor/rails/activerecord/lib/active_record/calculations.rb +270 -0
  756. data/vendor/rails/activerecord/lib/active_record/callbacks.rb +367 -0
  757. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_specification.rb +279 -0
  758. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb +130 -0
  759. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb +58 -0
  760. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb +343 -0
  761. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb +303 -0
  762. data/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +161 -0
  763. data/vendor/rails/activerecord/lib/active_record/connection_adapters/db2_adapter.rb +228 -0
  764. data/vendor/rails/activerecord/lib/active_record/connection_adapters/firebird_adapter.rb +728 -0
  765. data/vendor/rails/activerecord/lib/active_record/connection_adapters/frontbase_adapter.rb +861 -0
  766. data/vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +414 -0
  767. data/vendor/rails/activerecord/lib/active_record/connection_adapters/openbase_adapter.rb +350 -0
  768. data/vendor/rails/activerecord/lib/active_record/connection_adapters/oracle_adapter.rb +689 -0
  769. data/vendor/rails/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +584 -0
  770. data/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb +407 -0
  771. data/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb +591 -0
  772. data/vendor/rails/activerecord/lib/active_record/connection_adapters/sybase_adapter.rb +662 -0
  773. data/vendor/rails/activerecord/lib/active_record/deprecated_associations.rb +104 -0
  774. data/vendor/rails/activerecord/lib/active_record/deprecated_finders.rb +44 -0
  775. data/vendor/rails/activerecord/lib/active_record/fixtures.rb +628 -0
  776. data/vendor/rails/activerecord/lib/active_record/locking/optimistic.rb +106 -0
  777. data/vendor/rails/activerecord/lib/active_record/locking/pessimistic.rb +77 -0
  778. data/vendor/rails/activerecord/lib/active_record/migration.rb +394 -0
  779. data/vendor/rails/activerecord/lib/active_record/observer.rb +178 -0
  780. data/vendor/rails/activerecord/lib/active_record/query_cache.rb +64 -0
  781. data/vendor/rails/activerecord/lib/active_record/reflection.rb +222 -0
  782. data/vendor/rails/activerecord/lib/active_record/schema.rb +58 -0
  783. data/vendor/rails/activerecord/lib/active_record/schema_dumper.rb +149 -0
  784. data/vendor/rails/activerecord/lib/active_record/timestamp.rb +51 -0
  785. data/vendor/rails/activerecord/lib/active_record/transactions.rb +136 -0
  786. data/vendor/rails/activerecord/lib/active_record/validations.rb +843 -0
  787. data/vendor/rails/activerecord/lib/active_record/vendor/db2.rb +362 -0
  788. data/vendor/rails/activerecord/lib/active_record/vendor/mysql.rb +1214 -0
  789. data/vendor/rails/activerecord/lib/active_record/vendor/simple.rb +693 -0
  790. data/vendor/rails/activerecord/lib/active_record/version.rb +9 -0
  791. data/vendor/rails/activerecord/lib/active_record/wrappers/yaml_wrapper.rb +15 -0
  792. data/vendor/rails/activerecord/lib/active_record/wrappings.rb +58 -0
  793. data/vendor/rails/activerecord/lib/active_record/xml_serialization.rb +308 -0
  794. data/vendor/rails/activerecord/test/aaa_create_tables_test.rb +59 -0
  795. data/vendor/rails/activerecord/test/abstract_unit.rb +77 -0
  796. data/vendor/rails/activerecord/test/active_schema_test_mysql.rb +31 -0
  797. data/vendor/rails/activerecord/test/adapter_test.rb +87 -0
  798. data/vendor/rails/activerecord/test/adapter_test_sqlserver.rb +81 -0
  799. data/vendor/rails/activerecord/test/aggregations_test.rb +95 -0
  800. data/vendor/rails/activerecord/test/all.sh +8 -0
  801. data/vendor/rails/activerecord/test/ar_schema_test.rb +33 -0
  802. data/vendor/rails/activerecord/test/association_inheritance_reload.rb +14 -0
  803. data/vendor/rails/activerecord/test/associations/callbacks_test.rb +126 -0
  804. data/vendor/rails/activerecord/test/associations/cascaded_eager_loading_test.rb +138 -0
  805. data/vendor/rails/activerecord/test/associations/eager_test.rb +393 -0
  806. data/vendor/rails/activerecord/test/associations/extension_test.rb +42 -0
  807. data/vendor/rails/activerecord/test/associations/join_model_test.rb +497 -0
  808. data/vendor/rails/activerecord/test/associations_test.rb +1809 -0
  809. data/vendor/rails/activerecord/test/attribute_methods_test.rb +49 -0
  810. data/vendor/rails/activerecord/test/base_test.rb +1586 -0
  811. data/vendor/rails/activerecord/test/binary_test.rb +37 -0
  812. data/vendor/rails/activerecord/test/calculations_test.rb +219 -0
  813. data/vendor/rails/activerecord/test/callbacks_test.rb +377 -0
  814. data/vendor/rails/activerecord/test/class_inheritable_attributes_test.rb +32 -0
  815. data/vendor/rails/activerecord/test/column_alias_test.rb +17 -0
  816. data/vendor/rails/activerecord/test/connection_test_firebird.rb +8 -0
  817. data/vendor/rails/activerecord/test/connections/native_db2/connection.rb +25 -0
  818. data/vendor/rails/activerecord/test/connections/native_firebird/connection.rb +26 -0
  819. data/vendor/rails/activerecord/test/connections/native_frontbase/connection.rb +27 -0
  820. data/vendor/rails/activerecord/test/connections/native_mysql/connection.rb +24 -0
  821. data/vendor/rails/activerecord/test/connections/native_openbase/connection.rb +21 -0
  822. data/vendor/rails/activerecord/test/connections/native_oracle/connection.rb +27 -0
  823. data/vendor/rails/activerecord/test/connections/native_postgresql/connection.rb +23 -0
  824. data/vendor/rails/activerecord/test/connections/native_sqlite/connection.rb +34 -0
  825. data/vendor/rails/activerecord/test/connections/native_sqlite3/connection.rb +34 -0
  826. data/vendor/rails/activerecord/test/connections/native_sqlite3/in_memory_connection.rb +18 -0
  827. data/vendor/rails/activerecord/test/connections/native_sqlserver/connection.rb +23 -0
  828. data/vendor/rails/activerecord/test/connections/native_sqlserver_odbc/connection.rb +25 -0
  829. data/vendor/rails/activerecord/test/connections/native_sybase/connection.rb +23 -0
  830. data/vendor/rails/activerecord/test/copy_table_sqlite.rb +64 -0
  831. data/vendor/rails/activerecord/test/datatype_test_postgresql.rb +52 -0
  832. data/vendor/rails/activerecord/test/default_test_firebird.rb +16 -0
  833. data/vendor/rails/activerecord/test/defaults_test.rb +60 -0
  834. data/vendor/rails/activerecord/test/deprecated_associations_test.rb +396 -0
  835. data/vendor/rails/activerecord/test/deprecated_finder_test.rb +151 -0
  836. data/vendor/rails/activerecord/test/empty_date_time_test.rb +25 -0
  837. data/vendor/rails/activerecord/test/finder_test.rb +504 -0
  838. data/vendor/rails/activerecord/test/fixtures/accounts.yml +28 -0
  839. data/vendor/rails/activerecord/test/fixtures/author.rb +99 -0
  840. data/vendor/rails/activerecord/test/fixtures/author_favorites.yml +4 -0
  841. data/vendor/rails/activerecord/test/fixtures/authors.yml +7 -0
  842. data/vendor/rails/activerecord/test/fixtures/auto_id.rb +4 -0
  843. data/vendor/rails/activerecord/test/fixtures/bad_fixtures/attr_with_numeric_first_char +1 -0
  844. data/vendor/rails/activerecord/test/fixtures/bad_fixtures/attr_with_spaces +1 -0
  845. data/vendor/rails/activerecord/test/fixtures/bad_fixtures/blank_line +3 -0
  846. data/vendor/rails/activerecord/test/fixtures/bad_fixtures/duplicate_attributes +3 -0
  847. data/vendor/rails/activerecord/test/fixtures/bad_fixtures/missing_value +1 -0
  848. data/vendor/rails/activerecord/test/fixtures/binary.rb +2 -0
  849. data/vendor/rails/activerecord/test/fixtures/categories.yml +14 -0
  850. data/vendor/rails/activerecord/test/fixtures/categories/special_categories.yml +9 -0
  851. data/vendor/rails/activerecord/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
  852. data/vendor/rails/activerecord/test/fixtures/categories_ordered.yml +7 -0
  853. data/vendor/rails/activerecord/test/fixtures/categories_posts.yml +23 -0
  854. data/vendor/rails/activerecord/test/fixtures/categorization.rb +5 -0
  855. data/vendor/rails/activerecord/test/fixtures/categorizations.yml +17 -0
  856. data/vendor/rails/activerecord/test/fixtures/category.rb +20 -0
  857. data/vendor/rails/activerecord/test/fixtures/column_name.rb +3 -0
  858. data/vendor/rails/activerecord/test/fixtures/comment.rb +23 -0
  859. data/vendor/rails/activerecord/test/fixtures/comments.yml +59 -0
  860. data/vendor/rails/activerecord/test/fixtures/companies.yml +55 -0
  861. data/vendor/rails/activerecord/test/fixtures/company.rb +107 -0
  862. data/vendor/rails/activerecord/test/fixtures/company_in_module.rb +59 -0
  863. data/vendor/rails/activerecord/test/fixtures/computer.rb +3 -0
  864. data/vendor/rails/activerecord/test/fixtures/computers.yml +4 -0
  865. data/vendor/rails/activerecord/test/fixtures/course.rb +3 -0
  866. data/vendor/rails/activerecord/test/fixtures/courses.yml +7 -0
  867. data/vendor/rails/activerecord/test/fixtures/customer.rb +55 -0
  868. data/vendor/rails/activerecord/test/fixtures/customers.yml +17 -0
  869. data/vendor/rails/activerecord/test/fixtures/db_definitions/db2.drop.sql +32 -0
  870. data/vendor/rails/activerecord/test/fixtures/db_definitions/db2.sql +231 -0
  871. data/vendor/rails/activerecord/test/fixtures/db_definitions/db22.drop.sql +2 -0
  872. data/vendor/rails/activerecord/test/fixtures/db_definitions/db22.sql +5 -0
  873. data/vendor/rails/activerecord/test/fixtures/db_definitions/firebird.drop.sql +63 -0
  874. data/vendor/rails/activerecord/test/fixtures/db_definitions/firebird.sql +304 -0
  875. data/vendor/rails/activerecord/test/fixtures/db_definitions/firebird2.drop.sql +2 -0
  876. data/vendor/rails/activerecord/test/fixtures/db_definitions/firebird2.sql +6 -0
  877. data/vendor/rails/activerecord/test/fixtures/db_definitions/frontbase.drop.sql +32 -0
  878. data/vendor/rails/activerecord/test/fixtures/db_definitions/frontbase.sql +268 -0
  879. data/vendor/rails/activerecord/test/fixtures/db_definitions/frontbase2.drop.sql +1 -0
  880. data/vendor/rails/activerecord/test/fixtures/db_definitions/frontbase2.sql +4 -0
  881. data/vendor/rails/activerecord/test/fixtures/db_definitions/mysql.drop.sql +32 -0
  882. data/vendor/rails/activerecord/test/fixtures/db_definitions/mysql.sql +234 -0
  883. data/vendor/rails/activerecord/test/fixtures/db_definitions/mysql2.drop.sql +2 -0
  884. data/vendor/rails/activerecord/test/fixtures/db_definitions/mysql2.sql +5 -0
  885. data/vendor/rails/activerecord/test/fixtures/db_definitions/openbase.drop.sql +2 -0
  886. data/vendor/rails/activerecord/test/fixtures/db_definitions/openbase.sql +302 -0
  887. data/vendor/rails/activerecord/test/fixtures/db_definitions/openbase2.drop.sql +2 -0
  888. data/vendor/rails/activerecord/test/fixtures/db_definitions/openbase2.sql +7 -0
  889. data/vendor/rails/activerecord/test/fixtures/db_definitions/oracle.drop.sql +65 -0
  890. data/vendor/rails/activerecord/test/fixtures/db_definitions/oracle.sql +325 -0
  891. data/vendor/rails/activerecord/test/fixtures/db_definitions/oracle2.drop.sql +2 -0
  892. data/vendor/rails/activerecord/test/fixtures/db_definitions/oracle2.sql +6 -0
  893. data/vendor/rails/activerecord/test/fixtures/db_definitions/postgresql.drop.sql +37 -0
  894. data/vendor/rails/activerecord/test/fixtures/db_definitions/postgresql.sql +263 -0
  895. data/vendor/rails/activerecord/test/fixtures/db_definitions/postgresql2.drop.sql +2 -0
  896. data/vendor/rails/activerecord/test/fixtures/db_definitions/postgresql2.sql +5 -0
  897. data/vendor/rails/activerecord/test/fixtures/db_definitions/schema.rb +60 -0
  898. data/vendor/rails/activerecord/test/fixtures/db_definitions/sqlite.drop.sql +32 -0
  899. data/vendor/rails/activerecord/test/fixtures/db_definitions/sqlite.sql +215 -0
  900. data/vendor/rails/activerecord/test/fixtures/db_definitions/sqlite2.drop.sql +2 -0
  901. data/vendor/rails/activerecord/test/fixtures/db_definitions/sqlite2.sql +5 -0
  902. data/vendor/rails/activerecord/test/fixtures/db_definitions/sqlserver.drop.sql +34 -0
  903. data/vendor/rails/activerecord/test/fixtures/db_definitions/sqlserver.sql +243 -0
  904. data/vendor/rails/activerecord/test/fixtures/db_definitions/sqlserver2.drop.sql +2 -0
  905. data/vendor/rails/activerecord/test/fixtures/db_definitions/sqlserver2.sql +5 -0
  906. data/vendor/rails/activerecord/test/fixtures/db_definitions/sybase.drop.sql +34 -0
  907. data/vendor/rails/activerecord/test/fixtures/db_definitions/sybase.sql +218 -0
  908. data/vendor/rails/activerecord/test/fixtures/db_definitions/sybase2.drop.sql +4 -0
  909. data/vendor/rails/activerecord/test/fixtures/db_definitions/sybase2.sql +5 -0
  910. data/vendor/rails/activerecord/test/fixtures/default.rb +2 -0
  911. data/vendor/rails/activerecord/test/fixtures/developer.rb +52 -0
  912. data/vendor/rails/activerecord/test/fixtures/developers.yml +21 -0
  913. data/vendor/rails/activerecord/test/fixtures/developers_projects.yml +17 -0
  914. data/vendor/rails/activerecord/test/fixtures/developers_projects/david_action_controller +3 -0
  915. data/vendor/rails/activerecord/test/fixtures/developers_projects/david_active_record +3 -0
  916. data/vendor/rails/activerecord/test/fixtures/developers_projects/jamis_active_record +2 -0
  917. data/vendor/rails/activerecord/test/fixtures/edge.rb +5 -0
  918. data/vendor/rails/activerecord/test/fixtures/edges.yml +6 -0
  919. data/vendor/rails/activerecord/test/fixtures/entrant.rb +3 -0
  920. data/vendor/rails/activerecord/test/fixtures/entrants.yml +14 -0
  921. data/vendor/rails/activerecord/test/fixtures/fk_test_has_fk.yml +3 -0
  922. data/vendor/rails/activerecord/test/fixtures/fk_test_has_pk.yml +2 -0
  923. data/vendor/rails/activerecord/test/fixtures/flowers.jpg +0 -0
  924. data/vendor/rails/activerecord/test/fixtures/funny_jokes.yml +10 -0
  925. data/vendor/rails/activerecord/test/fixtures/joke.rb +6 -0
  926. data/vendor/rails/activerecord/test/fixtures/keyboard.rb +3 -0
  927. data/vendor/rails/activerecord/test/fixtures/legacy_thing.rb +3 -0
  928. data/vendor/rails/activerecord/test/fixtures/legacy_things.yml +3 -0
  929. data/vendor/rails/activerecord/test/fixtures/migrations/1_people_have_last_names.rb +9 -0
  930. data/vendor/rails/activerecord/test/fixtures/migrations/2_we_need_reminders.rb +12 -0
  931. data/vendor/rails/activerecord/test/fixtures/migrations/3_innocent_jointable.rb +12 -0
  932. data/vendor/rails/activerecord/test/fixtures/migrations_with_decimal/1_give_me_big_numbers.rb +15 -0
  933. data/vendor/rails/activerecord/test/fixtures/migrations_with_duplicate/1_people_have_last_names.rb +9 -0
  934. data/vendor/rails/activerecord/test/fixtures/migrations_with_duplicate/2_we_need_reminders.rb +12 -0
  935. data/vendor/rails/activerecord/test/fixtures/migrations_with_duplicate/3_foo.rb +7 -0
  936. data/vendor/rails/activerecord/test/fixtures/migrations_with_duplicate/3_innocent_jointable.rb +12 -0
  937. data/vendor/rails/activerecord/test/fixtures/migrations_with_missing_versions/1000_people_have_middle_names.rb +9 -0
  938. data/vendor/rails/activerecord/test/fixtures/migrations_with_missing_versions/1_people_have_last_names.rb +9 -0
  939. data/vendor/rails/activerecord/test/fixtures/migrations_with_missing_versions/3_we_need_reminders.rb +12 -0
  940. data/vendor/rails/activerecord/test/fixtures/migrations_with_missing_versions/4_innocent_jointable.rb +12 -0
  941. data/vendor/rails/activerecord/test/fixtures/mixed_case_monkey.rb +3 -0
  942. data/vendor/rails/activerecord/test/fixtures/mixed_case_monkeys.yml +6 -0
  943. data/vendor/rails/activerecord/test/fixtures/mixin.rb +63 -0
  944. data/vendor/rails/activerecord/test/fixtures/mixins.yml +127 -0
  945. data/vendor/rails/activerecord/test/fixtures/movie.rb +5 -0
  946. data/vendor/rails/activerecord/test/fixtures/movies.yml +7 -0
  947. data/vendor/rails/activerecord/test/fixtures/naked/csv/accounts.csv +1 -0
  948. data/vendor/rails/activerecord/test/fixtures/naked/yml/accounts.yml +1 -0
  949. data/vendor/rails/activerecord/test/fixtures/naked/yml/companies.yml +1 -0
  950. data/vendor/rails/activerecord/test/fixtures/naked/yml/courses.yml +1 -0
  951. data/vendor/rails/activerecord/test/fixtures/order.rb +4 -0
  952. data/vendor/rails/activerecord/test/fixtures/people.yml +3 -0
  953. data/vendor/rails/activerecord/test/fixtures/person.rb +4 -0
  954. data/vendor/rails/activerecord/test/fixtures/post.rb +58 -0
  955. data/vendor/rails/activerecord/test/fixtures/posts.yml +48 -0
  956. data/vendor/rails/activerecord/test/fixtures/project.rb +27 -0
  957. data/vendor/rails/activerecord/test/fixtures/projects.yml +7 -0
  958. data/vendor/rails/activerecord/test/fixtures/reader.rb +4 -0
  959. data/vendor/rails/activerecord/test/fixtures/readers.yml +4 -0
  960. data/vendor/rails/activerecord/test/fixtures/reply.rb +37 -0
  961. data/vendor/rails/activerecord/test/fixtures/subject.rb +4 -0
  962. data/vendor/rails/activerecord/test/fixtures/subscriber.rb +6 -0
  963. data/vendor/rails/activerecord/test/fixtures/subscribers/first +2 -0
  964. data/vendor/rails/activerecord/test/fixtures/subscribers/second +2 -0
  965. data/vendor/rails/activerecord/test/fixtures/tag.rb +7 -0
  966. data/vendor/rails/activerecord/test/fixtures/tagging.rb +6 -0
  967. data/vendor/rails/activerecord/test/fixtures/taggings.yml +18 -0
  968. data/vendor/rails/activerecord/test/fixtures/tags.yml +7 -0
  969. data/vendor/rails/activerecord/test/fixtures/task.rb +3 -0
  970. data/vendor/rails/activerecord/test/fixtures/tasks.yml +7 -0
  971. data/vendor/rails/activerecord/test/fixtures/topic.rb +25 -0
  972. data/vendor/rails/activerecord/test/fixtures/topics.yml +22 -0
  973. data/vendor/rails/activerecord/test/fixtures/vertex.rb +9 -0
  974. data/vendor/rails/activerecord/test/fixtures/vertices.yml +4 -0
  975. data/vendor/rails/activerecord/test/fixtures_test.rb +401 -0
  976. data/vendor/rails/activerecord/test/inheritance_test.rb +205 -0
  977. data/vendor/rails/activerecord/test/lifecycle_test.rb +137 -0
  978. data/vendor/rails/activerecord/test/locking_test.rb +190 -0
  979. data/vendor/rails/activerecord/test/method_scoping_test.rb +416 -0
  980. data/vendor/rails/activerecord/test/migration_test.rb +768 -0
  981. data/vendor/rails/activerecord/test/migration_test_firebird.rb +124 -0
  982. data/vendor/rails/activerecord/test/mixin_nested_set_test.rb +196 -0
  983. data/vendor/rails/activerecord/test/mixin_test.rb +550 -0
  984. data/vendor/rails/activerecord/test/modules_test.rb +34 -0
  985. data/vendor/rails/activerecord/test/multiple_db_test.rb +60 -0
  986. data/vendor/rails/activerecord/test/pk_test.rb +104 -0
  987. data/vendor/rails/activerecord/test/readonly_test.rb +107 -0
  988. data/vendor/rails/activerecord/test/reflection_test.rb +159 -0
  989. data/vendor/rails/activerecord/test/schema_authorization_test_postgresql.rb +75 -0
  990. data/vendor/rails/activerecord/test/schema_dumper_test.rb +96 -0
  991. data/vendor/rails/activerecord/test/schema_test_postgresql.rb +64 -0
  992. data/vendor/rails/activerecord/test/synonym_test_oracle.rb +17 -0
  993. data/vendor/rails/activerecord/test/table_name_test_sqlserver.rb +23 -0
  994. data/vendor/rails/activerecord/test/threaded_connections_test.rb +48 -0
  995. data/vendor/rails/activerecord/test/transactions_test.rb +230 -0
  996. data/vendor/rails/activerecord/test/unconnected_test.rb +32 -0
  997. data/vendor/rails/activerecord/test/validations_test.rb +1097 -0
  998. data/vendor/rails/activerecord/test/xml_serialization_test.rb +125 -0
  999. data/vendor/rails/activesupport/CHANGELOG +703 -0
  1000. data/vendor/rails/activesupport/MIT-LICENSE +20 -0
  1001. data/vendor/rails/activesupport/README +43 -0
  1002. data/vendor/rails/activesupport/Rakefile +82 -0
  1003. data/vendor/rails/activesupport/install.rb +30 -0
  1004. data/vendor/rails/activesupport/lib/active_support.rb +44 -0
  1005. data/vendor/rails/activesupport/lib/active_support/binding_of_caller.rb +84 -0
  1006. data/vendor/rails/activesupport/lib/active_support/breakpoint.rb +528 -0
  1007. data/vendor/rails/activesupport/lib/active_support/caching_tools.rb +62 -0
  1008. data/vendor/rails/activesupport/lib/active_support/clean_logger.rb +38 -0
  1009. data/vendor/rails/activesupport/lib/active_support/core_ext.rb +1 -0
  1010. data/vendor/rails/activesupport/lib/active_support/core_ext/array.rb +7 -0
  1011. data/vendor/rails/activesupport/lib/active_support/core_ext/array/conversions.rb +72 -0
  1012. data/vendor/rails/activesupport/lib/active_support/core_ext/array/grouping.rb +55 -0
  1013. data/vendor/rails/activesupport/lib/active_support/core_ext/bigdecimal.rb +3 -0
  1014. data/vendor/rails/activesupport/lib/active_support/core_ext/bigdecimal/formatting.rb +7 -0
  1015. data/vendor/rails/activesupport/lib/active_support/core_ext/blank.rb +50 -0
  1016. data/vendor/rails/activesupport/lib/active_support/core_ext/cgi.rb +5 -0
  1017. data/vendor/rails/activesupport/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +14 -0
  1018. data/vendor/rails/activesupport/lib/active_support/core_ext/class.rb +3 -0
  1019. data/vendor/rails/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb +48 -0
  1020. data/vendor/rails/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb +140 -0
  1021. data/vendor/rails/activesupport/lib/active_support/core_ext/class/removal.rb +24 -0
  1022. data/vendor/rails/activesupport/lib/active_support/core_ext/date.rb +6 -0
  1023. data/vendor/rails/activesupport/lib/active_support/core_ext/date/conversions.rb +39 -0
  1024. data/vendor/rails/activesupport/lib/active_support/core_ext/enumerable.rb +62 -0
  1025. data/vendor/rails/activesupport/lib/active_support/core_ext/exception.rb +33 -0
  1026. data/vendor/rails/activesupport/lib/active_support/core_ext/hash.rb +13 -0
  1027. data/vendor/rails/activesupport/lib/active_support/core_ext/hash/conversions.rb +155 -0
  1028. data/vendor/rails/activesupport/lib/active_support/core_ext/hash/diff.rb +11 -0
  1029. data/vendor/rails/activesupport/lib/active_support/core_ext/hash/indifferent_access.rb +88 -0
  1030. data/vendor/rails/activesupport/lib/active_support/core_ext/hash/keys.rb +53 -0
  1031. data/vendor/rails/activesupport/lib/active_support/core_ext/hash/reverse_merge.rb +25 -0
  1032. data/vendor/rails/activesupport/lib/active_support/core_ext/integer.rb +7 -0
  1033. data/vendor/rails/activesupport/lib/active_support/core_ext/integer/even_odd.rb +24 -0
  1034. data/vendor/rails/activesupport/lib/active_support/core_ext/integer/inflections.rb +21 -0
  1035. data/vendor/rails/activesupport/lib/active_support/core_ext/kernel.rb +4 -0
  1036. data/vendor/rails/activesupport/lib/active_support/core_ext/kernel/agnostics.rb +11 -0
  1037. data/vendor/rails/activesupport/lib/active_support/core_ext/kernel/daemonizing.rb +15 -0
  1038. data/vendor/rails/activesupport/lib/active_support/core_ext/kernel/reporting.rb +51 -0
  1039. data/vendor/rails/activesupport/lib/active_support/core_ext/kernel/requires.rb +24 -0
  1040. data/vendor/rails/activesupport/lib/active_support/core_ext/load_error.rb +38 -0
  1041. data/vendor/rails/activesupport/lib/active_support/core_ext/logger.rb +16 -0
  1042. data/vendor/rails/activesupport/lib/active_support/core_ext/module.rb +7 -0
  1043. data/vendor/rails/activesupport/lib/active_support/core_ext/module/aliasing.rb +58 -0
  1044. data/vendor/rails/activesupport/lib/active_support/core_ext/module/attr_internal.rb +31 -0
  1045. data/vendor/rails/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb +48 -0
  1046. data/vendor/rails/activesupport/lib/active_support/core_ext/module/delegation.rb +41 -0
  1047. data/vendor/rails/activesupport/lib/active_support/core_ext/module/inclusion.rb +11 -0
  1048. data/vendor/rails/activesupport/lib/active_support/core_ext/module/introspection.rb +21 -0
  1049. data/vendor/rails/activesupport/lib/active_support/core_ext/module/loading.rb +13 -0
  1050. data/vendor/rails/activesupport/lib/active_support/core_ext/name_error.rb +17 -0
  1051. data/vendor/rails/activesupport/lib/active_support/core_ext/numeric.rb +7 -0
  1052. data/vendor/rails/activesupport/lib/active_support/core_ext/numeric/bytes.rb +44 -0
  1053. data/vendor/rails/activesupport/lib/active_support/core_ext/numeric/time.rb +72 -0
  1054. data/vendor/rails/activesupport/lib/active_support/core_ext/object.rb +2 -0
  1055. data/vendor/rails/activesupport/lib/active_support/core_ext/object/extending.rb +47 -0
  1056. data/vendor/rails/activesupport/lib/active_support/core_ext/object/misc.rb +34 -0
  1057. data/vendor/rails/activesupport/lib/active_support/core_ext/pathname.rb +7 -0
  1058. data/vendor/rails/activesupport/lib/active_support/core_ext/pathname/clean_within.rb +14 -0
  1059. data/vendor/rails/activesupport/lib/active_support/core_ext/proc.rb +12 -0
  1060. data/vendor/rails/activesupport/lib/active_support/core_ext/range.rb +5 -0
  1061. data/vendor/rails/activesupport/lib/active_support/core_ext/range/conversions.rb +21 -0
  1062. data/vendor/rails/activesupport/lib/active_support/core_ext/string.rb +15 -0
  1063. data/vendor/rails/activesupport/lib/active_support/core_ext/string/access.rb +58 -0
  1064. data/vendor/rails/activesupport/lib/active_support/core_ext/string/conversions.rb +19 -0
  1065. data/vendor/rails/activesupport/lib/active_support/core_ext/string/inflections.rb +153 -0
  1066. data/vendor/rails/activesupport/lib/active_support/core_ext/string/iterators.rb +17 -0
  1067. data/vendor/rails/activesupport/lib/active_support/core_ext/string/starts_ends_with.rb +20 -0
  1068. data/vendor/rails/activesupport/lib/active_support/core_ext/string/unicode.rb +42 -0
  1069. data/vendor/rails/activesupport/lib/active_support/core_ext/symbol.rb +12 -0
  1070. data/vendor/rails/activesupport/lib/active_support/core_ext/time.rb +17 -0
  1071. data/vendor/rails/activesupport/lib/active_support/core_ext/time/calculations.rb +191 -0
  1072. data/vendor/rails/activesupport/lib/active_support/core_ext/time/conversions.rb +33 -0
  1073. data/vendor/rails/activesupport/lib/active_support/dependencies.rb +539 -0
  1074. data/vendor/rails/activesupport/lib/active_support/deprecation.rb +202 -0
  1075. data/vendor/rails/activesupport/lib/active_support/inflections.rb +52 -0
  1076. data/vendor/rails/activesupport/lib/active_support/inflector.rb +275 -0
  1077. data/vendor/rails/activesupport/lib/active_support/json.rb +48 -0
  1078. data/vendor/rails/activesupport/lib/active_support/json/encoders.rb +25 -0
  1079. data/vendor/rails/activesupport/lib/active_support/json/encoders/core.rb +68 -0
  1080. data/vendor/rails/activesupport/lib/active_support/multibyte.rb +7 -0
  1081. data/vendor/rails/activesupport/lib/active_support/multibyte/chars.rb +129 -0
  1082. data/vendor/rails/activesupport/lib/active_support/multibyte/generators/generate_tables.rb +149 -0
  1083. data/vendor/rails/activesupport/lib/active_support/multibyte/handlers/passthru_handler.rb +9 -0
  1084. data/vendor/rails/activesupport/lib/active_support/multibyte/handlers/utf8_handler.rb +454 -0
  1085. data/vendor/rails/activesupport/lib/active_support/multibyte/handlers/utf8_handler_proc.rb +43 -0
  1086. data/vendor/rails/activesupport/lib/active_support/option_merger.rb +25 -0
  1087. data/vendor/rails/activesupport/lib/active_support/ordered_options.rb +44 -0
  1088. data/vendor/rails/activesupport/lib/active_support/reloadable.rb +60 -0
  1089. data/vendor/rails/activesupport/lib/active_support/values/time_zone.rb +180 -0
  1090. data/vendor/rails/activesupport/lib/active_support/values/unicode_tables.dat +0 -0
  1091. data/vendor/rails/activesupport/lib/active_support/vendor/builder.rb +13 -0
  1092. data/vendor/rails/activesupport/lib/active_support/vendor/builder/blankslate.rb +63 -0
  1093. data/vendor/rails/activesupport/lib/active_support/vendor/builder/xchar.rb +112 -0
  1094. data/vendor/rails/activesupport/lib/active_support/vendor/builder/xmlbase.rb +145 -0
  1095. data/vendor/rails/activesupport/lib/active_support/vendor/builder/xmlevents.rb +63 -0
  1096. data/vendor/rails/activesupport/lib/active_support/vendor/builder/xmlmarkup.rb +327 -0
  1097. data/vendor/rails/activesupport/lib/active_support/vendor/xml_simple.rb +1021 -0
  1098. data/vendor/rails/activesupport/lib/active_support/version.rb +9 -0
  1099. data/vendor/rails/activesupport/lib/active_support/whiny_nil.rb +38 -0
  1100. data/vendor/rails/activesupport/test/abstract_unit.rb +7 -0
  1101. data/vendor/rails/activesupport/test/autoloading_fixtures/a/b.rb +2 -0
  1102. data/vendor/rails/activesupport/test/autoloading_fixtures/a/c/d.rb +2 -0
  1103. data/vendor/rails/activesupport/test/autoloading_fixtures/a/c/e/f.rb +2 -0
  1104. data/vendor/rails/activesupport/test/autoloading_fixtures/application.rb +1 -0
  1105. data/vendor/rails/activesupport/test/autoloading_fixtures/class_folder.rb +3 -0
  1106. data/vendor/rails/activesupport/test/autoloading_fixtures/class_folder/class_folder_subclass.rb +3 -0
  1107. data/vendor/rails/activesupport/test/autoloading_fixtures/class_folder/inline_class.rb +2 -0
  1108. data/vendor/rails/activesupport/test/autoloading_fixtures/class_folder/nested_class.rb +7 -0
  1109. data/vendor/rails/activesupport/test/autoloading_fixtures/conflict.rb +1 -0
  1110. data/vendor/rails/activesupport/test/autoloading_fixtures/counting_loader.rb +5 -0
  1111. data/vendor/rails/activesupport/test/autoloading_fixtures/cross_site_dependency.rb +2 -0
  1112. data/vendor/rails/activesupport/test/autoloading_fixtures/e.rb +2 -0
  1113. data/vendor/rails/activesupport/test/autoloading_fixtures/module_folder/inline_class.rb +2 -0
  1114. data/vendor/rails/activesupport/test/autoloading_fixtures/module_folder/nested_class.rb +4 -0
  1115. data/vendor/rails/activesupport/test/autoloading_fixtures/module_folder/nested_sibling.rb +2 -0
  1116. data/vendor/rails/activesupport/test/autoloading_fixtures/module_with_custom_const_missing/a/b.rb +1 -0
  1117. data/vendor/rails/activesupport/test/autoloading_fixtures/multiple_constant_file.rb +2 -0
  1118. data/vendor/rails/activesupport/test/autoloading_fixtures/raises_name_error.rb +3 -0
  1119. data/vendor/rails/activesupport/test/autoloading_fixtures/raises_no_method_error.rb +3 -0
  1120. data/vendor/rails/activesupport/test/caching_tools_test.rb +79 -0
  1121. data/vendor/rails/activesupport/test/clean_logger_test.rb +80 -0
  1122. data/vendor/rails/activesupport/test/core_ext/array_ext_test.rb +182 -0
  1123. data/vendor/rails/activesupport/test/core_ext/blank_test.rb +11 -0
  1124. data/vendor/rails/activesupport/test/core_ext/cgi_ext_test.rb +14 -0
  1125. data/vendor/rails/activesupport/test/core_ext/class/attribute_accessor_test.rb +31 -0
  1126. data/vendor/rails/activesupport/test/core_ext/class/class_inheritable_attributes_test.rb +208 -0
  1127. data/vendor/rails/activesupport/test/core_ext/class_test.rb +36 -0
  1128. data/vendor/rails/activesupport/test/core_ext/date_ext_test.rb +20 -0
  1129. data/vendor/rails/activesupport/test/core_ext/enumerable_test.rb +61 -0
  1130. data/vendor/rails/activesupport/test/core_ext/exception_test.rb +64 -0
  1131. data/vendor/rails/activesupport/test/core_ext/hash_ext_test.rb +472 -0
  1132. data/vendor/rails/activesupport/test/core_ext/integer_ext_test.rb +37 -0
  1133. data/vendor/rails/activesupport/test/core_ext/kernel_test.rb +43 -0
  1134. data/vendor/rails/activesupport/test/core_ext/load_error_tests.rb +16 -0
  1135. data/vendor/rails/activesupport/test/core_ext/module/attr_accessor_with_default.rb +30 -0
  1136. data/vendor/rails/activesupport/test/core_ext/module/attr_internal_test.rb +52 -0
  1137. data/vendor/rails/activesupport/test/core_ext/module/attribute_accessor_test.rb +33 -0
  1138. data/vendor/rails/activesupport/test/core_ext/module/attribute_aliasing_test.rb +31 -0
  1139. data/vendor/rails/activesupport/test/core_ext/module_test.rb +221 -0
  1140. data/vendor/rails/activesupport/test/core_ext/name_error_test.rb +24 -0
  1141. data/vendor/rails/activesupport/test/core_ext/numeric_ext_test.rb +57 -0
  1142. data/vendor/rails/activesupport/test/core_ext/object_and_class_ext_test.rb +151 -0
  1143. data/vendor/rails/activesupport/test/core_ext/pathname_test.rb +9 -0
  1144. data/vendor/rails/activesupport/test/core_ext/proc_test.rb +11 -0
  1145. data/vendor/rails/activesupport/test/core_ext/range_ext_test.rb +13 -0
  1146. data/vendor/rails/activesupport/test/core_ext/string_ext_test.rb +152 -0
  1147. data/vendor/rails/activesupport/test/core_ext/symbol_test.rb +9 -0
  1148. data/vendor/rails/activesupport/test/core_ext/time_ext_test.rb +335 -0
  1149. data/vendor/rails/activesupport/test/dependencies/check_warnings.rb +2 -0
  1150. data/vendor/rails/activesupport/test/dependencies/conflict.rb +1 -0
  1151. data/vendor/rails/activesupport/test/dependencies/cross_site_depender.rb +3 -0
  1152. data/vendor/rails/activesupport/test/dependencies/mutual_one.rb +4 -0
  1153. data/vendor/rails/activesupport/test/dependencies/mutual_two.rb +4 -0
  1154. data/vendor/rails/activesupport/test/dependencies/raises_exception.rb +3 -0
  1155. data/vendor/rails/activesupport/test/dependencies/requires_nonexistent0.rb +1 -0
  1156. data/vendor/rails/activesupport/test/dependencies/requires_nonexistent1.rb +1 -0
  1157. data/vendor/rails/activesupport/test/dependencies/service_one.rb +5 -0
  1158. data/vendor/rails/activesupport/test/dependencies/service_two.rb +2 -0
  1159. data/vendor/rails/activesupport/test/dependencies_test.rb +741 -0
  1160. data/vendor/rails/activesupport/test/deprecation_test.rb +151 -0
  1161. data/vendor/rails/activesupport/test/inflector_test.rb +404 -0
  1162. data/vendor/rails/activesupport/test/json.rb +87 -0
  1163. data/vendor/rails/activesupport/test/multibyte_chars_test.rb +164 -0
  1164. data/vendor/rails/activesupport/test/multibyte_conformance.rb +141 -0
  1165. data/vendor/rails/activesupport/test/multibyte_handler_test.rb +274 -0
  1166. data/vendor/rails/activesupport/test/option_merger_test.rb +50 -0
  1167. data/vendor/rails/activesupport/test/ordered_options_test.rb +80 -0
  1168. data/vendor/rails/activesupport/test/reloadable_test.rb +123 -0
  1169. data/vendor/rails/activesupport/test/time_zone_test.rb +91 -0
  1170. data/vendor/rails/activesupport/test/whiny_nil_test.rb +38 -0
  1171. data/vendor/rails/cleanlogs.sh +1 -0
  1172. data/vendor/rails/pushgems.rb +15 -0
  1173. data/vendor/rails/railties/CHANGELOG +1366 -0
  1174. data/vendor/rails/railties/MIT-LICENSE +20 -0
  1175. data/vendor/rails/railties/README +182 -0
  1176. data/vendor/rails/railties/Rakefile +334 -0
  1177. data/vendor/rails/railties/bin/about +3 -0
  1178. data/vendor/rails/railties/bin/breakpointer +3 -0
  1179. data/vendor/rails/railties/bin/console +3 -0
  1180. data/vendor/rails/railties/bin/destroy +3 -0
  1181. data/vendor/rails/railties/bin/generate +3 -0
  1182. data/vendor/rails/railties/bin/performance/benchmarker +3 -0
  1183. data/vendor/rails/railties/bin/performance/profiler +3 -0
  1184. data/vendor/rails/railties/bin/plugin +3 -0
  1185. data/vendor/rails/railties/bin/process/inspector +3 -0
  1186. data/vendor/rails/railties/bin/process/reaper +3 -0
  1187. data/vendor/rails/railties/bin/process/spawner +3 -0
  1188. data/vendor/rails/railties/bin/rails +19 -0
  1189. data/vendor/rails/railties/bin/runner +3 -0
  1190. data/vendor/rails/railties/bin/server +3 -0
  1191. data/vendor/rails/railties/builtin/rails_info/rails/info.rb +123 -0
  1192. data/vendor/rails/railties/builtin/rails_info/rails/info_controller.rb +9 -0
  1193. data/vendor/rails/railties/builtin/rails_info/rails/info_helper.rb +2 -0
  1194. data/vendor/rails/railties/builtin/rails_info/rails_info_controller.rb +2 -0
  1195. data/vendor/rails/railties/configs/apache.conf +40 -0
  1196. data/vendor/rails/railties/configs/databases/frontbase.yml +28 -0
  1197. data/vendor/rails/railties/configs/databases/mysql.yml +48 -0
  1198. data/vendor/rails/railties/configs/databases/oracle.yml +39 -0
  1199. data/vendor/rails/railties/configs/databases/postgresql.yml +44 -0
  1200. data/vendor/rails/railties/configs/databases/sqlite2.yml +16 -0
  1201. data/vendor/rails/railties/configs/databases/sqlite3.yml +19 -0
  1202. data/vendor/rails/railties/configs/empty.log +0 -0
  1203. data/vendor/rails/railties/configs/lighttpd.conf +54 -0
  1204. data/vendor/rails/railties/configs/routes.rb +23 -0
  1205. data/vendor/rails/railties/dispatches/dispatch.fcgi +24 -0
  1206. data/vendor/rails/railties/dispatches/dispatch.rb +10 -0
  1207. data/vendor/rails/railties/dispatches/gateway.cgi +97 -0
  1208. data/vendor/rails/railties/environments/boot.rb +45 -0
  1209. data/vendor/rails/railties/environments/development.rb +21 -0
  1210. data/vendor/rails/railties/environments/environment.rb +60 -0
  1211. data/vendor/rails/railties/environments/production.rb +18 -0
  1212. data/vendor/rails/railties/environments/test.rb +19 -0
  1213. data/vendor/rails/railties/fresh_rakefile +10 -0
  1214. data/vendor/rails/railties/helpers/application.rb +7 -0
  1215. data/vendor/rails/railties/helpers/application_helper.rb +3 -0
  1216. data/vendor/rails/railties/helpers/test_helper.rb +28 -0
  1217. data/vendor/rails/railties/html/404.html +30 -0
  1218. data/vendor/rails/railties/html/500.html +30 -0
  1219. data/vendor/rails/railties/html/favicon.ico +0 -0
  1220. data/vendor/rails/railties/html/images/rails.png +0 -0
  1221. data/vendor/rails/railties/html/index.html +277 -0
  1222. data/vendor/rails/railties/html/javascripts/application.js +2 -0
  1223. data/vendor/rails/railties/html/javascripts/controls.js +833 -0
  1224. data/vendor/rails/railties/html/javascripts/dragdrop.js +942 -0
  1225. data/vendor/rails/railties/html/javascripts/effects.js +1088 -0
  1226. data/vendor/rails/railties/html/javascripts/prototype.js +2515 -0
  1227. data/vendor/rails/railties/html/robots.txt +1 -0
  1228. data/vendor/rails/railties/lib/binding_of_caller.rb +85 -0
  1229. data/vendor/rails/railties/lib/breakpoint.rb +553 -0
  1230. data/vendor/rails/railties/lib/breakpoint_client.rb +196 -0
  1231. data/vendor/rails/railties/lib/code_statistics.rb +107 -0
  1232. data/vendor/rails/railties/lib/commands.rb +17 -0
  1233. data/vendor/rails/railties/lib/commands/about.rb +2 -0
  1234. data/vendor/rails/railties/lib/commands/breakpointer.rb +1 -0
  1235. data/vendor/rails/railties/lib/commands/console.rb +25 -0
  1236. data/vendor/rails/railties/lib/commands/destroy.rb +6 -0
  1237. data/vendor/rails/railties/lib/commands/generate.rb +6 -0
  1238. data/vendor/rails/railties/lib/commands/ncgi/listener +86 -0
  1239. data/vendor/rails/railties/lib/commands/ncgi/tracker +69 -0
  1240. data/vendor/rails/railties/lib/commands/performance/benchmarker.rb +24 -0
  1241. data/vendor/rails/railties/lib/commands/performance/profiler.rb +50 -0
  1242. data/vendor/rails/railties/lib/commands/plugin.rb +918 -0
  1243. data/vendor/rails/railties/lib/commands/process/inspector.rb +68 -0
  1244. data/vendor/rails/railties/lib/commands/process/reaper.rb +149 -0
  1245. data/vendor/rails/railties/lib/commands/process/spawner.rb +209 -0
  1246. data/vendor/rails/railties/lib/commands/process/spinner.rb +57 -0
  1247. data/vendor/rails/railties/lib/commands/runner.rb +48 -0
  1248. data/vendor/rails/railties/lib/commands/server.rb +39 -0
  1249. data/vendor/rails/railties/lib/commands/servers/base.rb +19 -0
  1250. data/vendor/rails/railties/lib/commands/servers/lighttpd.rb +94 -0
  1251. data/vendor/rails/railties/lib/commands/servers/mongrel.rb +65 -0
  1252. data/vendor/rails/railties/lib/commands/servers/webrick.rb +59 -0
  1253. data/vendor/rails/railties/lib/commands/update.rb +4 -0
  1254. data/vendor/rails/railties/lib/console_app.rb +27 -0
  1255. data/vendor/rails/railties/lib/console_sandbox.rb +6 -0
  1256. data/vendor/rails/railties/lib/console_with_helpers.rb +23 -0
  1257. data/vendor/rails/railties/lib/dispatcher.rb +173 -0
  1258. data/vendor/rails/railties/lib/fcgi_handler.rb +225 -0
  1259. data/vendor/rails/railties/lib/initializer.rb +702 -0
  1260. data/vendor/rails/railties/lib/rails/version.rb +9 -0
  1261. data/vendor/rails/railties/lib/rails_generator.rb +43 -0
  1262. data/vendor/rails/railties/lib/rails_generator/base.rb +261 -0
  1263. data/vendor/rails/railties/lib/rails_generator/commands.rb +581 -0
  1264. data/vendor/rails/railties/lib/rails_generator/generated_attribute.rb +42 -0
  1265. data/vendor/rails/railties/lib/rails_generator/generators/applications/app/USAGE +16 -0
  1266. data/vendor/rails/railties/lib/rails_generator/generators/applications/app/app_generator.rb +160 -0
  1267. data/vendor/rails/railties/lib/rails_generator/generators/components/controller/USAGE +30 -0
  1268. data/vendor/rails/railties/lib/rails_generator/generators/components/controller/controller_generator.rb +37 -0
  1269. data/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/controller.rb +10 -0
  1270. data/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/functional_test.rb +18 -0
  1271. data/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/helper.rb +2 -0
  1272. data/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/view.rhtml +2 -0
  1273. data/vendor/rails/railties/lib/rails_generator/generators/components/integration_test/USAGE +14 -0
  1274. data/vendor/rails/railties/lib/rails_generator/generators/components/integration_test/integration_test_generator.rb +16 -0
  1275. data/vendor/rails/railties/lib/rails_generator/generators/components/integration_test/templates/integration_test.rb +10 -0
  1276. data/vendor/rails/railties/lib/rails_generator/generators/components/mailer/USAGE +18 -0
  1277. data/vendor/rails/railties/lib/rails_generator/generators/components/mailer/mailer_generator.rb +34 -0
  1278. data/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/fixture.rhtml +3 -0
  1279. data/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/mailer.rb +13 -0
  1280. data/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/unit_test.rb +37 -0
  1281. data/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/view.rhtml +3 -0
  1282. data/vendor/rails/railties/lib/rails_generator/generators/components/migration/USAGE +14 -0
  1283. data/vendor/rails/railties/lib/rails_generator/generators/components/migration/migration_generator.rb +7 -0
  1284. data/vendor/rails/railties/lib/rails_generator/generators/components/migration/templates/migration.rb +7 -0
  1285. data/vendor/rails/railties/lib/rails_generator/generators/components/model/USAGE +26 -0
  1286. data/vendor/rails/railties/lib/rails_generator/generators/components/model/model_generator.rb +38 -0
  1287. data/vendor/rails/railties/lib/rails_generator/generators/components/model/templates/fixtures.yml +11 -0
  1288. data/vendor/rails/railties/lib/rails_generator/generators/components/model/templates/migration.rb +13 -0
  1289. data/vendor/rails/railties/lib/rails_generator/generators/components/model/templates/model.rb +2 -0
  1290. data/vendor/rails/railties/lib/rails_generator/generators/components/model/templates/unit_test.rb +10 -0
  1291. data/vendor/rails/railties/lib/rails_generator/generators/components/observer/USAGE +15 -0
  1292. data/vendor/rails/railties/lib/rails_generator/generators/components/observer/observer_generator.rb +16 -0
  1293. data/vendor/rails/railties/lib/rails_generator/generators/components/observer/templates/observer.rb +2 -0
  1294. data/vendor/rails/railties/lib/rails_generator/generators/components/observer/templates/unit_test.rb +10 -0
  1295. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/USAGE +35 -0
  1296. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/plugin_generator.rb +38 -0
  1297. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/README +4 -0
  1298. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/Rakefile +22 -0
  1299. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/USAGE +8 -0
  1300. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/generator.rb +8 -0
  1301. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/init.rb +1 -0
  1302. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/install.rb +1 -0
  1303. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/plugin.rb +1 -0
  1304. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/tasks.rake +4 -0
  1305. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/uninstall.rb +1 -0
  1306. data/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/unit_test.rb +8 -0
  1307. data/vendor/rails/railties/lib/rails_generator/generators/components/resource/resource_generator.rb +76 -0
  1308. data/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/USAGE +18 -0
  1309. data/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/controller.rb +2 -0
  1310. data/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/fixtures.yml +11 -0
  1311. data/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/functional_test.rb +20 -0
  1312. data/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/helper.rb +2 -0
  1313. data/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/migration.rb +13 -0
  1314. data/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/model.rb +2 -0
  1315. data/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/unit_test.rb +10 -0
  1316. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/USAGE +32 -0
  1317. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +193 -0
  1318. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/controller.rb +58 -0
  1319. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/form.rhtml +3 -0
  1320. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/form_scaffolding.rhtml +1 -0
  1321. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/functional_test.rb +102 -0
  1322. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/helper.rb +2 -0
  1323. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/layout.rhtml +17 -0
  1324. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/style.css +74 -0
  1325. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/view_edit.rhtml +9 -0
  1326. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/view_list.rhtml +27 -0
  1327. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/view_new.rhtml +8 -0
  1328. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/view_show.rhtml +8 -0
  1329. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold_resource/USAGE +29 -0
  1330. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold_resource/scaffold_resource_generator.rb +92 -0
  1331. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold_resource/templates/controller.rb +79 -0
  1332. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold_resource/templates/fixtures.yml +11 -0
  1333. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold_resource/templates/functional_test.rb +57 -0
  1334. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold_resource/templates/helper.rb +2 -0
  1335. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold_resource/templates/layout.rhtml +17 -0
  1336. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold_resource/templates/migration.rb +13 -0
  1337. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold_resource/templates/model.rb +2 -0
  1338. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold_resource/templates/style.css +74 -0
  1339. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold_resource/templates/unit_test.rb +10 -0
  1340. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold_resource/templates/view_edit.rhtml +19 -0
  1341. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold_resource/templates/view_index.rhtml +24 -0
  1342. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold_resource/templates/view_new.rhtml +18 -0
  1343. data/vendor/rails/railties/lib/rails_generator/generators/components/scaffold_resource/templates/view_show.rhtml +10 -0
  1344. data/vendor/rails/railties/lib/rails_generator/generators/components/session_migration/USAGE +15 -0
  1345. data/vendor/rails/railties/lib/rails_generator/generators/components/session_migration/session_migration_generator.rb +18 -0
  1346. data/vendor/rails/railties/lib/rails_generator/generators/components/session_migration/templates/migration.rb +16 -0
  1347. data/vendor/rails/railties/lib/rails_generator/generators/components/web_service/USAGE +28 -0
  1348. data/vendor/rails/railties/lib/rails_generator/generators/components/web_service/templates/api_definition.rb +5 -0
  1349. data/vendor/rails/railties/lib/rails_generator/generators/components/web_service/templates/controller.rb +8 -0
  1350. data/vendor/rails/railties/lib/rails_generator/generators/components/web_service/templates/functional_test.rb +19 -0
  1351. data/vendor/rails/railties/lib/rails_generator/generators/components/web_service/web_service_generator.rb +29 -0
  1352. data/vendor/rails/railties/lib/rails_generator/lookup.rb +209 -0
  1353. data/vendor/rails/railties/lib/rails_generator/manifest.rb +53 -0
  1354. data/vendor/rails/railties/lib/rails_generator/options.rb +143 -0
  1355. data/vendor/rails/railties/lib/rails_generator/scripts.rb +83 -0
  1356. data/vendor/rails/railties/lib/rails_generator/scripts/destroy.rb +7 -0
  1357. data/vendor/rails/railties/lib/rails_generator/scripts/generate.rb +7 -0
  1358. data/vendor/rails/railties/lib/rails_generator/scripts/update.rb +12 -0
  1359. data/vendor/rails/railties/lib/rails_generator/simple_logger.rb +46 -0
  1360. data/vendor/rails/railties/lib/rails_generator/spec.rb +44 -0
  1361. data/vendor/rails/railties/lib/railties_path.rb +1 -0
  1362. data/vendor/rails/railties/lib/ruby_version_check.rb +17 -0
  1363. data/vendor/rails/railties/lib/rubyprof_ext.rb +35 -0
  1364. data/vendor/rails/railties/lib/tasks/databases.rake +187 -0
  1365. data/vendor/rails/railties/lib/tasks/framework.rake +112 -0
  1366. data/vendor/rails/railties/lib/tasks/log.rake +9 -0
  1367. data/vendor/rails/railties/lib/tasks/misc.rake +4 -0
  1368. data/vendor/rails/railties/lib/tasks/pre_namespace_aliases.rake +53 -0
  1369. data/vendor/rails/railties/lib/tasks/rails.rb +8 -0
  1370. data/vendor/rails/railties/lib/tasks/statistics.rake +18 -0
  1371. data/vendor/rails/railties/lib/tasks/testing.rake +120 -0
  1372. data/vendor/rails/railties/lib/test_help.rb +19 -0
  1373. data/vendor/rails/railties/lib/webrick_server.rb +166 -0
  1374. data/vendor/rails/railties/test/abstract_unit.rb +20 -0
  1375. data/vendor/rails/railties/test/dispatcher_test.rb +141 -0
  1376. data/vendor/rails/railties/test/fcgi_dispatcher_test.rb +294 -0
  1377. data/vendor/rails/railties/test/fixtures/environment_with_constant.rb +1 -0
  1378. data/vendor/rails/railties/test/fixtures/lib/generators/missing_class/missing_class_generator.rb +0 -0
  1379. data/vendor/rails/railties/test/fixtures/lib/generators/working/working_generator.rb +2 -0
  1380. data/vendor/rails/railties/test/fixtures/plugins/default/stubby/init.rb +7 -0
  1381. data/vendor/rails/railties/test/fixtures/plugins/default/stubby/lib/stubby_mixin.rb +2 -0
  1382. data/vendor/rails/railties/test/initializer_test.rb +33 -0
  1383. data/vendor/rails/railties/test/mocks/dispatcher.rb +13 -0
  1384. data/vendor/rails/railties/test/mocks/fcgi.rb +15 -0
  1385. data/vendor/rails/railties/test/mocks/routes.rb +6 -0
  1386. data/vendor/rails/railties/test/mocks/stubbed_breakpoint.rb +2 -0
  1387. data/vendor/rails/railties/test/mocks/stubbed_kernel.rb +5 -0
  1388. data/vendor/rails/railties/test/plugin_test.rb +111 -0
  1389. data/vendor/rails/railties/test/rails_generator_test.rb +127 -0
  1390. data/vendor/rails/railties/test/rails_info_controller_test.rb +48 -0
  1391. data/vendor/rails/railties/test/rails_info_test.rb +98 -0
  1392. data/vendor/rails/release.rb +25 -0
  1393. data/vendor/redcloth/Rakefile +196 -0
  1394. data/vendor/redcloth/bin/redcloth +3 -0
  1395. data/vendor/redcloth/lib/rctodb.rb +1107 -0
  1396. data/vendor/redcloth/lib/redcloth.rb +1130 -0
  1397. data/vendor/redcloth/run-tests.rb +28 -0
  1398. data/vendor/redcloth/setup.rb +1376 -0
  1399. data/vendor/redcloth/tests/code.yml +105 -0
  1400. data/vendor/redcloth/tests/images.yml +171 -0
  1401. data/vendor/redcloth/tests/instiki.yml +39 -0
  1402. data/vendor/redcloth/tests/links.yml +155 -0
  1403. data/vendor/redcloth/tests/lists.yml +77 -0
  1404. data/vendor/redcloth/tests/markdown.yml +218 -0
  1405. data/vendor/redcloth/tests/poignant.yml +64 -0
  1406. data/vendor/redcloth/tests/table.yml +198 -0
  1407. data/vendor/redcloth/tests/textism.yml +406 -0
  1408. data/vendor/rubypants/README +114 -0
  1409. data/vendor/rubypants/Rakefile +84 -0
  1410. data/vendor/rubypants/install.rb +9 -0
  1411. data/vendor/rubypants/rubypants.rb +490 -0
  1412. data/vendor/rubypants/test_rubypants.rb +162 -0
  1413. metadata +1701 -114
  1414. data/app/behaviors/archive_behavior.rb +0 -42
  1415. data/app/behaviors/archive_day_index_behavior.rb +0 -30
  1416. data/app/behaviors/archive_month_index_behavior.rb +0 -30
  1417. data/app/behaviors/archive_year_index_behavior.rb +0 -30
  1418. data/app/behaviors/page_missing_behavior.rb +0 -31
  1419. data/app/filters/markdown_filter.rb +0 -9
  1420. data/app/filters/textile_filter.rb +0 -9
  1421. data/app/models/behavior.rb +0 -194
  1422. data/db/development_structure.sql +0 -80
  1423. data/lib/advanced_delegation.rb +0 -21
  1424. data/lib/archive_index_behavior_tags_and_methods.rb +0 -48
  1425. data/lib/generators/behavior/USAGE +0 -16
  1426. data/lib/generators/behavior/behavior_generator.rb +0 -22
  1427. data/lib/generators/behavior/templates/model.rb.template +0 -9
  1428. data/lib/generators/behavior/templates/unit_test.rb.template +0 -16
  1429. data/lib/generators/filter/USAGE +0 -16
  1430. data/lib/generators/filter/filter_generator.rb +0 -22
  1431. data/lib/generators/filter/templates/model.rb.template +0 -8
  1432. data/lib/generators/filter/templates/unit_test.rb.template +0 -7
  1433. data/lib/plugins/index_quoting_fix/init.rb +0 -32
  1434. data/lib/registerable.rb +0 -70
  1435. data/script/setup_database +0 -297
  1436. data/test/functional/admin/model_controller_test.rb +0 -152
  1437. data/test/helpers/behavior_render_test_helper.rb +0 -34
  1438. data/test/helpers/behavior_test_helper.rb +0 -47
  1439. data/test/unit/behavior_test.rb +0 -196
  1440. data/test/unit/filters/markdown_filter_test.rb +0 -14
  1441. data/test/unit/filters/textile_filter_test.rb +0 -14
  1442. data/test/unit/registerable_test.rb +0 -68
@@ -0,0 +1,1627 @@
1
+ require 'active_record/associations/association_proxy'
2
+ require 'active_record/associations/association_collection'
3
+ require 'active_record/associations/belongs_to_association'
4
+ require 'active_record/associations/belongs_to_polymorphic_association'
5
+ require 'active_record/associations/has_one_association'
6
+ require 'active_record/associations/has_many_association'
7
+ require 'active_record/associations/has_many_through_association'
8
+ require 'active_record/associations/has_and_belongs_to_many_association'
9
+ require 'active_record/deprecated_associations'
10
+
11
+ module ActiveRecord
12
+ class HasManyThroughAssociationNotFoundError < ActiveRecordError #:nodoc:
13
+ def initialize(owner_class_name, reflection)
14
+ super("Could not find the association #{reflection.options[:through].inspect} in model #{owner_class_name}")
15
+ end
16
+ end
17
+
18
+ class HasManyThroughAssociationPolymorphicError < ActiveRecordError #:nodoc:
19
+ def initialize(owner_class_name, reflection, source_reflection)
20
+ super("Cannot have a has_many :through association '#{owner_class_name}##{reflection.name}' on the polymorphic object '#{source_reflection.class_name}##{source_reflection.name}'.")
21
+ end
22
+ end
23
+
24
+ class HasManyThroughAssociationPointlessSourceTypeError < ActiveRecordError #:nodoc:
25
+ def initialize(owner_class_name, reflection, source_reflection)
26
+ super("Cannot have a has_many :through association '#{owner_class_name}##{reflection.name}' with a :source_type option if the '#{reflection.through_reflection.class_name}##{source_reflection.name}' is not polymorphic. Try removing :source_type on your association.")
27
+ end
28
+ end
29
+
30
+ class HasManyThroughSourceAssociationNotFoundError < ActiveRecordError #:nodoc:
31
+ def initialize(reflection)
32
+ through_reflection = reflection.through_reflection
33
+ source_reflection_names = reflection.source_reflection_names
34
+ source_associations = reflection.through_reflection.klass.reflect_on_all_associations.collect { |a| a.name.inspect }
35
+ super("Could not find the source association(s) #{source_reflection_names.collect(&:inspect).to_sentence :connector => 'or'} in model #{through_reflection.klass}. Try 'has_many #{reflection.name.inspect}, :through => #{through_reflection.name.inspect}, :source => <name>'. Is it one of #{source_associations.to_sentence :connector => 'or'}?")
36
+ end
37
+ end
38
+
39
+ class HasManyThroughSourceAssociationMacroError < ActiveRecordError #:nodoc:
40
+ def initialize(reflection)
41
+ through_reflection = reflection.through_reflection
42
+ source_reflection = reflection.source_reflection
43
+ super("Invalid source reflection macro :#{source_reflection.macro}#{" :through" if source_reflection.options[:through]} for has_many #{reflection.name.inspect}, :through => #{through_reflection.name.inspect}. Use :source to specify the source reflection.")
44
+ end
45
+ end
46
+
47
+ class HasManyThroughCantAssociateNewRecords < ActiveRecordError #:nodoc:
48
+ def initialize(owner, reflection)
49
+ super("Cannot associate new records through '#{owner.class.name}##{reflection.name}' on '#{reflection.source_reflection.class_name rescue nil}##{reflection.source_reflection.name rescue nil}'. Both records must have an id in order to create the has_many :through record associating them.")
50
+ end
51
+ end
52
+
53
+ class EagerLoadPolymorphicError < ActiveRecordError #:nodoc:
54
+ def initialize(reflection)
55
+ super("Can not eagerly load the polymorphic association #{reflection.name.inspect}")
56
+ end
57
+ end
58
+
59
+ class ReadOnlyAssociation < ActiveRecordError #:nodoc:
60
+ def initialize(reflection)
61
+ super("Can not add to a has_many :through association. Try adding to #{reflection.through_reflection.name.inspect}.")
62
+ end
63
+ end
64
+
65
+ module Associations # :nodoc:
66
+ def self.included(base)
67
+ base.extend(ClassMethods)
68
+ end
69
+
70
+ # Clears out the association cache
71
+ def clear_association_cache #:nodoc:
72
+ self.class.reflect_on_all_associations.to_a.each do |assoc|
73
+ instance_variable_set "@#{assoc.name}", nil
74
+ end unless self.new_record?
75
+ end
76
+
77
+ # Associations are a set of macro-like class methods for tying objects together through foreign keys. They express relationships like
78
+ # "Project has one Project Manager" or "Project belongs to a Portfolio". Each macro adds a number of methods to the class which are
79
+ # specialized according to the collection or association symbol and the options hash. It works much the same way as Ruby's own attr*
80
+ # methods. Example:
81
+ #
82
+ # class Project < ActiveRecord::Base
83
+ # belongs_to :portfolio
84
+ # has_one :project_manager
85
+ # has_many :milestones
86
+ # has_and_belongs_to_many :categories
87
+ # end
88
+ #
89
+ # The project class now has the following methods (and more) to ease the traversal and manipulation of its relationships:
90
+ # * <tt>Project#portfolio, Project#portfolio=(portfolio), Project#portfolio.nil?</tt>
91
+ # * <tt>Project#project_manager, Project#project_manager=(project_manager), Project#project_manager.nil?,</tt>
92
+ # * <tt>Project#milestones.empty?, Project#milestones.size, Project#milestones, Project#milestones<<(milestone),</tt>
93
+ # <tt>Project#milestones.delete(milestone), Project#milestones.find(milestone_id), Project#milestones.find(:all, options),</tt>
94
+ # <tt>Project#milestones.build, Project#milestones.create</tt>
95
+ # * <tt>Project#categories.empty?, Project#categories.size, Project#categories, Project#categories<<(category1),</tt>
96
+ # <tt>Project#categories.delete(category1)</tt>
97
+ #
98
+ # == Example
99
+ #
100
+ # link:files/examples/associations.png
101
+ #
102
+ # == Is it belongs_to or has_one?
103
+ #
104
+ # Both express a 1-1 relationship, the difference is mostly where to place the foreign key, which goes on the table for the class
105
+ # saying belongs_to. Example:
106
+ #
107
+ # class User < ActiveRecord::Base
108
+ # # I reference an account.
109
+ # belongs_to :account
110
+ # end
111
+ #
112
+ # class Account < ActiveRecord::Base
113
+ # # One user references me.
114
+ # has_one :user
115
+ # end
116
+ #
117
+ # The tables for these classes could look something like:
118
+ #
119
+ # CREATE TABLE users (
120
+ # id int(11) NOT NULL auto_increment,
121
+ # account_id int(11) default NULL,
122
+ # name varchar default NULL,
123
+ # PRIMARY KEY (id)
124
+ # )
125
+ #
126
+ # CREATE TABLE accounts (
127
+ # id int(11) NOT NULL auto_increment,
128
+ # name varchar default NULL,
129
+ # PRIMARY KEY (id)
130
+ # )
131
+ #
132
+ # == Unsaved objects and associations
133
+ #
134
+ # You can manipulate objects and associations before they are saved to the database, but there is some special behaviour you should be
135
+ # aware of, mostly involving the saving of associated objects.
136
+ #
137
+ # === One-to-one associations
138
+ #
139
+ # * Assigning an object to a has_one association automatically saves that object and the object being replaced (if there is one), in
140
+ # order to update their primary keys - except if the parent object is unsaved (new_record? == true).
141
+ # * If either of these saves fail (due to one of the objects being invalid) the assignment statement returns false and the assignment
142
+ # is cancelled.
143
+ # * If you wish to assign an object to a has_one association without saving it, use the #association.build method (documented below).
144
+ # * Assigning an object to a belongs_to association does not save the object, since the foreign key field belongs on the parent. It does
145
+ # not save the parent either.
146
+ #
147
+ # === Collections
148
+ #
149
+ # * Adding an object to a collection (has_many or has_and_belongs_to_many) automatically saves that object, except if the parent object
150
+ # (the owner of the collection) is not yet stored in the database.
151
+ # * If saving any of the objects being added to a collection (via #push or similar) fails, then #push returns false.
152
+ # * You can add an object to a collection without automatically saving it by using the #collection.build method (documented below).
153
+ # * All unsaved (new_record? == true) members of the collection are automatically saved when the parent is saved.
154
+ #
155
+ # === Association callbacks
156
+ #
157
+ # Similiar to the normal callbacks that hook into the lifecycle of an Active Record object, you can also define callbacks that get
158
+ # trigged when you add an object to or removing an object from a association collection. Example:
159
+ #
160
+ # class Project
161
+ # has_and_belongs_to_many :developers, :after_add => :evaluate_velocity
162
+ #
163
+ # def evaluate_velocity(developer)
164
+ # ...
165
+ # end
166
+ # end
167
+ #
168
+ # It's possible to stack callbacks by passing them as an array. Example:
169
+ #
170
+ # class Project
171
+ # has_and_belongs_to_many :developers, :after_add => [:evaluate_velocity, Proc.new { |p, d| p.shipping_date = Time.now}]
172
+ # end
173
+ #
174
+ # Possible callbacks are: before_add, after_add, before_remove and after_remove.
175
+ #
176
+ # Should any of the before_add callbacks throw an exception, the object does not get added to the collection. Same with
177
+ # the before_remove callbacks, if an exception is thrown the object doesn't get removed.
178
+ #
179
+ # === Association extensions
180
+ #
181
+ # The proxy objects that controls the access to associations can be extended through anonymous modules. This is especially
182
+ # beneficial for adding new finders, creators, and other factory-type methods that are only used as part of this association.
183
+ # Example:
184
+ #
185
+ # class Account < ActiveRecord::Base
186
+ # has_many :people do
187
+ # def find_or_create_by_name(name)
188
+ # first_name, last_name = name.split(" ", 2)
189
+ # find_or_create_by_first_name_and_last_name(first_name, last_name)
190
+ # end
191
+ # end
192
+ # end
193
+ #
194
+ # person = Account.find(:first).people.find_or_create_by_name("David Heinemeier Hansson")
195
+ # person.first_name # => "David"
196
+ # person.last_name # => "Heinemeier Hansson"
197
+ #
198
+ # If you need to share the same extensions between many associations, you can use a named extension module. Example:
199
+ #
200
+ # module FindOrCreateByNameExtension
201
+ # def find_or_create_by_name(name)
202
+ # first_name, last_name = name.split(" ", 2)
203
+ # find_or_create_by_first_name_and_last_name(first_name, last_name)
204
+ # end
205
+ # end
206
+ #
207
+ # class Account < ActiveRecord::Base
208
+ # has_many :people, :extend => FindOrCreateByNameExtension
209
+ # end
210
+ #
211
+ # class Company < ActiveRecord::Base
212
+ # has_many :people, :extend => FindOrCreateByNameExtension
213
+ # end
214
+ #
215
+ # If you need to use multiple named extension modules, you can specify an array of modules with the :extend option.
216
+ # In the case of name conflicts between methods in the modules, methods in modules later in the array supercede
217
+ # those earlier in the array. Example:
218
+ #
219
+ # class Account < ActiveRecord::Base
220
+ # has_many :people, :extend => [FindOrCreateByNameExtension, FindRecentExtension]
221
+ # end
222
+ #
223
+ # Some extensions can only be made to work with knowledge of the association proxy's internals.
224
+ # Extensions can access relevant state using accessors on the association proxy:
225
+ #
226
+ # * +proxy_owner+ - Returns the object the association is part of.
227
+ # * +proxy_reflection+ - Returns the reflection object that describes the association.
228
+ # * +proxy_target+ - Returns the associated object for belongs_to and has_one, or the collection of associated objects for has_many and has_and_belongs_to_many.
229
+ #
230
+ # === Association Join Models
231
+ #
232
+ # Has Many associations can be configured with the :through option to use an explicit join model to retrieve the data. This
233
+ # operates similarly to a <tt>has_and_belongs_to_many</tt> association. The advantage is that you're able to add validations,
234
+ # callbacks, and extra attributes on the join model. Consider the following schema:
235
+ #
236
+ # class Author < ActiveRecord::Base
237
+ # has_many :authorships
238
+ # has_many :books, :through => :authorships
239
+ # end
240
+ #
241
+ # class Authorship < ActiveRecord::Base
242
+ # belongs_to :author
243
+ # belongs_to :book
244
+ # end
245
+ #
246
+ # @author = Author.find :first
247
+ # @author.authorships.collect { |a| a.book } # selects all books that the author's authorships belong to.
248
+ # @author.books # selects all books by using the Authorship join model
249
+ #
250
+ # You can also go through a has_many association on the join model:
251
+ #
252
+ # class Firm < ActiveRecord::Base
253
+ # has_many :clients
254
+ # has_many :invoices, :through => :clients
255
+ # end
256
+ #
257
+ # class Client < ActiveRecord::Base
258
+ # belongs_to :firm
259
+ # has_many :invoices
260
+ # end
261
+ #
262
+ # class Invoice < ActiveRecord::Base
263
+ # belongs_to :client
264
+ # end
265
+ #
266
+ # @firm = Firm.find :first
267
+ # @firm.clients.collect { |c| c.invoices }.flatten # select all invoices for all clients of the firm
268
+ # @firm.invoices # selects all invoices by going through the Client join model.
269
+ #
270
+ # === Polymorphic Associations
271
+ #
272
+ # Polymorphic associations on models are not restricted on what types of models they can be associated with. Rather, they
273
+ # specify an interface that a has_many association must adhere to.
274
+ #
275
+ # class Asset < ActiveRecord::Base
276
+ # belongs_to :attachable, :polymorphic => true
277
+ # end
278
+ #
279
+ # class Post < ActiveRecord::Base
280
+ # has_many :assets, :as => :attachable # The <tt>:as</tt> option specifies the polymorphic interface to use.
281
+ # end
282
+ #
283
+ # @asset.attachable = @post
284
+ #
285
+ # This works by using a type column in addition to a foreign key to specify the associated record. In the Asset example, you'd need
286
+ # an attachable_id integer column and an attachable_type string column.
287
+ #
288
+ # Using polymorphic associations in combination with single table inheritance (STI) is a little tricky. In order
289
+ # for the associations to work as expected, ensure that you store the base model for the STI models in the
290
+ # type column of the polymorphic association. To continue with the asset example above, suppose there are guest posts
291
+ # and member posts that use the posts table for STI. So there will be an additional 'type' column in the posts table.
292
+ #
293
+ # class Asset < ActiveRecord::Base
294
+ # belongs_to :attachable, :polymorphic => true
295
+ #
296
+ # def attachable_type=(sType)
297
+ # super(sType.to_s.classify.constantize.base_class.to_s)
298
+ # end
299
+ # end
300
+ #
301
+ # class Post < ActiveRecord::Base
302
+ # # because we store "Post" in attachable_type now :dependent => :destroy will work
303
+ # has_many :assets, :as => :attachable, :dependent => :destroy
304
+ # end
305
+ #
306
+ # class GuestPost < ActiveRecord::Base
307
+ # end
308
+ #
309
+ # class MemberPost < ActiveRecord::Base
310
+ # end
311
+ #
312
+ # == Caching
313
+ #
314
+ # All of the methods are built on a simple caching principle that will keep the result of the last query around unless specifically
315
+ # instructed not to. The cache is even shared across methods to make it even cheaper to use the macro-added methods without
316
+ # worrying too much about performance at the first go. Example:
317
+ #
318
+ # project.milestones # fetches milestones from the database
319
+ # project.milestones.size # uses the milestone cache
320
+ # project.milestones.empty? # uses the milestone cache
321
+ # project.milestones(true).size # fetches milestones from the database
322
+ # project.milestones # uses the milestone cache
323
+ #
324
+ # == Eager loading of associations
325
+ #
326
+ # Eager loading is a way to find objects of a certain class and a number of named associations along with it in a single SQL call. This is
327
+ # one of the easiest ways of to prevent the dreaded 1+N problem in which fetching 100 posts that each needs to display their author
328
+ # triggers 101 database queries. Through the use of eager loading, the 101 queries can be reduced to 1. Example:
329
+ #
330
+ # class Post < ActiveRecord::Base
331
+ # belongs_to :author
332
+ # has_many :comments
333
+ # end
334
+ #
335
+ # Consider the following loop using the class above:
336
+ #
337
+ # for post in Post.find(:all)
338
+ # puts "Post: " + post.title
339
+ # puts "Written by: " + post.author.name
340
+ # puts "Last comment on: " + post.comments.first.created_on
341
+ # end
342
+ #
343
+ # To iterate over these one hundred posts, we'll generate 201 database queries. Let's first just optimize it for retrieving the author:
344
+ #
345
+ # for post in Post.find(:all, :include => :author)
346
+ #
347
+ # This references the name of the belongs_to association that also used the :author symbol, so the find will now weave in a join something
348
+ # like this: LEFT OUTER JOIN authors ON authors.id = posts.author_id. Doing so will cut down the number of queries from 201 to 101.
349
+ #
350
+ # We can improve upon the situation further by referencing both associations in the finder with:
351
+ #
352
+ # for post in Post.find(:all, :include => [ :author, :comments ])
353
+ #
354
+ # That'll add another join along the lines of: LEFT OUTER JOIN comments ON comments.post_id = posts.id. And we'll be down to 1 query.
355
+ # But that shouldn't fool you to think that you can pull out huge amounts of data with no performance penalty just because you've reduced
356
+ # the number of queries. The database still needs to send all the data to Active Record and it still needs to be processed. So it's no
357
+ # catch-all for performance problems, but it's a great way to cut down on the number of queries in a situation as the one described above.
358
+ #
359
+ # Since the eager loading pulls from multiple tables, you'll have to disambiguate any column references in both conditions and orders. So
360
+ # :order => "posts.id DESC" will work while :order => "id DESC" will not. Because eager loading generates the SELECT statement too, the
361
+ # :select option is ignored.
362
+ #
363
+ # You can use eager loading on multiple associations from the same table, but you cannot use those associations in orders and conditions
364
+ # as there is currently not any way to disambiguate them. Eager loading will not pull additional attributes on join tables, so "rich
365
+ # associations" with has_and_belongs_to_many are not a good fit for eager loading.
366
+ #
367
+ # When eager loaded, conditions are interpolated in the context of the model class, not the model instance. Conditions are lazily interpolated
368
+ # before the actual model exists.
369
+ #
370
+ # == Table Aliasing
371
+ #
372
+ # ActiveRecord uses table aliasing in the case that a table is referenced multiple times in a join. If a table is referenced only once,
373
+ # the standard table name is used. The second time, the table is aliased as #{reflection_name}_#{parent_table_name}. Indexes are appended
374
+ # for any more successive uses of the table name.
375
+ #
376
+ # Post.find :all, :include => :comments
377
+ # # => SELECT ... FROM posts LEFT OUTER JOIN comments ON ...
378
+ # Post.find :all, :include => :special_comments # STI
379
+ # # => SELECT ... FROM posts LEFT OUTER JOIN comments ON ... AND comments.type = 'SpecialComment'
380
+ # Post.find :all, :include => [:comments, :special_comments] # special_comments is the reflection name, posts is the parent table name
381
+ # # => SELECT ... FROM posts LEFT OUTER JOIN comments ON ... LEFT OUTER JOIN comments special_comments_posts
382
+ #
383
+ # Acts as tree example:
384
+ #
385
+ # TreeMixin.find :all, :include => :children
386
+ # # => SELECT ... FROM mixins LEFT OUTER JOIN mixins childrens_mixins ...
387
+ # TreeMixin.find :all, :include => {:children => :parent} # using cascading eager includes
388
+ # # => SELECT ... FROM mixins LEFT OUTER JOIN mixins childrens_mixins ...
389
+ # LEFT OUTER JOIN parents_mixins ...
390
+ # TreeMixin.find :all, :include => {:children => {:parent => :children}}
391
+ # # => SELECT ... FROM mixins LEFT OUTER JOIN mixins childrens_mixins ...
392
+ # LEFT OUTER JOIN parents_mixins ...
393
+ # LEFT OUTER JOIN mixins childrens_mixins_2
394
+ #
395
+ # Has and Belongs to Many join tables use the same idea, but add a _join suffix:
396
+ #
397
+ # Post.find :all, :include => :categories
398
+ # # => SELECT ... FROM posts LEFT OUTER JOIN categories_posts ... LEFT OUTER JOIN categories ...
399
+ # Post.find :all, :include => {:categories => :posts}
400
+ # # => SELECT ... FROM posts LEFT OUTER JOIN categories_posts ... LEFT OUTER JOIN categories ...
401
+ # LEFT OUTER JOIN categories_posts posts_categories_join LEFT OUTER JOIN posts posts_categories
402
+ # Post.find :all, :include => {:categories => {:posts => :categories}}
403
+ # # => SELECT ... FROM posts LEFT OUTER JOIN categories_posts ... LEFT OUTER JOIN categories ...
404
+ # LEFT OUTER JOIN categories_posts posts_categories_join LEFT OUTER JOIN posts posts_categories
405
+ # LEFT OUTER JOIN categories_posts categories_posts_join LEFT OUTER JOIN categories categories_posts
406
+ #
407
+ # If you wish to specify your own custom joins using a :joins option, those table names will take precedence over the eager associations..
408
+ #
409
+ # Post.find :all, :include => :comments, :joins => "inner join comments ..."
410
+ # # => SELECT ... FROM posts LEFT OUTER JOIN comments_posts ON ... INNER JOIN comments ...
411
+ # Post.find :all, :include => [:comments, :special_comments], :joins => "inner join comments ..."
412
+ # # => SELECT ... FROM posts LEFT OUTER JOIN comments comments_posts ON ...
413
+ # LEFT OUTER JOIN comments special_comments_posts ...
414
+ # INNER JOIN comments ...
415
+ #
416
+ # Table aliases are automatically truncated according to the maximum length of table identifiers according to the specific database.
417
+ #
418
+ # == Modules
419
+ #
420
+ # By default, associations will look for objects within the current module scope. Consider:
421
+ #
422
+ # module MyApplication
423
+ # module Business
424
+ # class Firm < ActiveRecord::Base
425
+ # has_many :clients
426
+ # end
427
+ #
428
+ # class Company < ActiveRecord::Base; end
429
+ # end
430
+ # end
431
+ #
432
+ # When Firm#clients is called, it'll in turn call <tt>MyApplication::Business::Company.find(firm.id)</tt>. If you want to associate
433
+ # with a class in another module scope this can be done by specifying the complete class name, such as:
434
+ #
435
+ # module MyApplication
436
+ # module Business
437
+ # class Firm < ActiveRecord::Base; end
438
+ # end
439
+ #
440
+ # module Billing
441
+ # class Account < ActiveRecord::Base
442
+ # belongs_to :firm, :class_name => "MyApplication::Business::Firm"
443
+ # end
444
+ # end
445
+ # end
446
+ #
447
+ # == Type safety with ActiveRecord::AssociationTypeMismatch
448
+ #
449
+ # If you attempt to assign an object to an association that doesn't match the inferred or specified <tt>:class_name</tt>, you'll
450
+ # get a ActiveRecord::AssociationTypeMismatch.
451
+ #
452
+ # == Options
453
+ #
454
+ # All of the association macros can be specialized through options which makes more complex cases than the simple and guessable ones
455
+ # possible.
456
+ module ClassMethods
457
+ # Adds the following methods for retrieval and query of collections of associated objects.
458
+ # +collection+ is replaced with the symbol passed as the first argument, so
459
+ # <tt>has_many :clients</tt> would add among others <tt>clients.empty?</tt>.
460
+ # * <tt>collection(force_reload = false)</tt> - returns an array of all the associated objects.
461
+ # An empty array is returned if none are found.
462
+ # * <tt>collection<<(object, ...)</tt> - adds one or more objects to the collection by setting their foreign keys to the collection's primary key.
463
+ # * <tt>collection.delete(object, ...)</tt> - removes one or more objects from the collection by setting their foreign keys to NULL.
464
+ # This will also destroy the objects if they're declared as belongs_to and dependent on this model.
465
+ # * <tt>collection=objects</tt> - replaces the collections content by deleting and adding objects as appropriate.
466
+ # * <tt>collection_singular_ids</tt> - returns an array of the associated objects ids
467
+ # * <tt>collection_singular_ids=ids</tt> - replace the collection by the objects identified by the primary keys in +ids+
468
+ # * <tt>collection.clear</tt> - removes every object from the collection. This destroys the associated objects if they
469
+ # are <tt>:dependent</tt>, deletes them directly from the database if they are <tt>:dependent => :delete_all</tt>,
470
+ # and sets their foreign keys to NULL otherwise.
471
+ # * <tt>collection.empty?</tt> - returns true if there are no associated objects.
472
+ # * <tt>collection.size</tt> - returns the number of associated objects.
473
+ # * <tt>collection.find</tt> - finds an associated object according to the same rules as Base.find.
474
+ # * <tt>collection.build(attributes = {})</tt> - returns a new object of the collection type that has been instantiated
475
+ # with +attributes+ and linked to this object through a foreign key but has not yet been saved. *Note:* This only works if an
476
+ # associated object already exists, not if it's nil!
477
+ # * <tt>collection.create(attributes = {})</tt> - returns a new object of the collection type that has been instantiated
478
+ # with +attributes+ and linked to this object through a foreign key and that has already been saved (if it passed the validation).
479
+ # *Note:* This only works if an associated object already exists, not if it's nil!
480
+ #
481
+ # Example: A Firm class declares <tt>has_many :clients</tt>, which will add:
482
+ # * <tt>Firm#clients</tt> (similar to <tt>Clients.find :all, :conditions => "firm_id = #{id}"</tt>)
483
+ # * <tt>Firm#clients<<</tt>
484
+ # * <tt>Firm#clients.delete</tt>
485
+ # * <tt>Firm#clients=</tt>
486
+ # * <tt>Firm#client_ids</tt>
487
+ # * <tt>Firm#client_ids=</tt>
488
+ # * <tt>Firm#clients.clear</tt>
489
+ # * <tt>Firm#clients.empty?</tt> (similar to <tt>firm.clients.size == 0</tt>)
490
+ # * <tt>Firm#clients.size</tt> (similar to <tt>Client.count "firm_id = #{id}"</tt>)
491
+ # * <tt>Firm#clients.find</tt> (similar to <tt>Client.find(id, :conditions => "firm_id = #{id}")</tt>)
492
+ # * <tt>Firm#clients.build</tt> (similar to <tt>Client.new("firm_id" => id)</tt>)
493
+ # * <tt>Firm#clients.create</tt> (similar to <tt>c = Client.new("firm_id" => id); c.save; c</tt>)
494
+ # The declaration can also include an options hash to specialize the behavior of the association.
495
+ #
496
+ # Options are:
497
+ # * <tt>:class_name</tt> - specify the class name of the association. Use it only if that name can't be inferred
498
+ # from the association name. So <tt>has_many :products</tt> will by default be linked to the +Product+ class, but
499
+ # if the real class name is +SpecialProduct+, you'll have to specify it with this option.
500
+ # * <tt>:conditions</tt> - specify the conditions that the associated objects must meet in order to be included as a "WHERE"
501
+ # sql fragment, such as "price > 5 AND name LIKE 'B%'".
502
+ # * <tt>:order</tt> - specify the order in which the associated objects are returned as a "ORDER BY" sql fragment,
503
+ # such as "last_name, first_name DESC"
504
+ # * <tt>:group</tt> - specify the attribute by which the associated objects are returned as a "GROUP BY" sql fragment,
505
+ # such as "category"
506
+ # * <tt>:foreign_key</tt> - specify the foreign key used for the association. By default this is guessed to be the name
507
+ # of this class in lower-case and "_id" suffixed. So a +Person+ class that makes a has_many association will use "person_id"
508
+ # as the default foreign_key.
509
+ # * <tt>:dependent</tt> - if set to :destroy all the associated objects are destroyed
510
+ # alongside this object by calling their destroy method. If set to :delete_all all associated
511
+ # objects are deleted *without* calling their destroy method. If set to :nullify all associated
512
+ # objects' foreign keys are set to NULL *without* calling their save callbacks.
513
+ # NOTE: :dependent => true is deprecated and has been replaced with :dependent => :destroy.
514
+ # May not be set if :exclusively_dependent is also set.
515
+ # * <tt>:exclusively_dependent</tt> - Deprecated; equivalent to :dependent => :delete_all. If set to true all
516
+ # the associated object are deleted in one SQL statement without having their
517
+ # before_destroy callback run. This should only be used on associations that depend solely on this class and don't need to do any
518
+ # clean-up in before_destroy. The upside is that it's much faster, especially if there's a counter_cache involved.
519
+ # May not be set if :dependent is also set.
520
+ # * <tt>:finder_sql</tt> - specify a complete SQL statement to fetch the association. This is a good way to go for complex
521
+ # associations that depend on multiple tables. Note: When this option is used, +find_in_collection+ is _not_ added.
522
+ # * <tt>:counter_sql</tt> - specify a complete SQL statement to fetch the size of the association. If +:finder_sql+ is
523
+ # specified but +:counter_sql+, +:counter_sql+ will be generated by replacing SELECT ... FROM with SELECT COUNT(*) FROM.
524
+ # * <tt>:extend</tt> - specify a named module for extending the proxy, see "Association extensions".
525
+ # * <tt>:include</tt> - specify second-order associations that should be eager loaded when the collection is loaded.
526
+ # * <tt>:group</tt>: An attribute name by which the result should be grouped. Uses the GROUP BY SQL-clause.
527
+ # * <tt>:limit</tt>: An integer determining the limit on the number of rows that should be returned.
528
+ # * <tt>:offset</tt>: An integer determining the offset from where the rows should be fetched. So at 5, it would skip the first 4 rows.
529
+ # * <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
530
+ # include the joined columns.
531
+ # * <tt>:as</tt>: Specifies a polymorphic interface (See #belongs_to).
532
+ # * <tt>:through</tt>: Specifies a Join Model to perform the query through. Options for <tt>:class_name</tt> and <tt>:foreign_key</tt>
533
+ # are ignored, as the association uses the source reflection. You can only use a <tt>:through</tt> query through a <tt>belongs_to</tt>
534
+ # or <tt>has_many</tt> association.
535
+ # * <tt>:source</tt>: Specifies the source association name used by <tt>has_many :through</tt> queries. Only use it if the name cannot be
536
+ # inferred from the association. <tt>has_many :subscribers, :through => :subscriptions</tt> will look for either +:subscribers+ or
537
+ # +:subscriber+ on +Subscription+, unless a +:source+ is given.
538
+ # * <tt>:source_type</tt>: Specifies type of the source association used by <tt>has_many :through</tt> queries where the source association
539
+ # is a polymorphic belongs_to.
540
+ # * <tt>:uniq</tt> - if set to true, duplicates will be omitted from the collection. Useful in conjunction with :through.
541
+ #
542
+ # Option examples:
543
+ # has_many :comments, :order => "posted_on"
544
+ # has_many :comments, :include => :author
545
+ # has_many :people, :class_name => "Person", :conditions => "deleted = 0", :order => "name"
546
+ # has_many :tracks, :order => "position", :dependent => :destroy
547
+ # has_many :comments, :dependent => :nullify
548
+ # has_many :tags, :as => :taggable
549
+ # has_many :subscribers, :through => :subscriptions, :source => :user
550
+ # has_many :subscribers, :class_name => "Person", :finder_sql =>
551
+ # 'SELECT DISTINCT people.* ' +
552
+ # 'FROM people p, post_subscriptions ps ' +
553
+ # 'WHERE ps.post_id = #{id} AND ps.person_id = p.id ' +
554
+ # 'ORDER BY p.first_name'
555
+ def has_many(association_id, options = {}, &extension)
556
+ reflection = create_has_many_reflection(association_id, options, &extension)
557
+
558
+ configure_dependency_for_has_many(reflection)
559
+
560
+ if options[:through]
561
+ collection_reader_method(reflection, HasManyThroughAssociation)
562
+ else
563
+ add_multiple_associated_save_callbacks(reflection.name)
564
+ add_association_callbacks(reflection.name, reflection.options)
565
+ collection_accessor_methods(reflection, HasManyAssociation)
566
+ end
567
+
568
+ add_deprecated_api_for_has_many(reflection.name)
569
+ end
570
+
571
+ # Adds the following methods for retrieval and query of a single associated object.
572
+ # +association+ is replaced with the symbol passed as the first argument, so
573
+ # <tt>has_one :manager</tt> would add among others <tt>manager.nil?</tt>.
574
+ # * <tt>association(force_reload = false)</tt> - returns the associated object. Nil is returned if none is found.
575
+ # * <tt>association=(associate)</tt> - assigns the associate object, extracts the primary key, sets it as the foreign key,
576
+ # and saves the associate object.
577
+ # * <tt>association.nil?</tt> - returns true if there is no associated object.
578
+ # * <tt>build_association(attributes = {})</tt> - returns a new object of the associated type that has been instantiated
579
+ # with +attributes+ and linked to this object through a foreign key but has not yet been saved. Note: This ONLY works if
580
+ # an association already exists. It will NOT work if the association is nil.
581
+ # * <tt>create_association(attributes = {})</tt> - returns a new object of the associated type that has been instantiated
582
+ # with +attributes+ and linked to this object through a foreign key and that has already been saved (if it passed the validation).
583
+ #
584
+ # Example: An Account class declares <tt>has_one :beneficiary</tt>, which will add:
585
+ # * <tt>Account#beneficiary</tt> (similar to <tt>Beneficiary.find(:first, :conditions => "account_id = #{id}")</tt>)
586
+ # * <tt>Account#beneficiary=(beneficiary)</tt> (similar to <tt>beneficiary.account_id = account.id; beneficiary.save</tt>)
587
+ # * <tt>Account#beneficiary.nil?</tt>
588
+ # * <tt>Account#build_beneficiary</tt> (similar to <tt>Beneficiary.new("account_id" => id)</tt>)
589
+ # * <tt>Account#create_beneficiary</tt> (similar to <tt>b = Beneficiary.new("account_id" => id); b.save; b</tt>)
590
+ #
591
+ # The declaration can also include an options hash to specialize the behavior of the association.
592
+ #
593
+ # Options are:
594
+ # * <tt>:class_name</tt> - specify the class name of the association. Use it only if that name can't be inferred
595
+ # from the association name. So <tt>has_one :manager</tt> will by default be linked to the +Manager+ class, but
596
+ # if the real class name is +Person+, you'll have to specify it with this option.
597
+ # * <tt>:conditions</tt> - specify the conditions that the associated object must meet in order to be included as a "WHERE"
598
+ # sql fragment, such as "rank = 5".
599
+ # * <tt>:order</tt> - specify the order from which the associated object will be picked at the top. Specified as
600
+ # an "ORDER BY" sql fragment, such as "last_name, first_name DESC"
601
+ # * <tt>:dependent</tt> - if set to :destroy (or true) the associated object is destroyed when this object is. If set to
602
+ # :delete the associated object is deleted *without* calling its destroy method. If set to :nullify the associated
603
+ # object's foreign key is set to NULL. Also, association is assigned.
604
+ # * <tt>:foreign_key</tt> - specify the foreign key used for the association. By default this is guessed to be the name
605
+ # of this class in lower-case and "_id" suffixed. So a +Person+ class that makes a has_one association will use "person_id"
606
+ # as the default foreign_key.
607
+ # * <tt>:include</tt> - specify second-order associations that should be eager loaded when this object is loaded.
608
+ # * <tt>:as</tt>: Specifies a polymorphic interface (See #belongs_to).
609
+ #
610
+ # Option examples:
611
+ # has_one :credit_card, :dependent => :destroy # destroys the associated credit card
612
+ # has_one :credit_card, :dependent => :nullify # updates the associated records foriegn key value to null rather than destroying it
613
+ # has_one :last_comment, :class_name => "Comment", :order => "posted_on"
614
+ # has_one :project_manager, :class_name => "Person", :conditions => "role = 'project_manager'"
615
+ # has_one :attachment, :as => :attachable
616
+ def has_one(association_id, options = {})
617
+ reflection = create_has_one_reflection(association_id, options)
618
+
619
+ module_eval do
620
+ after_save <<-EOF
621
+ association = instance_variable_get("@#{reflection.name}")
622
+ if !association.nil? && (new_record? || association.new_record? || association["#{reflection.primary_key_name}"] != id)
623
+ association["#{reflection.primary_key_name}"] = id
624
+ association.save(true)
625
+ end
626
+ EOF
627
+ end
628
+
629
+ association_accessor_methods(reflection, HasOneAssociation)
630
+ association_constructor_method(:build, reflection, HasOneAssociation)
631
+ association_constructor_method(:create, reflection, HasOneAssociation)
632
+
633
+ configure_dependency_for_has_one(reflection)
634
+
635
+ # deprecated api
636
+ deprecated_has_association_method(reflection.name)
637
+ deprecated_association_comparison_method(reflection.name, reflection.class_name)
638
+ end
639
+
640
+ # Adds the following methods for retrieval and query for a single associated object that this object holds an id to.
641
+ # +association+ is replaced with the symbol passed as the first argument, so
642
+ # <tt>belongs_to :author</tt> would add among others <tt>author.nil?</tt>.
643
+ # * <tt>association(force_reload = false)</tt> - returns the associated object. Nil is returned if none is found.
644
+ # * <tt>association=(associate)</tt> - assigns the associate object, extracts the primary key, and sets it as the foreign key.
645
+ # * <tt>association.nil?</tt> - returns true if there is no associated object.
646
+ # * <tt>build_association(attributes = {})</tt> - returns a new object of the associated type that has been instantiated
647
+ # with +attributes+ and linked to this object through a foreign key but has not yet been saved.
648
+ # * <tt>create_association(attributes = {})</tt> - returns a new object of the associated type that has been instantiated
649
+ # with +attributes+ and linked to this object through a foreign key and that has already been saved (if it passed the validation).
650
+ #
651
+ # Example: A Post class declares <tt>belongs_to :author</tt>, which will add:
652
+ # * <tt>Post#author</tt> (similar to <tt>Author.find(author_id)</tt>)
653
+ # * <tt>Post#author=(author)</tt> (similar to <tt>post.author_id = author.id</tt>)
654
+ # * <tt>Post#author?</tt> (similar to <tt>post.author == some_author</tt>)
655
+ # * <tt>Post#author.nil?</tt>
656
+ # * <tt>Post#build_author</tt> (similar to <tt>post.author = Author.new</tt>)
657
+ # * <tt>Post#create_author</tt> (similar to <tt>post.author = Author.new; post.author.save; post.author</tt>)
658
+ # The declaration can also include an options hash to specialize the behavior of the association.
659
+ #
660
+ # Options are:
661
+ # * <tt>:class_name</tt> - specify the class name of the association. Use it only if that name can't be inferred
662
+ # from the association name. So <tt>has_one :author</tt> will by default be linked to the +Author+ class, but
663
+ # if the real class name is +Person+, you'll have to specify it with this option.
664
+ # * <tt>:conditions</tt> - specify the conditions that the associated object must meet in order to be included as a "WHERE"
665
+ # sql fragment, such as "authorized = 1".
666
+ # * <tt>:order</tt> - specify the order from which the associated object will be picked at the top. Specified as
667
+ # an "ORDER BY" sql fragment, such as "last_name, first_name DESC"
668
+ # * <tt>:foreign_key</tt> - specify the foreign key used for the association. By default this is guessed to be the name
669
+ # of the associated class in lower-case and "_id" suffixed. So a +Person+ class that makes a belongs_to association to a
670
+ # +Boss+ class will use "boss_id" as the default foreign_key.
671
+ # * <tt>:counter_cache</tt> - caches the number of belonging objects on the associate class through use of increment_counter
672
+ # and decrement_counter. The counter cache is incremented when an object of this class is created and decremented when it's
673
+ # destroyed. This requires that a column named "#{table_name}_count" (such as comments_count for a belonging Comment class)
674
+ # is used on the associate class (such as a Post class). You can also specify a custom counter cache column by given that
675
+ # name instead of a true/false value to this option (e.g., <tt>:counter_cache => :my_custom_counter</tt>.)
676
+ # * <tt>:include</tt> - specify second-order associations that should be eager loaded when this object is loaded.
677
+ # * <tt>:polymorphic</tt> - specify this association is a polymorphic association by passing true.
678
+ #
679
+ # Option examples:
680
+ # belongs_to :firm, :foreign_key => "client_of"
681
+ # belongs_to :author, :class_name => "Person", :foreign_key => "author_id"
682
+ # belongs_to :valid_coupon, :class_name => "Coupon", :foreign_key => "coupon_id",
683
+ # :conditions => 'discounts > #{payments_count}'
684
+ # belongs_to :attachable, :polymorphic => true
685
+ def belongs_to(association_id, options = {})
686
+ if options.include?(:class_name) && !options.include?(:foreign_key)
687
+ ::ActiveSupport::Deprecation.warn(
688
+ "The inferred foreign_key name will change in Rails 2.0 to use the association name instead of its class name when they differ. When using :class_name in belongs_to, use the :foreign_key option to explicitly set the key name to avoid problems in the transition.",
689
+ caller)
690
+ end
691
+
692
+ reflection = create_belongs_to_reflection(association_id, options)
693
+
694
+ if reflection.options[:polymorphic]
695
+ association_accessor_methods(reflection, BelongsToPolymorphicAssociation)
696
+
697
+ module_eval do
698
+ before_save <<-EOF
699
+ association = instance_variable_get("@#{reflection.name}")
700
+ if association && association.target
701
+ if association.new_record?
702
+ association.save(true)
703
+ end
704
+
705
+ if association.updated?
706
+ self["#{reflection.primary_key_name}"] = association.id
707
+ self["#{reflection.options[:foreign_type]}"] = association.class.base_class.name.to_s
708
+ end
709
+ end
710
+ EOF
711
+ end
712
+ else
713
+ association_accessor_methods(reflection, BelongsToAssociation)
714
+ association_constructor_method(:build, reflection, BelongsToAssociation)
715
+ association_constructor_method(:create, reflection, BelongsToAssociation)
716
+
717
+ module_eval do
718
+ before_save <<-EOF
719
+ association = instance_variable_get("@#{reflection.name}")
720
+ if !association.nil?
721
+ if association.new_record?
722
+ association.save(true)
723
+ end
724
+
725
+ if association.updated?
726
+ self["#{reflection.primary_key_name}"] = association.id
727
+ end
728
+ end
729
+ EOF
730
+ end
731
+
732
+ # deprecated api
733
+ deprecated_has_association_method(reflection.name)
734
+ deprecated_association_comparison_method(reflection.name, reflection.class_name)
735
+ end
736
+
737
+ if options[:counter_cache]
738
+ cache_column = options[:counter_cache] == true ?
739
+ "#{self.to_s.underscore.pluralize}_count" :
740
+ options[:counter_cache]
741
+
742
+ module_eval(
743
+ "after_create '#{reflection.name}.class.increment_counter(\"#{cache_column}\", #{reflection.primary_key_name})" +
744
+ " unless #{reflection.name}.nil?'"
745
+ )
746
+
747
+ module_eval(
748
+ "before_destroy '#{reflection.name}.class.decrement_counter(\"#{cache_column}\", #{reflection.primary_key_name})" +
749
+ " unless #{reflection.name}.nil?'"
750
+ )
751
+ end
752
+ end
753
+
754
+ # Associates two classes via an intermediate join table. Unless the join table is explicitly specified as
755
+ # an option, it is guessed using the lexical order of the class names. So a join between Developer and Project
756
+ # will give the default join table name of "developers_projects" because "D" outranks "P". Note that this precedence
757
+ # is calculated using the <tt><</tt> operator for <tt>String</tt>. This means that if the strings are of different lengths,
758
+ # and the strings are equal when compared up to the shortest length, then the longer string is considered of higher
759
+ # lexical precedence than the shorter one. For example, one would expect the tables <tt>paper_boxes</tt> and <tt>papers</tt>
760
+ # to generate a join table name of <tt>papers_paper_boxes</tt> because of the length of the name <tt>paper_boxes</tt>,
761
+ # but it in fact generates a join table name of <tt>paper_boxes_papers</tt>. Be aware of this caveat, and use the
762
+ # custom <tt>join_table</tt> option if you need to.
763
+ #
764
+ # Deprecated: Any additional fields added to the join table will be placed as attributes when pulling records out through
765
+ # has_and_belongs_to_many associations. Records returned from join tables with additional attributes will be marked as
766
+ # ReadOnly (because we can't save changes to the additional attrbutes). It's strongly recommended that you upgrade any
767
+ # associations with attributes to a real join model (see introduction).
768
+ #
769
+ # Adds the following methods for retrieval and query.
770
+ # +collection+ is replaced with the symbol passed as the first argument, so
771
+ # <tt>has_and_belongs_to_many :categories</tt> would add among others <tt>categories.empty?</tt>.
772
+ # * <tt>collection(force_reload = false)</tt> - returns an array of all the associated objects.
773
+ # An empty array is returned if none is found.
774
+ # * <tt>collection<<(object, ...)</tt> - adds one or more objects to the collection by creating associations in the join table
775
+ # (collection.push and collection.concat are aliases to this method).
776
+ # * <tt>collection.push_with_attributes(object, join_attributes)</tt> - adds one to the collection by creating an association in the join table that
777
+ # also holds the attributes from <tt>join_attributes</tt> (should be a hash with the column names as keys). This can be used to have additional
778
+ # attributes on the join, which will be injected into the associated objects when they are retrieved through the collection.
779
+ # (collection.concat_with_attributes is an alias to this method). This method is now deprecated.
780
+ # * <tt>collection.delete(object, ...)</tt> - removes one or more objects from the collection by removing their associations from the join table.
781
+ # This does not destroy the objects.
782
+ # * <tt>collection=objects</tt> - replaces the collections content by deleting and adding objects as appropriate.
783
+ # * <tt>collection_singular_ids</tt> - returns an array of the associated objects ids
784
+ # * <tt>collection_singular_ids=ids</tt> - replace the collection by the objects identified by the primary keys in +ids+
785
+ # * <tt>collection.clear</tt> - removes every object from the collection. This does not destroy the objects.
786
+ # * <tt>collection.empty?</tt> - returns true if there are no associated objects.
787
+ # * <tt>collection.size</tt> - returns the number of associated objects.
788
+ # * <tt>collection.find(id)</tt> - finds an associated object responding to the +id+ and that
789
+ # meets the condition that it has to be associated with this object.
790
+ # * <tt>collection.build(attributes = {})</tt> - returns a new object of the collection type that has been instantiated
791
+ # with +attributes+ and linked to this object through the join table but has not yet been saved.
792
+ # * <tt>collection.create(attributes = {})</tt> - returns a new object of the collection type that has been instantiated
793
+ # with +attributes+ and linked to this object through the join table and that has already been saved (if it passed the validation).
794
+ #
795
+ # Example: An Developer class declares <tt>has_and_belongs_to_many :projects</tt>, which will add:
796
+ # * <tt>Developer#projects</tt>
797
+ # * <tt>Developer#projects<<</tt>
798
+ # * <tt>Developer#projects.delete</tt>
799
+ # * <tt>Developer#projects=</tt>
800
+ # * <tt>Developer#project_ids</tt>
801
+ # * <tt>Developer#project_ids=</tt>
802
+ # * <tt>Developer#projects.clear</tt>
803
+ # * <tt>Developer#projects.empty?</tt>
804
+ # * <tt>Developer#projects.size</tt>
805
+ # * <tt>Developer#projects.find(id)</tt>
806
+ # * <tt>Developer#projects.build</tt> (similar to <tt>Project.new("project_id" => id)</tt>)
807
+ # * <tt>Developer#projects.create</tt> (similar to <tt>c = Project.new("project_id" => id); c.save; c</tt>)
808
+ # The declaration may include an options hash to specialize the behavior of the association.
809
+ #
810
+ # Options are:
811
+ # * <tt>:class_name</tt> - specify the class name of the association. Use it only if that name can't be inferred
812
+ # from the association name. So <tt>has_and_belongs_to_many :projects</tt> will by default be linked to the
813
+ # +Project+ class, but if the real class name is +SuperProject+, you'll have to specify it with this option.
814
+ # * <tt>:join_table</tt> - specify the name of the join table if the default based on lexical order isn't what you want.
815
+ # WARNING: If you're overwriting the table name of either class, the table_name method MUST be declared underneath any
816
+ # has_and_belongs_to_many declaration in order to work.
817
+ # * <tt>:foreign_key</tt> - specify the foreign key used for the association. By default this is guessed to be the name
818
+ # of this class in lower-case and "_id" suffixed. So a +Person+ class that makes a has_and_belongs_to_many association
819
+ # will use "person_id" as the default foreign_key.
820
+ # * <tt>:association_foreign_key</tt> - specify the association foreign key used for the association. By default this is
821
+ # guessed to be the name of the associated class in lower-case and "_id" suffixed. So if the associated class is +Project+,
822
+ # the has_and_belongs_to_many association will use "project_id" as the default association foreign_key.
823
+ # * <tt>:conditions</tt> - specify the conditions that the associated object must meet in order to be included as a "WHERE"
824
+ # sql fragment, such as "authorized = 1".
825
+ # * <tt>:order</tt> - specify the order in which the associated objects are returned as a "ORDER BY" sql fragment, such as "last_name, first_name DESC"
826
+ # * <tt>:uniq</tt> - if set to true, duplicate associated objects will be ignored by accessors and query methods
827
+ # * <tt>:finder_sql</tt> - overwrite the default generated SQL used to fetch the association with a manual one
828
+ # * <tt>:delete_sql</tt> - overwrite the default generated SQL used to remove links between the associated
829
+ # classes with a manual one
830
+ # * <tt>:insert_sql</tt> - overwrite the default generated SQL used to add links between the associated classes
831
+ # with a manual one
832
+ # * <tt>:extend</tt> - anonymous module for extending the proxy, see "Association extensions".
833
+ # * <tt>:include</tt> - specify second-order associations that should be eager loaded when the collection is loaded.
834
+ # * <tt>:group</tt>: An attribute name by which the result should be grouped. Uses the GROUP BY SQL-clause.
835
+ # * <tt>:limit</tt>: An integer determining the limit on the number of rows that should be returned.
836
+ # * <tt>:offset</tt>: An integer determining the offset from where the rows should be fetched. So at 5, it would skip the first 4 rows.
837
+ # * <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
838
+ # include the joined columns.
839
+ #
840
+ # Option examples:
841
+ # has_and_belongs_to_many :projects
842
+ # has_and_belongs_to_many :projects, :include => [ :milestones, :manager ]
843
+ # has_and_belongs_to_many :nations, :class_name => "Country"
844
+ # has_and_belongs_to_many :categories, :join_table => "prods_cats"
845
+ # has_and_belongs_to_many :active_projects, :join_table => 'developers_projects', :delete_sql =>
846
+ # 'DELETE FROM developers_projects WHERE active=1 AND developer_id = #{id} AND project_id = #{record.id}'
847
+ def has_and_belongs_to_many(association_id, options = {}, &extension)
848
+ reflection = create_has_and_belongs_to_many_reflection(association_id, options, &extension)
849
+
850
+ add_multiple_associated_save_callbacks(reflection.name)
851
+ collection_accessor_methods(reflection, HasAndBelongsToManyAssociation)
852
+
853
+ # Don't use a before_destroy callback since users' before_destroy
854
+ # callbacks will be executed after the association is wiped out.
855
+ old_method = "destroy_without_habtm_shim_for_#{reflection.name}"
856
+ class_eval <<-end_eval
857
+ alias_method :#{old_method}, :destroy_without_callbacks
858
+ def destroy_without_callbacks
859
+ #{reflection.name}.clear
860
+ #{old_method}
861
+ end
862
+ end_eval
863
+
864
+ add_association_callbacks(reflection.name, options)
865
+
866
+ # deprecated api
867
+ deprecated_collection_count_method(reflection.name)
868
+ deprecated_add_association_relation(reflection.name)
869
+ deprecated_remove_association_relation(reflection.name)
870
+ deprecated_has_collection_method(reflection.name)
871
+ end
872
+
873
+ private
874
+ def join_table_name(first_table_name, second_table_name)
875
+ if first_table_name < second_table_name
876
+ join_table = "#{first_table_name}_#{second_table_name}"
877
+ else
878
+ join_table = "#{second_table_name}_#{first_table_name}"
879
+ end
880
+
881
+ table_name_prefix + join_table + table_name_suffix
882
+ end
883
+
884
+ def association_accessor_methods(reflection, association_proxy_class)
885
+ define_method(reflection.name) do |*params|
886
+ force_reload = params.first unless params.empty?
887
+ association = instance_variable_get("@#{reflection.name}")
888
+
889
+ if association.nil? || force_reload
890
+ association = association_proxy_class.new(self, reflection)
891
+ retval = association.reload
892
+ if retval.nil? and association_proxy_class == BelongsToAssociation
893
+ instance_variable_set("@#{reflection.name}", nil)
894
+ return nil
895
+ end
896
+ instance_variable_set("@#{reflection.name}", association)
897
+ end
898
+
899
+ association.target.nil? ? nil : association
900
+ end
901
+
902
+ define_method("#{reflection.name}=") do |new_value|
903
+ association = instance_variable_get("@#{reflection.name}")
904
+ if association.nil?
905
+ association = association_proxy_class.new(self, reflection)
906
+ end
907
+
908
+ association.replace(new_value)
909
+
910
+ unless new_value.nil?
911
+ instance_variable_set("@#{reflection.name}", association)
912
+ else
913
+ instance_variable_set("@#{reflection.name}", nil)
914
+ return nil
915
+ end
916
+
917
+ association
918
+ end
919
+
920
+ define_method("set_#{reflection.name}_target") do |target|
921
+ return if target.nil? and association_proxy_class == BelongsToAssociation
922
+ association = association_proxy_class.new(self, reflection)
923
+ association.target = target
924
+ instance_variable_set("@#{reflection.name}", association)
925
+ end
926
+ end
927
+
928
+ def collection_reader_method(reflection, association_proxy_class)
929
+ define_method(reflection.name) do |*params|
930
+ force_reload = params.first unless params.empty?
931
+ association = instance_variable_get("@#{reflection.name}")
932
+
933
+ unless association.respond_to?(:loaded?)
934
+ association = association_proxy_class.new(self, reflection)
935
+ instance_variable_set("@#{reflection.name}", association)
936
+ end
937
+
938
+ association.reload if force_reload
939
+
940
+ association
941
+ end
942
+ end
943
+
944
+ def collection_accessor_methods(reflection, association_proxy_class)
945
+ collection_reader_method(reflection, association_proxy_class)
946
+
947
+ define_method("#{reflection.name}=") do |new_value|
948
+ # Loads proxy class instance (defined in collection_reader_method) if not already loaded
949
+ association = send(reflection.name)
950
+ association.replace(new_value)
951
+ association
952
+ end
953
+
954
+ define_method("#{reflection.name.to_s.singularize}_ids") do
955
+ send(reflection.name).map(&:id)
956
+ end
957
+
958
+ define_method("#{reflection.name.to_s.singularize}_ids=") do |new_value|
959
+ ids = (new_value || []).reject { |nid| nid.blank? }
960
+ send("#{reflection.name}=", reflection.class_name.constantize.find(ids))
961
+ end
962
+ end
963
+
964
+ def add_multiple_associated_save_callbacks(association_name)
965
+ method_name = "validate_associated_records_for_#{association_name}".to_sym
966
+ define_method(method_name) do
967
+ association = instance_variable_get("@#{association_name}")
968
+ if association.respond_to?(:loaded?)
969
+ if new_record?
970
+ association
971
+ else
972
+ association.select { |record| record.new_record? }
973
+ end.each do |record|
974
+ errors.add "#{association_name}" unless record.valid?
975
+ end
976
+ end
977
+ end
978
+
979
+ validate method_name
980
+ before_save("@new_record_before_save = new_record?; true")
981
+
982
+ after_callback = <<-end_eval
983
+ association = instance_variable_get("@#{association_name}")
984
+
985
+ if association.respond_to?(:loaded?)
986
+ if @new_record_before_save
987
+ records_to_save = association
988
+ else
989
+ records_to_save = association.select { |record| record.new_record? }
990
+ end
991
+ records_to_save.each { |record| association.send(:insert_record, record) }
992
+ association.send(:construct_sql) # reconstruct the SQL queries now that we know the owner's id
993
+ end
994
+ end_eval
995
+
996
+ # Doesn't use after_save as that would save associations added in after_create/after_update twice
997
+ after_create(after_callback)
998
+ after_update(after_callback)
999
+ end
1000
+
1001
+ def association_constructor_method(constructor, reflection, association_proxy_class)
1002
+ define_method("#{constructor}_#{reflection.name}") do |*params|
1003
+ attributees = params.first unless params.empty?
1004
+ replace_existing = params[1].nil? ? true : params[1]
1005
+ association = instance_variable_get("@#{reflection.name}")
1006
+
1007
+ if association.nil?
1008
+ association = association_proxy_class.new(self, reflection)
1009
+ instance_variable_set("@#{reflection.name}", association)
1010
+ end
1011
+
1012
+ if association_proxy_class == HasOneAssociation
1013
+ association.send(constructor, attributees, replace_existing)
1014
+ else
1015
+ association.send(constructor, attributees)
1016
+ end
1017
+ end
1018
+ end
1019
+
1020
+ def find_with_associations(options = {})
1021
+ catch :invalid_query do
1022
+ join_dependency = JoinDependency.new(self, merge_includes(scope(:find, :include), options[:include]), options[:joins])
1023
+ rows = select_all_rows(options, join_dependency)
1024
+ return join_dependency.instantiate(rows)
1025
+ end
1026
+ []
1027
+ end
1028
+
1029
+ def configure_dependency_for_has_many(reflection)
1030
+ if reflection.options[:dependent] == true
1031
+ ::ActiveSupport::Deprecation.warn("The :dependent => true option is deprecated and will be removed from Rails 2.0. Please use :dependent => :destroy instead. See http://www.rubyonrails.org/deprecation for details.", caller)
1032
+ end
1033
+
1034
+ if reflection.options[:dependent] && reflection.options[:exclusively_dependent]
1035
+ raise ArgumentError, ':dependent and :exclusively_dependent are mutually exclusive options. You may specify one or the other.'
1036
+ end
1037
+
1038
+ if reflection.options[:exclusively_dependent]
1039
+ reflection.options[:dependent] = :delete_all
1040
+ ::ActiveSupport::Deprecation.warn("The :exclusively_dependent option is deprecated and will be removed from Rails 2.0. Please use :dependent => :delete_all instead. See http://www.rubyonrails.org/deprecation for details.", caller)
1041
+ end
1042
+
1043
+ # See HasManyAssociation#delete_records. Dependent associations
1044
+ # delete children, otherwise foreign key is set to NULL.
1045
+
1046
+ # Add polymorphic type if the :as option is present
1047
+ dependent_conditions = %(#{reflection.primary_key_name} = \#{record.quoted_id})
1048
+ if reflection.options[:as]
1049
+ dependent_conditions += " AND #{reflection.options[:as]}_type = '#{base_class.name}'"
1050
+ end
1051
+
1052
+ case reflection.options[:dependent]
1053
+ when :destroy, true
1054
+ module_eval "before_destroy '#{reflection.name}.each { |o| o.destroy }'"
1055
+ when :delete_all
1056
+ module_eval "before_destroy { |record| #{reflection.class_name}.delete_all(%(#{dependent_conditions})) }"
1057
+ when :nullify
1058
+ module_eval "before_destroy { |record| #{reflection.class_name}.update_all(%(#{reflection.primary_key_name} = NULL), %(#{dependent_conditions})) }"
1059
+ when nil, false
1060
+ # pass
1061
+ else
1062
+ raise ArgumentError, 'The :dependent option expects either :destroy, :delete_all, or :nullify'
1063
+ end
1064
+ end
1065
+
1066
+ def configure_dependency_for_has_one(reflection)
1067
+ case reflection.options[:dependent]
1068
+ when :destroy, true
1069
+ module_eval "before_destroy '#{reflection.name}.destroy unless #{reflection.name}.nil?'"
1070
+ when :delete
1071
+ module_eval "before_destroy '#{reflection.class_name}.delete(#{reflection.name}.id) unless #{reflection.name}.nil?'"
1072
+ when :nullify
1073
+ module_eval "before_destroy '#{reflection.name}.update_attribute(\"#{reflection.primary_key_name}\", nil) unless #{reflection.name}.nil?'"
1074
+ when nil, false
1075
+ # pass
1076
+ else
1077
+ raise ArgumentError, "The :dependent option expects either :destroy, :delete or :nullify."
1078
+ end
1079
+ end
1080
+
1081
+
1082
+ def add_deprecated_api_for_has_many(association_name)
1083
+ deprecated_collection_count_method(association_name)
1084
+ deprecated_add_association_relation(association_name)
1085
+ deprecated_remove_association_relation(association_name)
1086
+ deprecated_has_collection_method(association_name)
1087
+ deprecated_find_in_collection_method(association_name)
1088
+ deprecated_find_all_in_collection_method(association_name)
1089
+ deprecated_collection_create_method(association_name)
1090
+ deprecated_collection_build_method(association_name)
1091
+ end
1092
+
1093
+ def create_has_many_reflection(association_id, options, &extension)
1094
+ options.assert_valid_keys(
1095
+ :class_name, :table_name, :foreign_key,
1096
+ :exclusively_dependent, :dependent,
1097
+ :select, :conditions, :include, :order, :group, :limit, :offset,
1098
+ :as, :through, :source, :source_type,
1099
+ :uniq,
1100
+ :finder_sql, :counter_sql,
1101
+ :before_add, :after_add, :before_remove, :after_remove,
1102
+ :extend
1103
+ )
1104
+
1105
+ options[:extend] = create_extension_module(association_id, extension) if block_given?
1106
+
1107
+ create_reflection(:has_many, association_id, options, self)
1108
+ end
1109
+
1110
+ def create_has_one_reflection(association_id, options)
1111
+ options.assert_valid_keys(
1112
+ :class_name, :foreign_key, :remote, :conditions, :order, :include, :dependent, :counter_cache, :extend, :as
1113
+ )
1114
+
1115
+ create_reflection(:has_one, association_id, options, self)
1116
+ end
1117
+
1118
+ def create_belongs_to_reflection(association_id, options)
1119
+ options.assert_valid_keys(
1120
+ :class_name, :foreign_key, :foreign_type, :remote, :conditions, :order, :include, :dependent,
1121
+ :counter_cache, :extend, :polymorphic
1122
+ )
1123
+
1124
+ reflection = create_reflection(:belongs_to, association_id, options, self)
1125
+
1126
+ if options[:polymorphic]
1127
+ reflection.options[:foreign_type] ||= reflection.class_name.underscore + "_type"
1128
+ end
1129
+
1130
+ reflection
1131
+ end
1132
+
1133
+ def create_has_and_belongs_to_many_reflection(association_id, options, &extension)
1134
+ options.assert_valid_keys(
1135
+ :class_name, :table_name, :join_table, :foreign_key, :association_foreign_key,
1136
+ :select, :conditions, :include, :order, :group, :limit, :offset,
1137
+ :uniq,
1138
+ :finder_sql, :delete_sql, :insert_sql,
1139
+ :before_add, :after_add, :before_remove, :after_remove,
1140
+ :extend
1141
+ )
1142
+
1143
+ options[:extend] = create_extension_module(association_id, extension) if block_given?
1144
+
1145
+ reflection = create_reflection(:has_and_belongs_to_many, association_id, options, self)
1146
+
1147
+ reflection.options[:join_table] ||= join_table_name(undecorated_table_name(self.to_s), undecorated_table_name(reflection.class_name))
1148
+
1149
+ reflection
1150
+ end
1151
+
1152
+ def reflect_on_included_associations(associations)
1153
+ [ associations ].flatten.collect { |association| reflect_on_association(association.to_s.intern) }
1154
+ end
1155
+
1156
+ def guard_against_unlimitable_reflections(reflections, options)
1157
+ if (options[:offset] || options[:limit]) && !using_limitable_reflections?(reflections)
1158
+ raise(
1159
+ ConfigurationError,
1160
+ "You can not use offset and limit together with has_many or has_and_belongs_to_many associations"
1161
+ )
1162
+ end
1163
+ end
1164
+
1165
+ def select_all_rows(options, join_dependency)
1166
+ connection.select_all(
1167
+ construct_finder_sql_with_included_associations(options, join_dependency),
1168
+ "#{name} Load Including Associations"
1169
+ )
1170
+ end
1171
+
1172
+ def construct_finder_sql_with_included_associations(options, join_dependency)
1173
+ scope = scope(:find)
1174
+ sql = "SELECT #{column_aliases(join_dependency)} FROM #{(scope && scope[:from]) || options[:from] || table_name} "
1175
+ sql << join_dependency.join_associations.collect{|join| join.association_join }.join
1176
+
1177
+ add_joins!(sql, options, scope)
1178
+ add_conditions!(sql, options[:conditions], scope)
1179
+ add_limited_ids_condition!(sql, options, join_dependency) if !using_limitable_reflections?(join_dependency.reflections) && ((scope && scope[:limit]) || options[:limit])
1180
+
1181
+ sql << "GROUP BY #{options[:group]} " if options[:group]
1182
+
1183
+ add_order!(sql, options[:order], scope)
1184
+ add_limit!(sql, options, scope) if using_limitable_reflections?(join_dependency.reflections)
1185
+ add_lock!(sql, options, scope)
1186
+
1187
+ return sanitize_sql(sql)
1188
+ end
1189
+
1190
+ def add_limited_ids_condition!(sql, options, join_dependency)
1191
+ unless (id_list = select_limited_ids_list(options, join_dependency)).empty?
1192
+ sql << "#{condition_word(sql)} #{table_name}.#{primary_key} IN (#{id_list}) "
1193
+ else
1194
+ throw :invalid_query
1195
+ end
1196
+ end
1197
+
1198
+ def select_limited_ids_list(options, join_dependency)
1199
+ connection.select_all(
1200
+ construct_finder_sql_for_association_limiting(options, join_dependency),
1201
+ "#{name} Load IDs For Limited Eager Loading"
1202
+ ).collect { |row| connection.quote(row[primary_key]) }.join(", ")
1203
+ end
1204
+
1205
+ def construct_finder_sql_for_association_limiting(options, join_dependency)
1206
+ scope = scope(:find)
1207
+ is_distinct = include_eager_conditions?(options) || include_eager_order?(options)
1208
+ sql = "SELECT "
1209
+ if is_distinct
1210
+ sql << connection.distinct("#{table_name}.#{primary_key}", options[:order])
1211
+ else
1212
+ sql << primary_key
1213
+ end
1214
+ sql << " FROM #{table_name} "
1215
+
1216
+ if is_distinct
1217
+ sql << join_dependency.join_associations.collect(&:association_join).join
1218
+ add_joins!(sql, options, scope)
1219
+ end
1220
+
1221
+ add_conditions!(sql, options[:conditions], scope)
1222
+ if options[:order]
1223
+ if is_distinct
1224
+ connection.add_order_by_for_association_limiting!(sql, options)
1225
+ else
1226
+ sql << "ORDER BY #{options[:order]}"
1227
+ end
1228
+ end
1229
+ add_limit!(sql, options, scope)
1230
+ return sanitize_sql(sql)
1231
+ end
1232
+
1233
+ # Checks if the conditions reference a table other than the current model table
1234
+ def include_eager_conditions?(options)
1235
+ # look in both sets of conditions
1236
+ conditions = [scope(:find, :conditions), options[:conditions]].inject([]) do |all, cond|
1237
+ case cond
1238
+ when nil then all
1239
+ when Array then all << cond.first
1240
+ else all << cond
1241
+ end
1242
+ end
1243
+ return false unless conditions.any?
1244
+ conditions.join(' ').scan(/([\.\w]+)\.\w+/).flatten.any? do |condition_table_name|
1245
+ condition_table_name != table_name
1246
+ end
1247
+ end
1248
+
1249
+ # Checks if the query order references a table other than the current model's table.
1250
+ def include_eager_order?(options)
1251
+ order = options[:order]
1252
+ return false unless order
1253
+ order.scan(/([\.\w]+)\.\w+/).flatten.any? do |order_table_name|
1254
+ order_table_name != table_name
1255
+ end
1256
+ end
1257
+
1258
+ def using_limitable_reflections?(reflections)
1259
+ reflections.reject { |r| [ :belongs_to, :has_one ].include?(r.macro) }.length.zero?
1260
+ end
1261
+
1262
+ def column_aliases(join_dependency)
1263
+ join_dependency.joins.collect{|join| join.column_names_with_alias.collect{|column_name, aliased_name|
1264
+ "#{join.aliased_table_name}.#{connection.quote_column_name column_name} AS #{aliased_name}"}}.flatten.join(", ")
1265
+ end
1266
+
1267
+ def add_association_callbacks(association_name, options)
1268
+ callbacks = %w(before_add after_add before_remove after_remove)
1269
+ callbacks.each do |callback_name|
1270
+ full_callback_name = "#{callback_name}_for_#{association_name}"
1271
+ defined_callbacks = options[callback_name.to_sym]
1272
+ if options.has_key?(callback_name.to_sym)
1273
+ class_inheritable_reader full_callback_name.to_sym
1274
+ write_inheritable_array(full_callback_name.to_sym, [defined_callbacks].flatten)
1275
+ end
1276
+ end
1277
+ end
1278
+
1279
+ def condition_word(sql)
1280
+ sql =~ /where/i ? " AND " : "WHERE "
1281
+ end
1282
+
1283
+ def create_extension_module(association_id, extension)
1284
+ extension_module_name = "#{self.to_s}#{association_id.to_s.camelize}AssociationExtension"
1285
+
1286
+ silence_warnings do
1287
+ Object.const_set(extension_module_name, Module.new(&extension))
1288
+ end
1289
+
1290
+ extension_module_name.constantize
1291
+ end
1292
+
1293
+ class JoinDependency # :nodoc:
1294
+ attr_reader :joins, :reflections, :table_aliases
1295
+
1296
+ def initialize(base, associations, joins)
1297
+ @joins = [JoinBase.new(base, joins)]
1298
+ @associations = associations
1299
+ @reflections = []
1300
+ @base_records_hash = {}
1301
+ @base_records_in_order = []
1302
+ @table_aliases = Hash.new { |aliases, table| aliases[table] = 0 }
1303
+ @table_aliases[base.table_name] = 1
1304
+ build(associations)
1305
+ end
1306
+
1307
+ def join_associations
1308
+ @joins[1..-1].to_a
1309
+ end
1310
+
1311
+ def join_base
1312
+ @joins[0]
1313
+ end
1314
+
1315
+ def instantiate(rows)
1316
+ rows.each_with_index do |row, i|
1317
+ primary_id = join_base.record_id(row)
1318
+ unless @base_records_hash[primary_id]
1319
+ @base_records_in_order << (@base_records_hash[primary_id] = join_base.instantiate(row))
1320
+ end
1321
+ construct(@base_records_hash[primary_id], @associations, join_associations.dup, row)
1322
+ end
1323
+ return @base_records_in_order
1324
+ end
1325
+
1326
+ def aliased_table_names_for(table_name)
1327
+ joins.select{|join| join.table_name == table_name }.collect{|join| join.aliased_table_name}
1328
+ end
1329
+
1330
+ protected
1331
+ def build(associations, parent = nil)
1332
+ parent ||= @joins.last
1333
+ case associations
1334
+ when Symbol, String
1335
+ reflection = parent.reflections[associations.to_s.intern] or
1336
+ raise ConfigurationError, "Association named '#{ associations }' was not found; perhaps you misspelled it?"
1337
+ @reflections << reflection
1338
+ @joins << JoinAssociation.new(reflection, self, parent)
1339
+ when Array
1340
+ associations.each do |association|
1341
+ build(association, parent)
1342
+ end
1343
+ when Hash
1344
+ associations.keys.sort{|a,b|a.to_s<=>b.to_s}.each do |name|
1345
+ build(name, parent)
1346
+ build(associations[name])
1347
+ end
1348
+ else
1349
+ raise ConfigurationError, associations.inspect
1350
+ end
1351
+ end
1352
+
1353
+ def construct(parent, associations, joins, row)
1354
+ case associations
1355
+ when Symbol, String
1356
+ while (join = joins.shift).reflection.name.to_s != associations.to_s
1357
+ raise ConfigurationError, "Not Enough Associations" if joins.empty?
1358
+ end
1359
+ construct_association(parent, join, row)
1360
+ when Array
1361
+ associations.each do |association|
1362
+ construct(parent, association, joins, row)
1363
+ end
1364
+ when Hash
1365
+ associations.keys.sort{|a,b|a.to_s<=>b.to_s}.each do |name|
1366
+ association = construct_association(parent, joins.shift, row)
1367
+ construct(association, associations[name], joins, row) if association
1368
+ end
1369
+ else
1370
+ raise ConfigurationError, associations.inspect
1371
+ end
1372
+ end
1373
+
1374
+ def construct_association(record, join, row)
1375
+ case join.reflection.macro
1376
+ when :has_many, :has_and_belongs_to_many
1377
+ collection = record.send(join.reflection.name)
1378
+ collection.loaded
1379
+
1380
+ return nil if record.id.to_s != join.parent.record_id(row).to_s or row[join.aliased_primary_key].nil?
1381
+ association = join.instantiate(row)
1382
+ collection.target.push(association) unless collection.target.include?(association)
1383
+ when :has_one
1384
+ return if record.id.to_s != join.parent.record_id(row).to_s
1385
+ association = join.instantiate(row) unless row[join.aliased_primary_key].nil?
1386
+ record.send("set_#{join.reflection.name}_target", association)
1387
+ when :belongs_to
1388
+ return if record.id.to_s != join.parent.record_id(row).to_s or row[join.aliased_primary_key].nil?
1389
+ association = join.instantiate(row)
1390
+ record.send("set_#{join.reflection.name}_target", association)
1391
+ else
1392
+ raise ConfigurationError, "unknown macro: #{join.reflection.macro}"
1393
+ end
1394
+ return association
1395
+ end
1396
+
1397
+ class JoinBase # :nodoc:
1398
+ attr_reader :active_record, :table_joins
1399
+ delegate :table_name, :column_names, :primary_key, :reflections, :sanitize_sql, :to => :active_record
1400
+
1401
+ def initialize(active_record, joins = nil)
1402
+ @active_record = active_record
1403
+ @cached_record = {}
1404
+ @table_joins = joins
1405
+ end
1406
+
1407
+ def aliased_prefix
1408
+ "t0"
1409
+ end
1410
+
1411
+ def aliased_primary_key
1412
+ "#{ aliased_prefix }_r0"
1413
+ end
1414
+
1415
+ def aliased_table_name
1416
+ active_record.table_name
1417
+ end
1418
+
1419
+ def column_names_with_alias
1420
+ unless @column_names_with_alias
1421
+ @column_names_with_alias = []
1422
+ ([primary_key] + (column_names - [primary_key])).each_with_index do |column_name, i|
1423
+ @column_names_with_alias << [column_name, "#{ aliased_prefix }_r#{ i }"]
1424
+ end
1425
+ end
1426
+ return @column_names_with_alias
1427
+ end
1428
+
1429
+ def extract_record(row)
1430
+ column_names_with_alias.inject({}){|record, (cn, an)| record[cn] = row[an]; record}
1431
+ end
1432
+
1433
+ def record_id(row)
1434
+ row[aliased_primary_key]
1435
+ end
1436
+
1437
+ def instantiate(row)
1438
+ @cached_record[record_id(row)] ||= active_record.instantiate(extract_record(row))
1439
+ end
1440
+ end
1441
+
1442
+ class JoinAssociation < JoinBase # :nodoc:
1443
+ attr_reader :reflection, :parent, :aliased_table_name, :aliased_prefix, :aliased_join_table_name, :parent_table_name
1444
+ delegate :options, :klass, :through_reflection, :source_reflection, :to => :reflection
1445
+
1446
+ def initialize(reflection, join_dependency, parent = nil)
1447
+ reflection.check_validity!
1448
+ if reflection.options[:polymorphic]
1449
+ raise EagerLoadPolymorphicError.new(reflection)
1450
+ end
1451
+
1452
+ super(reflection.klass)
1453
+ @parent = parent
1454
+ @reflection = reflection
1455
+ @aliased_prefix = "t#{ join_dependency.joins.size }"
1456
+ @aliased_table_name = table_name #.tr('.', '_') # start with the table name, sub out any .'s
1457
+ @parent_table_name = parent.active_record.table_name
1458
+
1459
+ if !parent.table_joins.blank? && parent.table_joins.to_s.downcase =~ %r{join(\s+\w+)?\s+#{aliased_table_name.downcase}\son}
1460
+ join_dependency.table_aliases[aliased_table_name] += 1
1461
+ end
1462
+
1463
+ unless join_dependency.table_aliases[aliased_table_name].zero?
1464
+ # if the table name has been used, then use an alias
1465
+ @aliased_table_name = active_record.connection.table_alias_for "#{pluralize(reflection.name)}_#{parent_table_name}"
1466
+ table_index = join_dependency.table_aliases[aliased_table_name]
1467
+ join_dependency.table_aliases[aliased_table_name] += 1
1468
+ @aliased_table_name = @aliased_table_name[0..active_record.connection.table_alias_length-3] + "_#{table_index+1}" if table_index > 0
1469
+ else
1470
+ join_dependency.table_aliases[aliased_table_name] += 1
1471
+ end
1472
+
1473
+ if reflection.macro == :has_and_belongs_to_many || (reflection.macro == :has_many && reflection.options[:through])
1474
+ @aliased_join_table_name = reflection.macro == :has_and_belongs_to_many ? reflection.options[:join_table] : reflection.through_reflection.klass.table_name
1475
+ unless join_dependency.table_aliases[aliased_join_table_name].zero?
1476
+ @aliased_join_table_name = active_record.connection.table_alias_for "#{pluralize(reflection.name)}_#{parent_table_name}_join"
1477
+ table_index = join_dependency.table_aliases[aliased_join_table_name]
1478
+ join_dependency.table_aliases[aliased_join_table_name] += 1
1479
+ @aliased_join_table_name = @aliased_join_table_name[0..active_record.connection.table_alias_length-3] + "_#{table_index+1}" if table_index > 0
1480
+ else
1481
+ join_dependency.table_aliases[aliased_join_table_name] += 1
1482
+ end
1483
+ end
1484
+ end
1485
+
1486
+ def association_join
1487
+ join = case reflection.macro
1488
+ when :has_and_belongs_to_many
1489
+ " LEFT OUTER JOIN %s ON %s.%s = %s.%s " % [
1490
+ table_alias_for(options[:join_table], aliased_join_table_name),
1491
+ aliased_join_table_name,
1492
+ options[:foreign_key] || reflection.active_record.to_s.classify.foreign_key,
1493
+ parent.aliased_table_name, reflection.active_record.primary_key] +
1494
+ " LEFT OUTER JOIN %s ON %s.%s = %s.%s " % [
1495
+ table_name_and_alias, aliased_table_name, klass.primary_key,
1496
+ aliased_join_table_name, options[:association_foreign_key] || klass.table_name.classify.foreign_key
1497
+ ]
1498
+ when :has_many, :has_one
1499
+ case
1500
+ when reflection.macro == :has_many && reflection.options[:through]
1501
+ through_conditions = through_reflection.options[:conditions] ? "AND #{interpolate_sql(sanitize_sql(through_reflection.options[:conditions]))}" : ''
1502
+
1503
+ jt_foreign_key = jt_as_extra = jt_source_extra = jt_sti_extra = nil
1504
+ first_key = second_key = as_extra = nil
1505
+
1506
+ if through_reflection.options[:as] # has_many :through against a polymorphic join
1507
+ jt_foreign_key = through_reflection.options[:as].to_s + '_id'
1508
+ jt_as_extra = " AND %s.%s = %s" % [
1509
+ aliased_join_table_name, reflection.active_record.connection.quote_column_name(through_reflection.options[:as].to_s + '_type'),
1510
+ klass.quote_value(parent.active_record.base_class.name)
1511
+ ]
1512
+ else
1513
+ jt_foreign_key = through_reflection.primary_key_name
1514
+ end
1515
+
1516
+ case source_reflection.macro
1517
+ when :has_many
1518
+ if source_reflection.options[:as]
1519
+ first_key = "#{source_reflection.options[:as]}_id"
1520
+ second_key = options[:foreign_key] || primary_key
1521
+ as_extra = " AND %s.%s = %s" % [
1522
+ aliased_table_name, reflection.active_record.connection.quote_column_name("#{source_reflection.options[:as]}_type"),
1523
+ klass.quote_value(source_reflection.active_record.base_class.name)
1524
+ ]
1525
+ else
1526
+ first_key = through_reflection.klass.base_class.to_s.classify.foreign_key
1527
+ second_key = options[:foreign_key] || primary_key
1528
+ end
1529
+
1530
+ unless through_reflection.klass.descends_from_active_record?
1531
+ jt_sti_extra = " AND %s.%s = %s" % [
1532
+ aliased_join_table_name,
1533
+ reflection.active_record.connection.quote_column_name(through_reflection.active_record.inheritance_column),
1534
+ through_reflection.klass.quote_value(through_reflection.klass.name.demodulize)]
1535
+ end
1536
+ when :belongs_to
1537
+ first_key = primary_key
1538
+ if reflection.options[:source_type]
1539
+ second_key = source_reflection.association_foreign_key
1540
+ jt_source_extra = " AND %s.%s = %s" % [
1541
+ aliased_join_table_name, reflection.active_record.connection.quote_column_name(reflection.source_reflection.options[:foreign_type]),
1542
+ klass.quote_value(reflection.options[:source_type])
1543
+ ]
1544
+ else
1545
+ second_key = source_reflection.options[:foreign_key] || klass.to_s.classify.foreign_key
1546
+ end
1547
+ end
1548
+
1549
+ " LEFT OUTER JOIN %s ON (%s.%s = %s.%s%s%s%s) " % [
1550
+ table_alias_for(through_reflection.klass.table_name, aliased_join_table_name),
1551
+ parent.aliased_table_name, reflection.active_record.connection.quote_column_name(parent.primary_key),
1552
+ aliased_join_table_name, reflection.active_record.connection.quote_column_name(jt_foreign_key),
1553
+ jt_as_extra, jt_source_extra, jt_sti_extra
1554
+ ] +
1555
+ " LEFT OUTER JOIN %s ON (%s.%s = %s.%s%s) " % [
1556
+ table_name_and_alias,
1557
+ aliased_table_name, reflection.active_record.connection.quote_column_name(first_key),
1558
+ aliased_join_table_name, reflection.active_record.connection.quote_column_name(second_key),
1559
+ as_extra
1560
+ ]
1561
+
1562
+ when reflection.macro == :has_many && reflection.options[:as]
1563
+ " LEFT OUTER JOIN %s ON %s.%s = %s.%s AND %s.%s = %s" % [
1564
+ table_name_and_alias,
1565
+ aliased_table_name, "#{reflection.options[:as]}_id",
1566
+ parent.aliased_table_name, parent.primary_key,
1567
+ aliased_table_name, "#{reflection.options[:as]}_type",
1568
+ klass.quote_value(parent.active_record.base_class.name)
1569
+ ]
1570
+ when reflection.macro == :has_one && reflection.options[:as]
1571
+ " LEFT OUTER JOIN %s ON %s.%s = %s.%s AND %s.%s = %s " % [
1572
+ table_name_and_alias,
1573
+ aliased_table_name, "#{reflection.options[:as]}_id",
1574
+ parent.aliased_table_name, parent.primary_key,
1575
+ aliased_table_name, "#{reflection.options[:as]}_type",
1576
+ klass.quote_value(reflection.active_record.base_class.name)
1577
+ ]
1578
+ else
1579
+ foreign_key = options[:foreign_key] || reflection.active_record.name.foreign_key
1580
+ " LEFT OUTER JOIN %s ON %s.%s = %s.%s " % [
1581
+ table_name_and_alias,
1582
+ aliased_table_name, foreign_key,
1583
+ parent.aliased_table_name, parent.primary_key
1584
+ ]
1585
+ end
1586
+ when :belongs_to
1587
+ " LEFT OUTER JOIN %s ON %s.%s = %s.%s " % [
1588
+ table_name_and_alias, aliased_table_name, reflection.klass.primary_key,
1589
+ parent.aliased_table_name, options[:foreign_key] || klass.to_s.foreign_key
1590
+ ]
1591
+ else
1592
+ ""
1593
+ end || ''
1594
+ join << %(AND %s.%s = %s ) % [
1595
+ aliased_table_name,
1596
+ reflection.active_record.connection.quote_column_name(klass.inheritance_column),
1597
+ klass.quote_value(klass.name.demodulize)] unless klass.descends_from_active_record?
1598
+
1599
+ [through_reflection, reflection].each do |ref|
1600
+ join << "AND #{interpolate_sql(sanitize_sql(ref.options[:conditions]))} " if ref && ref.options[:conditions]
1601
+ end
1602
+
1603
+ join
1604
+ end
1605
+
1606
+ protected
1607
+
1608
+ def pluralize(table_name)
1609
+ ActiveRecord::Base.pluralize_table_names ? table_name.to_s.pluralize : table_name
1610
+ end
1611
+
1612
+ def table_alias_for(table_name, table_alias)
1613
+ "#{table_name} #{table_alias if table_name != table_alias}".strip
1614
+ end
1615
+
1616
+ def table_name_and_alias
1617
+ table_alias_for table_name, @aliased_table_name
1618
+ end
1619
+
1620
+ def interpolate_sql(sql)
1621
+ instance_eval("%@#{sql.gsub('@', '\@')}@")
1622
+ end
1623
+ end
1624
+ end
1625
+ end
1626
+ end
1627
+ end