antfarm 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1690) hide show
  1. data/CHANGELOG +20 -0
  2. data/LICENSE +504 -0
  3. data/README +183 -0
  4. data/bin/antfarm +137 -0
  5. data/config/boot.rb +43 -0
  6. data/config/environment.rb +29 -0
  7. data/db/migrate/001_create_nodes.rb +33 -0
  8. data/db/migrate/002_create_layer2_interfaces.rb +33 -0
  9. data/db/migrate/003_create_layer3_interfaces.rb +34 -0
  10. data/db/migrate/004_create_layer3_networks.rb +32 -0
  11. data/db/migrate/005_create_ethernet_interfaces.rb +31 -0
  12. data/db/migrate/006_create_ip_interfaces.rb +31 -0
  13. data/db/migrate/007_create_ip_networks.rb +33 -0
  14. data/db/migrate/008_create_private_networks.rb +31 -0
  15. data/db/migrate/009_create_traffic.rb +35 -0
  16. data/db/schema.rb +84 -0
  17. data/lib/antfarm.jar +0 -0
  18. data/lib/antfarm.rb +242 -0
  19. data/lib/antfarm/ethernet_interface.rb +91 -0
  20. data/lib/antfarm/ip_interface.rb +177 -0
  21. data/lib/antfarm/ip_network.rb +109 -0
  22. data/lib/antfarm/layer2_interface.rb +98 -0
  23. data/lib/antfarm/layer3_interface.rb +140 -0
  24. data/lib/antfarm/layer3_network.rb +126 -0
  25. data/lib/antfarm/node.rb +78 -0
  26. data/lib/antfarm/private_network.rb +34 -0
  27. data/lib/antfarm/traffic.rb +32 -0
  28. data/lib/dbmanage.rb +135 -0
  29. data/lib/init/initializer.rb +107 -0
  30. data/lib/scparse.rb +332 -0
  31. data/lib/scripts/cisco/parse-arp.rb +66 -0
  32. data/lib/scripts/cisco/parse-ip-ifaces.rb +116 -0
  33. data/lib/scripts/cisco/parse-network-objects.rb +80 -0
  34. data/lib/scripts/cisco/parse-pix-config.rb +263 -0
  35. data/lib/scripts/cisco/parse-routes.rb +84 -0
  36. data/lib/scripts/load-host.rb +51 -0
  37. data/lib/scripts/load-network.rb +51 -0
  38. data/lib/scripts/load-route.rb +79 -0
  39. data/lib/scripts/load-router-nomac.rb +60 -0
  40. data/lib/scripts/load-router.rb +59 -0
  41. data/lib/scripts/nmap/parse-xml-results.rb +240 -0
  42. data/lib/scripts/pcap/parse-pcap-file.rb +64 -0
  43. data/lib/scripts/route.rb +89 -0
  44. data/lib/scripts/tethereal/load-arp.rb +67 -0
  45. data/lib/scripts/tethereal/load-ip.rb +65 -0
  46. data/lib/scripts/viz/display-networks.rb +97 -0
  47. data/lib/scripts/viz/dump-graphml.rb +219 -0
  48. data/lib/scripts/viz/dump-graphviz.rb +136 -0
  49. data/log/antfarm.log +0 -0
  50. data/rails/app/controllers/application.rb +10 -0
  51. data/rails/app/controllers/ethernet_interfaces_controller.rb +4 -0
  52. data/rails/app/controllers/ip_interfaces_controller.rb +4 -0
  53. data/rails/app/controllers/ip_networks_controller.rb +4 -0
  54. data/rails/app/controllers/layer2_interfaces_controller.rb +6 -0
  55. data/rails/app/controllers/layer3_interfaces_controller.rb +6 -0
  56. data/rails/app/controllers/layer3_networks_controller.rb +4 -0
  57. data/rails/app/controllers/nodes_controller.rb +9 -0
  58. data/rails/app/controllers/private_networks_controller.rb +4 -0
  59. data/rails/app/controllers/traffic_controller.rb +4 -0
  60. data/rails/app/helpers/application_helper.rb +3 -0
  61. data/rails/app/helpers/ethernet_interfaces_helper.rb +2 -0
  62. data/rails/app/helpers/ip_interfaces_helper.rb +2 -0
  63. data/rails/app/helpers/ip_networks_helper.rb +2 -0
  64. data/rails/app/helpers/layer2_interfaces_helper.rb +2 -0
  65. data/rails/app/helpers/layer3_interfaces_helper.rb +5 -0
  66. data/rails/app/helpers/layer3_networks_helper.rb +2 -0
  67. data/rails/app/helpers/nodes_helper.rb +2 -0
  68. data/rails/app/helpers/private_networks_helper.rb +2 -0
  69. data/rails/app/helpers/traffic_helper.rb +2 -0
  70. data/rails/app/views/layouts/ethernet_interfaces.html.erb +15 -0
  71. data/rails/app/views/layouts/ip_interfaces.html.erb +15 -0
  72. data/rails/app/views/layouts/ip_networks.html.erb +15 -0
  73. data/rails/app/views/layouts/layer2_interfaces.html.erb +15 -0
  74. data/rails/app/views/layouts/layer3_interfaces.html.erb +15 -0
  75. data/rails/app/views/layouts/layer3_networks.html.erb +15 -0
  76. data/rails/app/views/layouts/nodes.html.erb +15 -0
  77. data/rails/app/views/layouts/private_networks.html.erb +15 -0
  78. data/rails/app/views/layouts/traffic.html.erb +15 -0
  79. data/rails/config/boot.rb +145 -0
  80. data/rails/config/environment.rb +62 -0
  81. data/rails/config/environments/development.rb +17 -0
  82. data/rails/config/initializers/inflections.rb +10 -0
  83. data/rails/config/initializers/mime_types.rb +5 -0
  84. data/rails/config/routes.rb +36 -0
  85. data/rails/public/000-index.html +277 -0
  86. data/rails/public/404.html +30 -0
  87. data/rails/public/422.html +30 -0
  88. data/rails/public/500.html +30 -0
  89. data/rails/public/blank.html +33 -0
  90. data/rails/public/dispatch.cgi +10 -0
  91. data/rails/public/dispatch.fcgi +24 -0
  92. data/rails/public/dispatch.rb +10 -0
  93. data/rails/public/favicon.ico +0 -0
  94. data/rails/public/images/active_scaffold/DO_NOT_EDIT +2 -0
  95. data/rails/public/images/active_scaffold/default/add.gif +0 -0
  96. data/rails/public/images/active_scaffold/default/arrow_down.gif +0 -0
  97. data/rails/public/images/active_scaffold/default/arrow_up.gif +0 -0
  98. data/rails/public/images/active_scaffold/default/close.gif +0 -0
  99. data/rails/public/images/active_scaffold/default/cross.png +0 -0
  100. data/rails/public/images/active_scaffold/default/indicator-small.gif +0 -0
  101. data/rails/public/images/active_scaffold/default/indicator.gif +0 -0
  102. data/rails/public/images/active_scaffold/default/magnifier.png +0 -0
  103. data/rails/public/images/rails.png +0 -0
  104. data/rails/public/javascripts/active_scaffold/DO_NOT_EDIT +2 -0
  105. data/rails/public/javascripts/active_scaffold/default/active_scaffold.js +418 -0
  106. data/rails/public/javascripts/active_scaffold/default/dhtml_history.js +942 -0
  107. data/rails/public/javascripts/active_scaffold/default/form_enhancements.js +89 -0
  108. data/rails/public/javascripts/active_scaffold/default/rico_corner.js +370 -0
  109. data/rails/public/javascripts/application.js +2 -0
  110. data/rails/public/javascripts/controls.js +963 -0
  111. data/rails/public/javascripts/dragdrop.js +972 -0
  112. data/rails/public/javascripts/effects.js +1120 -0
  113. data/rails/public/javascripts/prototype.js +4225 -0
  114. data/rails/public/robots.txt +5 -0
  115. data/rails/public/stylesheets/active_scaffold/DO_NOT_EDIT +2 -0
  116. data/rails/public/stylesheets/active_scaffold/default/stylesheet-ie.css +35 -0
  117. data/rails/public/stylesheets/active_scaffold/default/stylesheet.css +770 -0
  118. data/rails/script/server +3 -0
  119. data/rails/vendor/plugins/active_scaffold/CHANGELOG +151 -0
  120. data/rails/vendor/plugins/active_scaffold/MIT-LICENSE +20 -0
  121. data/rails/vendor/plugins/active_scaffold/README +19 -0
  122. data/rails/vendor/plugins/active_scaffold/Rakefile +24 -0
  123. data/rails/vendor/plugins/active_scaffold/environment.rb +83 -0
  124. data/rails/vendor/plugins/active_scaffold/frontends/default/images/add.gif +0 -0
  125. data/rails/vendor/plugins/active_scaffold/frontends/default/images/arrow_down.gif +0 -0
  126. data/rails/vendor/plugins/active_scaffold/frontends/default/images/arrow_up.gif +0 -0
  127. data/rails/vendor/plugins/active_scaffold/frontends/default/images/close.gif +0 -0
  128. data/rails/vendor/plugins/active_scaffold/frontends/default/images/cross.png +0 -0
  129. data/rails/vendor/plugins/active_scaffold/frontends/default/images/indicator-small.gif +0 -0
  130. data/rails/vendor/plugins/active_scaffold/frontends/default/images/indicator.gif +0 -0
  131. data/rails/vendor/plugins/active_scaffold/frontends/default/images/magnifier.png +0 -0
  132. data/rails/vendor/plugins/active_scaffold/frontends/default/javascripts/active_scaffold.js +418 -0
  133. data/rails/vendor/plugins/active_scaffold/frontends/default/javascripts/dhtml_history.js +942 -0
  134. data/rails/vendor/plugins/active_scaffold/frontends/default/javascripts/form_enhancements.js +89 -0
  135. data/rails/vendor/plugins/active_scaffold/frontends/default/javascripts/rico_corner.js +370 -0
  136. data/rails/vendor/plugins/active_scaffold/frontends/default/stylesheets/stylesheet-ie.css +35 -0
  137. data/rails/vendor/plugins/active_scaffold/frontends/default/stylesheets/stylesheet.css +770 -0
  138. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_add_existing_form.rhtml +40 -0
  139. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_create_form.rhtml +45 -0
  140. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_field_search.rhtml +55 -0
  141. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_form.rhtml +18 -0
  142. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_form_association.rhtml +44 -0
  143. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_form_association_footer.rhtml +42 -0
  144. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_form_association_header.rhtml +10 -0
  145. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_form_association_record.rhtml +22 -0
  146. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_form_attribute.rhtml +12 -0
  147. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_form_hidden_attribute.rhtml +1 -0
  148. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_form_messages.rhtml +5 -0
  149. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_list.rhtml +34 -0
  150. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_list_actions.rhtml +13 -0
  151. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_list_calculations.rhtml +22 -0
  152. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_list_column_headings.rhtml +32 -0
  153. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_list_header.rhtml +12 -0
  154. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_list_inline_adapter.rhtml +9 -0
  155. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_list_pagination_links.rhtml +30 -0
  156. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_list_record.rhtml +31 -0
  157. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_live_search.rhtml +25 -0
  158. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_messages.rhtml +10 -0
  159. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_nested.rhtml +44 -0
  160. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_search.rhtml +21 -0
  161. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_show.rhtml +8 -0
  162. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_show_columns.rhtml +11 -0
  163. data/rails/vendor/plugins/active_scaffold/frontends/default/views/_update_form.rhtml +49 -0
  164. data/rails/vendor/plugins/active_scaffold/frontends/default/views/add_existing.rjs +16 -0
  165. data/rails/vendor/plugins/active_scaffold/frontends/default/views/add_existing_form.rhtml +5 -0
  166. data/rails/vendor/plugins/active_scaffold/frontends/default/views/create.rjs +19 -0
  167. data/rails/vendor/plugins/active_scaffold/frontends/default/views/create_form.rhtml +5 -0
  168. data/rails/vendor/plugins/active_scaffold/frontends/default/views/delete.rhtml +13 -0
  169. data/rails/vendor/plugins/active_scaffold/frontends/default/views/destroy.rjs +9 -0
  170. data/rails/vendor/plugins/active_scaffold/frontends/default/views/edit_associated.rjs +15 -0
  171. data/rails/vendor/plugins/active_scaffold/frontends/default/views/field_search.rhtml +5 -0
  172. data/rails/vendor/plugins/active_scaffold/frontends/default/views/form_messages.rjs +1 -0
  173. data/rails/vendor/plugins/active_scaffold/frontends/default/views/list.rhtml +25 -0
  174. data/rails/vendor/plugins/active_scaffold/frontends/default/views/search.rhtml +5 -0
  175. data/rails/vendor/plugins/active_scaffold/frontends/default/views/show.rhtml +5 -0
  176. data/rails/vendor/plugins/active_scaffold/frontends/default/views/update.rjs +10 -0
  177. data/rails/vendor/plugins/active_scaffold/frontends/default/views/update_column.rjs +12 -0
  178. data/rails/vendor/plugins/active_scaffold/frontends/default/views/update_form.rhtml +5 -0
  179. data/rails/vendor/plugins/active_scaffold/init.rb +16 -0
  180. data/rails/vendor/plugins/active_scaffold/install.rb +40 -0
  181. data/rails/vendor/plugins/active_scaffold/install_assets.rb +36 -0
  182. data/rails/vendor/plugins/active_scaffold/lib/actions/core.rb +87 -0
  183. data/rails/vendor/plugins/active_scaffold/lib/actions/create.rb +98 -0
  184. data/rails/vendor/plugins/active_scaffold/lib/actions/delete.rb +46 -0
  185. data/rails/vendor/plugins/active_scaffold/lib/actions/field_search.rb +51 -0
  186. data/rails/vendor/plugins/active_scaffold/lib/actions/list.rb +75 -0
  187. data/rails/vendor/plugins/active_scaffold/lib/actions/live_search.rb +44 -0
  188. data/rails/vendor/plugins/active_scaffold/lib/actions/nested.rb +211 -0
  189. data/rails/vendor/plugins/active_scaffold/lib/actions/search.rb +38 -0
  190. data/rails/vendor/plugins/active_scaffold/lib/actions/show.rb +34 -0
  191. data/rails/vendor/plugins/active_scaffold/lib/actions/subform.rb +17 -0
  192. data/rails/vendor/plugins/active_scaffold/lib/actions/update.rb +112 -0
  193. data/rails/vendor/plugins/active_scaffold/lib/active_record_permissions.rb +127 -0
  194. data/rails/vendor/plugins/active_scaffold/lib/active_scaffold.rb +141 -0
  195. data/rails/vendor/plugins/active_scaffold/lib/attribute_params.rb +184 -0
  196. data/rails/vendor/plugins/active_scaffold/lib/bridges/bridge.rb +52 -0
  197. data/rails/vendor/plugins/active_scaffold/lib/bridges/calendar_date_select/bridge.rb +11 -0
  198. data/rails/vendor/plugins/active_scaffold/lib/bridges/calendar_date_select/lib/as_cds_bridge.rb +46 -0
  199. data/rails/vendor/plugins/active_scaffold/lib/bridges/file_column/bridge.rb +12 -0
  200. data/rails/vendor/plugins/active_scaffold/lib/bridges/file_column/lib/as_file_column_bridge.rb +48 -0
  201. data/rails/vendor/plugins/active_scaffold/lib/bridges/file_column/lib/file_column_helpers.rb +51 -0
  202. data/rails/vendor/plugins/active_scaffold/lib/bridges/file_column/lib/form_ui.rb +32 -0
  203. data/rails/vendor/plugins/active_scaffold/lib/bridges/file_column/lib/list_ui.rb +26 -0
  204. data/rails/vendor/plugins/active_scaffold/lib/bridges/file_column/test/functional/file_column_keep_test.rb +43 -0
  205. data/rails/vendor/plugins/active_scaffold/lib/bridges/file_column/test/mock_model.rb +9 -0
  206. data/rails/vendor/plugins/active_scaffold/lib/bridges/file_column/test/test_helper.rb +15 -0
  207. data/rails/vendor/plugins/active_scaffold/lib/config/base.rb +37 -0
  208. data/rails/vendor/plugins/active_scaffold/lib/config/core.rb +203 -0
  209. data/rails/vendor/plugins/active_scaffold/lib/config/create.rb +34 -0
  210. data/rails/vendor/plugins/active_scaffold/lib/config/delete.rb +25 -0
  211. data/rails/vendor/plugins/active_scaffold/lib/config/field_search.rb +53 -0
  212. data/rails/vendor/plugins/active_scaffold/lib/config/form.rb +49 -0
  213. data/rails/vendor/plugins/active_scaffold/lib/config/list.rb +100 -0
  214. data/rails/vendor/plugins/active_scaffold/lib/config/live_search.rb +52 -0
  215. data/rails/vendor/plugins/active_scaffold/lib/config/nested.rb +30 -0
  216. data/rails/vendor/plugins/active_scaffold/lib/config/search.rb +52 -0
  217. data/rails/vendor/plugins/active_scaffold/lib/config/show.rb +39 -0
  218. data/rails/vendor/plugins/active_scaffold/lib/config/subform.rb +33 -0
  219. data/rails/vendor/plugins/active_scaffold/lib/config/update.rb +24 -0
  220. data/rails/vendor/plugins/active_scaffold/lib/configurable.rb +29 -0
  221. data/rails/vendor/plugins/active_scaffold/lib/constraints.rb +174 -0
  222. data/rails/vendor/plugins/active_scaffold/lib/data_structures/action_columns.rb +92 -0
  223. data/rails/vendor/plugins/active_scaffold/lib/data_structures/action_link.rb +133 -0
  224. data/rails/vendor/plugins/active_scaffold/lib/data_structures/action_links.rb +49 -0
  225. data/rails/vendor/plugins/active_scaffold/lib/data_structures/actions.rb +45 -0
  226. data/rails/vendor/plugins/active_scaffold/lib/data_structures/column.rb +247 -0
  227. data/rails/vendor/plugins/active_scaffold/lib/data_structures/columns.rb +62 -0
  228. data/rails/vendor/plugins/active_scaffold/lib/data_structures/error_message.rb +24 -0
  229. data/rails/vendor/plugins/active_scaffold/lib/data_structures/set.rb +61 -0
  230. data/rails/vendor/plugins/active_scaffold/lib/data_structures/sorting.rb +89 -0
  231. data/rails/vendor/plugins/active_scaffold/lib/dhtml_confirm.rb +54 -0
  232. data/rails/vendor/plugins/active_scaffold/lib/exceptions.rb +7 -0
  233. data/rails/vendor/plugins/active_scaffold/lib/extensions/action_controller_rendering.rb +33 -0
  234. data/rails/vendor/plugins/active_scaffold/lib/extensions/action_view_rendering.rb +94 -0
  235. data/rails/vendor/plugins/active_scaffold/lib/extensions/array.rb +7 -0
  236. data/rails/vendor/plugins/active_scaffold/lib/extensions/component_response_with_namespacing.rb +17 -0
  237. data/rails/vendor/plugins/active_scaffold/lib/extensions/error_messages.rb +65 -0
  238. data/rails/vendor/plugins/active_scaffold/lib/extensions/generic_view_paths.rb +62 -0
  239. data/rails/vendor/plugins/active_scaffold/lib/extensions/hashes_in_url_for.rb +61 -0
  240. data/rails/vendor/plugins/active_scaffold/lib/extensions/json_mime_type.rb +28 -0
  241. data/rails/vendor/plugins/active_scaffold/lib/extensions/localize.rb +5 -0
  242. data/rails/vendor/plugins/active_scaffold/lib/extensions/name_option_for_datetime.rb +33 -0
  243. data/rails/vendor/plugins/active_scaffold/lib/extensions/nil_id_in_url_params.rb +7 -0
  244. data/rails/vendor/plugins/active_scaffold/lib/extensions/resources.rb +26 -0
  245. data/rails/vendor/plugins/active_scaffold/lib/extensions/reverse_associations.rb +56 -0
  246. data/rails/vendor/plugins/active_scaffold/lib/extensions/to_label.rb +8 -0
  247. data/rails/vendor/plugins/active_scaffold/lib/extensions/unsaved_associated.rb +61 -0
  248. data/rails/vendor/plugins/active_scaffold/lib/extensions/unsaved_record.rb +20 -0
  249. data/rails/vendor/plugins/active_scaffold/lib/finder.rb +149 -0
  250. data/rails/vendor/plugins/active_scaffold/lib/helpers/association_helpers.rb +40 -0
  251. data/rails/vendor/plugins/active_scaffold/lib/helpers/controller_helpers.rb +7 -0
  252. data/rails/vendor/plugins/active_scaffold/lib/helpers/form_column_helpers.rb +251 -0
  253. data/rails/vendor/plugins/active_scaffold/lib/helpers/id_helpers.rb +119 -0
  254. data/rails/vendor/plugins/active_scaffold/lib/helpers/list_column_helpers.rb +187 -0
  255. data/rails/vendor/plugins/active_scaffold/lib/helpers/pagination_helpers.rb +37 -0
  256. data/rails/vendor/plugins/active_scaffold/lib/helpers/usa_state.rb +46 -0
  257. data/rails/vendor/plugins/active_scaffold/lib/helpers/view_helpers.rb +205 -0
  258. data/rails/vendor/plugins/active_scaffold/lib/paginator.rb +136 -0
  259. data/rails/vendor/plugins/active_scaffold/lib/responds_to_parent.rb +68 -0
  260. data/rails/vendor/plugins/active_scaffold/public/blank.html +33 -0
  261. data/rails/vendor/plugins/active_scaffold/test/bridges/bridge_test.rb +47 -0
  262. data/rails/vendor/plugins/active_scaffold/test/config/update_test.rb +17 -0
  263. data/rails/vendor/plugins/active_scaffold/test/const_mocker.rb +36 -0
  264. data/rails/vendor/plugins/active_scaffold/test/data_structures/action_columns_test.rb +119 -0
  265. data/rails/vendor/plugins/active_scaffold/test/data_structures/action_link_test.rb +78 -0
  266. data/rails/vendor/plugins/active_scaffold/test/data_structures/action_links_test.rb +63 -0
  267. data/rails/vendor/plugins/active_scaffold/test/data_structures/actions_test.rb +25 -0
  268. data/rails/vendor/plugins/active_scaffold/test/data_structures/association_column_test.rb +41 -0
  269. data/rails/vendor/plugins/active_scaffold/test/data_structures/column_test.rb +161 -0
  270. data/rails/vendor/plugins/active_scaffold/test/data_structures/columns_test.rb +69 -0
  271. data/rails/vendor/plugins/active_scaffold/test/data_structures/error_message_test.rb +28 -0
  272. data/rails/vendor/plugins/active_scaffold/test/data_structures/set_test.rb +86 -0
  273. data/rails/vendor/plugins/active_scaffold/test/data_structures/sorting_test.rb +96 -0
  274. data/rails/vendor/plugins/active_scaffold/test/data_structures/standard_column_test.rb +34 -0
  275. data/rails/vendor/plugins/active_scaffold/test/data_structures/virtual_column_test.rb +34 -0
  276. data/rails/vendor/plugins/active_scaffold/test/extensions/active_record_test.rb +45 -0
  277. data/rails/vendor/plugins/active_scaffold/test/extensions/array.rb +12 -0
  278. data/rails/vendor/plugins/active_scaffold/test/misc/active_record_permissions.rb +154 -0
  279. data/rails/vendor/plugins/active_scaffold/test/misc/configurable_test.rb +96 -0
  280. data/rails/vendor/plugins/active_scaffold/test/misc/constraints_test.rb +175 -0
  281. data/rails/vendor/plugins/active_scaffold/test/misc/finder_test.rb +70 -0
  282. data/rails/vendor/plugins/active_scaffold/test/misc/lang_test.rb +12 -0
  283. data/rails/vendor/plugins/active_scaffold/test/model_stub.rb +39 -0
  284. data/rails/vendor/plugins/active_scaffold/test/run_all.rb +8 -0
  285. data/rails/vendor/plugins/active_scaffold/test/test_helper.rb +13 -0
  286. data/rails/vendor/plugins/active_scaffold/uninstall.rb +12 -0
  287. data/rails/vendor/rails/actionmailer/CHANGELOG +336 -0
  288. data/rails/vendor/rails/actionmailer/MIT-LICENSE +21 -0
  289. data/rails/vendor/rails/actionmailer/README +149 -0
  290. data/rails/vendor/rails/actionmailer/Rakefile +97 -0
  291. data/rails/vendor/rails/actionmailer/install.rb +30 -0
  292. data/rails/vendor/rails/actionmailer/lib/action_mailer.rb +52 -0
  293. data/rails/vendor/rails/actionmailer/lib/action_mailer/adv_attr_accessor.rb +30 -0
  294. data/rails/vendor/rails/actionmailer/lib/action_mailer/base.rb +646 -0
  295. data/rails/vendor/rails/actionmailer/lib/action_mailer/helpers.rb +111 -0
  296. data/rails/vendor/rails/actionmailer/lib/action_mailer/mail_helper.rb +19 -0
  297. data/rails/vendor/rails/actionmailer/lib/action_mailer/part.rb +110 -0
  298. data/rails/vendor/rails/actionmailer/lib/action_mailer/part_container.rb +51 -0
  299. data/rails/vendor/rails/actionmailer/lib/action_mailer/quoting.rb +61 -0
  300. data/rails/vendor/rails/actionmailer/lib/action_mailer/test_case.rb +64 -0
  301. data/rails/vendor/rails/actionmailer/lib/action_mailer/test_helper.rb +67 -0
  302. data/rails/vendor/rails/actionmailer/lib/action_mailer/utils.rb +8 -0
  303. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor.rb +14 -0
  304. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/text-format-0.6.3/text/format.rb +1466 -0
  305. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail.rb +5 -0
  306. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/address.rb +426 -0
  307. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/attachments.rb +46 -0
  308. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/base64.rb +46 -0
  309. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/compat.rb +41 -0
  310. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/config.rb +67 -0
  311. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/core_extensions.rb +63 -0
  312. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/encode.rb +581 -0
  313. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/header.rb +960 -0
  314. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/index.rb +9 -0
  315. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/interface.rb +1130 -0
  316. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/loader.rb +3 -0
  317. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/mail.rb +578 -0
  318. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/mailbox.rb +495 -0
  319. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/main.rb +6 -0
  320. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/mbox.rb +3 -0
  321. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/net.rb +248 -0
  322. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/obsolete.rb +132 -0
  323. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/parser.rb +1476 -0
  324. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/port.rb +379 -0
  325. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/quoting.rb +118 -0
  326. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/require_arch.rb +58 -0
  327. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/scanner.rb +49 -0
  328. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/scanner_r.rb +261 -0
  329. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/stringio.rb +280 -0
  330. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/utils.rb +337 -0
  331. data/rails/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/version.rb +39 -0
  332. data/rails/vendor/rails/actionmailer/lib/action_mailer/version.rb +9 -0
  333. data/rails/vendor/rails/actionmailer/lib/actionmailer.rb +1 -0
  334. data/rails/vendor/rails/actionmailer/test/abstract_unit.rb +49 -0
  335. data/rails/vendor/rails/actionmailer/test/delivery_method_test.rb +51 -0
  336. data/rails/vendor/rails/actionmailer/test/fixtures/first_mailer/share.erb +1 -0
  337. data/rails/vendor/rails/actionmailer/test/fixtures/helper_mailer/use_example_helper.erb +1 -0
  338. data/rails/vendor/rails/actionmailer/test/fixtures/helper_mailer/use_helper.erb +1 -0
  339. data/rails/vendor/rails/actionmailer/test/fixtures/helper_mailer/use_helper_method.erb +1 -0
  340. data/rails/vendor/rails/actionmailer/test/fixtures/helper_mailer/use_mail_helper.erb +5 -0
  341. data/rails/vendor/rails/actionmailer/test/fixtures/helpers/example_helper.rb +5 -0
  342. data/rails/vendor/rails/actionmailer/test/fixtures/path.with.dots/funky_path_mailer/multipart_with_template_path_with_dots.erb +1 -0
  343. data/rails/vendor/rails/actionmailer/test/fixtures/raw_email +14 -0
  344. data/rails/vendor/rails/actionmailer/test/fixtures/raw_email10 +20 -0
  345. data/rails/vendor/rails/actionmailer/test/fixtures/raw_email12 +32 -0
  346. data/rails/vendor/rails/actionmailer/test/fixtures/raw_email13 +29 -0
  347. data/rails/vendor/rails/actionmailer/test/fixtures/raw_email2 +114 -0
  348. data/rails/vendor/rails/actionmailer/test/fixtures/raw_email3 +70 -0
  349. data/rails/vendor/rails/actionmailer/test/fixtures/raw_email4 +59 -0
  350. data/rails/vendor/rails/actionmailer/test/fixtures/raw_email5 +19 -0
  351. data/rails/vendor/rails/actionmailer/test/fixtures/raw_email6 +20 -0
  352. data/rails/vendor/rails/actionmailer/test/fixtures/raw_email7 +66 -0
  353. data/rails/vendor/rails/actionmailer/test/fixtures/raw_email8 +47 -0
  354. data/rails/vendor/rails/actionmailer/test/fixtures/raw_email9 +28 -0
  355. data/rails/vendor/rails/actionmailer/test/fixtures/raw_email_quoted_with_0d0a +14 -0
  356. data/rails/vendor/rails/actionmailer/test/fixtures/raw_email_with_invalid_characters_in_content_type +104 -0
  357. data/rails/vendor/rails/actionmailer/test/fixtures/raw_email_with_nested_attachment +100 -0
  358. data/rails/vendor/rails/actionmailer/test/fixtures/raw_email_with_partially_quoted_subject +14 -0
  359. data/rails/vendor/rails/actionmailer/test/fixtures/second_mailer/share.erb +1 -0
  360. data/rails/vendor/rails/actionmailer/test/fixtures/templates/signed_up.erb +3 -0
  361. data/rails/vendor/rails/actionmailer/test/fixtures/test_mailer/_subtemplate.text.plain.erb +1 -0
  362. data/rails/vendor/rails/actionmailer/test/fixtures/test_mailer/custom_templating_extension.text.html.haml +6 -0
  363. data/rails/vendor/rails/actionmailer/test/fixtures/test_mailer/custom_templating_extension.text.plain.haml +6 -0
  364. data/rails/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.ignored.erb +1 -0
  365. data/rails/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.html.erb +10 -0
  366. data/rails/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.plain.erb +2 -0
  367. data/rails/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.yaml.erb +1 -0
  368. data/rails/vendor/rails/actionmailer/test/fixtures/test_mailer/included_subtemplate.text.plain.erb +1 -0
  369. data/rails/vendor/rails/actionmailer/test/fixtures/test_mailer/rxml_template.builder +2 -0
  370. data/rails/vendor/rails/actionmailer/test/fixtures/test_mailer/rxml_template.rxml +2 -0
  371. data/rails/vendor/rails/actionmailer/test/fixtures/test_mailer/signed_up.erb +3 -0
  372. data/rails/vendor/rails/actionmailer/test/fixtures/test_mailer/signed_up_with_url.erb +5 -0
  373. data/rails/vendor/rails/actionmailer/test/mail_helper_test.rb +95 -0
  374. data/rails/vendor/rails/actionmailer/test/mail_render_test.rb +122 -0
  375. data/rails/vendor/rails/actionmailer/test/mail_service_test.rb +979 -0
  376. data/rails/vendor/rails/actionmailer/test/quoting_test.rb +98 -0
  377. data/rails/vendor/rails/actionmailer/test/test_helper_test.rb +129 -0
  378. data/rails/vendor/rails/actionmailer/test/tmail_test.rb +22 -0
  379. data/rails/vendor/rails/actionmailer/test/url_test.rb +76 -0
  380. data/rails/vendor/rails/actionpack/CHANGELOG +4798 -0
  381. data/rails/vendor/rails/actionpack/MIT-LICENSE +21 -0
  382. data/rails/vendor/rails/actionpack/README +469 -0
  383. data/rails/vendor/rails/actionpack/RUNNING_UNIT_TESTS +24 -0
  384. data/rails/vendor/rails/actionpack/Rakefile +154 -0
  385. data/rails/vendor/rails/actionpack/install.rb +30 -0
  386. data/rails/vendor/rails/actionpack/lib/action_controller.rb +79 -0
  387. data/rails/vendor/rails/actionpack/lib/action_controller/assertions.rb +69 -0
  388. data/rails/vendor/rails/actionpack/lib/action_controller/assertions/dom_assertions.rb +39 -0
  389. data/rails/vendor/rails/actionpack/lib/action_controller/assertions/model_assertions.rb +20 -0
  390. data/rails/vendor/rails/actionpack/lib/action_controller/assertions/response_assertions.rb +172 -0
  391. data/rails/vendor/rails/actionpack/lib/action_controller/assertions/routing_assertions.rb +146 -0
  392. data/rails/vendor/rails/actionpack/lib/action_controller/assertions/selector_assertions.rb +643 -0
  393. data/rails/vendor/rails/actionpack/lib/action_controller/assertions/tag_assertions.rb +130 -0
  394. data/rails/vendor/rails/actionpack/lib/action_controller/base.rb +1270 -0
  395. data/rails/vendor/rails/actionpack/lib/action_controller/benchmarking.rb +94 -0
  396. data/rails/vendor/rails/actionpack/lib/action_controller/caching.rb +72 -0
  397. data/rails/vendor/rails/actionpack/lib/action_controller/caching/actions.rb +144 -0
  398. data/rails/vendor/rails/actionpack/lib/action_controller/caching/fragments.rb +138 -0
  399. data/rails/vendor/rails/actionpack/lib/action_controller/caching/pages.rb +154 -0
  400. data/rails/vendor/rails/actionpack/lib/action_controller/caching/sql_cache.rb +18 -0
  401. data/rails/vendor/rails/actionpack/lib/action_controller/caching/sweeping.rb +97 -0
  402. data/rails/vendor/rails/actionpack/lib/action_controller/cgi_ext.rb +16 -0
  403. data/rails/vendor/rails/actionpack/lib/action_controller/cgi_ext/cookie.rb +110 -0
  404. data/rails/vendor/rails/actionpack/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  405. data/rails/vendor/rails/actionpack/lib/action_controller/cgi_ext/session.rb +73 -0
  406. data/rails/vendor/rails/actionpack/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  407. data/rails/vendor/rails/actionpack/lib/action_controller/cgi_process.rb +223 -0
  408. data/rails/vendor/rails/actionpack/lib/action_controller/components.rb +166 -0
  409. data/rails/vendor/rails/actionpack/lib/action_controller/cookies.rb +96 -0
  410. data/rails/vendor/rails/actionpack/lib/action_controller/dispatcher.rb +162 -0
  411. data/rails/vendor/rails/actionpack/lib/action_controller/filters.rb +643 -0
  412. data/rails/vendor/rails/actionpack/lib/action_controller/flash.rb +172 -0
  413. data/rails/vendor/rails/actionpack/lib/action_controller/headers.rb +31 -0
  414. data/rails/vendor/rails/actionpack/lib/action_controller/helpers.rb +221 -0
  415. data/rails/vendor/rails/actionpack/lib/action_controller/http_authentication.rb +124 -0
  416. data/rails/vendor/rails/actionpack/lib/action_controller/integration.rb +634 -0
  417. data/rails/vendor/rails/actionpack/lib/action_controller/layout.rb +310 -0
  418. data/rails/vendor/rails/actionpack/lib/action_controller/mime_responds.rb +174 -0
  419. data/rails/vendor/rails/actionpack/lib/action_controller/mime_type.rb +182 -0
  420. data/rails/vendor/rails/actionpack/lib/action_controller/mime_types.rb +20 -0
  421. data/rails/vendor/rails/actionpack/lib/action_controller/polymorphic_routes.rb +178 -0
  422. data/rails/vendor/rails/actionpack/lib/action_controller/record_identifier.rb +97 -0
  423. data/rails/vendor/rails/actionpack/lib/action_controller/request.rb +761 -0
  424. data/rails/vendor/rails/actionpack/lib/action_controller/request_forgery_protection.rb +140 -0
  425. data/rails/vendor/rails/actionpack/lib/action_controller/request_profiler.rb +169 -0
  426. data/rails/vendor/rails/actionpack/lib/action_controller/rescue.rb +258 -0
  427. data/rails/vendor/rails/actionpack/lib/action_controller/resources.rb +572 -0
  428. data/rails/vendor/rails/actionpack/lib/action_controller/response.rb +76 -0
  429. data/rails/vendor/rails/actionpack/lib/action_controller/routing.rb +383 -0
  430. data/rails/vendor/rails/actionpack/lib/action_controller/routing/builder.rb +204 -0
  431. data/rails/vendor/rails/actionpack/lib/action_controller/routing/optimisations.rb +120 -0
  432. data/rails/vendor/rails/actionpack/lib/action_controller/routing/recognition_optimisation.rb +158 -0
  433. data/rails/vendor/rails/actionpack/lib/action_controller/routing/route.rb +240 -0
  434. data/rails/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb +435 -0
  435. data/rails/vendor/rails/actionpack/lib/action_controller/routing/routing_ext.rb +46 -0
  436. data/rails/vendor/rails/actionpack/lib/action_controller/routing/segments.rb +283 -0
  437. data/rails/vendor/rails/actionpack/lib/action_controller/session/active_record_store.rb +340 -0
  438. data/rails/vendor/rails/actionpack/lib/action_controller/session/cookie_store.rb +166 -0
  439. data/rails/vendor/rails/actionpack/lib/action_controller/session/drb_server.rb +32 -0
  440. data/rails/vendor/rails/actionpack/lib/action_controller/session/drb_store.rb +35 -0
  441. data/rails/vendor/rails/actionpack/lib/action_controller/session/mem_cache_store.rb +98 -0
  442. data/rails/vendor/rails/actionpack/lib/action_controller/session_management.rb +158 -0
  443. data/rails/vendor/rails/actionpack/lib/action_controller/status_codes.rb +88 -0
  444. data/rails/vendor/rails/actionpack/lib/action_controller/streaming.rb +155 -0
  445. data/rails/vendor/rails/actionpack/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  446. data/rails/vendor/rails/actionpack/lib/action_controller/templates/rescues/_trace.erb +26 -0
  447. data/rails/vendor/rails/actionpack/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  448. data/rails/vendor/rails/actionpack/lib/action_controller/templates/rescues/layout.erb +29 -0
  449. data/rails/vendor/rails/actionpack/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  450. data/rails/vendor/rails/actionpack/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  451. data/rails/vendor/rails/actionpack/lib/action_controller/templates/rescues/template_error.erb +21 -0
  452. data/rails/vendor/rails/actionpack/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  453. data/rails/vendor/rails/actionpack/lib/action_controller/test_case.rb +83 -0
  454. data/rails/vendor/rails/actionpack/lib/action_controller/test_process.rb +524 -0
  455. data/rails/vendor/rails/actionpack/lib/action_controller/url_rewriter.rb +142 -0
  456. data/rails/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  457. data/rails/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/node.rb +530 -0
  458. data/rails/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  459. data/rails/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  460. data/rails/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  461. data/rails/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  462. data/rails/vendor/rails/actionpack/lib/action_controller/verification.rb +130 -0
  463. data/rails/vendor/rails/actionpack/lib/action_pack.rb +24 -0
  464. data/rails/vendor/rails/actionpack/lib/action_pack/version.rb +9 -0
  465. data/rails/vendor/rails/actionpack/lib/action_view.rb +45 -0
  466. data/rails/vendor/rails/actionpack/lib/action_view/base.rb +343 -0
  467. data/rails/vendor/rails/actionpack/lib/action_view/helpers/active_record_helper.rb +276 -0
  468. data/rails/vendor/rails/actionpack/lib/action_view/helpers/asset_tag_helper.rb +611 -0
  469. data/rails/vendor/rails/actionpack/lib/action_view/helpers/atom_feed_helper.rb +143 -0
  470. data/rails/vendor/rails/actionpack/lib/action_view/helpers/benchmark_helper.rb +33 -0
  471. data/rails/vendor/rails/actionpack/lib/action_view/helpers/cache_helper.rb +40 -0
  472. data/rails/vendor/rails/actionpack/lib/action_view/helpers/capture_helper.rb +161 -0
  473. data/rails/vendor/rails/actionpack/lib/action_view/helpers/date_helper.rb +711 -0
  474. data/rails/vendor/rails/actionpack/lib/action_view/helpers/debug_helper.rb +31 -0
  475. data/rails/vendor/rails/actionpack/lib/action_view/helpers/form_helper.rb +763 -0
  476. data/rails/vendor/rails/actionpack/lib/action_view/helpers/form_options_helper.rb +457 -0
  477. data/rails/vendor/rails/actionpack/lib/action_view/helpers/form_tag_helper.rb +459 -0
  478. data/rails/vendor/rails/actionpack/lib/action_view/helpers/javascript_helper.rb +217 -0
  479. data/rails/vendor/rails/actionpack/lib/action_view/helpers/javascripts/controls.js +963 -0
  480. data/rails/vendor/rails/actionpack/lib/action_view/helpers/javascripts/dragdrop.js +972 -0
  481. data/rails/vendor/rails/actionpack/lib/action_view/helpers/javascripts/effects.js +1120 -0
  482. data/rails/vendor/rails/actionpack/lib/action_view/helpers/javascripts/prototype.js +4225 -0
  483. data/rails/vendor/rails/actionpack/lib/action_view/helpers/number_helper.rb +186 -0
  484. data/rails/vendor/rails/actionpack/lib/action_view/helpers/prototype_helper.rb +1300 -0
  485. data/rails/vendor/rails/actionpack/lib/action_view/helpers/record_identification_helper.rb +20 -0
  486. data/rails/vendor/rails/actionpack/lib/action_view/helpers/record_tag_helper.rb +59 -0
  487. data/rails/vendor/rails/actionpack/lib/action_view/helpers/sanitize_helper.rb +229 -0
  488. data/rails/vendor/rails/actionpack/lib/action_view/helpers/scriptaculous_helper.rb +225 -0
  489. data/rails/vendor/rails/actionpack/lib/action_view/helpers/tag_helper.rb +133 -0
  490. data/rails/vendor/rails/actionpack/lib/action_view/helpers/text_helper.rb +507 -0
  491. data/rails/vendor/rails/actionpack/lib/action_view/helpers/url_helper.rb +575 -0
  492. data/rails/vendor/rails/actionpack/lib/action_view/inline_template.rb +20 -0
  493. data/rails/vendor/rails/actionpack/lib/action_view/partial_template.rb +70 -0
  494. data/rails/vendor/rails/actionpack/lib/action_view/partials.rb +158 -0
  495. data/rails/vendor/rails/actionpack/lib/action_view/template.rb +127 -0
  496. data/rails/vendor/rails/actionpack/lib/action_view/template_error.rb +110 -0
  497. data/rails/vendor/rails/actionpack/lib/action_view/template_finder.rb +177 -0
  498. data/rails/vendor/rails/actionpack/lib/action_view/template_handler.rb +34 -0
  499. data/rails/vendor/rails/actionpack/lib/action_view/template_handlers/builder.rb +27 -0
  500. data/rails/vendor/rails/actionpack/lib/action_view/template_handlers/compilable.rb +128 -0
  501. data/rails/vendor/rails/actionpack/lib/action_view/template_handlers/erb.rb +56 -0
  502. data/rails/vendor/rails/actionpack/lib/action_view/template_handlers/rjs.rb +27 -0
  503. data/rails/vendor/rails/actionpack/lib/action_view/test_case.rb +58 -0
  504. data/rails/vendor/rails/actionpack/lib/actionpack.rb +1 -0
  505. data/rails/vendor/rails/actionpack/test/abstract_unit.rb +36 -0
  506. data/rails/vendor/rails/actionpack/test/active_record_unit.rb +105 -0
  507. data/rails/vendor/rails/actionpack/test/activerecord/active_record_store_test.rb +141 -0
  508. data/rails/vendor/rails/actionpack/test/activerecord/render_partial_with_record_identification_test.rb +191 -0
  509. data/rails/vendor/rails/actionpack/test/adv_attr_test.rb +20 -0
  510. data/rails/vendor/rails/actionpack/test/controller/action_pack_assertions_test.rb +524 -0
  511. data/rails/vendor/rails/actionpack/test/controller/addresses_render_test.rb +43 -0
  512. data/rails/vendor/rails/actionpack/test/controller/assert_select_test.rb +689 -0
  513. data/rails/vendor/rails/actionpack/test/controller/base_test.rb +183 -0
  514. data/rails/vendor/rails/actionpack/test/controller/benchmark_test.rb +32 -0
  515. data/rails/vendor/rails/actionpack/test/controller/caching_test.rb +610 -0
  516. data/rails/vendor/rails/actionpack/test/controller/capture_test.rb +89 -0
  517. data/rails/vendor/rails/actionpack/test/controller/cgi_test.rb +116 -0
  518. data/rails/vendor/rails/actionpack/test/controller/components_test.rb +140 -0
  519. data/rails/vendor/rails/actionpack/test/controller/content_type_test.rb +139 -0
  520. data/rails/vendor/rails/actionpack/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  521. data/rails/vendor/rails/actionpack/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  522. data/rails/vendor/rails/actionpack/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  523. data/rails/vendor/rails/actionpack/test/controller/cookie_test.rb +146 -0
  524. data/rails/vendor/rails/actionpack/test/controller/custom_handler_test.rb +45 -0
  525. data/rails/vendor/rails/actionpack/test/controller/deprecation/deprecated_base_methods_test.rb +37 -0
  526. data/rails/vendor/rails/actionpack/test/controller/dispatcher_test.rb +105 -0
  527. data/rails/vendor/rails/actionpack/test/controller/fake_controllers.rb +33 -0
  528. data/rails/vendor/rails/actionpack/test/controller/fake_models.rb +11 -0
  529. data/rails/vendor/rails/actionpack/test/controller/filter_params_test.rb +49 -0
  530. data/rails/vendor/rails/actionpack/test/controller/filters_test.rb +881 -0
  531. data/rails/vendor/rails/actionpack/test/controller/flash_test.rb +146 -0
  532. data/rails/vendor/rails/actionpack/test/controller/header_test.rb +14 -0
  533. data/rails/vendor/rails/actionpack/test/controller/helper_test.rb +210 -0
  534. data/rails/vendor/rails/actionpack/test/controller/html-scanner/document_test.rb +123 -0
  535. data/rails/vendor/rails/actionpack/test/controller/html-scanner/node_test.rb +68 -0
  536. data/rails/vendor/rails/actionpack/test/controller/html-scanner/sanitizer_test.rb +259 -0
  537. data/rails/vendor/rails/actionpack/test/controller/html-scanner/tag_node_test.rb +238 -0
  538. data/rails/vendor/rails/actionpack/test/controller/html-scanner/text_node_test.rb +50 -0
  539. data/rails/vendor/rails/actionpack/test/controller/html-scanner/tokenizer_test.rb +131 -0
  540. data/rails/vendor/rails/actionpack/test/controller/http_authentication_test.rb +54 -0
  541. data/rails/vendor/rails/actionpack/test/controller/integration_test.rb +252 -0
  542. data/rails/vendor/rails/actionpack/test/controller/integration_upload_test.rb +43 -0
  543. data/rails/vendor/rails/actionpack/test/controller/layout_test.rb +259 -0
  544. data/rails/vendor/rails/actionpack/test/controller/mime_responds_test.rb +538 -0
  545. data/rails/vendor/rails/actionpack/test/controller/mime_type_test.rb +84 -0
  546. data/rails/vendor/rails/actionpack/test/controller/new_render_test.rb +926 -0
  547. data/rails/vendor/rails/actionpack/test/controller/polymorphic_routes_test.rb +141 -0
  548. data/rails/vendor/rails/actionpack/test/controller/record_identifier_test.rb +139 -0
  549. data/rails/vendor/rails/actionpack/test/controller/redirect_test.rb +289 -0
  550. data/rails/vendor/rails/actionpack/test/controller/render_test.rb +527 -0
  551. data/rails/vendor/rails/actionpack/test/controller/request_forgery_protection_test.rb +313 -0
  552. data/rails/vendor/rails/actionpack/test/controller/request_test.rb +922 -0
  553. data/rails/vendor/rails/actionpack/test/controller/rescue_test.rb +517 -0
  554. data/rails/vendor/rails/actionpack/test/controller/resources_test.rb +875 -0
  555. data/rails/vendor/rails/actionpack/test/controller/routing_test.rb +2415 -0
  556. data/rails/vendor/rails/actionpack/test/controller/selector_test.rb +628 -0
  557. data/rails/vendor/rails/actionpack/test/controller/send_file_test.rb +138 -0
  558. data/rails/vendor/rails/actionpack/test/controller/session/cookie_store_test.rb +258 -0
  559. data/rails/vendor/rails/actionpack/test/controller/session/mem_cache_store_test.rb +181 -0
  560. data/rails/vendor/rails/actionpack/test/controller/session_fixation_test.rb +89 -0
  561. data/rails/vendor/rails/actionpack/test/controller/session_management_test.rb +178 -0
  562. data/rails/vendor/rails/actionpack/test/controller/test_test.rb +686 -0
  563. data/rails/vendor/rails/actionpack/test/controller/url_rewriter_test.rb +310 -0
  564. data/rails/vendor/rails/actionpack/test/controller/verification_test.rb +253 -0
  565. data/rails/vendor/rails/actionpack/test/controller/view_paths_test.rb +140 -0
  566. data/rails/vendor/rails/actionpack/test/controller/webservice_test.rb +229 -0
  567. data/rails/vendor/rails/actionpack/test/fixtures/addresses/list.erb +1 -0
  568. data/rails/vendor/rails/actionpack/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  569. data/rails/vendor/rails/actionpack/test/fixtures/companies.yml +24 -0
  570. data/rails/vendor/rails/actionpack/test/fixtures/company.rb +10 -0
  571. data/rails/vendor/rails/actionpack/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  572. data/rails/vendor/rails/actionpack/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  573. data/rails/vendor/rails/actionpack/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  574. data/rails/vendor/rails/actionpack/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  575. data/rails/vendor/rails/actionpack/test/fixtures/customers/_customer.html.erb +1 -0
  576. data/rails/vendor/rails/actionpack/test/fixtures/db_definitions/sqlite.sql +49 -0
  577. data/rails/vendor/rails/actionpack/test/fixtures/developer.rb +9 -0
  578. data/rails/vendor/rails/actionpack/test/fixtures/developers.yml +21 -0
  579. data/rails/vendor/rails/actionpack/test/fixtures/developers_projects.yml +13 -0
  580. data/rails/vendor/rails/actionpack/test/fixtures/fun/games/hello_world.erb +1 -0
  581. data/rails/vendor/rails/actionpack/test/fixtures/functional_caching/_partial.erb +3 -0
  582. data/rails/vendor/rails/actionpack/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  583. data/rails/vendor/rails/actionpack/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  584. data/rails/vendor/rails/actionpack/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  585. data/rails/vendor/rails/actionpack/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  586. data/rails/vendor/rails/actionpack/test/fixtures/helpers/abc_helper.rb +5 -0
  587. data/rails/vendor/rails/actionpack/test/fixtures/helpers/fun/games_helper.rb +3 -0
  588. data/rails/vendor/rails/actionpack/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  589. data/rails/vendor/rails/actionpack/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  590. data/rails/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  591. data/rails/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  592. data/rails/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  593. data/rails/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  594. data/rails/vendor/rails/actionpack/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  595. data/rails/vendor/rails/actionpack/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  596. data/rails/vendor/rails/actionpack/test/fixtures/layouts/block_with_layout.erb +3 -0
  597. data/rails/vendor/rails/actionpack/test/fixtures/layouts/builder.builder +3 -0
  598. data/rails/vendor/rails/actionpack/test/fixtures/layouts/partial_with_layout.erb +3 -0
  599. data/rails/vendor/rails/actionpack/test/fixtures/layouts/standard.erb +1 -0
  600. data/rails/vendor/rails/actionpack/test/fixtures/layouts/talk_from_action.erb +2 -0
  601. data/rails/vendor/rails/actionpack/test/fixtures/layouts/yield.erb +2 -0
  602. data/rails/vendor/rails/actionpack/test/fixtures/mascot.rb +3 -0
  603. data/rails/vendor/rails/actionpack/test/fixtures/mascots.yml +4 -0
  604. data/rails/vendor/rails/actionpack/test/fixtures/mascots/_mascot.html.erb +1 -0
  605. data/rails/vendor/rails/actionpack/test/fixtures/multipart/binary_file +0 -0
  606. data/rails/vendor/rails/actionpack/test/fixtures/multipart/boundary_problem_file +10 -0
  607. data/rails/vendor/rails/actionpack/test/fixtures/multipart/bracketed_param +5 -0
  608. data/rails/vendor/rails/actionpack/test/fixtures/multipart/large_text_file +10 -0
  609. data/rails/vendor/rails/actionpack/test/fixtures/multipart/mixed_files +0 -0
  610. data/rails/vendor/rails/actionpack/test/fixtures/multipart/mona_lisa.jpg +0 -0
  611. data/rails/vendor/rails/actionpack/test/fixtures/multipart/single_parameter +5 -0
  612. data/rails/vendor/rails/actionpack/test/fixtures/multipart/text_file +10 -0
  613. data/rails/vendor/rails/actionpack/test/fixtures/override/test/hello_world.erb +1 -0
  614. data/rails/vendor/rails/actionpack/test/fixtures/override2/layouts/test/sub.erb +1 -0
  615. data/rails/vendor/rails/actionpack/test/fixtures/post_test/layouts/post.html.erb +1 -0
  616. data/rails/vendor/rails/actionpack/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  617. data/rails/vendor/rails/actionpack/test/fixtures/post_test/post/index.html.erb +1 -0
  618. data/rails/vendor/rails/actionpack/test/fixtures/post_test/post/index.iphone.erb +1 -0
  619. data/rails/vendor/rails/actionpack/test/fixtures/post_test/super_post/index.html.erb +1 -0
  620. data/rails/vendor/rails/actionpack/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  621. data/rails/vendor/rails/actionpack/test/fixtures/project.rb +3 -0
  622. data/rails/vendor/rails/actionpack/test/fixtures/projects.yml +7 -0
  623. data/rails/vendor/rails/actionpack/test/fixtures/public/404.html +1 -0
  624. data/rails/vendor/rails/actionpack/test/fixtures/public/500.html +1 -0
  625. data/rails/vendor/rails/actionpack/test/fixtures/public/images/rails.png +0 -0
  626. data/rails/vendor/rails/actionpack/test/fixtures/public/javascripts/application.js +1 -0
  627. data/rails/vendor/rails/actionpack/test/fixtures/public/javascripts/bank.js +1 -0
  628. data/rails/vendor/rails/actionpack/test/fixtures/public/javascripts/controls.js +1 -0
  629. data/rails/vendor/rails/actionpack/test/fixtures/public/javascripts/dragdrop.js +1 -0
  630. data/rails/vendor/rails/actionpack/test/fixtures/public/javascripts/effects.js +1 -0
  631. data/rails/vendor/rails/actionpack/test/fixtures/public/javascripts/prototype.js +1 -0
  632. data/rails/vendor/rails/actionpack/test/fixtures/public/javascripts/robber.js +1 -0
  633. data/rails/vendor/rails/actionpack/test/fixtures/public/javascripts/version.1.0.js +1 -0
  634. data/rails/vendor/rails/actionpack/test/fixtures/public/stylesheets/bank.css +1 -0
  635. data/rails/vendor/rails/actionpack/test/fixtures/public/stylesheets/robber.css +1 -0
  636. data/rails/vendor/rails/actionpack/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  637. data/rails/vendor/rails/actionpack/test/fixtures/replies.yml +15 -0
  638. data/rails/vendor/rails/actionpack/test/fixtures/reply.rb +7 -0
  639. data/rails/vendor/rails/actionpack/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  640. data/rails/vendor/rails/actionpack/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
  641. data/rails/vendor/rails/actionpack/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  642. data/rails/vendor/rails/actionpack/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  643. data/rails/vendor/rails/actionpack/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  644. data/rails/vendor/rails/actionpack/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  645. data/rails/vendor/rails/actionpack/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  646. data/rails/vendor/rails/actionpack/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  647. data/rails/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  648. data/rails/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  649. data/rails/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  650. data/rails/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  651. data/rails/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  652. data/rails/vendor/rails/actionpack/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  653. data/rails/vendor/rails/actionpack/test/fixtures/scope/test/modgreet.erb +1 -0
  654. data/rails/vendor/rails/actionpack/test/fixtures/shared.html.erb +1 -0
  655. data/rails/vendor/rails/actionpack/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  656. data/rails/vendor/rails/actionpack/test/fixtures/test/_customer.erb +1 -0
  657. data/rails/vendor/rails/actionpack/test/fixtures/test/_customer_counter.erb +1 -0
  658. data/rails/vendor/rails/actionpack/test/fixtures/test/_customer_greeting.erb +1 -0
  659. data/rails/vendor/rails/actionpack/test/fixtures/test/_form.erb +1 -0
  660. data/rails/vendor/rails/actionpack/test/fixtures/test/_hash_greeting.erb +1 -0
  661. data/rails/vendor/rails/actionpack/test/fixtures/test/_hash_object.erb +2 -0
  662. data/rails/vendor/rails/actionpack/test/fixtures/test/_hello.builder +1 -0
  663. data/rails/vendor/rails/actionpack/test/fixtures/test/_labelling_form.erb +1 -0
  664. data/rails/vendor/rails/actionpack/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  665. data/rails/vendor/rails/actionpack/test/fixtures/test/_partial.erb +1 -0
  666. data/rails/vendor/rails/actionpack/test/fixtures/test/_partial.html.erb +1 -0
  667. data/rails/vendor/rails/actionpack/test/fixtures/test/_partial.js.erb +1 -0
  668. data/rails/vendor/rails/actionpack/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  669. data/rails/vendor/rails/actionpack/test/fixtures/test/_partial_only.erb +1 -0
  670. data/rails/vendor/rails/actionpack/test/fixtures/test/_person.erb +2 -0
  671. data/rails/vendor/rails/actionpack/test/fixtures/test/_raise.html.erb +1 -0
  672. data/rails/vendor/rails/actionpack/test/fixtures/test/action_talk_to_layout.erb +2 -0
  673. data/rails/vendor/rails/actionpack/test/fixtures/test/block_content_for.erb +2 -0
  674. data/rails/vendor/rails/actionpack/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  675. data/rails/vendor/rails/actionpack/test/fixtures/test/capturing.erb +4 -0
  676. data/rails/vendor/rails/actionpack/test/fixtures/test/content_for.erb +2 -0
  677. data/rails/vendor/rails/actionpack/test/fixtures/test/content_for_concatenated.erb +3 -0
  678. data/rails/vendor/rails/actionpack/test/fixtures/test/content_for_with_parameter.erb +2 -0
  679. data/rails/vendor/rails/actionpack/test/fixtures/test/delete_with_js.rjs +2 -0
  680. data/rails/vendor/rails/actionpack/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  681. data/rails/vendor/rails/actionpack/test/fixtures/test/enum_rjs_test.rjs +6 -0
  682. data/rails/vendor/rails/actionpack/test/fixtures/test/erb_content_for.erb +2 -0
  683. data/rails/vendor/rails/actionpack/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  684. data/rails/vendor/rails/actionpack/test/fixtures/test/formatted_xml_erb.builder +1 -0
  685. data/rails/vendor/rails/actionpack/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  686. data/rails/vendor/rails/actionpack/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  687. data/rails/vendor/rails/actionpack/test/fixtures/test/greeting.erb +1 -0
  688. data/rails/vendor/rails/actionpack/test/fixtures/test/greeting.js.rjs +1 -0
  689. data/rails/vendor/rails/actionpack/test/fixtures/test/hello.builder +4 -0
  690. data/rails/vendor/rails/actionpack/test/fixtures/test/hello_world.erb +1 -0
  691. data/rails/vendor/rails/actionpack/test/fixtures/test/hello_world_container.builder +3 -0
  692. data/rails/vendor/rails/actionpack/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  693. data/rails/vendor/rails/actionpack/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  694. data/rails/vendor/rails/actionpack/test/fixtures/test/hello_xml_world.builder +11 -0
  695. data/rails/vendor/rails/actionpack/test/fixtures/test/list.erb +1 -0
  696. data/rails/vendor/rails/actionpack/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  697. data/rails/vendor/rails/actionpack/test/fixtures/test/potential_conflicts.erb +4 -0
  698. data/rails/vendor/rails/actionpack/test/fixtures/test/render_file_with_ivar.erb +1 -0
  699. data/rails/vendor/rails/actionpack/test/fixtures/test/render_file_with_locals.erb +1 -0
  700. data/rails/vendor/rails/actionpack/test/fixtures/test/render_to_string_test.erb +1 -0
  701. data/rails/vendor/rails/actionpack/test/fixtures/test/update_element_with_capture.erb +9 -0
  702. data/rails/vendor/rails/actionpack/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  703. data/rails/vendor/rails/actionpack/test/fixtures/topic.rb +3 -0
  704. data/rails/vendor/rails/actionpack/test/fixtures/topics.yml +22 -0
  705. data/rails/vendor/rails/actionpack/test/fixtures/topics/_topic.html.erb +1 -0
  706. data/rails/vendor/rails/actionpack/test/template/active_record_helper_test.rb +268 -0
  707. data/rails/vendor/rails/actionpack/test/template/asset_tag_helper_test.rb +525 -0
  708. data/rails/vendor/rails/actionpack/test/template/atom_feed_helper_test.rb +179 -0
  709. data/rails/vendor/rails/actionpack/test/template/benchmark_helper_test.rb +60 -0
  710. data/rails/vendor/rails/actionpack/test/template/date_helper_test.rb +1740 -0
  711. data/rails/vendor/rails/actionpack/test/template/erb_util_test.rb +24 -0
  712. data/rails/vendor/rails/actionpack/test/template/form_helper_test.rb +918 -0
  713. data/rails/vendor/rails/actionpack/test/template/form_options_helper_test.rb +1336 -0
  714. data/rails/vendor/rails/actionpack/test/template/form_tag_helper_test.rb +259 -0
  715. data/rails/vendor/rails/actionpack/test/template/javascript_helper_test.rb +109 -0
  716. data/rails/vendor/rails/actionpack/test/template/number_helper_test.rb +97 -0
  717. data/rails/vendor/rails/actionpack/test/template/prototype_helper_test.rb +614 -0
  718. data/rails/vendor/rails/actionpack/test/template/record_tag_helper_test.rb +54 -0
  719. data/rails/vendor/rails/actionpack/test/template/sanitize_helper_test.rb +48 -0
  720. data/rails/vendor/rails/actionpack/test/template/scriptaculous_helper_test.rb +90 -0
  721. data/rails/vendor/rails/actionpack/test/template/tag_helper_test.rb +77 -0
  722. data/rails/vendor/rails/actionpack/test/template/template_finder_test.rb +73 -0
  723. data/rails/vendor/rails/actionpack/test/template/template_object_test.rb +95 -0
  724. data/rails/vendor/rails/actionpack/test/template/test_test.rb +56 -0
  725. data/rails/vendor/rails/actionpack/test/template/text_helper_test.rb +366 -0
  726. data/rails/vendor/rails/actionpack/test/template/url_helper_test.rb +534 -0
  727. data/rails/vendor/rails/actionpack/test/testing_sandbox.rb +15 -0
  728. data/rails/vendor/rails/activemodel/CHANGES +12 -0
  729. data/rails/vendor/rails/activemodel/README +21 -0
  730. data/rails/vendor/rails/activemodel/Rakefile +16 -0
  731. data/rails/vendor/rails/activemodel/lib/active_model.rb +17 -0
  732. data/rails/vendor/rails/activemodel/lib/active_model/base.rb +4 -0
  733. data/rails/vendor/rails/activemodel/lib/active_model/callbacks.rb +5 -0
  734. data/rails/vendor/rails/activemodel/lib/active_model/deprecated_error_methods.rb +38 -0
  735. data/rails/vendor/rails/activemodel/lib/active_model/errors.rb +80 -0
  736. data/rails/vendor/rails/activemodel/lib/active_model/observing.rb +100 -0
  737. data/rails/vendor/rails/activemodel/lib/active_model/validations.rb +124 -0
  738. data/rails/vendor/rails/activemodel/lib/active_model/validations/acceptance.rb +45 -0
  739. data/rails/vendor/rails/activemodel/lib/active_model/validations/associated.rb +46 -0
  740. data/rails/vendor/rails/activemodel/lib/active_model/validations/confirmation.rb +44 -0
  741. data/rails/vendor/rails/activemodel/lib/active_model/validations/exclusion.rb +37 -0
  742. data/rails/vendor/rails/activemodel/lib/active_model/validations/format.rb +39 -0
  743. data/rails/vendor/rails/activemodel/lib/active_model/validations/inclusion.rb +37 -0
  744. data/rails/vendor/rails/activemodel/lib/active_model/validations/length.rb +95 -0
  745. data/rails/vendor/rails/activemodel/lib/active_model/validations/numericality.rb +80 -0
  746. data/rails/vendor/rails/activemodel/lib/active_model/validations/presence.rb +42 -0
  747. data/rails/vendor/rails/activemodel/lib/active_model/validations/uniqueness.rb +104 -0
  748. data/rails/vendor/rails/activemodel/spec/observing_spec.rb +120 -0
  749. data/rails/vendor/rails/activemodel/spec/spec_helper.rb +17 -0
  750. data/rails/vendor/rails/activerecord/CHANGELOG +5719 -0
  751. data/rails/vendor/rails/activerecord/MIT-LICENSE +20 -0
  752. data/rails/vendor/rails/activerecord/README +351 -0
  753. data/rails/vendor/rails/activerecord/RUNNING_UNIT_TESTS +36 -0
  754. data/rails/vendor/rails/activerecord/Rakefile +247 -0
  755. data/rails/vendor/rails/activerecord/examples/associations.png +0 -0
  756. data/rails/vendor/rails/activerecord/install.rb +30 -0
  757. data/rails/vendor/rails/activerecord/lib/active_record.rb +82 -0
  758. data/rails/vendor/rails/activerecord/lib/active_record/aggregations.rb +189 -0
  759. data/rails/vendor/rails/activerecord/lib/active_record/association_preload.rb +277 -0
  760. data/rails/vendor/rails/activerecord/lib/active_record/associations.rb +1994 -0
  761. data/rails/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb +365 -0
  762. data/rails/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb +224 -0
  763. data/rails/vendor/rails/activerecord/lib/active_record/associations/belongs_to_association.rb +58 -0
  764. data/rails/vendor/rails/activerecord/lib/active_record/associations/belongs_to_polymorphic_association.rb +49 -0
  765. data/rails/vendor/rails/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb +112 -0
  766. data/rails/vendor/rails/activerecord/lib/active_record/associations/has_many_association.rb +109 -0
  767. data/rails/vendor/rails/activerecord/lib/active_record/associations/has_many_through_association.rb +254 -0
  768. data/rails/vendor/rails/activerecord/lib/active_record/associations/has_one_association.rb +98 -0
  769. data/rails/vendor/rails/activerecord/lib/active_record/associations/has_one_through_association.rb +28 -0
  770. data/rails/vendor/rails/activerecord/lib/active_record/attribute_methods.rb +379 -0
  771. data/rails/vendor/rails/activerecord/lib/active_record/base.rb +2726 -0
  772. data/rails/vendor/rails/activerecord/lib/active_record/calculations.rb +275 -0
  773. data/rails/vendor/rails/activerecord/lib/active_record/callbacks.rb +312 -0
  774. data/rails/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_specification.rb +309 -0
  775. data/rails/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb +176 -0
  776. data/rails/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb +93 -0
  777. data/rails/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb +69 -0
  778. data/rails/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb +661 -0
  779. data/rails/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb +421 -0
  780. data/rails/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +169 -0
  781. data/rails/vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +530 -0
  782. data/rails/vendor/rails/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +948 -0
  783. data/rails/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb +34 -0
  784. data/rails/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb +406 -0
  785. data/rails/vendor/rails/activerecord/lib/active_record/dirty.rb +158 -0
  786. data/rails/vendor/rails/activerecord/lib/active_record/fixtures.rb +997 -0
  787. data/rails/vendor/rails/activerecord/lib/active_record/locking/optimistic.rb +147 -0
  788. data/rails/vendor/rails/activerecord/lib/active_record/locking/pessimistic.rb +77 -0
  789. data/rails/vendor/rails/activerecord/lib/active_record/migration.rb +496 -0
  790. data/rails/vendor/rails/activerecord/lib/active_record/named_scope.rb +163 -0
  791. data/rails/vendor/rails/activerecord/lib/active_record/observer.rb +195 -0
  792. data/rails/vendor/rails/activerecord/lib/active_record/query_cache.rb +21 -0
  793. data/rails/vendor/rails/activerecord/lib/active_record/reflection.rb +239 -0
  794. data/rails/vendor/rails/activerecord/lib/active_record/schema.rb +51 -0
  795. data/rails/vendor/rails/activerecord/lib/active_record/schema_dumper.rb +171 -0
  796. data/rails/vendor/rails/activerecord/lib/active_record/serialization.rb +98 -0
  797. data/rails/vendor/rails/activerecord/lib/active_record/serializers/json_serializer.rb +80 -0
  798. data/rails/vendor/rails/activerecord/lib/active_record/serializers/xml_serializer.rb +338 -0
  799. data/rails/vendor/rails/activerecord/lib/active_record/test_case.rb +36 -0
  800. data/rails/vendor/rails/activerecord/lib/active_record/timestamp.rb +41 -0
  801. data/rails/vendor/rails/activerecord/lib/active_record/transactions.rb +130 -0
  802. data/rails/vendor/rails/activerecord/lib/active_record/validations.rb +961 -0
  803. data/rails/vendor/rails/activerecord/lib/active_record/vendor/db2.rb +362 -0
  804. data/rails/vendor/rails/activerecord/lib/active_record/vendor/mysql.rb +1214 -0
  805. data/rails/vendor/rails/activerecord/lib/active_record/version.rb +9 -0
  806. data/rails/vendor/rails/activerecord/lib/activerecord.rb +1 -0
  807. data/rails/vendor/rails/activerecord/test/assets/example.log +1 -0
  808. data/rails/vendor/rails/activerecord/test/assets/flowers.jpg +0 -0
  809. data/rails/vendor/rails/activerecord/test/cases/aaa_create_tables_test.rb +24 -0
  810. data/rails/vendor/rails/activerecord/test/cases/active_schema_test_mysql.rb +95 -0
  811. data/rails/vendor/rails/activerecord/test/cases/active_schema_test_postgresql.rb +24 -0
  812. data/rails/vendor/rails/activerecord/test/cases/adapter_test.rb +127 -0
  813. data/rails/vendor/rails/activerecord/test/cases/adapter_test_sqlserver.rb +95 -0
  814. data/rails/vendor/rails/activerecord/test/cases/aggregations_test.rb +128 -0
  815. data/rails/vendor/rails/activerecord/test/cases/ar_schema_test.rb +33 -0
  816. data/rails/vendor/rails/activerecord/test/cases/associations/belongs_to_associations_test.rb +412 -0
  817. data/rails/vendor/rails/activerecord/test/cases/associations/callbacks_test.rb +161 -0
  818. data/rails/vendor/rails/activerecord/test/cases/associations/cascaded_eager_loading_test.rb +111 -0
  819. data/rails/vendor/rails/activerecord/test/cases/associations/eager_load_nested_include_test.rb +83 -0
  820. data/rails/vendor/rails/activerecord/test/cases/associations/eager_singularization_test.rb +145 -0
  821. data/rails/vendor/rails/activerecord/test/cases/associations/eager_test.rb +612 -0
  822. data/rails/vendor/rails/activerecord/test/cases/associations/extension_test.rb +47 -0
  823. data/rails/vendor/rails/activerecord/test/cases/associations/has_and_belongs_to_many_associations_test.rb +684 -0
  824. data/rails/vendor/rails/activerecord/test/cases/associations/has_many_associations_test.rb +932 -0
  825. data/rails/vendor/rails/activerecord/test/cases/associations/has_many_through_associations_test.rb +190 -0
  826. data/rails/vendor/rails/activerecord/test/cases/associations/has_one_associations_test.rb +323 -0
  827. data/rails/vendor/rails/activerecord/test/cases/associations/has_one_through_associations_test.rb +74 -0
  828. data/rails/vendor/rails/activerecord/test/cases/associations/inner_join_association_test.rb +88 -0
  829. data/rails/vendor/rails/activerecord/test/cases/associations/join_model_test.rb +707 -0
  830. data/rails/vendor/rails/activerecord/test/cases/associations_test.rb +262 -0
  831. data/rails/vendor/rails/activerecord/test/cases/attribute_methods_test.rb +238 -0
  832. data/rails/vendor/rails/activerecord/test/cases/base_test.rb +1974 -0
  833. data/rails/vendor/rails/activerecord/test/cases/binary_test.rb +34 -0
  834. data/rails/vendor/rails/activerecord/test/cases/calculations_test.rb +271 -0
  835. data/rails/vendor/rails/activerecord/test/cases/callbacks_test.rb +400 -0
  836. data/rails/vendor/rails/activerecord/test/cases/class_inheritable_attributes_test.rb +32 -0
  837. data/rails/vendor/rails/activerecord/test/cases/column_alias_test.rb +17 -0
  838. data/rails/vendor/rails/activerecord/test/cases/connection_test_firebird.rb +8 -0
  839. data/rails/vendor/rails/activerecord/test/cases/connection_test_mysql.rb +30 -0
  840. data/rails/vendor/rails/activerecord/test/cases/copy_table_test_sqlite.rb +69 -0
  841. data/rails/vendor/rails/activerecord/test/cases/datatype_test_postgresql.rb +203 -0
  842. data/rails/vendor/rails/activerecord/test/cases/date_time_test.rb +37 -0
  843. data/rails/vendor/rails/activerecord/test/cases/default_test_firebird.rb +16 -0
  844. data/rails/vendor/rails/activerecord/test/cases/defaults_test.rb +69 -0
  845. data/rails/vendor/rails/activerecord/test/cases/deprecated_finder_test.rb +30 -0
  846. data/rails/vendor/rails/activerecord/test/cases/dirty_test.rb +163 -0
  847. data/rails/vendor/rails/activerecord/test/cases/finder_respond_to_test.rb +76 -0
  848. data/rails/vendor/rails/activerecord/test/cases/finder_test.rb +883 -0
  849. data/rails/vendor/rails/activerecord/test/cases/fixtures_test.rb +626 -0
  850. data/rails/vendor/rails/activerecord/test/cases/helper.rb +47 -0
  851. data/rails/vendor/rails/activerecord/test/cases/inheritance_test.rb +255 -0
  852. data/rails/vendor/rails/activerecord/test/cases/invalid_date_test.rb +24 -0
  853. data/rails/vendor/rails/activerecord/test/cases/json_serialization_test.rb +205 -0
  854. data/rails/vendor/rails/activerecord/test/cases/lifecycle_test.rb +140 -0
  855. data/rails/vendor/rails/activerecord/test/cases/locking_test.rb +289 -0
  856. data/rails/vendor/rails/activerecord/test/cases/method_scoping_test.rb +452 -0
  857. data/rails/vendor/rails/activerecord/test/cases/migration_test.rb +1319 -0
  858. data/rails/vendor/rails/activerecord/test/cases/migration_test_firebird.rb +124 -0
  859. data/rails/vendor/rails/activerecord/test/cases/mixin_test.rb +96 -0
  860. data/rails/vendor/rails/activerecord/test/cases/modules_test.rb +39 -0
  861. data/rails/vendor/rails/activerecord/test/cases/multiple_db_test.rb +60 -0
  862. data/rails/vendor/rails/activerecord/test/cases/named_scope_test.rb +157 -0
  863. data/rails/vendor/rails/activerecord/test/cases/pk_test.rb +101 -0
  864. data/rails/vendor/rails/activerecord/test/cases/query_cache_test.rb +126 -0
  865. data/rails/vendor/rails/activerecord/test/cases/readonly_test.rb +107 -0
  866. data/rails/vendor/rails/activerecord/test/cases/reflection_test.rb +176 -0
  867. data/rails/vendor/rails/activerecord/test/cases/reserved_word_test_mysql.rb +176 -0
  868. data/rails/vendor/rails/activerecord/test/cases/schema_authorization_test_postgresql.rb +75 -0
  869. data/rails/vendor/rails/activerecord/test/cases/schema_dumper_test.rb +138 -0
  870. data/rails/vendor/rails/activerecord/test/cases/schema_test_postgresql.rb +102 -0
  871. data/rails/vendor/rails/activerecord/test/cases/serialization_test.rb +47 -0
  872. data/rails/vendor/rails/activerecord/test/cases/synonym_test_oracle.rb +17 -0
  873. data/rails/vendor/rails/activerecord/test/cases/table_name_test_sqlserver.rb +23 -0
  874. data/rails/vendor/rails/activerecord/test/cases/threaded_connections_test.rb +48 -0
  875. data/rails/vendor/rails/activerecord/test/cases/transactions_test.rb +307 -0
  876. data/rails/vendor/rails/activerecord/test/cases/unconnected_test.rb +32 -0
  877. data/rails/vendor/rails/activerecord/test/cases/validations_test.rb +1509 -0
  878. data/rails/vendor/rails/activerecord/test/cases/xml_serialization_test.rb +202 -0
  879. data/rails/vendor/rails/activerecord/test/config.rb +5 -0
  880. data/rails/vendor/rails/activerecord/test/connections/native_db2/connection.rb +25 -0
  881. data/rails/vendor/rails/activerecord/test/connections/native_firebird/connection.rb +26 -0
  882. data/rails/vendor/rails/activerecord/test/connections/native_frontbase/connection.rb +27 -0
  883. data/rails/vendor/rails/activerecord/test/connections/native_mysql/connection.rb +27 -0
  884. data/rails/vendor/rails/activerecord/test/connections/native_openbase/connection.rb +21 -0
  885. data/rails/vendor/rails/activerecord/test/connections/native_oracle/connection.rb +27 -0
  886. data/rails/vendor/rails/activerecord/test/connections/native_postgresql/connection.rb +21 -0
  887. data/rails/vendor/rails/activerecord/test/connections/native_sqlite/connection.rb +25 -0
  888. data/rails/vendor/rails/activerecord/test/connections/native_sqlite3/connection.rb +25 -0
  889. data/rails/vendor/rails/activerecord/test/connections/native_sqlite3/in_memory_connection.rb +18 -0
  890. data/rails/vendor/rails/activerecord/test/connections/native_sybase/connection.rb +23 -0
  891. data/rails/vendor/rails/activerecord/test/fixtures/accounts.yml +28 -0
  892. data/rails/vendor/rails/activerecord/test/fixtures/all/developers.yml +0 -0
  893. data/rails/vendor/rails/activerecord/test/fixtures/all/people.csv +0 -0
  894. data/rails/vendor/rails/activerecord/test/fixtures/all/tasks.yml +0 -0
  895. data/rails/vendor/rails/activerecord/test/fixtures/author_addresses.yml +5 -0
  896. data/rails/vendor/rails/activerecord/test/fixtures/author_favorites.yml +4 -0
  897. data/rails/vendor/rails/activerecord/test/fixtures/authors.yml +9 -0
  898. data/rails/vendor/rails/activerecord/test/fixtures/binaries.yml +132 -0
  899. data/rails/vendor/rails/activerecord/test/fixtures/books.yml +7 -0
  900. data/rails/vendor/rails/activerecord/test/fixtures/categories.yml +14 -0
  901. data/rails/vendor/rails/activerecord/test/fixtures/categories/special_categories.yml +9 -0
  902. data/rails/vendor/rails/activerecord/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
  903. data/rails/vendor/rails/activerecord/test/fixtures/categories_ordered.yml +7 -0
  904. data/rails/vendor/rails/activerecord/test/fixtures/categories_posts.yml +23 -0
  905. data/rails/vendor/rails/activerecord/test/fixtures/categorizations.yml +17 -0
  906. data/rails/vendor/rails/activerecord/test/fixtures/clubs.yml +6 -0
  907. data/rails/vendor/rails/activerecord/test/fixtures/comments.yml +59 -0
  908. data/rails/vendor/rails/activerecord/test/fixtures/companies.yml +55 -0
  909. data/rails/vendor/rails/activerecord/test/fixtures/computers.yml +4 -0
  910. data/rails/vendor/rails/activerecord/test/fixtures/courses.yml +7 -0
  911. data/rails/vendor/rails/activerecord/test/fixtures/customers.yml +17 -0
  912. data/rails/vendor/rails/activerecord/test/fixtures/developers.yml +21 -0
  913. data/rails/vendor/rails/activerecord/test/fixtures/developers_projects.yml +17 -0
  914. data/rails/vendor/rails/activerecord/test/fixtures/edges.yml +6 -0
  915. data/rails/vendor/rails/activerecord/test/fixtures/entrants.yml +14 -0
  916. data/rails/vendor/rails/activerecord/test/fixtures/fk_test_has_fk.yml +3 -0
  917. data/rails/vendor/rails/activerecord/test/fixtures/fk_test_has_pk.yml +2 -0
  918. data/rails/vendor/rails/activerecord/test/fixtures/funny_jokes.yml +10 -0
  919. data/rails/vendor/rails/activerecord/test/fixtures/items.yml +4 -0
  920. data/rails/vendor/rails/activerecord/test/fixtures/jobs.yml +7 -0
  921. data/rails/vendor/rails/activerecord/test/fixtures/legacy_things.yml +3 -0
  922. data/rails/vendor/rails/activerecord/test/fixtures/mateys.yml +4 -0
  923. data/rails/vendor/rails/activerecord/test/fixtures/members.yml +4 -0
  924. data/rails/vendor/rails/activerecord/test/fixtures/memberships.yml +20 -0
  925. data/rails/vendor/rails/activerecord/test/fixtures/minimalistics.yml +2 -0
  926. data/rails/vendor/rails/activerecord/test/fixtures/mixed_case_monkeys.yml +6 -0
  927. data/rails/vendor/rails/activerecord/test/fixtures/mixins.yml +29 -0
  928. data/rails/vendor/rails/activerecord/test/fixtures/movies.yml +7 -0
  929. data/rails/vendor/rails/activerecord/test/fixtures/naked/csv/accounts.csv +1 -0
  930. data/rails/vendor/rails/activerecord/test/fixtures/naked/yml/accounts.yml +1 -0
  931. data/rails/vendor/rails/activerecord/test/fixtures/naked/yml/companies.yml +1 -0
  932. data/rails/vendor/rails/activerecord/test/fixtures/naked/yml/courses.yml +1 -0
  933. data/rails/vendor/rails/activerecord/test/fixtures/owners.yml +7 -0
  934. data/rails/vendor/rails/activerecord/test/fixtures/parrots.yml +27 -0
  935. data/rails/vendor/rails/activerecord/test/fixtures/parrots_pirates.yml +7 -0
  936. data/rails/vendor/rails/activerecord/test/fixtures/people.yml +6 -0
  937. data/rails/vendor/rails/activerecord/test/fixtures/pets.yml +14 -0
  938. data/rails/vendor/rails/activerecord/test/fixtures/pirates.yml +9 -0
  939. data/rails/vendor/rails/activerecord/test/fixtures/posts.yml +49 -0
  940. data/rails/vendor/rails/activerecord/test/fixtures/price_estimates.yml +7 -0
  941. data/rails/vendor/rails/activerecord/test/fixtures/projects.yml +7 -0
  942. data/rails/vendor/rails/activerecord/test/fixtures/readers.yml +9 -0
  943. data/rails/vendor/rails/activerecord/test/fixtures/references.yml +17 -0
  944. data/rails/vendor/rails/activerecord/test/fixtures/reserved_words/distinct.yml +5 -0
  945. data/rails/vendor/rails/activerecord/test/fixtures/reserved_words/distincts_selects.yml +11 -0
  946. data/rails/vendor/rails/activerecord/test/fixtures/reserved_words/group.yml +14 -0
  947. data/rails/vendor/rails/activerecord/test/fixtures/reserved_words/select.yml +8 -0
  948. data/rails/vendor/rails/activerecord/test/fixtures/reserved_words/values.yml +7 -0
  949. data/rails/vendor/rails/activerecord/test/fixtures/ships.yml +5 -0
  950. data/rails/vendor/rails/activerecord/test/fixtures/sponsors.yml +9 -0
  951. data/rails/vendor/rails/activerecord/test/fixtures/subscribers.yml +7 -0
  952. data/rails/vendor/rails/activerecord/test/fixtures/subscriptions.yml +12 -0
  953. data/rails/vendor/rails/activerecord/test/fixtures/taggings.yml +28 -0
  954. data/rails/vendor/rails/activerecord/test/fixtures/tags.yml +7 -0
  955. data/rails/vendor/rails/activerecord/test/fixtures/tasks.yml +7 -0
  956. data/rails/vendor/rails/activerecord/test/fixtures/topics.yml +42 -0
  957. data/rails/vendor/rails/activerecord/test/fixtures/treasures.yml +10 -0
  958. data/rails/vendor/rails/activerecord/test/fixtures/vertices.yml +4 -0
  959. data/rails/vendor/rails/activerecord/test/fixtures/warehouse-things.yml +3 -0
  960. data/rails/vendor/rails/activerecord/test/migrations/decimal/1_give_me_big_numbers.rb +15 -0
  961. data/rails/vendor/rails/activerecord/test/migrations/duplicate/1_people_have_last_names.rb +9 -0
  962. data/rails/vendor/rails/activerecord/test/migrations/duplicate/2_we_need_reminders.rb +12 -0
  963. data/rails/vendor/rails/activerecord/test/migrations/duplicate/3_foo.rb +7 -0
  964. data/rails/vendor/rails/activerecord/test/migrations/duplicate/3_innocent_jointable.rb +12 -0
  965. data/rails/vendor/rails/activerecord/test/migrations/duplicate_names/20080507052938_chunky.rb +7 -0
  966. data/rails/vendor/rails/activerecord/test/migrations/duplicate_names/20080507053028_chunky.rb +7 -0
  967. data/rails/vendor/rails/activerecord/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +12 -0
  968. data/rails/vendor/rails/activerecord/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +9 -0
  969. data/rails/vendor/rails/activerecord/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +12 -0
  970. data/rails/vendor/rails/activerecord/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +9 -0
  971. data/rails/vendor/rails/activerecord/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +8 -0
  972. data/rails/vendor/rails/activerecord/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +12 -0
  973. data/rails/vendor/rails/activerecord/test/migrations/missing/1000_people_have_middle_names.rb +9 -0
  974. data/rails/vendor/rails/activerecord/test/migrations/missing/1_people_have_last_names.rb +9 -0
  975. data/rails/vendor/rails/activerecord/test/migrations/missing/3_we_need_reminders.rb +12 -0
  976. data/rails/vendor/rails/activerecord/test/migrations/missing/4_innocent_jointable.rb +12 -0
  977. data/rails/vendor/rails/activerecord/test/migrations/valid/1_people_have_last_names.rb +9 -0
  978. data/rails/vendor/rails/activerecord/test/migrations/valid/2_we_need_reminders.rb +12 -0
  979. data/rails/vendor/rails/activerecord/test/migrations/valid/3_innocent_jointable.rb +12 -0
  980. data/rails/vendor/rails/activerecord/test/models/author.rb +133 -0
  981. data/rails/vendor/rails/activerecord/test/models/auto_id.rb +4 -0
  982. data/rails/vendor/rails/activerecord/test/models/binary.rb +2 -0
  983. data/rails/vendor/rails/activerecord/test/models/book.rb +4 -0
  984. data/rails/vendor/rails/activerecord/test/models/categorization.rb +5 -0
  985. data/rails/vendor/rails/activerecord/test/models/category.rb +29 -0
  986. data/rails/vendor/rails/activerecord/test/models/citation.rb +6 -0
  987. data/rails/vendor/rails/activerecord/test/models/club.rb +7 -0
  988. data/rails/vendor/rails/activerecord/test/models/column_name.rb +3 -0
  989. data/rails/vendor/rails/activerecord/test/models/comment.rb +25 -0
  990. data/rails/vendor/rails/activerecord/test/models/company.rb +123 -0
  991. data/rails/vendor/rails/activerecord/test/models/company_in_module.rb +61 -0
  992. data/rails/vendor/rails/activerecord/test/models/computer.rb +3 -0
  993. data/rails/vendor/rails/activerecord/test/models/contact.rb +16 -0
  994. data/rails/vendor/rails/activerecord/test/models/course.rb +3 -0
  995. data/rails/vendor/rails/activerecord/test/models/customer.rb +55 -0
  996. data/rails/vendor/rails/activerecord/test/models/default.rb +2 -0
  997. data/rails/vendor/rails/activerecord/test/models/developer.rb +76 -0
  998. data/rails/vendor/rails/activerecord/test/models/edge.rb +5 -0
  999. data/rails/vendor/rails/activerecord/test/models/entrant.rb +3 -0
  1000. data/rails/vendor/rails/activerecord/test/models/guid.rb +2 -0
  1001. data/rails/vendor/rails/activerecord/test/models/item.rb +7 -0
  1002. data/rails/vendor/rails/activerecord/test/models/job.rb +5 -0
  1003. data/rails/vendor/rails/activerecord/test/models/joke.rb +3 -0
  1004. data/rails/vendor/rails/activerecord/test/models/keyboard.rb +3 -0
  1005. data/rails/vendor/rails/activerecord/test/models/legacy_thing.rb +3 -0
  1006. data/rails/vendor/rails/activerecord/test/models/matey.rb +4 -0
  1007. data/rails/vendor/rails/activerecord/test/models/member.rb +9 -0
  1008. data/rails/vendor/rails/activerecord/test/models/membership.rb +9 -0
  1009. data/rails/vendor/rails/activerecord/test/models/minimalistic.rb +2 -0
  1010. data/rails/vendor/rails/activerecord/test/models/mixed_case_monkey.rb +3 -0
  1011. data/rails/vendor/rails/activerecord/test/models/movie.rb +5 -0
  1012. data/rails/vendor/rails/activerecord/test/models/order.rb +4 -0
  1013. data/rails/vendor/rails/activerecord/test/models/owner.rb +4 -0
  1014. data/rails/vendor/rails/activerecord/test/models/parrot.rb +13 -0
  1015. data/rails/vendor/rails/activerecord/test/models/person.rb +10 -0
  1016. data/rails/vendor/rails/activerecord/test/models/pet.rb +4 -0
  1017. data/rails/vendor/rails/activerecord/test/models/pirate.rb +9 -0
  1018. data/rails/vendor/rails/activerecord/test/models/post.rb +80 -0
  1019. data/rails/vendor/rails/activerecord/test/models/price_estimate.rb +3 -0
  1020. data/rails/vendor/rails/activerecord/test/models/project.rb +29 -0
  1021. data/rails/vendor/rails/activerecord/test/models/reader.rb +4 -0
  1022. data/rails/vendor/rails/activerecord/test/models/reference.rb +4 -0
  1023. data/rails/vendor/rails/activerecord/test/models/reply.rb +39 -0
  1024. data/rails/vendor/rails/activerecord/test/models/ship.rb +3 -0
  1025. data/rails/vendor/rails/activerecord/test/models/sponsor.rb +4 -0
  1026. data/rails/vendor/rails/activerecord/test/models/subject.rb +4 -0
  1027. data/rails/vendor/rails/activerecord/test/models/subscriber.rb +8 -0
  1028. data/rails/vendor/rails/activerecord/test/models/subscription.rb +4 -0
  1029. data/rails/vendor/rails/activerecord/test/models/tag.rb +7 -0
  1030. data/rails/vendor/rails/activerecord/test/models/tagging.rb +10 -0
  1031. data/rails/vendor/rails/activerecord/test/models/task.rb +3 -0
  1032. data/rails/vendor/rails/activerecord/test/models/topic.rb +65 -0
  1033. data/rails/vendor/rails/activerecord/test/models/treasure.rb +6 -0
  1034. data/rails/vendor/rails/activerecord/test/models/vertex.rb +9 -0
  1035. data/rails/vendor/rails/activerecord/test/models/warehouse_thing.rb +5 -0
  1036. data/rails/vendor/rails/activerecord/test/schema/mysql_specific_schema.rb +12 -0
  1037. data/rails/vendor/rails/activerecord/test/schema/postgresql_specific_schema.rb +103 -0
  1038. data/rails/vendor/rails/activerecord/test/schema/schema.rb +421 -0
  1039. data/rails/vendor/rails/activerecord/test/schema/schema2.rb +6 -0
  1040. data/rails/vendor/rails/activerecord/test/schema/sqlite_specific_schema.rb +25 -0
  1041. data/rails/vendor/rails/activerecord/test/schema/sqlserver_specific_schema.rb +5 -0
  1042. data/rails/vendor/rails/activeresource/CHANGELOG +246 -0
  1043. data/rails/vendor/rails/activeresource/MIT-LICENSE +20 -0
  1044. data/rails/vendor/rails/activeresource/README +165 -0
  1045. data/rails/vendor/rails/activeresource/Rakefile +135 -0
  1046. data/rails/vendor/rails/activeresource/lib/active_resource.rb +47 -0
  1047. data/rails/vendor/rails/activeresource/lib/active_resource/base.rb +1014 -0
  1048. data/rails/vendor/rails/activeresource/lib/active_resource/connection.rb +207 -0
  1049. data/rails/vendor/rails/activeresource/lib/active_resource/custom_methods.rb +119 -0
  1050. data/rails/vendor/rails/activeresource/lib/active_resource/formats.rb +14 -0
  1051. data/rails/vendor/rails/activeresource/lib/active_resource/formats/json_format.rb +23 -0
  1052. data/rails/vendor/rails/activeresource/lib/active_resource/formats/xml_format.rb +34 -0
  1053. data/rails/vendor/rails/activeresource/lib/active_resource/http_mock.rb +217 -0
  1054. data/rails/vendor/rails/activeresource/lib/active_resource/validations.rb +288 -0
  1055. data/rails/vendor/rails/activeresource/lib/active_resource/version.rb +9 -0
  1056. data/rails/vendor/rails/activeresource/lib/activeresource.rb +1 -0
  1057. data/rails/vendor/rails/activeresource/test/abstract_unit.rb +22 -0
  1058. data/rails/vendor/rails/activeresource/test/authorization_test.rb +122 -0
  1059. data/rails/vendor/rails/activeresource/test/base/custom_methods_test.rb +99 -0
  1060. data/rails/vendor/rails/activeresource/test/base/equality_test.rb +43 -0
  1061. data/rails/vendor/rails/activeresource/test/base/load_test.rb +146 -0
  1062. data/rails/vendor/rails/activeresource/test/base_errors_test.rb +48 -0
  1063. data/rails/vendor/rails/activeresource/test/base_test.rb +791 -0
  1064. data/rails/vendor/rails/activeresource/test/connection_test.rb +190 -0
  1065. data/rails/vendor/rails/activeresource/test/fixtures/beast.rb +14 -0
  1066. data/rails/vendor/rails/activeresource/test/fixtures/person.rb +3 -0
  1067. data/rails/vendor/rails/activeresource/test/fixtures/street_address.rb +4 -0
  1068. data/rails/vendor/rails/activeresource/test/format_test.rb +83 -0
  1069. data/rails/vendor/rails/activeresource/test/setter_trap.rb +27 -0
  1070. data/rails/vendor/rails/activesupport/CHANGELOG +1181 -0
  1071. data/rails/vendor/rails/activesupport/MIT-LICENSE +20 -0
  1072. data/rails/vendor/rails/activesupport/README +43 -0
  1073. data/rails/vendor/rails/activesupport/Rakefile +175 -0
  1074. data/rails/vendor/rails/activesupport/install.rb +30 -0
  1075. data/rails/vendor/rails/activesupport/lib/active_support.rb +55 -0
  1076. data/rails/vendor/rails/activesupport/lib/active_support/base64.rb +22 -0
  1077. data/rails/vendor/rails/activesupport/lib/active_support/basic_object.rb +24 -0
  1078. data/rails/vendor/rails/activesupport/lib/active_support/buffered_logger.rb +121 -0
  1079. data/rails/vendor/rails/activesupport/lib/active_support/cache.rb +145 -0
  1080. data/rails/vendor/rails/activesupport/lib/active_support/cache/compressed_mem_cache_store.rb +15 -0
  1081. data/rails/vendor/rails/activesupport/lib/active_support/cache/drb_store.rb +15 -0
  1082. data/rails/vendor/rails/activesupport/lib/active_support/cache/file_store.rb +70 -0
  1083. data/rails/vendor/rails/activesupport/lib/active_support/cache/mem_cache_store.rb +100 -0
  1084. data/rails/vendor/rails/activesupport/lib/active_support/cache/memory_store.rb +38 -0
  1085. data/rails/vendor/rails/activesupport/lib/active_support/callbacks.rb +275 -0
  1086. data/rails/vendor/rails/activesupport/lib/active_support/clean_logger.rb +127 -0
  1087. data/rails/vendor/rails/activesupport/lib/active_support/core_ext.rb +4 -0
  1088. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/array.rb +13 -0
  1089. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/array/access.rb +26 -0
  1090. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/array/conversions.rb +178 -0
  1091. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/array/extract_options.rb +20 -0
  1092. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/array/grouping.rb +63 -0
  1093. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/array/random_access.rb +12 -0
  1094. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/base64.rb +4 -0
  1095. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/base64/encoding.rb +13 -0
  1096. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb +12 -0
  1097. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/bigdecimal.rb +6 -0
  1098. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/bigdecimal/conversions.rb +41 -0
  1099. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/blank.rb +53 -0
  1100. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/cgi.rb +5 -0
  1101. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +14 -0
  1102. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/class.rb +4 -0
  1103. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb +54 -0
  1104. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/class/delegating_attributes.rb +46 -0
  1105. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb +140 -0
  1106. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/class/removal.rb +50 -0
  1107. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/date.rb +10 -0
  1108. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/date/behavior.rb +13 -0
  1109. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/date/calculations.rb +215 -0
  1110. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/date/conversions.rb +107 -0
  1111. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/date_time.rb +12 -0
  1112. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/date_time/calculations.rb +112 -0
  1113. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/date_time/conversions.rb +96 -0
  1114. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/duplicable.rb +37 -0
  1115. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/enumerable.rb +69 -0
  1116. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/exception.rb +41 -0
  1117. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/file.rb +21 -0
  1118. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/float.rb +5 -0
  1119. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/float/rounding.rb +24 -0
  1120. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/hash.rb +13 -0
  1121. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/hash/conversions.rb +259 -0
  1122. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/hash/diff.rb +19 -0
  1123. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/hash/except.rb +24 -0
  1124. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/hash/indifferent_access.rb +137 -0
  1125. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/hash/keys.rb +52 -0
  1126. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/hash/reverse_merge.rb +28 -0
  1127. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/hash/slice.rb +28 -0
  1128. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/integer.rb +7 -0
  1129. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/integer/even_odd.rb +29 -0
  1130. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/integer/inflections.rb +20 -0
  1131. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/kernel.rb +5 -0
  1132. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/kernel/agnostics.rb +11 -0
  1133. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/kernel/daemonizing.rb +7 -0
  1134. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/kernel/debugger.rb +13 -0
  1135. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/kernel/reporting.rb +59 -0
  1136. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/kernel/requires.rb +24 -0
  1137. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/load_error.rb +38 -0
  1138. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/logger.rb +16 -0
  1139. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/module.rb +8 -0
  1140. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/module/aliasing.rb +70 -0
  1141. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/module/attr_accessor_with_default.rb +31 -0
  1142. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/module/attr_internal.rb +32 -0
  1143. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb +58 -0
  1144. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/module/delegation.rb +64 -0
  1145. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/module/inclusion.rb +30 -0
  1146. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/module/introspection.rb +75 -0
  1147. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/module/loading.rb +23 -0
  1148. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/name_error.rb +17 -0
  1149. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/numeric.rb +9 -0
  1150. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/numeric/bytes.rb +44 -0
  1151. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/numeric/conversions.rb +19 -0
  1152. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/numeric/time.rb +91 -0
  1153. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/object.rb +4 -0
  1154. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/object/conversions.rb +14 -0
  1155. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/object/extending.rb +58 -0
  1156. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/object/instance_variables.rb +74 -0
  1157. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/object/misc.rb +59 -0
  1158. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/pathname.rb +7 -0
  1159. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/pathname/clean_within.rb +14 -0
  1160. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/proc.rb +12 -0
  1161. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/process.rb +1 -0
  1162. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/process/daemon.rb +25 -0
  1163. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/range.rb +11 -0
  1164. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/range/blockless_step.rb +32 -0
  1165. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/range/conversions.rb +27 -0
  1166. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/range/include_range.rb +30 -0
  1167. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/range/overlaps.rb +15 -0
  1168. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/string.rb +18 -0
  1169. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/string/access.rb +82 -0
  1170. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/string/conversions.rb +28 -0
  1171. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/string/filters.rb +26 -0
  1172. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/string/inflections.rb +148 -0
  1173. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/string/iterators.rb +21 -0
  1174. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/string/starts_ends_with.rb +35 -0
  1175. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/string/unicode.rb +68 -0
  1176. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/string/xchar.rb +11 -0
  1177. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/symbol.rb +14 -0
  1178. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/test.rb +1 -0
  1179. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/test/unit/assertions.rb +64 -0
  1180. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/time.rb +21 -0
  1181. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/time/behavior.rb +13 -0
  1182. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/time/calculations.rb +276 -0
  1183. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/time/conversions.rb +89 -0
  1184. data/rails/vendor/rails/activesupport/lib/active_support/core_ext/time/zones.rb +86 -0
  1185. data/rails/vendor/rails/activesupport/lib/active_support/dependencies.rb +552 -0
  1186. data/rails/vendor/rails/activesupport/lib/active_support/deprecation.rb +205 -0
  1187. data/rails/vendor/rails/activesupport/lib/active_support/duration.rb +96 -0
  1188. data/rails/vendor/rails/activesupport/lib/active_support/gzip.rb +25 -0
  1189. data/rails/vendor/rails/activesupport/lib/active_support/inflections.rb +53 -0
  1190. data/rails/vendor/rails/activesupport/lib/active_support/inflector.rb +308 -0
  1191. data/rails/vendor/rails/activesupport/lib/active_support/json.rb +23 -0
  1192. data/rails/vendor/rails/activesupport/lib/active_support/json/decoding.rb +63 -0
  1193. data/rails/vendor/rails/activesupport/lib/active_support/json/encoders/date.rb +14 -0
  1194. data/rails/vendor/rails/activesupport/lib/active_support/json/encoders/date_time.rb +14 -0
  1195. data/rails/vendor/rails/activesupport/lib/active_support/json/encoders/enumerable.rb +12 -0
  1196. data/rails/vendor/rails/activesupport/lib/active_support/json/encoders/false_class.rb +5 -0
  1197. data/rails/vendor/rails/activesupport/lib/active_support/json/encoders/hash.rb +47 -0
  1198. data/rails/vendor/rails/activesupport/lib/active_support/json/encoders/nil_class.rb +5 -0
  1199. data/rails/vendor/rails/activesupport/lib/active_support/json/encoders/numeric.rb +5 -0
  1200. data/rails/vendor/rails/activesupport/lib/active_support/json/encoders/object.rb +6 -0
  1201. data/rails/vendor/rails/activesupport/lib/active_support/json/encoders/regexp.rb +5 -0
  1202. data/rails/vendor/rails/activesupport/lib/active_support/json/encoders/string.rb +36 -0
  1203. data/rails/vendor/rails/activesupport/lib/active_support/json/encoders/symbol.rb +5 -0
  1204. data/rails/vendor/rails/activesupport/lib/active_support/json/encoders/time.rb +14 -0
  1205. data/rails/vendor/rails/activesupport/lib/active_support/json/encoders/true_class.rb +5 -0
  1206. data/rails/vendor/rails/activesupport/lib/active_support/json/encoding.rb +37 -0
  1207. data/rails/vendor/rails/activesupport/lib/active_support/json/variable.rb +10 -0
  1208. data/rails/vendor/rails/activesupport/lib/active_support/multibyte.rb +9 -0
  1209. data/rails/vendor/rails/activesupport/lib/active_support/multibyte/chars.rb +137 -0
  1210. data/rails/vendor/rails/activesupport/lib/active_support/multibyte/generators/generate_tables.rb +149 -0
  1211. data/rails/vendor/rails/activesupport/lib/active_support/multibyte/handlers/passthru_handler.rb +9 -0
  1212. data/rails/vendor/rails/activesupport/lib/active_support/multibyte/handlers/utf8_handler.rb +564 -0
  1213. data/rails/vendor/rails/activesupport/lib/active_support/multibyte/handlers/utf8_handler_proc.rb +43 -0
  1214. data/rails/vendor/rails/activesupport/lib/active_support/option_merger.rb +25 -0
  1215. data/rails/vendor/rails/activesupport/lib/active_support/ordered_hash.rb +43 -0
  1216. data/rails/vendor/rails/activesupport/lib/active_support/ordered_options.rb +17 -0
  1217. data/rails/vendor/rails/activesupport/lib/active_support/test_case.rb +13 -0
  1218. data/rails/vendor/rails/activesupport/lib/active_support/testing/default.rb +9 -0
  1219. data/rails/vendor/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb +93 -0
  1220. data/rails/vendor/rails/activesupport/lib/active_support/time_with_zone.rb +283 -0
  1221. data/rails/vendor/rails/activesupport/lib/active_support/values/time_zone.rb +394 -0
  1222. data/rails/vendor/rails/activesupport/lib/active_support/values/unicode_tables.dat +0 -0
  1223. data/rails/vendor/rails/activesupport/lib/active_support/vendor.rb +26 -0
  1224. data/rails/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/blankslate.rb +113 -0
  1225. data/rails/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder.rb +13 -0
  1226. data/rails/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb +20 -0
  1227. data/rails/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/css.rb +250 -0
  1228. data/rails/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb +115 -0
  1229. data/rails/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb +139 -0
  1230. data/rails/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb +63 -0
  1231. data/rails/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb +328 -0
  1232. data/rails/vendor/rails/activesupport/lib/active_support/vendor/memcache-client-1.5.0/memcache.rb +849 -0
  1233. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo.rb +33 -0
  1234. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/data_timezone.rb +47 -0
  1235. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/data_timezone_info.rb +226 -0
  1236. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Africa/Algiers.rb +55 -0
  1237. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Africa/Cairo.rb +219 -0
  1238. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Africa/Casablanca.rb +38 -0
  1239. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Africa/Harare.rb +18 -0
  1240. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Africa/Johannesburg.rb +25 -0
  1241. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Africa/Monrovia.rb +22 -0
  1242. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Africa/Nairobi.rb +23 -0
  1243. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +166 -0
  1244. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Argentina/San_Juan.rb +170 -0
  1245. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Bogota.rb +23 -0
  1246. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Caracas.rb +23 -0
  1247. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Chicago.rb +283 -0
  1248. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Chihuahua.rb +136 -0
  1249. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Denver.rb +204 -0
  1250. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Godthab.rb +161 -0
  1251. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Guatemala.rb +27 -0
  1252. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Halifax.rb +274 -0
  1253. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Indiana/Indianapolis.rb +149 -0
  1254. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Juneau.rb +194 -0
  1255. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/La_Paz.rb +22 -0
  1256. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Lima.rb +35 -0
  1257. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Los_Angeles.rb +232 -0
  1258. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Mazatlan.rb +139 -0
  1259. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Mexico_City.rb +144 -0
  1260. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Monterrey.rb +131 -0
  1261. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/New_York.rb +282 -0
  1262. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Phoenix.rb +30 -0
  1263. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Regina.rb +74 -0
  1264. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Santiago.rb +205 -0
  1265. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/St_Johns.rb +288 -0
  1266. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/America/Tijuana.rb +196 -0
  1267. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Almaty.rb +67 -0
  1268. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Baghdad.rb +73 -0
  1269. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Baku.rb +161 -0
  1270. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Bangkok.rb +20 -0
  1271. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Chongqing.rb +33 -0
  1272. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Dhaka.rb +27 -0
  1273. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Hong_Kong.rb +87 -0
  1274. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Irkutsk.rb +165 -0
  1275. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Jakarta.rb +30 -0
  1276. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Jerusalem.rb +163 -0
  1277. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Kabul.rb +20 -0
  1278. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Kamchatka.rb +163 -0
  1279. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Karachi.rb +28 -0
  1280. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Katmandu.rb +20 -0
  1281. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Kolkata.rb +25 -0
  1282. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Krasnoyarsk.rb +163 -0
  1283. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Kuala_Lumpur.rb +31 -0
  1284. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Kuwait.rb +18 -0
  1285. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Magadan.rb +163 -0
  1286. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Muscat.rb +18 -0
  1287. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Novosibirsk.rb +164 -0
  1288. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Rangoon.rb +24 -0
  1289. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Riyadh.rb +18 -0
  1290. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Seoul.rb +34 -0
  1291. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Shanghai.rb +35 -0
  1292. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Singapore.rb +33 -0
  1293. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Taipei.rb +59 -0
  1294. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Tashkent.rb +47 -0
  1295. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Tbilisi.rb +78 -0
  1296. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Tehran.rb +121 -0
  1297. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Tokyo.rb +30 -0
  1298. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Ulaanbaatar.rb +65 -0
  1299. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Urumqi.rb +33 -0
  1300. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Vladivostok.rb +164 -0
  1301. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Yakutsk.rb +163 -0
  1302. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Yekaterinburg.rb +165 -0
  1303. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Asia/Yerevan.rb +165 -0
  1304. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Atlantic/Azores.rb +270 -0
  1305. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Atlantic/Cape_Verde.rb +23 -0
  1306. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Atlantic/South_Georgia.rb +18 -0
  1307. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Australia/Adelaide.rb +187 -0
  1308. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Australia/Brisbane.rb +35 -0
  1309. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Australia/Darwin.rb +29 -0
  1310. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Australia/Hobart.rb +193 -0
  1311. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Australia/Melbourne.rb +185 -0
  1312. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Australia/Perth.rb +37 -0
  1313. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Australia/Sydney.rb +185 -0
  1314. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Etc/UTC.rb +16 -0
  1315. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Amsterdam.rb +228 -0
  1316. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Athens.rb +185 -0
  1317. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Belgrade.rb +163 -0
  1318. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Berlin.rb +188 -0
  1319. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Bratislava.rb +13 -0
  1320. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Brussels.rb +232 -0
  1321. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Bucharest.rb +181 -0
  1322. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Budapest.rb +197 -0
  1323. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Copenhagen.rb +179 -0
  1324. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Dublin.rb +276 -0
  1325. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Helsinki.rb +163 -0
  1326. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Istanbul.rb +218 -0
  1327. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Kiev.rb +168 -0
  1328. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Lisbon.rb +268 -0
  1329. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Ljubljana.rb +13 -0
  1330. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/London.rb +288 -0
  1331. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Madrid.rb +211 -0
  1332. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Minsk.rb +170 -0
  1333. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Moscow.rb +181 -0
  1334. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Paris.rb +232 -0
  1335. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Prague.rb +187 -0
  1336. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Riga.rb +176 -0
  1337. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Rome.rb +215 -0
  1338. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Sarajevo.rb +13 -0
  1339. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Skopje.rb +13 -0
  1340. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Sofia.rb +173 -0
  1341. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Stockholm.rb +165 -0
  1342. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Tallinn.rb +172 -0
  1343. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Vienna.rb +183 -0
  1344. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Vilnius.rb +170 -0
  1345. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Warsaw.rb +212 -0
  1346. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Europe/Zagreb.rb +13 -0
  1347. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Pacific/Auckland.rb +202 -0
  1348. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Pacific/Fiji.rb +23 -0
  1349. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Pacific/Guam.rb +22 -0
  1350. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Pacific/Honolulu.rb +28 -0
  1351. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Pacific/Majuro.rb +20 -0
  1352. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Pacific/Midway.rb +25 -0
  1353. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Pacific/Noumea.rb +25 -0
  1354. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Pacific/Pago_Pago.rb +26 -0
  1355. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Pacific/Port_Moresby.rb +20 -0
  1356. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/definitions/Pacific/Tongatapu.rb +27 -0
  1357. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/info_timezone.rb +52 -0
  1358. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/linked_timezone.rb +51 -0
  1359. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/linked_timezone_info.rb +44 -0
  1360. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/offset_rationals.rb +95 -0
  1361. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/time_or_datetime.rb +292 -0
  1362. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/timezone.rb +508 -0
  1363. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/timezone_definition.rb +56 -0
  1364. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/timezone_info.rb +40 -0
  1365. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/timezone_offset_info.rb +94 -0
  1366. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/timezone_period.rb +198 -0
  1367. data/rails/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/timezone_transition_info.rb +138 -0
  1368. data/rails/vendor/rails/activesupport/lib/active_support/vendor/xml-simple-1.0.11/xmlsimple.rb +1021 -0
  1369. data/rails/vendor/rails/activesupport/lib/active_support/version.rb +9 -0
  1370. data/rails/vendor/rails/activesupport/lib/active_support/whiny_nil.rb +58 -0
  1371. data/rails/vendor/rails/activesupport/lib/activesupport.rb +1 -0
  1372. data/rails/vendor/rails/activesupport/test/abstract_unit.rb +24 -0
  1373. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/a/b.rb +2 -0
  1374. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/a/c/d.rb +2 -0
  1375. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/a/c/e/f.rb +2 -0
  1376. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/application.rb +1 -0
  1377. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/class_folder.rb +3 -0
  1378. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/class_folder/class_folder_subclass.rb +3 -0
  1379. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/class_folder/inline_class.rb +2 -0
  1380. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/class_folder/nested_class.rb +7 -0
  1381. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/conflict.rb +1 -0
  1382. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/counting_loader.rb +5 -0
  1383. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/cross_site_dependency.rb +2 -0
  1384. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/e.rb +2 -0
  1385. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/module_folder/inline_class.rb +2 -0
  1386. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/module_folder/nested_class.rb +4 -0
  1387. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/module_folder/nested_sibling.rb +2 -0
  1388. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/module_with_custom_const_missing/a/b.rb +1 -0
  1389. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/multiple_constant_file.rb +2 -0
  1390. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/raises_name_error.rb +3 -0
  1391. data/rails/vendor/rails/activesupport/test/autoloading_fixtures/raises_no_method_error.rb +3 -0
  1392. data/rails/vendor/rails/activesupport/test/buffered_logger_test.rb +118 -0
  1393. data/rails/vendor/rails/activesupport/test/caching_test.rb +66 -0
  1394. data/rails/vendor/rails/activesupport/test/callbacks_test.rb +148 -0
  1395. data/rails/vendor/rails/activesupport/test/clean_logger_test.rb +57 -0
  1396. data/rails/vendor/rails/activesupport/test/core_ext/array_ext_test.rb +250 -0
  1397. data/rails/vendor/rails/activesupport/test/core_ext/base64_ext_test.rb +8 -0
  1398. data/rails/vendor/rails/activesupport/test/core_ext/bigdecimal.rb +9 -0
  1399. data/rails/vendor/rails/activesupport/test/core_ext/blank_test.rb +19 -0
  1400. data/rails/vendor/rails/activesupport/test/core_ext/cgi_ext_test.rb +14 -0
  1401. data/rails/vendor/rails/activesupport/test/core_ext/class/attribute_accessor_test.rb +31 -0
  1402. data/rails/vendor/rails/activesupport/test/core_ext/class/class_inheritable_attributes_test.rb +224 -0
  1403. data/rails/vendor/rails/activesupport/test/core_ext/class/delegating_attributes_test.rb +115 -0
  1404. data/rails/vendor/rails/activesupport/test/core_ext/class_test.rb +46 -0
  1405. data/rails/vendor/rails/activesupport/test/core_ext/date_ext_test.rb +242 -0
  1406. data/rails/vendor/rails/activesupport/test/core_ext/date_time_ext_test.rb +288 -0
  1407. data/rails/vendor/rails/activesupport/test/core_ext/duplicable_test.rb +22 -0
  1408. data/rails/vendor/rails/activesupport/test/core_ext/duration_test.rb +74 -0
  1409. data/rails/vendor/rails/activesupport/test/core_ext/enumerable_test.rb +66 -0
  1410. data/rails/vendor/rails/activesupport/test/core_ext/exception_test.rb +68 -0
  1411. data/rails/vendor/rails/activesupport/test/core_ext/file_test.rb +29 -0
  1412. data/rails/vendor/rails/activesupport/test/core_ext/float_ext_test.rb +25 -0
  1413. data/rails/vendor/rails/activesupport/test/core_ext/hash_ext_test.rb +815 -0
  1414. data/rails/vendor/rails/activesupport/test/core_ext/integer_ext_test.rb +37 -0
  1415. data/rails/vendor/rails/activesupport/test/core_ext/kernel_test.rb +43 -0
  1416. data/rails/vendor/rails/activesupport/test/core_ext/load_error_test.rb +16 -0
  1417. data/rails/vendor/rails/activesupport/test/core_ext/module/attr_accessor_with_default_test.rb +30 -0
  1418. data/rails/vendor/rails/activesupport/test/core_ext/module/attr_internal_test.rb +52 -0
  1419. data/rails/vendor/rails/activesupport/test/core_ext/module/attribute_accessor_test.rb +33 -0
  1420. data/rails/vendor/rails/activesupport/test/core_ext/module/attribute_aliasing_test.rb +58 -0
  1421. data/rails/vendor/rails/activesupport/test/core_ext/module_test.rb +293 -0
  1422. data/rails/vendor/rails/activesupport/test/core_ext/name_error_test.rb +24 -0
  1423. data/rails/vendor/rails/activesupport/test/core_ext/numeric_ext_test.rb +162 -0
  1424. data/rails/vendor/rails/activesupport/test/core_ext/object_and_class_ext_test.rb +246 -0
  1425. data/rails/vendor/rails/activesupport/test/core_ext/pathname_test.rb +9 -0
  1426. data/rails/vendor/rails/activesupport/test/core_ext/proc_test.rb +11 -0
  1427. data/rails/vendor/rails/activesupport/test/core_ext/range_ext_test.rb +63 -0
  1428. data/rails/vendor/rails/activesupport/test/core_ext/string_ext_test.rb +199 -0
  1429. data/rails/vendor/rails/activesupport/test/core_ext/symbol_test.rb +9 -0
  1430. data/rails/vendor/rails/activesupport/test/core_ext/time_ext_test.rb +622 -0
  1431. data/rails/vendor/rails/activesupport/test/core_ext/time_with_zone_test.rb +676 -0
  1432. data/rails/vendor/rails/activesupport/test/dependencies/check_warnings.rb +2 -0
  1433. data/rails/vendor/rails/activesupport/test/dependencies/conflict.rb +1 -0
  1434. data/rails/vendor/rails/activesupport/test/dependencies/cross_site_depender.rb +3 -0
  1435. data/rails/vendor/rails/activesupport/test/dependencies/mutual_one.rb +4 -0
  1436. data/rails/vendor/rails/activesupport/test/dependencies/mutual_two.rb +4 -0
  1437. data/rails/vendor/rails/activesupport/test/dependencies/raises_exception.rb +3 -0
  1438. data/rails/vendor/rails/activesupport/test/dependencies/requires_nonexistent0.rb +1 -0
  1439. data/rails/vendor/rails/activesupport/test/dependencies/requires_nonexistent1.rb +1 -0
  1440. data/rails/vendor/rails/activesupport/test/dependencies/service_one.rb +5 -0
  1441. data/rails/vendor/rails/activesupport/test/dependencies/service_two.rb +2 -0
  1442. data/rails/vendor/rails/activesupport/test/dependencies_test.rb +765 -0
  1443. data/rails/vendor/rails/activesupport/test/deprecation_test.rb +151 -0
  1444. data/rails/vendor/rails/activesupport/test/inflector_test.rb +242 -0
  1445. data/rails/vendor/rails/activesupport/test/inflector_test_cases.rb +211 -0
  1446. data/rails/vendor/rails/activesupport/test/json/decoding_test.rb +41 -0
  1447. data/rails/vendor/rails/activesupport/test/json/encoding_test.rb +140 -0
  1448. data/rails/vendor/rails/activesupport/test/multibyte_chars_test.rb +182 -0
  1449. data/rails/vendor/rails/activesupport/test/multibyte_conformance.rb +146 -0
  1450. data/rails/vendor/rails/activesupport/test/multibyte_handler_test.rb +372 -0
  1451. data/rails/vendor/rails/activesupport/test/option_merger_test.rb +50 -0
  1452. data/rails/vendor/rails/activesupport/test/ordered_hash_test.rb +45 -0
  1453. data/rails/vendor/rails/activesupport/test/ordered_options_test.rb +53 -0
  1454. data/rails/vendor/rails/activesupport/test/test_test.rb +120 -0
  1455. data/rails/vendor/rails/activesupport/test/time_zone_test.rb +288 -0
  1456. data/rails/vendor/rails/activesupport/test/whiny_nil_test.rb +38 -0
  1457. data/rails/vendor/rails/railties/CHANGELOG +2027 -0
  1458. data/rails/vendor/rails/railties/MIT-LICENSE +20 -0
  1459. data/rails/vendor/rails/railties/README +256 -0
  1460. data/rails/vendor/rails/railties/Rakefile +349 -0
  1461. data/rails/vendor/rails/railties/bin/about +3 -0
  1462. data/rails/vendor/rails/railties/bin/console +3 -0
  1463. data/rails/vendor/rails/railties/bin/dbconsole +3 -0
  1464. data/rails/vendor/rails/railties/bin/destroy +3 -0
  1465. data/rails/vendor/rails/railties/bin/generate +3 -0
  1466. data/rails/vendor/rails/railties/bin/performance/benchmarker +3 -0
  1467. data/rails/vendor/rails/railties/bin/performance/profiler +3 -0
  1468. data/rails/vendor/rails/railties/bin/performance/request +3 -0
  1469. data/rails/vendor/rails/railties/bin/plugin +3 -0
  1470. data/rails/vendor/rails/railties/bin/process/inspector +3 -0
  1471. data/rails/vendor/rails/railties/bin/process/reaper +3 -0
  1472. data/rails/vendor/rails/railties/bin/process/spawner +3 -0
  1473. data/rails/vendor/rails/railties/bin/rails +19 -0
  1474. data/rails/vendor/rails/railties/bin/runner +3 -0
  1475. data/rails/vendor/rails/railties/bin/server +3 -0
  1476. data/rails/vendor/rails/railties/builtin/rails_info/rails/info.rb +125 -0
  1477. data/rails/vendor/rails/railties/builtin/rails_info/rails/info_controller.rb +9 -0
  1478. data/rails/vendor/rails/railties/builtin/rails_info/rails/info_helper.rb +2 -0
  1479. data/rails/vendor/rails/railties/builtin/rails_info/rails_info_controller.rb +2 -0
  1480. data/rails/vendor/rails/railties/configs/apache.conf +40 -0
  1481. data/rails/vendor/rails/railties/configs/databases/frontbase.yml +28 -0
  1482. data/rails/vendor/rails/railties/configs/databases/mysql.yml +54 -0
  1483. data/rails/vendor/rails/railties/configs/databases/oracle.yml +39 -0
  1484. data/rails/vendor/rails/railties/configs/databases/postgresql.yml +48 -0
  1485. data/rails/vendor/rails/railties/configs/databases/sqlite2.yml +16 -0
  1486. data/rails/vendor/rails/railties/configs/databases/sqlite3.yml +19 -0
  1487. data/rails/vendor/rails/railties/configs/empty.log +0 -0
  1488. data/rails/vendor/rails/railties/configs/initializers/inflections.rb +10 -0
  1489. data/rails/vendor/rails/railties/configs/initializers/mime_types.rb +5 -0
  1490. data/rails/vendor/rails/railties/configs/initializers/new_rails_defaults.rb +15 -0
  1491. data/rails/vendor/rails/railties/configs/lighttpd.conf +54 -0
  1492. data/rails/vendor/rails/railties/configs/routes.rb +41 -0
  1493. data/rails/vendor/rails/railties/dispatches/dispatch.fcgi +24 -0
  1494. data/rails/vendor/rails/railties/dispatches/dispatch.rb +10 -0
  1495. data/rails/vendor/rails/railties/dispatches/gateway.cgi +97 -0
  1496. data/rails/vendor/rails/railties/doc/README_FOR_APP +2 -0
  1497. data/rails/vendor/rails/railties/environments/boot.rb +109 -0
  1498. data/rails/vendor/rails/railties/environments/development.rb +17 -0
  1499. data/rails/vendor/rails/railties/environments/environment.rb +67 -0
  1500. data/rails/vendor/rails/railties/environments/production.rb +22 -0
  1501. data/rails/vendor/rails/railties/environments/test.rb +22 -0
  1502. data/rails/vendor/rails/railties/fresh_rakefile +10 -0
  1503. data/rails/vendor/rails/railties/helpers/application.rb +15 -0
  1504. data/rails/vendor/rails/railties/helpers/application_helper.rb +3 -0
  1505. data/rails/vendor/rails/railties/helpers/test_helper.rb +38 -0
  1506. data/rails/vendor/rails/railties/html/404.html +30 -0
  1507. data/rails/vendor/rails/railties/html/422.html +30 -0
  1508. data/rails/vendor/rails/railties/html/500.html +30 -0
  1509. data/rails/vendor/rails/railties/html/favicon.ico +0 -0
  1510. data/rails/vendor/rails/railties/html/images/rails.png +0 -0
  1511. data/rails/vendor/rails/railties/html/index.html +274 -0
  1512. data/rails/vendor/rails/railties/html/javascripts/application.js +2 -0
  1513. data/rails/vendor/rails/railties/html/javascripts/controls.js +963 -0
  1514. data/rails/vendor/rails/railties/html/javascripts/dragdrop.js +972 -0
  1515. data/rails/vendor/rails/railties/html/javascripts/effects.js +1120 -0
  1516. data/rails/vendor/rails/railties/html/javascripts/prototype.js +4225 -0
  1517. data/rails/vendor/rails/railties/html/robots.txt +5 -0
  1518. data/rails/vendor/rails/railties/lib/code_statistics.rb +107 -0
  1519. data/rails/vendor/rails/railties/lib/commands.rb +17 -0
  1520. data/rails/vendor/rails/railties/lib/commands/about.rb +2 -0
  1521. data/rails/vendor/rails/railties/lib/commands/console.rb +32 -0
  1522. data/rails/vendor/rails/railties/lib/commands/dbconsole.rb +65 -0
  1523. data/rails/vendor/rails/railties/lib/commands/destroy.rb +6 -0
  1524. data/rails/vendor/rails/railties/lib/commands/generate.rb +6 -0
  1525. data/rails/vendor/rails/railties/lib/commands/ncgi/listener +86 -0
  1526. data/rails/vendor/rails/railties/lib/commands/ncgi/tracker +69 -0
  1527. data/rails/vendor/rails/railties/lib/commands/performance/benchmarker.rb +24 -0
  1528. data/rails/vendor/rails/railties/lib/commands/performance/profiler.rb +50 -0
  1529. data/rails/vendor/rails/railties/lib/commands/performance/request.rb +6 -0
  1530. data/rails/vendor/rails/railties/lib/commands/plugin.rb +950 -0
  1531. data/rails/vendor/rails/railties/lib/commands/process/inspector.rb +68 -0
  1532. data/rails/vendor/rails/railties/lib/commands/process/reaper.rb +149 -0
  1533. data/rails/vendor/rails/railties/lib/commands/process/spawner.rb +219 -0
  1534. data/rails/vendor/rails/railties/lib/commands/process/spinner.rb +57 -0
  1535. data/rails/vendor/rails/railties/lib/commands/runner.rb +48 -0
  1536. data/rails/vendor/rails/railties/lib/commands/server.rb +39 -0
  1537. data/rails/vendor/rails/railties/lib/commands/servers/base.rb +31 -0
  1538. data/rails/vendor/rails/railties/lib/commands/servers/lighttpd.rb +94 -0
  1539. data/rails/vendor/rails/railties/lib/commands/servers/mongrel.rb +69 -0
  1540. data/rails/vendor/rails/railties/lib/commands/servers/new_mongrel.rb +16 -0
  1541. data/rails/vendor/rails/railties/lib/commands/servers/webrick.rb +66 -0
  1542. data/rails/vendor/rails/railties/lib/commands/update.rb +4 -0
  1543. data/rails/vendor/rails/railties/lib/console_app.rb +30 -0
  1544. data/rails/vendor/rails/railties/lib/console_sandbox.rb +6 -0
  1545. data/rails/vendor/rails/railties/lib/console_with_helpers.rb +26 -0
  1546. data/rails/vendor/rails/railties/lib/dispatcher.rb +24 -0
  1547. data/rails/vendor/rails/railties/lib/fcgi_handler.rb +239 -0
  1548. data/rails/vendor/rails/railties/lib/initializer.rb +900 -0
  1549. data/rails/vendor/rails/railties/lib/rails/gem_builder.rb +21 -0
  1550. data/rails/vendor/rails/railties/lib/rails/gem_dependency.rb +124 -0
  1551. data/rails/vendor/rails/railties/lib/rails/mongrel_server/commands.rb +342 -0
  1552. data/rails/vendor/rails/railties/lib/rails/mongrel_server/handler.rb +55 -0
  1553. data/rails/vendor/rails/railties/lib/rails/plugin.rb +115 -0
  1554. data/rails/vendor/rails/railties/lib/rails/plugin/loader.rb +152 -0
  1555. data/rails/vendor/rails/railties/lib/rails/plugin/locator.rb +99 -0
  1556. data/rails/vendor/rails/railties/lib/rails/version.rb +9 -0
  1557. data/rails/vendor/rails/railties/lib/rails_generator.rb +43 -0
  1558. data/rails/vendor/rails/railties/lib/rails_generator/base.rb +263 -0
  1559. data/rails/vendor/rails/railties/lib/rails_generator/commands.rb +607 -0
  1560. data/rails/vendor/rails/railties/lib/rails_generator/generated_attribute.rb +42 -0
  1561. data/rails/vendor/rails/railties/lib/rails_generator/generators/applications/app/USAGE +9 -0
  1562. data/rails/vendor/rails/railties/lib/rails_generator/generators/applications/app/app_generator.rb +178 -0
  1563. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/controller/USAGE +29 -0
  1564. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/controller/controller_generator.rb +37 -0
  1565. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/controller.rb +7 -0
  1566. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/functional_test.rb +8 -0
  1567. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/helper.rb +2 -0
  1568. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/controller/templates/view.html.erb +2 -0
  1569. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/integration_test/USAGE +8 -0
  1570. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/integration_test/integration_test_generator.rb +16 -0
  1571. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/integration_test/templates/integration_test.rb +10 -0
  1572. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/mailer/USAGE +16 -0
  1573. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/mailer/mailer_generator.rb +30 -0
  1574. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/fixture.erb +3 -0
  1575. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/fixture.rhtml +0 -0
  1576. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/mailer.rb +15 -0
  1577. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/unit_test.rb +21 -0
  1578. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/view.erb +3 -0
  1579. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/mailer/templates/view.rhtml +0 -0
  1580. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/migration/USAGE +29 -0
  1581. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/migration/migration_generator.rb +20 -0
  1582. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/migration/templates/migration.rb +11 -0
  1583. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/model/USAGE +27 -0
  1584. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/model/model_generator.rb +45 -0
  1585. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/model/templates/fixtures.yml +19 -0
  1586. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/model/templates/migration.rb +16 -0
  1587. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/model/templates/model.rb +2 -0
  1588. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/model/templates/unit_test.rb +8 -0
  1589. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/observer/USAGE +13 -0
  1590. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/observer/observer_generator.rb +16 -0
  1591. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/observer/templates/observer.rb +2 -0
  1592. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/observer/templates/unit_test.rb +8 -0
  1593. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/plugin/USAGE +25 -0
  1594. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/plugin/plugin_generator.rb +39 -0
  1595. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/MIT-LICENSE +20 -0
  1596. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/README +13 -0
  1597. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/Rakefile +22 -0
  1598. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/USAGE +8 -0
  1599. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/generator.rb +8 -0
  1600. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/init.rb +1 -0
  1601. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/install.rb +1 -0
  1602. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/plugin.rb +1 -0
  1603. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/tasks.rake +4 -0
  1604. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/uninstall.rb +1 -0
  1605. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/plugin/templates/unit_test.rb +8 -0
  1606. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/resource/USAGE +23 -0
  1607. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/resource/resource_generator.rb +74 -0
  1608. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/controller.rb +2 -0
  1609. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/functional_test.rb +8 -0
  1610. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/resource/templates/helper.rb +2 -0
  1611. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/USAGE +25 -0
  1612. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +93 -0
  1613. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/controller.rb +85 -0
  1614. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/functional_test.rb +45 -0
  1615. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/helper.rb +2 -0
  1616. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/layout.html.erb +17 -0
  1617. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/style.css +54 -0
  1618. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/view_edit.html.erb +18 -0
  1619. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/view_index.html.erb +24 -0
  1620. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/view_new.html.erb +17 -0
  1621. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/scaffold/templates/view_show.html.erb +10 -0
  1622. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/session_migration/USAGE +10 -0
  1623. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/session_migration/session_migration_generator.rb +18 -0
  1624. data/rails/vendor/rails/railties/lib/rails_generator/generators/components/session_migration/templates/migration.rb +16 -0
  1625. data/rails/vendor/rails/railties/lib/rails_generator/lookup.rb +248 -0
  1626. data/rails/vendor/rails/railties/lib/rails_generator/manifest.rb +53 -0
  1627. data/rails/vendor/rails/railties/lib/rails_generator/options.rb +150 -0
  1628. data/rails/vendor/rails/railties/lib/rails_generator/scripts.rb +89 -0
  1629. data/rails/vendor/rails/railties/lib/rails_generator/scripts/destroy.rb +30 -0
  1630. data/rails/vendor/rails/railties/lib/rails_generator/scripts/generate.rb +7 -0
  1631. data/rails/vendor/rails/railties/lib/rails_generator/scripts/update.rb +12 -0
  1632. data/rails/vendor/rails/railties/lib/rails_generator/secret_key_generator.rb +164 -0
  1633. data/rails/vendor/rails/railties/lib/rails_generator/simple_logger.rb +46 -0
  1634. data/rails/vendor/rails/railties/lib/rails_generator/spec.rb +44 -0
  1635. data/rails/vendor/rails/railties/lib/railties_path.rb +1 -0
  1636. data/rails/vendor/rails/railties/lib/ruby_version_check.rb +17 -0
  1637. data/rails/vendor/rails/railties/lib/rubyprof_ext.rb +35 -0
  1638. data/rails/vendor/rails/railties/lib/source_annotation_extractor.rb +102 -0
  1639. data/rails/vendor/rails/railties/lib/tasks/annotations.rake +23 -0
  1640. data/rails/vendor/rails/railties/lib/tasks/databases.rake +387 -0
  1641. data/rails/vendor/rails/railties/lib/tasks/documentation.rake +80 -0
  1642. data/rails/vendor/rails/railties/lib/tasks/framework.rake +114 -0
  1643. data/rails/vendor/rails/railties/lib/tasks/gems.rake +64 -0
  1644. data/rails/vendor/rails/railties/lib/tasks/log.rake +9 -0
  1645. data/rails/vendor/rails/railties/lib/tasks/misc.rake +57 -0
  1646. data/rails/vendor/rails/railties/lib/tasks/rails.rb +8 -0
  1647. data/rails/vendor/rails/railties/lib/tasks/routes.rake +17 -0
  1648. data/rails/vendor/rails/railties/lib/tasks/statistics.rake +18 -0
  1649. data/rails/vendor/rails/railties/lib/tasks/testing.rake +118 -0
  1650. data/rails/vendor/rails/railties/lib/tasks/tmp.rake +37 -0
  1651. data/rails/vendor/rails/railties/lib/test_help.rb +28 -0
  1652. data/rails/vendor/rails/railties/lib/webrick_server.rb +165 -0
  1653. data/rails/vendor/rails/railties/test/abstract_unit.rb +24 -0
  1654. data/rails/vendor/rails/railties/test/boot_test.rb +181 -0
  1655. data/rails/vendor/rails/railties/test/console_app_test.rb +32 -0
  1656. data/rails/vendor/rails/railties/test/fcgi_dispatcher_test.rb +299 -0
  1657. data/rails/vendor/rails/railties/test/fixtures/about_yml_plugins/bad_about_yml/about.yml +1 -0
  1658. data/rails/vendor/rails/railties/test/fixtures/about_yml_plugins/bad_about_yml/init.rb +1 -0
  1659. data/rails/vendor/rails/railties/test/fixtures/about_yml_plugins/plugin_without_about_yml/init.rb +1 -0
  1660. data/rails/vendor/rails/railties/test/fixtures/environment_with_constant.rb +1 -0
  1661. data/rails/vendor/rails/railties/test/fixtures/lib/generators/missing_class/missing_class_generator.rb +0 -0
  1662. data/rails/vendor/rails/railties/test/fixtures/lib/generators/working/working_generator.rb +2 -0
  1663. data/rails/vendor/rails/railties/test/fixtures/plugins/alternate/a/generators/a_generator/a_generator.rb +4 -0
  1664. data/rails/vendor/rails/railties/test/fixtures/plugins/default/plugin_with_no_lib_dir/init.rb +0 -0
  1665. data/rails/vendor/rails/railties/test/fixtures/plugins/default/stubby/about.yml +2 -0
  1666. data/rails/vendor/rails/railties/test/fixtures/plugins/default/stubby/generators/stubby_generator/stubby_generator.rb +4 -0
  1667. data/rails/vendor/rails/railties/test/fixtures/plugins/default/stubby/init.rb +7 -0
  1668. data/rails/vendor/rails/railties/test/fixtures/plugins/default/stubby/lib/stubby_mixin.rb +2 -0
  1669. data/rails/vendor/rails/railties/test/gem_dependency_test.rb +66 -0
  1670. data/rails/vendor/rails/railties/test/generator_lookup_test.rb +40 -0
  1671. data/rails/vendor/rails/railties/test/generators/generator_test_helper.rb +287 -0
  1672. data/rails/vendor/rails/railties/test/generators/rails_controller_generator_test.rb +20 -0
  1673. data/rails/vendor/rails/railties/test/generators/rails_mailer_generator_test.rb +29 -0
  1674. data/rails/vendor/rails/railties/test/generators/rails_model_generator_test.rb +32 -0
  1675. data/rails/vendor/rails/railties/test/generators/rails_resource_generator_test.rb +29 -0
  1676. data/rails/vendor/rails/railties/test/generators/rails_scaffold_generator_test.rb +107 -0
  1677. data/rails/vendor/rails/railties/test/initializer_test.rb +225 -0
  1678. data/rails/vendor/rails/railties/test/mocks/routes.rb +6 -0
  1679. data/rails/vendor/rails/railties/test/plugin_loader_test.rb +142 -0
  1680. data/rails/vendor/rails/railties/test/plugin_locator_test.rb +69 -0
  1681. data/rails/vendor/rails/railties/test/plugin_test.rb +159 -0
  1682. data/rails/vendor/rails/railties/test/plugin_test_helper.rb +29 -0
  1683. data/rails/vendor/rails/railties/test/rails_generator_test.rb +145 -0
  1684. data/rails/vendor/rails/railties/test/rails_info_controller_test.rb +48 -0
  1685. data/rails/vendor/rails/railties/test/rails_info_test.rb +99 -0
  1686. data/rails/vendor/rails/railties/test/secret_key_generation_test.rb +44 -0
  1687. data/templates/colors_template_file.xml +7 -0
  1688. data/templates/defaults_template_file.yml +2 -0
  1689. data/tmp/useless.txt +1 -0
  1690. metadata +2122 -0
@@ -0,0 +1,1994 @@
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/associations/has_one_through_association'
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 HasManyThroughCantAssociateThroughHasManyReflection < ActiveRecordError #:nodoc:
48
+ def initialize(owner, reflection)
49
+ super("Cannot modify association '#{owner.class.name}##{reflection.name}' because the source reflection class '#{reflection.source_reflection.class_name}' is associated to '#{reflection.through_reflection.class_name}' via :#{reflection.source_reflection.macro}.")
50
+ end
51
+ end
52
+ class HasManyThroughCantAssociateNewRecords < ActiveRecordError #:nodoc:
53
+ def initialize(owner, reflection)
54
+ 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.")
55
+ end
56
+ end
57
+
58
+ class HasManyThroughCantDissociateNewRecords < ActiveRecordError #:nodoc:
59
+ def initialize(owner, reflection)
60
+ super("Cannot dissociate 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 delete the has_many :through record associating them.")
61
+ end
62
+ end
63
+
64
+ class EagerLoadPolymorphicError < ActiveRecordError #:nodoc:
65
+ def initialize(reflection)
66
+ super("Can not eagerly load the polymorphic association #{reflection.name.inspect}")
67
+ end
68
+ end
69
+
70
+ class ReadOnlyAssociation < ActiveRecordError #:nodoc:
71
+ def initialize(reflection)
72
+ super("Can not add to a has_many :through association. Try adding to #{reflection.through_reflection.name.inspect}.")
73
+ end
74
+ end
75
+
76
+ module Associations # :nodoc:
77
+ def self.included(base)
78
+ base.extend(ClassMethods)
79
+ end
80
+
81
+ # Clears out the association cache
82
+ def clear_association_cache #:nodoc:
83
+ self.class.reflect_on_all_associations.to_a.each do |assoc|
84
+ instance_variable_set "@#{assoc.name}", nil
85
+ end unless self.new_record?
86
+ end
87
+
88
+ # Associations are a set of macro-like class methods for tying objects together through foreign keys. They express relationships like
89
+ # "Project has one Project Manager" or "Project belongs to a Portfolio". Each macro adds a number of methods to the class which are
90
+ # specialized according to the collection or association symbol and the options hash. It works much the same way as Ruby's own <tt>attr*</tt>
91
+ # methods. Example:
92
+ #
93
+ # class Project < ActiveRecord::Base
94
+ # belongs_to :portfolio
95
+ # has_one :project_manager
96
+ # has_many :milestones
97
+ # has_and_belongs_to_many :categories
98
+ # end
99
+ #
100
+ # The project class now has the following methods (and more) to ease the traversal and manipulation of its relationships:
101
+ # * <tt>Project#portfolio, Project#portfolio=(portfolio), Project#portfolio.nil?</tt>
102
+ # * <tt>Project#project_manager, Project#project_manager=(project_manager), Project#project_manager.nil?,</tt>
103
+ # * <tt>Project#milestones.empty?, Project#milestones.size, Project#milestones, Project#milestones<<(milestone),</tt>
104
+ # <tt>Project#milestones.delete(milestone), Project#milestones.find(milestone_id), Project#milestones.find(:all, options),</tt>
105
+ # <tt>Project#milestones.build, Project#milestones.create</tt>
106
+ # * <tt>Project#categories.empty?, Project#categories.size, Project#categories, Project#categories<<(category1),</tt>
107
+ # <tt>Project#categories.delete(category1)</tt>
108
+ #
109
+ # === A word of warning
110
+ #
111
+ # Don't create associations that have the same name as instance methods of ActiveRecord::Base. Since the association
112
+ # adds a method with that name to its model, it will override the inherited method and break things.
113
+ # For instance, +attributes+ and +connection+ would be bad choices for association names.
114
+ #
115
+ # == Auto-generated methods
116
+ #
117
+ # === Singular associations (one-to-one)
118
+ # | | belongs_to |
119
+ # generated methods | belongs_to | :polymorphic | has_one
120
+ # ----------------------------------+------------+--------------+---------
121
+ # #other | X | X | X
122
+ # #other=(other) | X | X | X
123
+ # #build_other(attributes={}) | X | | X
124
+ # #create_other(attributes={}) | X | | X
125
+ # #other.create!(attributes={}) | | | X
126
+ # #other.nil? | X | X |
127
+ #
128
+ # ===Collection associations (one-to-many / many-to-many)
129
+ # | | | has_many
130
+ # generated methods | habtm | has_many | :through
131
+ # ----------------------------------+-------+----------+----------
132
+ # #others | X | X | X
133
+ # #others=(other,other,...) | X | X | X
134
+ # #other_ids | X | X | X
135
+ # #other_ids=(id,id,...) | X | X | X
136
+ # #others<< | X | X | X
137
+ # #others.push | X | X | X
138
+ # #others.concat | X | X | X
139
+ # #others.build(attributes={}) | X | X | X
140
+ # #others.create(attributes={}) | X | X | X
141
+ # #others.create!(attributes={}) | X | X | X
142
+ # #others.size | X | X | X
143
+ # #others.length | X | X | X
144
+ # #others.count | X | X | X
145
+ # #others.sum(args*,&block) | X | X | X
146
+ # #others.empty? | X | X | X
147
+ # #others.clear | X | X | X
148
+ # #others.delete(other,other,...) | X | X | X
149
+ # #others.delete_all | X | X |
150
+ # #others.destroy_all | X | X | X
151
+ # #others.find(*args) | X | X | X
152
+ # #others.find_first | X | |
153
+ # #others.uniq | X | X | X
154
+ # #others.reset | X | X | X
155
+ #
156
+ # == Cardinality and associations
157
+ #
158
+ # Active Record associations can be used to describe one-to-one, one-to-many and many-to-many
159
+ # relationships between models. Each model uses an association to describe its role in
160
+ # the relation. The +belongs_to+ association is always used in the model that has
161
+ # the foreign key.
162
+ #
163
+ # === One-to-one
164
+ #
165
+ # Use +has_one+ in the base, and +belongs_to+ in the associated model.
166
+ #
167
+ # class Employee < ActiveRecord::Base
168
+ # has_one :office
169
+ # end
170
+ # class Office < ActiveRecord::Base
171
+ # belongs_to :employee # foreign key - employee_id
172
+ # end
173
+ #
174
+ # === One-to-many
175
+ #
176
+ # Use +has_many+ in the base, and +belongs_to+ in the associated model.
177
+ #
178
+ # class Manager < ActiveRecord::Base
179
+ # has_many :employees
180
+ # end
181
+ # class Employee < ActiveRecord::Base
182
+ # belongs_to :manager # foreign key - manager_id
183
+ # end
184
+ #
185
+ # === Many-to-many
186
+ #
187
+ # There are two ways to build a many-to-many relationship.
188
+ #
189
+ # The first way uses a +has_many+ association with the <tt>:through</tt> option and a join model, so
190
+ # there are two stages of associations.
191
+ #
192
+ # class Assignment < ActiveRecord::Base
193
+ # belongs_to :programmer # foreign key - programmer_id
194
+ # belongs_to :project # foreign key - project_id
195
+ # end
196
+ # class Programmer < ActiveRecord::Base
197
+ # has_many :assignments
198
+ # has_many :projects, :through => :assignments
199
+ # end
200
+ # class Project < ActiveRecord::Base
201
+ # has_many :assignments
202
+ # has_many :programmers, :through => :assignments
203
+ # end
204
+ #
205
+ # For the second way, use +has_and_belongs_to_many+ in both models. This requires a join table
206
+ # that has no corresponding model or primary key.
207
+ #
208
+ # class Programmer < ActiveRecord::Base
209
+ # has_and_belongs_to_many :projects # foreign keys in the join table
210
+ # end
211
+ # class Project < ActiveRecord::Base
212
+ # has_and_belongs_to_many :programmers # foreign keys in the join table
213
+ # end
214
+ #
215
+ # Choosing which way to build a many-to-many relationship is not always simple.
216
+ # If you need to work with the relationship model as its own entity,
217
+ # use <tt>has_many :through</tt>. Use +has_and_belongs_to_many+ when working with legacy schemas or when
218
+ # you never work directly with the relationship itself.
219
+ #
220
+ # == Is it a +belongs_to+ or +has_one+ association?
221
+ #
222
+ # Both express a 1-1 relationship. The difference is mostly where to place the foreign key, which goes on the table for the class
223
+ # declaring the +belongs_to+ relationship. Example:
224
+ #
225
+ # class User < ActiveRecord::Base
226
+ # # I reference an account.
227
+ # belongs_to :account
228
+ # end
229
+ #
230
+ # class Account < ActiveRecord::Base
231
+ # # One user references me.
232
+ # has_one :user
233
+ # end
234
+ #
235
+ # The tables for these classes could look something like:
236
+ #
237
+ # CREATE TABLE users (
238
+ # id int(11) NOT NULL auto_increment,
239
+ # account_id int(11) default NULL,
240
+ # name varchar default NULL,
241
+ # PRIMARY KEY (id)
242
+ # )
243
+ #
244
+ # CREATE TABLE accounts (
245
+ # id int(11) NOT NULL auto_increment,
246
+ # name varchar default NULL,
247
+ # PRIMARY KEY (id)
248
+ # )
249
+ #
250
+ # == Unsaved objects and associations
251
+ #
252
+ # You can manipulate objects and associations before they are saved to the database, but there is some special behavior you should be
253
+ # aware of, mostly involving the saving of associated objects.
254
+ #
255
+ # === One-to-one associations
256
+ #
257
+ # * Assigning an object to a +has_one+ association automatically saves that object and the object being replaced (if there is one), in
258
+ # order to update their primary keys - except if the parent object is unsaved (<tt>new_record? == true</tt>).
259
+ # * If either of these saves fail (due to one of the objects being invalid) the assignment statement returns +false+ and the assignment
260
+ # is cancelled.
261
+ # * If you wish to assign an object to a +has_one+ association without saving it, use the <tt>association.build</tt> method (documented below).
262
+ # * Assigning an object to a +belongs_to+ association does not save the object, since the foreign key field belongs on the parent. It
263
+ # does not save the parent either.
264
+ #
265
+ # === Collections
266
+ #
267
+ # * Adding an object to a collection (+has_many+ or +has_and_belongs_to_many+) automatically saves that object, except if the parent object
268
+ # (the owner of the collection) is not yet stored in the database.
269
+ # * If saving any of the objects being added to a collection (via <tt>push</tt> or similar) fails, then <tt>push</tt> returns +false+.
270
+ # * You can add an object to a collection without automatically saving it by using the <tt>collection.build</tt> method (documented below).
271
+ # * All unsaved (<tt>new_record? == true</tt>) members of the collection are automatically saved when the parent is saved.
272
+ #
273
+ # === Association callbacks
274
+ #
275
+ # Similar to the normal callbacks that hook into the lifecycle of an Active Record object, you can also define callbacks that get
276
+ # triggered when you add an object to or remove an object from an association collection. Example:
277
+ #
278
+ # class Project
279
+ # has_and_belongs_to_many :developers, :after_add => :evaluate_velocity
280
+ #
281
+ # def evaluate_velocity(developer)
282
+ # ...
283
+ # end
284
+ # end
285
+ #
286
+ # It's possible to stack callbacks by passing them as an array. Example:
287
+ #
288
+ # class Project
289
+ # has_and_belongs_to_many :developers, :after_add => [:evaluate_velocity, Proc.new { |p, d| p.shipping_date = Time.now}]
290
+ # end
291
+ #
292
+ # Possible callbacks are: +before_add+, +after_add+, +before_remove+ and +after_remove+.
293
+ #
294
+ # Should any of the +before_add+ callbacks throw an exception, the object does not get added to the collection. Same with
295
+ # the +before_remove+ callbacks; if an exception is thrown the object doesn't get removed.
296
+ #
297
+ # === Association extensions
298
+ #
299
+ # The proxy objects that control the access to associations can be extended through anonymous modules. This is especially
300
+ # beneficial for adding new finders, creators, and other factory-type methods that are only used as part of this association.
301
+ # Example:
302
+ #
303
+ # class Account < ActiveRecord::Base
304
+ # has_many :people do
305
+ # def find_or_create_by_name(name)
306
+ # first_name, last_name = name.split(" ", 2)
307
+ # find_or_create_by_first_name_and_last_name(first_name, last_name)
308
+ # end
309
+ # end
310
+ # end
311
+ #
312
+ # person = Account.find(:first).people.find_or_create_by_name("David Heinemeier Hansson")
313
+ # person.first_name # => "David"
314
+ # person.last_name # => "Heinemeier Hansson"
315
+ #
316
+ # If you need to share the same extensions between many associations, you can use a named extension module. Example:
317
+ #
318
+ # module FindOrCreateByNameExtension
319
+ # def find_or_create_by_name(name)
320
+ # first_name, last_name = name.split(" ", 2)
321
+ # find_or_create_by_first_name_and_last_name(first_name, last_name)
322
+ # end
323
+ # end
324
+ #
325
+ # class Account < ActiveRecord::Base
326
+ # has_many :people, :extend => FindOrCreateByNameExtension
327
+ # end
328
+ #
329
+ # class Company < ActiveRecord::Base
330
+ # has_many :people, :extend => FindOrCreateByNameExtension
331
+ # end
332
+ #
333
+ # If you need to use multiple named extension modules, you can specify an array of modules with the <tt>:extend</tt> option.
334
+ # In the case of name conflicts between methods in the modules, methods in modules later in the array supercede
335
+ # those earlier in the array. Example:
336
+ #
337
+ # class Account < ActiveRecord::Base
338
+ # has_many :people, :extend => [FindOrCreateByNameExtension, FindRecentExtension]
339
+ # end
340
+ #
341
+ # Some extensions can only be made to work with knowledge of the association proxy's internals.
342
+ # Extensions can access relevant state using accessors on the association proxy:
343
+ #
344
+ # * +proxy_owner+ - Returns the object the association is part of.
345
+ # * +proxy_reflection+ - Returns the reflection object that describes the association.
346
+ # * +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+.
347
+ #
348
+ # === Association Join Models
349
+ #
350
+ # Has Many associations can be configured with the <tt>:through</tt> option to use an explicit join model to retrieve the data. This
351
+ # operates similarly to a +has_and_belongs_to_many+ association. The advantage is that you're able to add validations,
352
+ # callbacks, and extra attributes on the join model. Consider the following schema:
353
+ #
354
+ # class Author < ActiveRecord::Base
355
+ # has_many :authorships
356
+ # has_many :books, :through => :authorships
357
+ # end
358
+ #
359
+ # class Authorship < ActiveRecord::Base
360
+ # belongs_to :author
361
+ # belongs_to :book
362
+ # end
363
+ #
364
+ # @author = Author.find :first
365
+ # @author.authorships.collect { |a| a.book } # selects all books that the author's authorships belong to.
366
+ # @author.books # selects all books by using the Authorship join model
367
+ #
368
+ # You can also go through a +has_many+ association on the join model:
369
+ #
370
+ # class Firm < ActiveRecord::Base
371
+ # has_many :clients
372
+ # has_many :invoices, :through => :clients
373
+ # end
374
+ #
375
+ # class Client < ActiveRecord::Base
376
+ # belongs_to :firm
377
+ # has_many :invoices
378
+ # end
379
+ #
380
+ # class Invoice < ActiveRecord::Base
381
+ # belongs_to :client
382
+ # end
383
+ #
384
+ # @firm = Firm.find :first
385
+ # @firm.clients.collect { |c| c.invoices }.flatten # select all invoices for all clients of the firm
386
+ # @firm.invoices # selects all invoices by going through the Client join model.
387
+ #
388
+ # === Polymorphic Associations
389
+ #
390
+ # Polymorphic associations on models are not restricted on what types of models they can be associated with. Rather, they
391
+ # specify an interface that a +has_many+ association must adhere to.
392
+ #
393
+ # class Asset < ActiveRecord::Base
394
+ # belongs_to :attachable, :polymorphic => true
395
+ # end
396
+ #
397
+ # class Post < ActiveRecord::Base
398
+ # has_many :assets, :as => :attachable # The :as option specifies the polymorphic interface to use.
399
+ # end
400
+ #
401
+ # @asset.attachable = @post
402
+ #
403
+ # 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
404
+ # an +attachable_id+ integer column and an +attachable_type+ string column.
405
+ #
406
+ # Using polymorphic associations in combination with single table inheritance (STI) is a little tricky. In order
407
+ # for the associations to work as expected, ensure that you store the base model for the STI models in the
408
+ # type column of the polymorphic association. To continue with the asset example above, suppose there are guest posts
409
+ # and member posts that use the posts table for STI. In this case, there must be a +type+ column in the posts table.
410
+ #
411
+ # class Asset < ActiveRecord::Base
412
+ # belongs_to :attachable, :polymorphic => true
413
+ #
414
+ # def attachable_type=(sType)
415
+ # super(sType.to_s.classify.constantize.base_class.to_s)
416
+ # end
417
+ # end
418
+ #
419
+ # class Post < ActiveRecord::Base
420
+ # # because we store "Post" in attachable_type now :dependent => :destroy will work
421
+ # has_many :assets, :as => :attachable, :dependent => :destroy
422
+ # end
423
+ #
424
+ # class GuestPost < Post
425
+ # end
426
+ #
427
+ # class MemberPost < Post
428
+ # end
429
+ #
430
+ # == Caching
431
+ #
432
+ # All of the methods are built on a simple caching principle that will keep the result of the last query around unless specifically
433
+ # instructed not to. The cache is even shared across methods to make it even cheaper to use the macro-added methods without
434
+ # worrying too much about performance at the first go. Example:
435
+ #
436
+ # project.milestones # fetches milestones from the database
437
+ # project.milestones.size # uses the milestone cache
438
+ # project.milestones.empty? # uses the milestone cache
439
+ # project.milestones(true).size # fetches milestones from the database
440
+ # project.milestones # uses the milestone cache
441
+ #
442
+ # == Eager loading of associations
443
+ #
444
+ # Eager loading is a way to find objects of a certain class and a number of named associations. This is
445
+ # one of the easiest ways of to prevent the dreaded 1+N problem in which fetching 100 posts that each need to display their author
446
+ # triggers 101 database queries. Through the use of eager loading, the 101 queries can be reduced to 2. Example:
447
+ #
448
+ # class Post < ActiveRecord::Base
449
+ # belongs_to :author
450
+ # has_many :comments
451
+ # end
452
+ #
453
+ # Consider the following loop using the class above:
454
+ #
455
+ # for post in Post.all
456
+ # puts "Post: " + post.title
457
+ # puts "Written by: " + post.author.name
458
+ # puts "Last comment on: " + post.comments.first.created_on
459
+ # end
460
+ #
461
+ # To iterate over these one hundred posts, we'll generate 201 database queries. Let's first just optimize it for retrieving the author:
462
+ #
463
+ # for post in Post.find(:all, :include => :author)
464
+ #
465
+ # This references the name of the +belongs_to+ association that also used the <tt>:author</tt> symbol. After loading the posts, find
466
+ # will collect the +author_id+ from each one and load all the referenced authors with one query. Doing so will cut down the number of queries from 201 to 102.
467
+ #
468
+ # We can improve upon the situation further by referencing both associations in the finder with:
469
+ #
470
+ # for post in Post.find(:all, :include => [ :author, :comments ])
471
+ #
472
+ # This will load all comments with a single query. This reduces the total number of queries to 3. More generally the number of queries
473
+ # will be 1 plus the number of associations named (except if some of the associations are polymorphic +belongs_to+ - see below).
474
+ #
475
+ # To include a deep hierarchy of associations, use a hash:
476
+ #
477
+ # for post in Post.find(:all, :include => [ :author, { :comments => { :author => :gravatar } } ])
478
+ #
479
+ # That'll grab not only all the comments but all their authors and gravatar pictures. You can mix and match
480
+ # symbols, arrays and hashes in any combination to describe the associations you want to load.
481
+ #
482
+ # All of this power shouldn't fool you into thinking that you can pull out huge amounts of data with no performance penalty just because you've reduced
483
+ # 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
484
+ # 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.
485
+ #
486
+ # Since only one table is loaded at a time, conditions or orders cannot reference tables other than the main one. If this is the case
487
+ # Active Record falls back to the previously used LEFT OUTER JOIN based strategy. For example
488
+ #
489
+ # Post.find(:all, :include => [ :author, :comments ], :conditions => ['comments.approved = ?', true])
490
+ #
491
+ # will result in a single SQL query with joins along the lines of: <tt>LEFT OUTER JOIN comments ON comments.post_id = posts.id</tt> and
492
+ # <tt>LEFT OUTER JOIN authors ON authors.id = posts.author_id</tt>. Note that using conditions like this can have unintended consequences.
493
+ # In the above example posts with no approved comments are not returned at all, because the conditions apply to the SQL statement as a whole
494
+ # and not just to the association. You must disambiguate column references for this fallback to happen, for example
495
+ # <tt>:order => "author.name DESC"</tt> will work but <tt>:order => "name DESC"</tt> will not.
496
+ #
497
+ # If you do want eagerload only some members of an association it is usually more natural to <tt>:include</tt> an association
498
+ # which has conditions defined on it:
499
+ #
500
+ # class Post < ActiveRecord::Base
501
+ # has_many :approved_comments, :class_name => 'Comment', :conditions => ['approved = ?', true]
502
+ # end
503
+ #
504
+ # Post.find(:all, :include => :approved_comments)
505
+ #
506
+ # will load posts and eager load the +approved_comments+ association, which contains only those comments that have been approved.
507
+ #
508
+ # When eager loaded, conditions are interpolated in the context of the model class, not the model instance. Conditions are lazily interpolated
509
+ # before the actual model exists.
510
+ #
511
+ # Eager loading is supported with polymorphic associations.
512
+ #
513
+ # class Address < ActiveRecord::Base
514
+ # belongs_to :addressable, :polymorphic => true
515
+ # end
516
+ #
517
+ # A call that tries to eager load the addressable model
518
+ #
519
+ # Address.find(:all, :include => :addressable)
520
+ #
521
+ # will execute one query to load the addresses and load the addressables with one query per addressable type.
522
+ # For example if all the addressables are either of class Person or Company then a total of 3 queries will be executed. The list of
523
+ # addressable types to load is determined on the back of the addresses loaded. This is not supported if Active Record has to fallback
524
+ # to the previous implementation of eager loading and will raise ActiveRecord::EagerLoadPolymorphicError. The reason is that the parent
525
+ # model's type is a column value so its corresponding table name cannot be put in the +FROM+/+JOIN+ clauses of that query.
526
+ #
527
+ # == Table Aliasing
528
+ #
529
+ # Active Record uses table aliasing in the case that a table is referenced multiple times in a join. If a table is referenced only once,
530
+ # the standard table name is used. The second time, the table is aliased as <tt>#{reflection_name}_#{parent_table_name}</tt>. Indexes are appended
531
+ # for any more successive uses of the table name.
532
+ #
533
+ # Post.find :all, :joins => :comments
534
+ # # => SELECT ... FROM posts INNER JOIN comments ON ...
535
+ # Post.find :all, :joins => :special_comments # STI
536
+ # # => SELECT ... FROM posts INNER JOIN comments ON ... AND comments.type = 'SpecialComment'
537
+ # Post.find :all, :joins => [:comments, :special_comments] # special_comments is the reflection name, posts is the parent table name
538
+ # # => SELECT ... FROM posts INNER JOIN comments ON ... INNER JOIN comments special_comments_posts
539
+ #
540
+ # Acts as tree example:
541
+ #
542
+ # TreeMixin.find :all, :joins => :children
543
+ # # => SELECT ... FROM mixins INNER JOIN mixins childrens_mixins ...
544
+ # TreeMixin.find :all, :joins => {:children => :parent}
545
+ # # => SELECT ... FROM mixins INNER JOIN mixins childrens_mixins ...
546
+ # INNER JOIN parents_mixins ...
547
+ # TreeMixin.find :all, :joins => {:children => {:parent => :children}}
548
+ # # => SELECT ... FROM mixins INNER JOIN mixins childrens_mixins ...
549
+ # INNER JOIN parents_mixins ...
550
+ # INNER JOIN mixins childrens_mixins_2
551
+ #
552
+ # Has and Belongs to Many join tables use the same idea, but add a <tt>_join</tt> suffix:
553
+ #
554
+ # Post.find :all, :joins => :categories
555
+ # # => SELECT ... FROM posts INNER JOIN categories_posts ... INNER JOIN categories ...
556
+ # Post.find :all, :joins => {:categories => :posts}
557
+ # # => SELECT ... FROM posts INNER JOIN categories_posts ... INNER JOIN categories ...
558
+ # INNER JOIN categories_posts posts_categories_join INNER JOIN posts posts_categories
559
+ # Post.find :all, :joins => {:categories => {:posts => :categories}}
560
+ # # => SELECT ... FROM posts INNER JOIN categories_posts ... INNER JOIN categories ...
561
+ # INNER JOIN categories_posts posts_categories_join INNER JOIN posts posts_categories
562
+ # INNER JOIN categories_posts categories_posts_join INNER JOIN categories categories_posts_2
563
+ #
564
+ # If you wish to specify your own custom joins using a <tt>:joins</tt> option, those table names will take precedence over the eager associations:
565
+ #
566
+ # Post.find :all, :joins => :comments, :joins => "inner join comments ..."
567
+ # # => SELECT ... FROM posts INNER JOIN comments_posts ON ... INNER JOIN comments ...
568
+ # Post.find :all, :joins => [:comments, :special_comments], :joins => "inner join comments ..."
569
+ # # => SELECT ... FROM posts INNER JOIN comments comments_posts ON ...
570
+ # INNER JOIN comments special_comments_posts ...
571
+ # INNER JOIN comments ...
572
+ #
573
+ # Table aliases are automatically truncated according to the maximum length of table identifiers according to the specific database.
574
+ #
575
+ # == Modules
576
+ #
577
+ # By default, associations will look for objects within the current module scope. Consider:
578
+ #
579
+ # module MyApplication
580
+ # module Business
581
+ # class Firm < ActiveRecord::Base
582
+ # has_many :clients
583
+ # end
584
+ #
585
+ # class Company < ActiveRecord::Base; end
586
+ # end
587
+ # end
588
+ #
589
+ # When Firm#clients is called, it will in turn call <tt>MyApplication::Business::Company.find(firm.id)</tt>. If you want to associate
590
+ # with a class in another module scope, this can be done by specifying the complete class name. Example:
591
+ #
592
+ # module MyApplication
593
+ # module Business
594
+ # class Firm < ActiveRecord::Base; end
595
+ # end
596
+ #
597
+ # module Billing
598
+ # class Account < ActiveRecord::Base
599
+ # belongs_to :firm, :class_name => "MyApplication::Business::Firm"
600
+ # end
601
+ # end
602
+ # end
603
+ #
604
+ # == Type safety with <tt>ActiveRecord::AssociationTypeMismatch</tt>
605
+ #
606
+ # If you attempt to assign an object to an association that doesn't match the inferred or specified <tt>:class_name</tt>, you'll
607
+ # get an <tt>ActiveRecord::AssociationTypeMismatch</tt>.
608
+ #
609
+ # == Options
610
+ #
611
+ # All of the association macros can be specialized through options. This makes cases more complex than the simple and guessable ones
612
+ # possible.
613
+ module ClassMethods
614
+ # Adds the following methods for retrieval and query of collections of associated objects:
615
+ # +collection+ is replaced with the symbol passed as the first argument, so
616
+ # <tt>has_many :clients</tt> would add among others <tt>clients.empty?</tt>.
617
+ # * <tt>collection(force_reload = false)</tt> - Returns an array of all the associated objects.
618
+ # An empty array is returned if none are found.
619
+ # * <tt>collection<<(object, ...)</tt> - Adds one or more objects to the collection by setting their foreign keys to the collection's primary key.
620
+ # * <tt>collection.delete(object, ...)</tt> - Removes one or more objects from the collection by setting their foreign keys to +NULL+.
621
+ # This will also destroy the objects if they're declared as +belongs_to+ and dependent on this model.
622
+ # * <tt>collection=objects</tt> - Replaces the collections content by deleting and adding objects as appropriate.
623
+ # * <tt>collection_singular_ids</tt> - Returns an array of the associated objects' ids
624
+ # * <tt>collection_singular_ids=ids</tt> - Replace the collection with the objects identified by the primary keys in +ids+
625
+ # * <tt>collection.clear</tt> - Removes every object from the collection. This destroys the associated objects if they
626
+ # are associated with <tt>:dependent => :destroy</tt>, deletes them directly from the database if <tt>:dependent => :delete_all</tt>,
627
+ # otherwise sets their foreign keys to +NULL+.
628
+ # * <tt>collection.empty?</tt> - Returns +true+ if there are no associated objects.
629
+ # * <tt>collection.size</tt> - Returns the number of associated objects.
630
+ # * <tt>collection.find</tt> - Finds an associated object according to the same rules as Base.find.
631
+ # * <tt>collection.build(attributes = {}, ...)</tt> - Returns one or more new objects of the collection type that have been instantiated
632
+ # with +attributes+ and linked to this object through a foreign key, but have not yet been saved. *Note:* This only works if an
633
+ # associated object already exists, not if it's +nil+!
634
+ # * <tt>collection.create(attributes = {})</tt> - Returns a new object of the collection type that has been instantiated
635
+ # with +attributes+, linked to this object through a foreign key, and that has already been saved (if it passed the validation).
636
+ # *Note:* This only works if an associated object already exists, not if it's +nil+!
637
+ #
638
+ # Example: A Firm class declares <tt>has_many :clients</tt>, which will add:
639
+ # * <tt>Firm#clients</tt> (similar to <tt>Clients.find :all, :conditions => "firm_id = #{id}"</tt>)
640
+ # * <tt>Firm#clients<<</tt>
641
+ # * <tt>Firm#clients.delete</tt>
642
+ # * <tt>Firm#clients=</tt>
643
+ # * <tt>Firm#client_ids</tt>
644
+ # * <tt>Firm#client_ids=</tt>
645
+ # * <tt>Firm#clients.clear</tt>
646
+ # * <tt>Firm#clients.empty?</tt> (similar to <tt>firm.clients.size == 0</tt>)
647
+ # * <tt>Firm#clients.size</tt> (similar to <tt>Client.count "firm_id = #{id}"</tt>)
648
+ # * <tt>Firm#clients.find</tt> (similar to <tt>Client.find(id, :conditions => "firm_id = #{id}")</tt>)
649
+ # * <tt>Firm#clients.build</tt> (similar to <tt>Client.new("firm_id" => id)</tt>)
650
+ # * <tt>Firm#clients.create</tt> (similar to <tt>c = Client.new("firm_id" => id); c.save; c</tt>)
651
+ # The declaration can also include an options hash to specialize the behavior of the association.
652
+ #
653
+ # Options are:
654
+ # * <tt>:class_name</tt> - Specify the class name of the association. Use it only if that name can't be inferred
655
+ # from the association name. So <tt>has_many :products</tt> will by default be linked to the Product class, but
656
+ # if the real class name is SpecialProduct, you'll have to specify it with this option.
657
+ # * <tt>:conditions</tt> - Specify the conditions that the associated objects must meet in order to be included as a +WHERE+
658
+ # SQL fragment, such as <tt>price > 5 AND name LIKE 'B%'</tt>. Record creations from the association are scoped if a hash
659
+ # is used. <tt>has_many :posts, :conditions => {:published => true}</tt> will create published posts with <tt>@blog.posts.create</tt>
660
+ # or <tt>@blog.posts.build</tt>.
661
+ # * <tt>:order</tt> - Specify the order in which the associated objects are returned as an <tt>ORDER BY</tt> SQL fragment,
662
+ # such as <tt>last_name, first_name DESC</tt>.
663
+ # * <tt>:foreign_key</tt> - Specify the foreign key used for the association. By default this is guessed to be the name
664
+ # of this class in lower-case and "_id" suffixed. So a Person class that makes a +has_many+ association will use "person_id"
665
+ # as the default <tt>:foreign_key</tt>.
666
+ # * <tt>:dependent</tt> - If set to <tt>:destroy</tt> all the associated objects are destroyed
667
+ # alongside this object by calling their +destroy+ method. If set to <tt>:delete_all</tt> all associated
668
+ # objects are deleted *without* calling their +destroy+ method. If set to <tt>:nullify</tt> all associated
669
+ # objects' foreign keys are set to +NULL+ *without* calling their +save+ callbacks. *Warning:* This option is ignored when also using
670
+ # the <tt>:through</tt> option.
671
+ # * <tt>:finder_sql</tt> - Specify a complete SQL statement to fetch the association. This is a good way to go for complex
672
+ # associations that depend on multiple tables. Note: When this option is used, +find_in_collection+ is _not_ added.
673
+ # * <tt>:counter_sql</tt> - Specify a complete SQL statement to fetch the size of the association. If <tt>:finder_sql</tt> is
674
+ # specified but not <tt>:counter_sql</tt>, <tt>:counter_sql</tt> will be generated by replacing <tt>SELECT ... FROM</tt> with <tt>SELECT COUNT(*) FROM</tt>.
675
+ # * <tt>:extend</tt> - Specify a named module for extending the proxy. See "Association extensions".
676
+ # * <tt>:include</tt> - Specify second-order associations that should be eager loaded when the collection is loaded.
677
+ # * <tt>:group</tt> - An attribute name by which the result should be grouped. Uses the <tt>GROUP BY</tt> SQL-clause.
678
+ # * <tt>:limit</tt> - An integer determining the limit on the number of rows that should be returned.
679
+ # * <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.
680
+ # * <tt>:select</tt> - By default, this is <tt>*</tt> as in <tt>SELECT * FROM</tt>, but can be changed if you, for example, want to do a join
681
+ # but not include the joined columns. Do not forget to include the primary and foreign keys, otherwise it will rise an error.
682
+ # * <tt>:as</tt> - Specifies a polymorphic interface (See <tt>belongs_to</tt>).
683
+ # * <tt>:through</tt> - Specifies a Join Model through which to perform the query. Options for <tt>:class_name</tt> and <tt>:foreign_key</tt>
684
+ # are ignored, as the association uses the source reflection. You can only use a <tt>:through</tt> query through a <tt>belongs_to</tt>
685
+ # or <tt>has_many</tt> association on the join model.
686
+ # * <tt>:source</tt> - Specifies the source association name used by <tt>has_many :through</tt> queries. Only use it if the name cannot be
687
+ # inferred from the association. <tt>has_many :subscribers, :through => :subscriptions</tt> will look for either <tt>:subscribers</tt> or
688
+ # <tt>:subscriber</tt> on Subscription, unless a <tt>:source</tt> is given.
689
+ # * <tt>:source_type</tt> - Specifies type of the source association used by <tt>has_many :through</tt> queries where the source
690
+ # association is a polymorphic +belongs_to+.
691
+ # * <tt>:uniq</tt> - If true, duplicates will be omitted from the collection. Useful in conjunction with <tt>:through</tt>.
692
+ # * <tt>:readonly</tt> - If true, all the associated objects are readonly through the association.
693
+ #
694
+ # Option examples:
695
+ # has_many :comments, :order => "posted_on"
696
+ # has_many :comments, :include => :author
697
+ # has_many :people, :class_name => "Person", :conditions => "deleted = 0", :order => "name"
698
+ # has_many :tracks, :order => "position", :dependent => :destroy
699
+ # has_many :comments, :dependent => :nullify
700
+ # has_many :tags, :as => :taggable
701
+ # has_many :reports, :readonly => true
702
+ # has_many :subscribers, :through => :subscriptions, :source => :user
703
+ # has_many :subscribers, :class_name => "Person", :finder_sql =>
704
+ # 'SELECT DISTINCT people.* ' +
705
+ # 'FROM people p, post_subscriptions ps ' +
706
+ # 'WHERE ps.post_id = #{id} AND ps.person_id = p.id ' +
707
+ # 'ORDER BY p.first_name'
708
+ def has_many(association_id, options = {}, &extension)
709
+ reflection = create_has_many_reflection(association_id, options, &extension)
710
+
711
+ configure_dependency_for_has_many(reflection)
712
+
713
+ add_multiple_associated_save_callbacks(reflection.name)
714
+ add_association_callbacks(reflection.name, reflection.options)
715
+
716
+ if options[:through]
717
+ collection_accessor_methods(reflection, HasManyThroughAssociation)
718
+ else
719
+ collection_accessor_methods(reflection, HasManyAssociation)
720
+ end
721
+ end
722
+
723
+ # Adds the following methods for retrieval and query of a single associated object:
724
+ # +association+ is replaced with the symbol passed as the first argument, so
725
+ # <tt>has_one :manager</tt> would add among others <tt>manager.nil?</tt>.
726
+ # * <tt>association(force_reload = false)</tt> - Returns the associated object. +nil+ is returned if none is found.
727
+ # * <tt>association=(associate)</tt> - Assigns the associate object, extracts the primary key, sets it as the foreign key,
728
+ # and saves the associate object.
729
+ # * <tt>association.nil?</tt> - Returns +true+ if there is no associated object.
730
+ # * <tt>build_association(attributes = {})</tt> - Returns a new object of the associated type that has been instantiated
731
+ # with +attributes+ and linked to this object through a foreign key, but has not yet been saved. Note: This ONLY works if
732
+ # an association already exists. It will NOT work if the association is +nil+.
733
+ # * <tt>create_association(attributes = {})</tt> - Returns a new object of the associated type that has been instantiated
734
+ # with +attributes+, linked to this object through a foreign key, and that has already been saved (if it passed the validation).
735
+ #
736
+ # Example: An Account class declares <tt>has_one :beneficiary</tt>, which will add:
737
+ # * <tt>Account#beneficiary</tt> (similar to <tt>Beneficiary.find(:first, :conditions => "account_id = #{id}")</tt>)
738
+ # * <tt>Account#beneficiary=(beneficiary)</tt> (similar to <tt>beneficiary.account_id = account.id; beneficiary.save</tt>)
739
+ # * <tt>Account#beneficiary.nil?</tt>
740
+ # * <tt>Account#build_beneficiary</tt> (similar to <tt>Beneficiary.new("account_id" => id)</tt>)
741
+ # * <tt>Account#create_beneficiary</tt> (similar to <tt>b = Beneficiary.new("account_id" => id); b.save; b</tt>)
742
+ #
743
+ # The declaration can also include an options hash to specialize the behavior of the association.
744
+ #
745
+ # Options are:
746
+ # * <tt>:class_name</tt> - Specify the class name of the association. Use it only if that name can't be inferred
747
+ # from the association name. So <tt>has_one :manager</tt> will by default be linked to the Manager class, but
748
+ # if the real class name is Person, you'll have to specify it with this option.
749
+ # * <tt>:conditions</tt> - Specify the conditions that the associated object must meet in order to be included as a +WHERE+
750
+ # SQL fragment, such as <tt>rank = 5</tt>.
751
+ # * <tt>:order</tt> - Specify the order in which the associated objects are returned as an <tt>ORDER BY</tt> SQL fragment,
752
+ # such as <tt>last_name, first_name DESC</tt>.
753
+ # * <tt>:dependent</tt> - If set to <tt>:destroy</tt>, the associated object is destroyed when this object is. If set to
754
+ # <tt>:delete</tt>, the associated object is deleted *without* calling its destroy method. If set to <tt>:nullify</tt>, the associated
755
+ # object's foreign key is set to +NULL+. Also, association is assigned.
756
+ # * <tt>:foreign_key</tt> - Specify the foreign key used for the association. By default this is guessed to be the name
757
+ # of this class in lower-case and "_id" suffixed. So a Person class that makes a +has_one+ association will use "person_id"
758
+ # as the default <tt>:foreign_key</tt>.
759
+ # * <tt>:include</tt> - Specify second-order associations that should be eager loaded when this object is loaded.
760
+ # * <tt>:as</tt> - Specifies a polymorphic interface (See <tt>belongs_to</tt>).
761
+ # * <tt>:select</tt> - By default, this is <tt>*</tt> as in <tt>SELECT * FROM</tt>, but can be changed if, for example, you want to do a join
762
+ # but not include the joined columns. Do not forget to include the primary and foreign keys, otherwise it will raise an error.
763
+ # * <tt>:through</tt>: Specifies a Join Model through which to perform the query. Options for <tt>:class_name</tt> and <tt>:foreign_key</tt>
764
+ # are ignored, as the association uses the source reflection. You can only use a <tt>:through</tt> query through a
765
+ # <tt>has_one</tt> or <tt>belongs_to</tt> association on the join model.
766
+ # * <tt>:source</tt> - Specifies the source association name used by <tt>has_one :through</tt> queries. Only use it if the name cannot be
767
+ # inferred from the association. <tt>has_one :favorite, :through => :favorites</tt> will look for a
768
+ # <tt>:favorite</tt> on Favorite, unless a <tt>:source</tt> is given.
769
+ # * <tt>:source_type</tt> - Specifies type of the source association used by <tt>has_one :through</tt> queries where the source
770
+ # association is a polymorphic +belongs_to+.
771
+ # * <tt>:readonly</tt> - If true, the associated object is readonly through the association.
772
+ #
773
+ # Option examples:
774
+ # has_one :credit_card, :dependent => :destroy # destroys the associated credit card
775
+ # has_one :credit_card, :dependent => :nullify # updates the associated records foreign key value to NULL rather than destroying it
776
+ # has_one :last_comment, :class_name => "Comment", :order => "posted_on"
777
+ # has_one :project_manager, :class_name => "Person", :conditions => "role = 'project_manager'"
778
+ # has_one :attachment, :as => :attachable
779
+ # has_one :boss, :readonly => :true
780
+ # has_one :club, :through => :membership
781
+ # has_one :primary_address, :through => :addressables, :conditions => ["addressable.primary = ?", true], :source => :addressable
782
+ def has_one(association_id, options = {})
783
+ if options[:through]
784
+ reflection = create_has_one_through_reflection(association_id, options)
785
+ association_accessor_methods(reflection, ActiveRecord::Associations::HasOneThroughAssociation)
786
+ else
787
+ reflection = create_has_one_reflection(association_id, options)
788
+
789
+ ivar = "@#{reflection.name}"
790
+
791
+ method_name = "has_one_after_save_for_#{reflection.name}".to_sym
792
+ define_method(method_name) do
793
+ association = instance_variable_get("#{ivar}") if instance_variable_defined?("#{ivar}")
794
+
795
+ if !association.nil? && (new_record? || association.new_record? || association["#{reflection.primary_key_name}"] != id)
796
+ association["#{reflection.primary_key_name}"] = id
797
+ association.save(true)
798
+ end
799
+ end
800
+ after_save method_name
801
+
802
+ add_single_associated_save_callbacks(reflection.name)
803
+ association_accessor_methods(reflection, HasOneAssociation)
804
+ association_constructor_method(:build, reflection, HasOneAssociation)
805
+ association_constructor_method(:create, reflection, HasOneAssociation)
806
+
807
+ configure_dependency_for_has_one(reflection)
808
+ end
809
+ end
810
+
811
+ # Adds the following methods for retrieval and query for a single associated object for which this object holds an id:
812
+ # +association+ is replaced with the symbol passed as the first argument, so
813
+ # <tt>belongs_to :author</tt> would add among others <tt>author.nil?</tt>.
814
+ # * <tt>association(force_reload = false)</tt> - Returns the associated object. +nil+ is returned if none is found.
815
+ # * <tt>association=(associate)</tt> - Assigns the associate object, extracts the primary key, and sets it as the foreign key.
816
+ # * <tt>association.nil?</tt> - Returns +true+ if there is no associated object.
817
+ # * <tt>build_association(attributes = {})</tt> - Returns a new object of the associated type that has been instantiated
818
+ # with +attributes+ and linked to this object through a foreign key, but has not yet been saved.
819
+ # * <tt>create_association(attributes = {})</tt> - Returns a new object of the associated type that has been instantiated
820
+ # with +attributes+, linked to this object through a foreign key, and that has already been saved (if it passed the validation).
821
+ #
822
+ # Example: A Post class declares <tt>belongs_to :author</tt>, which will add:
823
+ # * <tt>Post#author</tt> (similar to <tt>Author.find(author_id)</tt>)
824
+ # * <tt>Post#author=(author)</tt> (similar to <tt>post.author_id = author.id</tt>)
825
+ # * <tt>Post#author?</tt> (similar to <tt>post.author == some_author</tt>)
826
+ # * <tt>Post#author.nil?</tt>
827
+ # * <tt>Post#build_author</tt> (similar to <tt>post.author = Author.new</tt>)
828
+ # * <tt>Post#create_author</tt> (similar to <tt>post.author = Author.new; post.author.save; post.author</tt>)
829
+ # The declaration can also include an options hash to specialize the behavior of the association.
830
+ #
831
+ # Options are:
832
+ # * <tt>:class_name</tt> - Specify the class name of the association. Use it only if that name can't be inferred
833
+ # from the association name. So <tt>has_one :author</tt> will by default be linked to the Author class, but
834
+ # if the real class name is Person, you'll have to specify it with this option.
835
+ # * <tt>:conditions</tt> - Specify the conditions that the associated object must meet in order to be included as a +WHERE+
836
+ # SQL fragment, such as <tt>authorized = 1</tt>.
837
+ # * <tt>:select</tt> - By default, this is <tt>*</tt> as in <tt>SELECT * FROM</tt>, but can be changed if, for example, you want to do a join
838
+ # but not include the joined columns. Do not forget to include the primary and foreign keys, otherwise it will raise an error.
839
+ # * <tt>:foreign_key</tt> - Specify the foreign key used for the association. By default this is guessed to be the name
840
+ # of the association with an "_id" suffix. So a class that defines a <tt>belongs_to :person</tt> association will use
841
+ # "person_id" as the default <tt>:foreign_key</tt>. Similarly, <tt>belongs_to :favorite_person, :class_name => "Person"</tt>
842
+ # will use a foreign key of "favorite_person_id".
843
+ # * <tt>:dependent</tt> - If set to <tt>:destroy</tt>, the associated object is destroyed when this object is. If set to
844
+ # <tt>:delete</tt>, the associated object is deleted *without* calling its destroy method. This option should not be specified when
845
+ # <tt>belongs_to</tt> is used in conjunction with a <tt>has_many</tt> relationship on another class because of the potential to leave
846
+ # orphaned records behind.
847
+ # * <tt>:counter_cache</tt> - Caches the number of belonging objects on the associate class through the use of +increment_counter+
848
+ # and +decrement_counter+. The counter cache is incremented when an object of this class is created and decremented when it's
849
+ # destroyed. This requires that a column named <tt>#{table_name}_count</tt> (such as +comments_count+ for a belonging Comment class)
850
+ # is used on the associate class (such as a Post class). You can also specify a custom counter cache column by providing
851
+ # a column name instead of a +true+/+false+ value to this option (e.g., <tt>:counter_cache => :my_custom_counter</tt>.)
852
+ # When creating a counter cache column, the database statement or migration must specify a default value of <tt>0</tt>, failing to do
853
+ # this results in a counter with +NULL+ value, which will never increment.
854
+ # Note: Specifying a counter cache will add it to that model's list of readonly attributes using +attr_readonly+.
855
+ # * <tt>:include</tt> - Specify second-order associations that should be eager loaded when this object is loaded.
856
+ # * <tt>:polymorphic</tt> - Specify this association is a polymorphic association by passing +true+.
857
+ # Note: If you've enabled the counter cache, then you may want to add the counter cache attribute
858
+ # to the +attr_readonly+ list in the associated classes (e.g. <tt>class Post; attr_readonly :comments_count; end</tt>).
859
+ # * <tt>:readonly</tt> - If true, the associated object is readonly through the association.
860
+ #
861
+ # Option examples:
862
+ # belongs_to :firm, :foreign_key => "client_of"
863
+ # belongs_to :author, :class_name => "Person", :foreign_key => "author_id"
864
+ # belongs_to :valid_coupon, :class_name => "Coupon", :foreign_key => "coupon_id",
865
+ # :conditions => 'discounts > #{payments_count}'
866
+ # belongs_to :attachable, :polymorphic => true
867
+ # belongs_to :project, :readonly => true
868
+ # belongs_to :post, :counter_cache => true
869
+ def belongs_to(association_id, options = {})
870
+ reflection = create_belongs_to_reflection(association_id, options)
871
+
872
+ ivar = "@#{reflection.name}"
873
+
874
+ if reflection.options[:polymorphic]
875
+ association_accessor_methods(reflection, BelongsToPolymorphicAssociation)
876
+
877
+ method_name = "polymorphic_belongs_to_before_save_for_#{reflection.name}".to_sym
878
+ define_method(method_name) do
879
+ association = instance_variable_get("#{ivar}") if instance_variable_defined?("#{ivar}")
880
+
881
+ if association && association.target
882
+ if association.new_record?
883
+ association.save(true)
884
+ end
885
+
886
+ if association.updated?
887
+ self["#{reflection.primary_key_name}"] = association.id
888
+ self["#{reflection.options[:foreign_type]}"] = association.class.base_class.name.to_s
889
+ end
890
+ end
891
+ end
892
+ before_save method_name
893
+ else
894
+ association_accessor_methods(reflection, BelongsToAssociation)
895
+ association_constructor_method(:build, reflection, BelongsToAssociation)
896
+ association_constructor_method(:create, reflection, BelongsToAssociation)
897
+
898
+ method_name = "belongs_to_before_save_for_#{reflection.name}".to_sym
899
+ define_method(method_name) do
900
+ association = instance_variable_get("#{ivar}") if instance_variable_defined?("#{ivar}")
901
+
902
+ if !association.nil?
903
+ if association.new_record?
904
+ association.save(true)
905
+ end
906
+
907
+ if association.updated?
908
+ self["#{reflection.primary_key_name}"] = association.id
909
+ end
910
+ end
911
+ end
912
+ before_save method_name
913
+ end
914
+
915
+ # Create the callbacks to update counter cache
916
+ if options[:counter_cache]
917
+ cache_column = options[:counter_cache] == true ?
918
+ "#{self.to_s.underscore.pluralize}_count" :
919
+ options[:counter_cache]
920
+
921
+ method_name = "belongs_to_counter_cache_after_create_for_#{reflection.name}".to_sym
922
+ define_method(method_name) do
923
+ association = send("#{reflection.name}")
924
+ association.class.increment_counter("#{cache_column}", send("#{reflection.primary_key_name}")) unless association.nil?
925
+ end
926
+ after_create method_name
927
+
928
+ method_name = "belongs_to_counter_cache_before_destroy_for_#{reflection.name}".to_sym
929
+ define_method(method_name) do
930
+ association = send("#{reflection.name}")
931
+ association.class.decrement_counter("#{cache_column}", send("#{reflection.primary_key_name}")) unless association.nil?
932
+ end
933
+ before_destroy method_name
934
+
935
+ module_eval(
936
+ "#{reflection.class_name}.send(:attr_readonly,\"#{cache_column}\".intern) if defined?(#{reflection.class_name}) && #{reflection.class_name}.respond_to?(:attr_readonly)"
937
+ )
938
+ end
939
+
940
+ configure_dependency_for_belongs_to(reflection)
941
+ end
942
+
943
+ # Associates two classes via an intermediate join table. Unless the join table is explicitly specified as
944
+ # an option, it is guessed using the lexical order of the class names. So a join between Developer and Project
945
+ # will give the default join table name of "developers_projects" because "D" outranks "P". Note that this precedence
946
+ # is calculated using the <tt><</tt> operator for String. This means that if the strings are of different lengths,
947
+ # and the strings are equal when compared up to the shortest length, then the longer string is considered of higher
948
+ # lexical precedence than the shorter one. For example, one would expect the tables "paper_boxes" and "papers"
949
+ # to generate a join table name of "papers_paper_boxes" because of the length of the name "paper_boxes",
950
+ # but it in fact generates a join table name of "paper_boxes_papers". Be aware of this caveat, and use the
951
+ # custom <tt>:join_table</tt> option if you need to.
952
+ #
953
+ # Deprecated: Any additional fields added to the join table will be placed as attributes when pulling records out through
954
+ # +has_and_belongs_to_many+ associations. Records returned from join tables with additional attributes will be marked as
955
+ # readonly (because we can't save changes to the additional attributes). It's strongly recommended that you upgrade any
956
+ # associations with attributes to a real join model (see introduction).
957
+ #
958
+ # Adds the following methods for retrieval and query:
959
+ # +collection+ is replaced with the symbol passed as the first argument, so
960
+ # <tt>has_and_belongs_to_many :categories</tt> would add among others <tt>categories.empty?</tt>.
961
+ # * <tt>collection(force_reload = false)</tt> - Returns an array of all the associated objects.
962
+ # An empty array is returned if none are found.
963
+ # * <tt>collection<<(object, ...)</tt> - Adds one or more objects to the collection by creating associations in the join table
964
+ # (<tt>collection.push</tt> and <tt>collection.concat</tt> are aliases to this method).
965
+ # * <tt>collection.delete(object, ...)</tt> - Removes one or more objects from the collection by removing their associations from the join table.
966
+ # This does not destroy the objects.
967
+ # * <tt>collection=objects</tt> - Replaces the collection's content by deleting and adding objects as appropriate.
968
+ # * <tt>collection_singular_ids</tt> - Returns an array of the associated objects' ids.
969
+ # * <tt>collection_singular_ids=ids</tt> - Replace the collection by the objects identified by the primary keys in +ids+.
970
+ # * <tt>collection.clear</tt> - Removes every object from the collection. This does not destroy the objects.
971
+ # * <tt>collection.empty?</tt> - Returns +true+ if there are no associated objects.
972
+ # * <tt>collection.size</tt> - Returns the number of associated objects.
973
+ # * <tt>collection.find(id)</tt> - Finds an associated object responding to the +id+ and that
974
+ # meets the condition that it has to be associated with this object.
975
+ # * <tt>collection.build(attributes = {})</tt> - Returns a new object of the collection type that has been instantiated
976
+ # with +attributes+ and linked to this object through the join table, but has not yet been saved.
977
+ # * <tt>collection.create(attributes = {})</tt> - Returns a new object of the collection type that has been instantiated
978
+ # with +attributes+, linked to this object through the join table, and that has already been saved (if it passed the validation).
979
+ #
980
+ # Example: A Developer class declares <tt>has_and_belongs_to_many :projects</tt>, which will add:
981
+ # * <tt>Developer#projects</tt>
982
+ # * <tt>Developer#projects<<</tt>
983
+ # * <tt>Developer#projects.delete</tt>
984
+ # * <tt>Developer#projects=</tt>
985
+ # * <tt>Developer#project_ids</tt>
986
+ # * <tt>Developer#project_ids=</tt>
987
+ # * <tt>Developer#projects.clear</tt>
988
+ # * <tt>Developer#projects.empty?</tt>
989
+ # * <tt>Developer#projects.size</tt>
990
+ # * <tt>Developer#projects.find(id)</tt>
991
+ # * <tt>Developer#projects.build</tt> (similar to <tt>Project.new("project_id" => id)</tt>)
992
+ # * <tt>Developer#projects.create</tt> (similar to <tt>c = Project.new("project_id" => id); c.save; c</tt>)
993
+ # The declaration may include an options hash to specialize the behavior of the association.
994
+ #
995
+ # Options are:
996
+ # * <tt>:class_name</tt> - Specify the class name of the association. Use it only if that name can't be inferred
997
+ # from the association name. So <tt>has_and_belongs_to_many :projects</tt> will by default be linked to the
998
+ # Project class, but if the real class name is SuperProject, you'll have to specify it with this option.
999
+ # * <tt>:join_table</tt> - Specify the name of the join table if the default based on lexical order isn't what you want.
1000
+ # WARNING: If you're overwriting the table name of either class, the +table_name+ method MUST be declared underneath any
1001
+ # +has_and_belongs_to_many+ declaration in order to work.
1002
+ # * <tt>:foreign_key</tt> - Specify the foreign key used for the association. By default this is guessed to be the name
1003
+ # of this class in lower-case and "_id" suffixed. So a Person class that makes a +has_and_belongs_to_many+ association
1004
+ # will use "person_id" as the default <tt>:foreign_key</tt>.
1005
+ # * <tt>:association_foreign_key</tt> - Specify the association foreign key used for the association. By default this is
1006
+ # guessed to be the name of the associated class in lower-case and "_id" suffixed. So if the associated class is Project,
1007
+ # the +has_and_belongs_to_many+ association will use "project_id" as the default <tt>:association_foreign_key</tt>.
1008
+ # * <tt>:conditions</tt> - Specify the conditions that the associated object must meet in order to be included as a +WHERE+
1009
+ # SQL fragment, such as <tt>authorized = 1</tt>. Record creations from the association are scoped if a hash is used.
1010
+ # <tt>has_many :posts, :conditions => {:published => true}</tt> will create published posts with <tt>@blog.posts.create</tt>
1011
+ # or <tt>@blog.posts.build</tt>.
1012
+ # * <tt>:order</tt> - Specify the order in which the associated objects are returned as an <tt>ORDER BY</tt> SQL fragment,
1013
+ # such as <tt>last_name, first_name DESC</tt>
1014
+ # * <tt>:uniq</tt> - If true, duplicate associated objects will be ignored by accessors and query methods.
1015
+ # * <tt>:finder_sql</tt> - Overwrite the default generated SQL statement used to fetch the association with a manual statement
1016
+ # * <tt>:delete_sql</tt> - Overwrite the default generated SQL statement used to remove links between the associated
1017
+ # classes with a manual statement.
1018
+ # * <tt>:insert_sql</tt> - Overwrite the default generated SQL statement used to add links between the associated classes
1019
+ # with a manual statement.
1020
+ # * <tt>:extend</tt> - Anonymous module for extending the proxy, see "Association extensions".
1021
+ # * <tt>:include</tt> - Specify second-order associations that should be eager loaded when the collection is loaded.
1022
+ # * <tt>:group</tt> - An attribute name by which the result should be grouped. Uses the <tt>GROUP BY</tt> SQL-clause.
1023
+ # * <tt>:limit</tt> - An integer determining the limit on the number of rows that should be returned.
1024
+ # * <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.
1025
+ # * <tt>:select</tt> - By default, this is <tt>*</tt> as in <tt>SELECT * FROM</tt>, but can be changed if, for example, you want to do a join
1026
+ # but not include the joined columns. Do not forget to include the primary and foreign keys, otherwise it will raise an error.
1027
+ # * <tt>:readonly</tt> - If true, all the associated objects are readonly through the association.
1028
+ #
1029
+ # Option examples:
1030
+ # has_and_belongs_to_many :projects
1031
+ # has_and_belongs_to_many :projects, :include => [ :milestones, :manager ]
1032
+ # has_and_belongs_to_many :nations, :class_name => "Country"
1033
+ # has_and_belongs_to_many :categories, :join_table => "prods_cats"
1034
+ # has_and_belongs_to_many :categories, :readonly => true
1035
+ # has_and_belongs_to_many :active_projects, :join_table => 'developers_projects', :delete_sql =>
1036
+ # 'DELETE FROM developers_projects WHERE active=1 AND developer_id = #{id} AND project_id = #{record.id}'
1037
+ def has_and_belongs_to_many(association_id, options = {}, &extension)
1038
+ reflection = create_has_and_belongs_to_many_reflection(association_id, options, &extension)
1039
+
1040
+ add_multiple_associated_save_callbacks(reflection.name)
1041
+ collection_accessor_methods(reflection, HasAndBelongsToManyAssociation)
1042
+
1043
+ # Don't use a before_destroy callback since users' before_destroy
1044
+ # callbacks will be executed after the association is wiped out.
1045
+ old_method = "destroy_without_habtm_shim_for_#{reflection.name}"
1046
+ class_eval <<-end_eval unless method_defined?(old_method)
1047
+ alias_method :#{old_method}, :destroy_without_callbacks
1048
+ def destroy_without_callbacks
1049
+ #{reflection.name}.clear
1050
+ #{old_method}
1051
+ end
1052
+ end_eval
1053
+
1054
+ add_association_callbacks(reflection.name, options)
1055
+ end
1056
+
1057
+ private
1058
+ # Generate a join table name from two provided tables names.
1059
+ # The order of names in join name is determined by lexical precedence.
1060
+ # join_table_name("members", "clubs")
1061
+ # => "clubs_members"
1062
+ # join_table_name("members", "special_clubs")
1063
+ # => "members_special_clubs"
1064
+ def join_table_name(first_table_name, second_table_name)
1065
+ if first_table_name < second_table_name
1066
+ join_table = "#{first_table_name}_#{second_table_name}"
1067
+ else
1068
+ join_table = "#{second_table_name}_#{first_table_name}"
1069
+ end
1070
+
1071
+ table_name_prefix + join_table + table_name_suffix
1072
+ end
1073
+
1074
+ def association_accessor_methods(reflection, association_proxy_class)
1075
+ ivar = "@#{reflection.name}"
1076
+
1077
+ define_method(reflection.name) do |*params|
1078
+ force_reload = params.first unless params.empty?
1079
+
1080
+ association = instance_variable_get(ivar) if instance_variable_defined?(ivar)
1081
+
1082
+ if association.nil? || force_reload
1083
+ association = association_proxy_class.new(self, reflection)
1084
+ retval = association.reload
1085
+ if retval.nil? and association_proxy_class == BelongsToAssociation
1086
+ instance_variable_set(ivar, nil)
1087
+ return nil
1088
+ end
1089
+ instance_variable_set(ivar, association)
1090
+ end
1091
+
1092
+ association.target.nil? ? nil : association
1093
+ end
1094
+
1095
+ define_method("#{reflection.name}=") do |new_value|
1096
+ association = instance_variable_get(ivar) if instance_variable_defined?(ivar)
1097
+
1098
+ if association.nil? || association.target != new_value
1099
+ association = association_proxy_class.new(self, reflection)
1100
+ end
1101
+
1102
+ if association_proxy_class == HasOneThroughAssociation
1103
+ association.create_through_record(new_value)
1104
+ self.send(reflection.name, new_value)
1105
+ else
1106
+ association.replace(new_value)
1107
+ end
1108
+
1109
+ instance_variable_set(ivar, new_value.nil? ? nil : association)
1110
+ end
1111
+
1112
+ define_method("set_#{reflection.name}_target") do |target|
1113
+ return if target.nil? and association_proxy_class == BelongsToAssociation
1114
+ association = association_proxy_class.new(self, reflection)
1115
+ association.target = target
1116
+ instance_variable_set(ivar, association)
1117
+ end
1118
+ end
1119
+
1120
+ def collection_reader_method(reflection, association_proxy_class)
1121
+ define_method(reflection.name) do |*params|
1122
+ ivar = "@#{reflection.name}"
1123
+
1124
+ force_reload = params.first unless params.empty?
1125
+ association = instance_variable_get(ivar) if instance_variable_defined?(ivar)
1126
+
1127
+ unless association.respond_to?(:loaded?)
1128
+ association = association_proxy_class.new(self, reflection)
1129
+ instance_variable_set(ivar, association)
1130
+ end
1131
+
1132
+ association.reload if force_reload
1133
+
1134
+ association
1135
+ end
1136
+
1137
+ define_method("#{reflection.name.to_s.singularize}_ids") do
1138
+ send(reflection.name).map(&:id)
1139
+ end
1140
+ end
1141
+
1142
+ def collection_accessor_methods(reflection, association_proxy_class, writer = true)
1143
+ collection_reader_method(reflection, association_proxy_class)
1144
+
1145
+ if writer
1146
+ define_method("#{reflection.name}=") do |new_value|
1147
+ # Loads proxy class instance (defined in collection_reader_method) if not already loaded
1148
+ association = send(reflection.name)
1149
+ association.replace(new_value)
1150
+ association
1151
+ end
1152
+
1153
+ define_method("#{reflection.name.to_s.singularize}_ids=") do |new_value|
1154
+ ids = (new_value || []).reject { |nid| nid.blank? }
1155
+ send("#{reflection.name}=", reflection.class_name.constantize.find(ids))
1156
+ end
1157
+ end
1158
+ end
1159
+
1160
+ def add_single_associated_save_callbacks(association_name)
1161
+ method_name = "validate_associated_records_for_#{association_name}".to_sym
1162
+ define_method(method_name) do
1163
+ association = instance_variable_get("@#{association_name}")
1164
+ if !association.nil?
1165
+ errors.add "#{association_name}" unless association.target.nil? || association.valid?
1166
+ end
1167
+ end
1168
+
1169
+ validate method_name
1170
+ end
1171
+
1172
+ def add_multiple_associated_save_callbacks(association_name)
1173
+ method_name = "validate_associated_records_for_#{association_name}".to_sym
1174
+ ivar = "@#{association_name}"
1175
+
1176
+ define_method(method_name) do
1177
+ association = instance_variable_get(ivar) if instance_variable_defined?(ivar)
1178
+
1179
+ if association.respond_to?(:loaded?)
1180
+ if new_record?
1181
+ association
1182
+ elsif association.loaded?
1183
+ association.select { |record| record.new_record? }
1184
+ else
1185
+ association.target.select { |record| record.new_record? }
1186
+ end.each do |record|
1187
+ errors.add "#{association_name}" unless record.valid?
1188
+ end
1189
+ end
1190
+ end
1191
+
1192
+ validate method_name
1193
+
1194
+ method_name = "before_save_associated_records_for_#{association_name}".to_sym
1195
+ define_method(method_name) do
1196
+ @new_record_before_save = new_record?
1197
+ true
1198
+ end
1199
+ before_save method_name
1200
+
1201
+ method_name = "after_create_or_update_associated_records_for_#{association_name}".to_sym
1202
+ define_method(method_name) do
1203
+ association = instance_variable_get("#{ivar}") if instance_variable_defined?("#{ivar}")
1204
+
1205
+ records_to_save = if @new_record_before_save
1206
+ association
1207
+ elsif association.respond_to?(:loaded?) && association.loaded?
1208
+ association.select { |record| record.new_record? }
1209
+ elsif association.respond_to?(:loaded?) && !association.loaded?
1210
+ association.target.select { |record| record.new_record? }
1211
+ else
1212
+ []
1213
+ end
1214
+
1215
+ records_to_save.each { |record| association.send(:insert_record, record) } unless records_to_save.blank?
1216
+
1217
+ # reconstruct the SQL queries now that we know the owner's id
1218
+ association.send(:construct_sql) if association.respond_to?(:construct_sql)
1219
+ end
1220
+
1221
+ # Doesn't use after_save as that would save associations added in after_create/after_update twice
1222
+ after_create method_name
1223
+ after_update method_name
1224
+ end
1225
+
1226
+ def association_constructor_method(constructor, reflection, association_proxy_class)
1227
+ define_method("#{constructor}_#{reflection.name}") do |*params|
1228
+ ivar = "@#{reflection.name}"
1229
+
1230
+ attributees = params.first unless params.empty?
1231
+ replace_existing = params[1].nil? ? true : params[1]
1232
+ association = instance_variable_get(ivar) if instance_variable_defined?(ivar)
1233
+
1234
+ if association.nil?
1235
+ association = association_proxy_class.new(self, reflection)
1236
+ instance_variable_set(ivar, association)
1237
+ end
1238
+
1239
+ if association_proxy_class == HasOneAssociation
1240
+ association.send(constructor, attributees, replace_existing)
1241
+ else
1242
+ association.send(constructor, attributees)
1243
+ end
1244
+ end
1245
+ end
1246
+
1247
+ def find_with_associations(options = {})
1248
+ catch :invalid_query do
1249
+ join_dependency = JoinDependency.new(self, merge_includes(scope(:find, :include), options[:include]), options[:joins])
1250
+ rows = select_all_rows(options, join_dependency)
1251
+ return join_dependency.instantiate(rows)
1252
+ end
1253
+ []
1254
+ end
1255
+
1256
+ # See HasManyAssociation#delete_records. Dependent associations
1257
+ # delete children, otherwise foreign key is set to NULL.
1258
+ def configure_dependency_for_has_many(reflection)
1259
+ if reflection.options.include?(:dependent)
1260
+ # Add polymorphic type if the :as option is present
1261
+ dependent_conditions = []
1262
+ dependent_conditions << "#{reflection.primary_key_name} = \#{record.quoted_id}"
1263
+ dependent_conditions << "#{reflection.options[:as]}_type = '#{base_class.name}'" if reflection.options[:as]
1264
+ dependent_conditions << sanitize_sql(reflection.options[:conditions]) if reflection.options[:conditions]
1265
+ dependent_conditions = dependent_conditions.collect {|where| "(#{where})" }.join(" AND ")
1266
+
1267
+ case reflection.options[:dependent]
1268
+ when :destroy
1269
+ method_name = "has_many_dependent_destroy_for_#{reflection.name}".to_sym
1270
+ define_method(method_name) do
1271
+ send("#{reflection.name}").each { |o| o.destroy }
1272
+ end
1273
+ before_destroy method_name
1274
+ when :delete_all
1275
+ module_eval "before_destroy { |record| #{reflection.class_name}.delete_all(%(#{dependent_conditions})) }"
1276
+ when :nullify
1277
+ module_eval "before_destroy { |record| #{reflection.class_name}.update_all(%(#{reflection.primary_key_name} = NULL), %(#{dependent_conditions})) }"
1278
+ else
1279
+ raise ArgumentError, "The :dependent option expects either :destroy, :delete_all, or :nullify (#{reflection.options[:dependent].inspect})"
1280
+ end
1281
+ end
1282
+ end
1283
+
1284
+ def configure_dependency_for_has_one(reflection)
1285
+ if reflection.options.include?(:dependent)
1286
+ case reflection.options[:dependent]
1287
+ when :destroy
1288
+ method_name = "has_one_dependent_destroy_for_#{reflection.name}".to_sym
1289
+ define_method(method_name) do
1290
+ association = send("#{reflection.name}")
1291
+ association.destroy unless association.nil?
1292
+ end
1293
+ before_destroy method_name
1294
+ when :delete
1295
+ method_name = "has_one_dependent_delete_for_#{reflection.name}".to_sym
1296
+ define_method(method_name) do
1297
+ association = send("#{reflection.name}")
1298
+ association.class.delete(association.id) unless association.nil?
1299
+ end
1300
+ before_destroy method_name
1301
+ when :nullify
1302
+ method_name = "has_one_dependent_nullify_for_#{reflection.name}".to_sym
1303
+ define_method(method_name) do
1304
+ association = send("#{reflection.name}")
1305
+ association.update_attribute("#{reflection.primary_key_name}", nil) unless association.nil?
1306
+ end
1307
+ before_destroy method_name
1308
+ else
1309
+ raise ArgumentError, "The :dependent option expects either :destroy, :delete or :nullify (#{reflection.options[:dependent].inspect})"
1310
+ end
1311
+ end
1312
+ end
1313
+
1314
+ def configure_dependency_for_belongs_to(reflection)
1315
+ if reflection.options.include?(:dependent)
1316
+ case reflection.options[:dependent]
1317
+ when :destroy
1318
+ method_name = "belongs_to_dependent_destroy_for_#{reflection.name}".to_sym
1319
+ define_method(method_name) do
1320
+ association = send("#{reflection.name}")
1321
+ association.destroy unless association.nil?
1322
+ end
1323
+ before_destroy method_name
1324
+ when :delete
1325
+ method_name = "belongs_to_dependent_delete_for_#{reflection.name}".to_sym
1326
+ define_method(method_name) do
1327
+ association = send("#{reflection.name}")
1328
+ association.class.delete(association.id) unless association.nil?
1329
+ end
1330
+ before_destroy method_name
1331
+ else
1332
+ raise ArgumentError, "The :dependent option expects either :destroy or :delete (#{reflection.options[:dependent].inspect})"
1333
+ end
1334
+ end
1335
+ end
1336
+
1337
+ def create_has_many_reflection(association_id, options, &extension)
1338
+ options.assert_valid_keys(
1339
+ :class_name, :table_name, :foreign_key,
1340
+ :dependent,
1341
+ :select, :conditions, :include, :order, :group, :limit, :offset,
1342
+ :as, :through, :source, :source_type,
1343
+ :uniq,
1344
+ :finder_sql, :counter_sql,
1345
+ :before_add, :after_add, :before_remove, :after_remove,
1346
+ :extend, :readonly
1347
+ )
1348
+
1349
+ options[:extend] = create_extension_modules(association_id, extension, options[:extend])
1350
+
1351
+ create_reflection(:has_many, association_id, options, self)
1352
+ end
1353
+
1354
+ def create_has_one_reflection(association_id, options)
1355
+ options.assert_valid_keys(
1356
+ :class_name, :foreign_key, :remote, :select, :conditions, :order, :include, :dependent, :counter_cache, :extend, :as, :readonly
1357
+ )
1358
+
1359
+ create_reflection(:has_one, association_id, options, self)
1360
+ end
1361
+
1362
+ def create_has_one_through_reflection(association_id, options)
1363
+ options.assert_valid_keys(
1364
+ :class_name, :foreign_key, :remote, :select, :conditions, :order, :include, :dependent, :counter_cache, :extend, :as, :through, :source, :source_type
1365
+ )
1366
+ create_reflection(:has_one, association_id, options, self)
1367
+ end
1368
+
1369
+ def create_belongs_to_reflection(association_id, options)
1370
+ options.assert_valid_keys(
1371
+ :class_name, :foreign_key, :foreign_type, :remote, :select, :conditions, :include, :dependent,
1372
+ :counter_cache, :extend, :polymorphic, :readonly
1373
+ )
1374
+
1375
+ reflection = create_reflection(:belongs_to, association_id, options, self)
1376
+
1377
+ if options[:polymorphic]
1378
+ reflection.options[:foreign_type] ||= reflection.class_name.underscore + "_type"
1379
+ end
1380
+
1381
+ reflection
1382
+ end
1383
+
1384
+ def create_has_and_belongs_to_many_reflection(association_id, options, &extension)
1385
+ options.assert_valid_keys(
1386
+ :class_name, :table_name, :join_table, :foreign_key, :association_foreign_key,
1387
+ :select, :conditions, :include, :order, :group, :limit, :offset,
1388
+ :uniq,
1389
+ :finder_sql, :delete_sql, :insert_sql,
1390
+ :before_add, :after_add, :before_remove, :after_remove,
1391
+ :extend, :readonly
1392
+ )
1393
+
1394
+ options[:extend] = create_extension_modules(association_id, extension, options[:extend])
1395
+
1396
+ reflection = create_reflection(:has_and_belongs_to_many, association_id, options, self)
1397
+
1398
+ reflection.options[:join_table] ||= join_table_name(undecorated_table_name(self.to_s), undecorated_table_name(reflection.class_name))
1399
+
1400
+ reflection
1401
+ end
1402
+
1403
+ def reflect_on_included_associations(associations)
1404
+ [ associations ].flatten.collect { |association| reflect_on_association(association.to_s.intern) }
1405
+ end
1406
+
1407
+ def guard_against_unlimitable_reflections(reflections, options)
1408
+ if (options[:offset] || options[:limit]) && !using_limitable_reflections?(reflections)
1409
+ raise(
1410
+ ConfigurationError,
1411
+ "You can not use offset and limit together with has_many or has_and_belongs_to_many associations"
1412
+ )
1413
+ end
1414
+ end
1415
+
1416
+ def select_all_rows(options, join_dependency)
1417
+ connection.select_all(
1418
+ construct_finder_sql_with_included_associations(options, join_dependency),
1419
+ "#{name} Load Including Associations"
1420
+ )
1421
+ end
1422
+
1423
+ def construct_finder_sql_with_included_associations(options, join_dependency)
1424
+ scope = scope(:find)
1425
+ sql = "SELECT #{column_aliases(join_dependency)} FROM #{(scope && scope[:from]) || options[:from] || quoted_table_name} "
1426
+ sql << join_dependency.join_associations.collect{|join| join.association_join }.join
1427
+
1428
+ add_joins!(sql, options, scope)
1429
+ add_conditions!(sql, options[:conditions], scope)
1430
+ add_limited_ids_condition!(sql, options, join_dependency) if !using_limitable_reflections?(join_dependency.reflections) && ((scope && scope[:limit]) || options[:limit])
1431
+
1432
+ add_group!(sql, options[:group], scope)
1433
+ add_order!(sql, options[:order], scope)
1434
+ add_limit!(sql, options, scope) if using_limitable_reflections?(join_dependency.reflections)
1435
+ add_lock!(sql, options, scope)
1436
+
1437
+ return sanitize_sql(sql)
1438
+ end
1439
+
1440
+ def add_limited_ids_condition!(sql, options, join_dependency)
1441
+ unless (id_list = select_limited_ids_list(options, join_dependency)).empty?
1442
+ sql << "#{condition_word(sql)} #{connection.quote_table_name table_name}.#{primary_key} IN (#{id_list}) "
1443
+ else
1444
+ throw :invalid_query
1445
+ end
1446
+ end
1447
+
1448
+ def select_limited_ids_list(options, join_dependency)
1449
+ pk = columns_hash[primary_key]
1450
+
1451
+ connection.select_all(
1452
+ construct_finder_sql_for_association_limiting(options, join_dependency),
1453
+ "#{name} Load IDs For Limited Eager Loading"
1454
+ ).collect { |row| connection.quote(row[primary_key], pk) }.join(", ")
1455
+ end
1456
+
1457
+ def construct_finder_sql_for_association_limiting(options, join_dependency)
1458
+ scope = scope(:find)
1459
+
1460
+ # Only join tables referenced in order or conditions since this is particularly slow on the pre-query.
1461
+ tables_from_conditions = conditions_tables(options)
1462
+ tables_from_order = order_tables(options)
1463
+ all_tables = tables_from_conditions + tables_from_order
1464
+ distinct_join_associations = all_tables.uniq.map{|table|
1465
+ join_dependency.joins_for_table_name(table)
1466
+ }.flatten.compact.uniq
1467
+
1468
+ is_distinct = !options[:joins].blank? || include_eager_conditions?(options, tables_from_conditions) || include_eager_order?(options, tables_from_order)
1469
+ sql = "SELECT "
1470
+ if is_distinct
1471
+ sql << connection.distinct("#{connection.quote_table_name table_name}.#{primary_key}", options[:order])
1472
+ else
1473
+ sql << primary_key
1474
+ end
1475
+ sql << " FROM #{connection.quote_table_name table_name} "
1476
+
1477
+ if is_distinct
1478
+ sql << distinct_join_associations.collect(&:association_join).join
1479
+ add_joins!(sql, options, scope)
1480
+ end
1481
+
1482
+ add_conditions!(sql, options[:conditions], scope)
1483
+ add_group!(sql, options[:group], scope)
1484
+
1485
+ if options[:order] && is_distinct
1486
+ connection.add_order_by_for_association_limiting!(sql, options)
1487
+ else
1488
+ add_order!(sql, options[:order], scope)
1489
+ end
1490
+
1491
+ add_limit!(sql, options, scope)
1492
+
1493
+ return sanitize_sql(sql)
1494
+ end
1495
+
1496
+ def conditions_tables(options)
1497
+ # look in both sets of conditions
1498
+ conditions = [scope(:find, :conditions), options[:conditions]].inject([]) do |all, cond|
1499
+ case cond
1500
+ when nil then all
1501
+ when Array then all << cond.first
1502
+ else all << cond
1503
+ end
1504
+ end
1505
+ conditions.join(' ').scan(/([\.\w]+).?\./).flatten
1506
+ end
1507
+
1508
+ def order_tables(options)
1509
+ order = options[:order]
1510
+ return [] unless order && order.is_a?(String)
1511
+ order.scan(/([\.\w]+).?\./).flatten
1512
+ end
1513
+
1514
+ def selects_tables(options)
1515
+ select = options[:select]
1516
+ return [] unless select && select.is_a?(String)
1517
+ select.scan(/"?([\.\w]+)"?.?\./).flatten
1518
+ end
1519
+
1520
+ # Checks if the conditions reference a table other than the current model table
1521
+ def include_eager_conditions?(options, tables = nil)
1522
+ ((tables || conditions_tables(options)) - [table_name]).any?
1523
+ end
1524
+
1525
+ # Checks if the query order references a table other than the current model's table.
1526
+ def include_eager_order?(options, tables = nil)
1527
+ ((tables || order_tables(options)) - [table_name]).any?
1528
+ end
1529
+
1530
+ def include_eager_select?(options)
1531
+ (selects_tables(options) - [table_name]).any?
1532
+ end
1533
+
1534
+ def references_eager_loaded_tables?(options)
1535
+ include_eager_order?(options) || include_eager_conditions?(options) || include_eager_select?(options)
1536
+ end
1537
+
1538
+ def using_limitable_reflections?(reflections)
1539
+ reflections.reject { |r| [ :belongs_to, :has_one ].include?(r.macro) }.length.zero?
1540
+ end
1541
+
1542
+ def column_aliases(join_dependency)
1543
+ join_dependency.joins.collect{|join| join.column_names_with_alias.collect{|column_name, aliased_name|
1544
+ "#{connection.quote_table_name join.aliased_table_name}.#{connection.quote_column_name column_name} AS #{aliased_name}"}}.flatten.join(", ")
1545
+ end
1546
+
1547
+ def add_association_callbacks(association_name, options)
1548
+ callbacks = %w(before_add after_add before_remove after_remove)
1549
+ callbacks.each do |callback_name|
1550
+ full_callback_name = "#{callback_name}_for_#{association_name}"
1551
+ defined_callbacks = options[callback_name.to_sym]
1552
+ if options.has_key?(callback_name.to_sym)
1553
+ class_inheritable_reader full_callback_name.to_sym
1554
+ write_inheritable_attribute(full_callback_name.to_sym, [defined_callbacks].flatten)
1555
+ else
1556
+ write_inheritable_attribute(full_callback_name.to_sym, [])
1557
+ end
1558
+ end
1559
+ end
1560
+
1561
+ def condition_word(sql)
1562
+ sql =~ /where/i ? " AND " : "WHERE "
1563
+ end
1564
+
1565
+ def create_extension_modules(association_id, block_extension, extensions)
1566
+ if block_extension
1567
+ extension_module_name = "#{self.to_s}#{association_id.to_s.camelize}AssociationExtension"
1568
+
1569
+ silence_warnings do
1570
+ Object.const_set(extension_module_name, Module.new(&block_extension))
1571
+ end
1572
+ Array(extensions).push(extension_module_name.constantize)
1573
+ else
1574
+ Array(extensions)
1575
+ end
1576
+ end
1577
+
1578
+ class JoinDependency # :nodoc:
1579
+ attr_reader :joins, :reflections, :table_aliases
1580
+
1581
+ def initialize(base, associations, joins)
1582
+ @joins = [JoinBase.new(base, joins)]
1583
+ @associations = associations
1584
+ @reflections = []
1585
+ @base_records_hash = {}
1586
+ @base_records_in_order = []
1587
+ @table_aliases = Hash.new { |aliases, table| aliases[table] = 0 }
1588
+ @table_aliases[base.table_name] = 1
1589
+ build(associations)
1590
+ end
1591
+
1592
+ def join_associations
1593
+ @joins[1..-1].to_a
1594
+ end
1595
+
1596
+ def join_base
1597
+ @joins[0]
1598
+ end
1599
+
1600
+ def instantiate(rows)
1601
+ rows.each_with_index do |row, i|
1602
+ primary_id = join_base.record_id(row)
1603
+ unless @base_records_hash[primary_id]
1604
+ @base_records_in_order << (@base_records_hash[primary_id] = join_base.instantiate(row))
1605
+ end
1606
+ construct(@base_records_hash[primary_id], @associations, join_associations.dup, row)
1607
+ end
1608
+ remove_duplicate_results!(join_base.active_record, @base_records_in_order, @associations)
1609
+ return @base_records_in_order
1610
+ end
1611
+
1612
+ def remove_duplicate_results!(base, records, associations)
1613
+ case associations
1614
+ when Symbol, String
1615
+ reflection = base.reflections[associations]
1616
+ if reflection && [:has_many, :has_and_belongs_to_many].include?(reflection.macro)
1617
+ records.each { |record| record.send(reflection.name).target.uniq! }
1618
+ end
1619
+ when Array
1620
+ associations.each do |association|
1621
+ remove_duplicate_results!(base, records, association)
1622
+ end
1623
+ when Hash
1624
+ associations.keys.each do |name|
1625
+ reflection = base.reflections[name]
1626
+ is_collection = [:has_many, :has_and_belongs_to_many].include?(reflection.macro)
1627
+
1628
+ parent_records = records.map do |record|
1629
+ descendant = record.send(reflection.name)
1630
+ next unless descendant
1631
+ descendant.target.uniq! if is_collection
1632
+ descendant
1633
+ end.flatten.compact
1634
+
1635
+ remove_duplicate_results!(reflection.class_name.constantize, parent_records, associations[name]) unless parent_records.empty?
1636
+ end
1637
+ end
1638
+ end
1639
+
1640
+ def join_for_table_name(table_name)
1641
+ @joins.select{|j|j.aliased_table_name == table_name.gsub(/^\"(.*)\"$/){$1} }.first rescue nil
1642
+ end
1643
+
1644
+ def joins_for_table_name(table_name)
1645
+ join = join_for_table_name(table_name)
1646
+ result = nil
1647
+ if join && join.is_a?(JoinAssociation)
1648
+ result = [join]
1649
+ if join.parent && join.parent.is_a?(JoinAssociation)
1650
+ result = joins_for_table_name(join.parent.aliased_table_name) +
1651
+ result
1652
+ end
1653
+ end
1654
+ result
1655
+ end
1656
+
1657
+ protected
1658
+ def build(associations, parent = nil)
1659
+ parent ||= @joins.last
1660
+ case associations
1661
+ when Symbol, String
1662
+ reflection = parent.reflections[associations.to_s.intern] or
1663
+ raise ConfigurationError, "Association named '#{ associations }' was not found; perhaps you misspelled it?"
1664
+ @reflections << reflection
1665
+ @joins << build_join_association(reflection, parent)
1666
+ when Array
1667
+ associations.each do |association|
1668
+ build(association, parent)
1669
+ end
1670
+ when Hash
1671
+ associations.keys.sort{|a,b|a.to_s<=>b.to_s}.each do |name|
1672
+ build(name, parent)
1673
+ build(associations[name])
1674
+ end
1675
+ else
1676
+ raise ConfigurationError, associations.inspect
1677
+ end
1678
+ end
1679
+
1680
+ # overridden in InnerJoinDependency subclass
1681
+ def build_join_association(reflection, parent)
1682
+ JoinAssociation.new(reflection, self, parent)
1683
+ end
1684
+
1685
+ def construct(parent, associations, joins, row)
1686
+ case associations
1687
+ when Symbol, String
1688
+ while (join = joins.shift).reflection.name.to_s != associations.to_s
1689
+ raise ConfigurationError, "Not Enough Associations" if joins.empty?
1690
+ end
1691
+ construct_association(parent, join, row)
1692
+ when Array
1693
+ associations.each do |association|
1694
+ construct(parent, association, joins, row)
1695
+ end
1696
+ when Hash
1697
+ associations.keys.sort{|a,b|a.to_s<=>b.to_s}.each do |name|
1698
+ association = construct_association(parent, joins.shift, row)
1699
+ construct(association, associations[name], joins, row) if association
1700
+ end
1701
+ else
1702
+ raise ConfigurationError, associations.inspect
1703
+ end
1704
+ end
1705
+
1706
+ def construct_association(record, join, row)
1707
+ case join.reflection.macro
1708
+ when :has_many, :has_and_belongs_to_many
1709
+ collection = record.send(join.reflection.name)
1710
+ collection.loaded
1711
+
1712
+ return nil if record.id.to_s != join.parent.record_id(row).to_s or row[join.aliased_primary_key].nil?
1713
+ association = join.instantiate(row)
1714
+ collection.target.push(association)
1715
+ when :has_one
1716
+ return if record.id.to_s != join.parent.record_id(row).to_s
1717
+ association = join.instantiate(row) unless row[join.aliased_primary_key].nil?
1718
+ record.send("set_#{join.reflection.name}_target", association)
1719
+ when :belongs_to
1720
+ return if record.id.to_s != join.parent.record_id(row).to_s or row[join.aliased_primary_key].nil?
1721
+ association = join.instantiate(row)
1722
+ record.send("set_#{join.reflection.name}_target", association)
1723
+ else
1724
+ raise ConfigurationError, "unknown macro: #{join.reflection.macro}"
1725
+ end
1726
+ return association
1727
+ end
1728
+
1729
+ class JoinBase # :nodoc:
1730
+ attr_reader :active_record, :table_joins
1731
+ delegate :table_name, :column_names, :primary_key, :reflections, :sanitize_sql, :to => :active_record
1732
+
1733
+ def initialize(active_record, joins = nil)
1734
+ @active_record = active_record
1735
+ @cached_record = {}
1736
+ @table_joins = joins
1737
+ end
1738
+
1739
+ def aliased_prefix
1740
+ "t0"
1741
+ end
1742
+
1743
+ def aliased_primary_key
1744
+ "#{ aliased_prefix }_r0"
1745
+ end
1746
+
1747
+ def aliased_table_name
1748
+ active_record.table_name
1749
+ end
1750
+
1751
+ def column_names_with_alias
1752
+ unless defined?(@column_names_with_alias)
1753
+ @column_names_with_alias = []
1754
+
1755
+ ([primary_key] + (column_names - [primary_key])).each_with_index do |column_name, i|
1756
+ @column_names_with_alias << [column_name, "#{ aliased_prefix }_r#{ i }"]
1757
+ end
1758
+ end
1759
+
1760
+ @column_names_with_alias
1761
+ end
1762
+
1763
+ def extract_record(row)
1764
+ column_names_with_alias.inject({}){|record, (cn, an)| record[cn] = row[an]; record}
1765
+ end
1766
+
1767
+ def record_id(row)
1768
+ row[aliased_primary_key]
1769
+ end
1770
+
1771
+ def instantiate(row)
1772
+ @cached_record[record_id(row)] ||= active_record.send(:instantiate, extract_record(row))
1773
+ end
1774
+ end
1775
+
1776
+ class JoinAssociation < JoinBase # :nodoc:
1777
+ attr_reader :reflection, :parent, :aliased_table_name, :aliased_prefix, :aliased_join_table_name, :parent_table_name
1778
+ delegate :options, :klass, :through_reflection, :source_reflection, :to => :reflection
1779
+
1780
+ def initialize(reflection, join_dependency, parent = nil)
1781
+ reflection.check_validity!
1782
+ if reflection.options[:polymorphic]
1783
+ raise EagerLoadPolymorphicError.new(reflection)
1784
+ end
1785
+
1786
+ super(reflection.klass)
1787
+ @join_dependency = join_dependency
1788
+ @parent = parent
1789
+ @reflection = reflection
1790
+ @aliased_prefix = "t#{ join_dependency.joins.size }"
1791
+ @parent_table_name = parent.active_record.table_name
1792
+ @aliased_table_name = aliased_table_name_for(table_name)
1793
+
1794
+ if reflection.macro == :has_and_belongs_to_many
1795
+ @aliased_join_table_name = aliased_table_name_for(reflection.options[:join_table], "_join")
1796
+ end
1797
+
1798
+ if reflection.macro == :has_many && reflection.options[:through]
1799
+ @aliased_join_table_name = aliased_table_name_for(reflection.through_reflection.klass.table_name, "_join")
1800
+ end
1801
+ end
1802
+
1803
+ def association_join
1804
+ connection = reflection.active_record.connection
1805
+ join = case reflection.macro
1806
+ when :has_and_belongs_to_many
1807
+ " #{join_type} %s ON %s.%s = %s.%s " % [
1808
+ table_alias_for(options[:join_table], aliased_join_table_name),
1809
+ connection.quote_table_name(aliased_join_table_name),
1810
+ options[:foreign_key] || reflection.active_record.to_s.foreign_key,
1811
+ connection.quote_table_name(parent.aliased_table_name),
1812
+ reflection.active_record.primary_key] +
1813
+ " #{join_type} %s ON %s.%s = %s.%s " % [
1814
+ table_name_and_alias,
1815
+ connection.quote_table_name(aliased_table_name),
1816
+ klass.primary_key,
1817
+ connection.quote_table_name(aliased_join_table_name),
1818
+ options[:association_foreign_key] || klass.to_s.foreign_key
1819
+ ]
1820
+ when :has_many, :has_one
1821
+ case
1822
+ when reflection.macro == :has_many && reflection.options[:through]
1823
+ through_conditions = through_reflection.options[:conditions] ? "AND #{interpolate_sql(sanitize_sql(through_reflection.options[:conditions]))}" : ''
1824
+
1825
+ jt_foreign_key = jt_as_extra = jt_source_extra = jt_sti_extra = nil
1826
+ first_key = second_key = as_extra = nil
1827
+
1828
+ if through_reflection.options[:as] # has_many :through against a polymorphic join
1829
+ jt_foreign_key = through_reflection.options[:as].to_s + '_id'
1830
+ jt_as_extra = " AND %s.%s = %s" % [
1831
+ connection.quote_table_name(aliased_join_table_name),
1832
+ connection.quote_column_name(through_reflection.options[:as].to_s + '_type'),
1833
+ klass.quote_value(parent.active_record.base_class.name)
1834
+ ]
1835
+ else
1836
+ jt_foreign_key = through_reflection.primary_key_name
1837
+ end
1838
+
1839
+ case source_reflection.macro
1840
+ when :has_many
1841
+ if source_reflection.options[:as]
1842
+ first_key = "#{source_reflection.options[:as]}_id"
1843
+ second_key = options[:foreign_key] || primary_key
1844
+ as_extra = " AND %s.%s = %s" % [
1845
+ connection.quote_table_name(aliased_table_name),
1846
+ connection.quote_column_name("#{source_reflection.options[:as]}_type"),
1847
+ klass.quote_value(source_reflection.active_record.base_class.name)
1848
+ ]
1849
+ else
1850
+ first_key = through_reflection.klass.base_class.to_s.foreign_key
1851
+ second_key = options[:foreign_key] || primary_key
1852
+ end
1853
+
1854
+ unless through_reflection.klass.descends_from_active_record?
1855
+ jt_sti_extra = " AND %s.%s = %s" % [
1856
+ connection.quote_table_name(aliased_join_table_name),
1857
+ connection.quote_column_name(through_reflection.active_record.inheritance_column),
1858
+ through_reflection.klass.quote_value(through_reflection.klass.name.demodulize)]
1859
+ end
1860
+ when :belongs_to
1861
+ first_key = primary_key
1862
+ if reflection.options[:source_type]
1863
+ second_key = source_reflection.association_foreign_key
1864
+ jt_source_extra = " AND %s.%s = %s" % [
1865
+ connection.quote_table_name(aliased_join_table_name),
1866
+ connection.quote_column_name(reflection.source_reflection.options[:foreign_type]),
1867
+ klass.quote_value(reflection.options[:source_type])
1868
+ ]
1869
+ else
1870
+ second_key = source_reflection.primary_key_name
1871
+ end
1872
+ end
1873
+
1874
+ " #{join_type} %s ON (%s.%s = %s.%s%s%s%s) " % [
1875
+ table_alias_for(through_reflection.klass.table_name, aliased_join_table_name),
1876
+ connection.quote_table_name(parent.aliased_table_name),
1877
+ connection.quote_column_name(parent.primary_key),
1878
+ connection.quote_table_name(aliased_join_table_name),
1879
+ connection.quote_column_name(jt_foreign_key),
1880
+ jt_as_extra, jt_source_extra, jt_sti_extra
1881
+ ] +
1882
+ " #{join_type} %s ON (%s.%s = %s.%s%s) " % [
1883
+ table_name_and_alias,
1884
+ connection.quote_table_name(aliased_table_name),
1885
+ connection.quote_column_name(first_key),
1886
+ connection.quote_table_name(aliased_join_table_name),
1887
+ connection.quote_column_name(second_key),
1888
+ as_extra
1889
+ ]
1890
+
1891
+ when reflection.options[:as] && [:has_many, :has_one].include?(reflection.macro)
1892
+ " #{join_type} %s ON %s.%s = %s.%s AND %s.%s = %s" % [
1893
+ table_name_and_alias,
1894
+ connection.quote_table_name(aliased_table_name),
1895
+ "#{reflection.options[:as]}_id",
1896
+ connection.quote_table_name(parent.aliased_table_name),
1897
+ parent.primary_key,
1898
+ connection.quote_table_name(aliased_table_name),
1899
+ "#{reflection.options[:as]}_type",
1900
+ klass.quote_value(parent.active_record.base_class.name)
1901
+ ]
1902
+ else
1903
+ foreign_key = options[:foreign_key] || reflection.active_record.name.foreign_key
1904
+ " #{join_type} %s ON %s.%s = %s.%s " % [
1905
+ table_name_and_alias,
1906
+ aliased_table_name,
1907
+ foreign_key,
1908
+ parent.aliased_table_name,
1909
+ parent.primary_key
1910
+ ]
1911
+ end
1912
+ when :belongs_to
1913
+ " #{join_type} %s ON %s.%s = %s.%s " % [
1914
+ table_name_and_alias,
1915
+ connection.quote_table_name(aliased_table_name),
1916
+ reflection.klass.primary_key,
1917
+ connection.quote_table_name(parent.aliased_table_name),
1918
+ options[:foreign_key] || reflection.primary_key_name
1919
+ ]
1920
+ else
1921
+ ""
1922
+ end || ''
1923
+ join << %(AND %s.%s = %s ) % [
1924
+ connection.quote_table_name(aliased_table_name),
1925
+ connection.quote_column_name(klass.inheritance_column),
1926
+ klass.quote_value(klass.name.demodulize)] unless klass.descends_from_active_record?
1927
+
1928
+ [through_reflection, reflection].each do |ref|
1929
+ join << "AND #{interpolate_sql(sanitize_sql(ref.options[:conditions]))} " if ref && ref.options[:conditions]
1930
+ end
1931
+
1932
+ join
1933
+ end
1934
+
1935
+ protected
1936
+
1937
+ def aliased_table_name_for(name, suffix = nil)
1938
+ if !parent.table_joins.blank? && parent.table_joins.to_s.downcase =~ %r{join(\s+\w+)?\s+#{name.downcase}\son}
1939
+ @join_dependency.table_aliases[name] += 1
1940
+ end
1941
+
1942
+ unless @join_dependency.table_aliases[name].zero?
1943
+ # if the table name has been used, then use an alias
1944
+ name = active_record.connection.table_alias_for "#{pluralize(reflection.name)}_#{parent_table_name}#{suffix}"
1945
+ table_index = @join_dependency.table_aliases[name]
1946
+ @join_dependency.table_aliases[name] += 1
1947
+ name = name[0..active_record.connection.table_alias_length-3] + "_#{table_index+1}" if table_index > 0
1948
+ else
1949
+ @join_dependency.table_aliases[name] += 1
1950
+ end
1951
+
1952
+ name
1953
+ end
1954
+
1955
+ def pluralize(table_name)
1956
+ ActiveRecord::Base.pluralize_table_names ? table_name.to_s.pluralize : table_name
1957
+ end
1958
+
1959
+ def table_alias_for(table_name, table_alias)
1960
+ "#{reflection.active_record.connection.quote_table_name(table_name)} #{table_alias if table_name != table_alias}".strip
1961
+ end
1962
+
1963
+ def table_name_and_alias
1964
+ table_alias_for table_name, @aliased_table_name
1965
+ end
1966
+
1967
+ def interpolate_sql(sql)
1968
+ instance_eval("%@#{sql.gsub('@', '\@')}@")
1969
+ end
1970
+
1971
+ private
1972
+ def join_type
1973
+ "LEFT OUTER JOIN"
1974
+ end
1975
+ end
1976
+ end
1977
+
1978
+ class InnerJoinDependency < JoinDependency # :nodoc:
1979
+ protected
1980
+ def build_join_association(reflection, parent)
1981
+ InnerJoinAssociation.new(reflection, self, parent)
1982
+ end
1983
+
1984
+ class InnerJoinAssociation < JoinAssociation
1985
+ private
1986
+ def join_type
1987
+ "INNER JOIN"
1988
+ end
1989
+ end
1990
+ end
1991
+
1992
+ end
1993
+ end
1994
+ end