3mix-castronaut 0.5.0.2

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 (904) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.textile +75 -0
  3. data/Rakefile +105 -0
  4. data/app/config.rb +15 -0
  5. data/app/config.ru +24 -0
  6. data/app/controllers/application.rb +47 -0
  7. data/app/public/javascripts/application.js +3 -0
  8. data/app/public/javascripts/jquery.js +32 -0
  9. data/app/public/stylesheets/screen.css +122 -0
  10. data/app/views/layout.erb +27 -0
  11. data/app/views/login.erb +31 -0
  12. data/app/views/logout.erb +13 -0
  13. data/app/views/proxy_validate.erb +25 -0
  14. data/app/views/service_validate.erb +18 -0
  15. data/bin/castronaut +48 -0
  16. data/castronaut.rb +7 -0
  17. data/config/castronaut.example.yml +47 -0
  18. data/config/nginx_vhost.conf +24 -0
  19. data/config/thin_config.yml +13 -0
  20. data/lib/castronaut/adapters/active_record_adapter.rb +20 -0
  21. data/lib/castronaut/adapters/development/adapter.rb +13 -0
  22. data/lib/castronaut/adapters/development/user.rb +25 -0
  23. data/lib/castronaut/adapters/ldap/adapter.rb +15 -0
  24. data/lib/castronaut/adapters/ldap/user.rb +40 -0
  25. data/lib/castronaut/adapters/restful_authentication/adapter.rb +21 -0
  26. data/lib/castronaut/adapters/restful_authentication/user.rb +50 -0
  27. data/lib/castronaut/adapters.rb +17 -0
  28. data/lib/castronaut/authentication_result.rb +27 -0
  29. data/lib/castronaut/configuration.rb +95 -0
  30. data/lib/castronaut/db/001_create_cas_database.rb +47 -0
  31. data/lib/castronaut/db/002_change_username_to_identifier.rb +11 -0
  32. data/lib/castronaut/db/003_add_extra_info.rb +11 -0
  33. data/lib/castronaut/models/consumeable.rb +18 -0
  34. data/lib/castronaut/models/dispenser.rb +14 -0
  35. data/lib/castronaut/models/login_ticket.rb +53 -0
  36. data/lib/castronaut/models/proxy_granting_ticket.rb +69 -0
  37. data/lib/castronaut/models/proxy_ticket.rb +43 -0
  38. data/lib/castronaut/models/service_ticket.rb +100 -0
  39. data/lib/castronaut/models/ticket_granting_ticket.rb +70 -0
  40. data/lib/castronaut/presenters/base.rb +32 -0
  41. data/lib/castronaut/presenters/login.rb +60 -0
  42. data/lib/castronaut/presenters/logout.rb +40 -0
  43. data/lib/castronaut/presenters/process_login.rb +127 -0
  44. data/lib/castronaut/presenters/proxy_validate.rb +49 -0
  45. data/lib/castronaut/presenters/service_validate.rb +43 -0
  46. data/lib/castronaut/ticket_result.rb +27 -0
  47. data/lib/castronaut/utilities/random_string.rb +24 -0
  48. data/lib/castronaut.rb +34 -0
  49. data/lib/version.rb +5 -0
  50. data/spec/app/controllers/application_spec.rb +89 -0
  51. data/spec/castronaut/adapters/development/adapter_spec.rb +14 -0
  52. data/spec/castronaut/adapters/development/user_spec.rb +55 -0
  53. data/spec/castronaut/adapters/ldap/adapter_spec.rb +14 -0
  54. data/spec/castronaut/adapters/ldap/user_spec.rb +25 -0
  55. data/spec/castronaut/adapters/restful_authentication/adapter_spec.rb +14 -0
  56. data/spec/castronaut/adapters/restful_authentication/user_spec.rb +108 -0
  57. data/spec/castronaut/adapters_spec.rb +13 -0
  58. data/spec/castronaut/authentication_result_spec.rb +20 -0
  59. data/spec/castronaut/configuration_spec.rb +172 -0
  60. data/spec/castronaut/models/consumeable_spec.rb +39 -0
  61. data/spec/castronaut/models/dispenser_spec.rb +30 -0
  62. data/spec/castronaut/models/login_ticket_spec.rb +107 -0
  63. data/spec/castronaut/models/proxy_granting_ticket_spec.rb +302 -0
  64. data/spec/castronaut/models/proxy_ticket_spec.rb +109 -0
  65. data/spec/castronaut/models/service_ticket_spec.rb +269 -0
  66. data/spec/castronaut/models/ticket_granting_ticket_spec.rb +89 -0
  67. data/spec/castronaut/presenters/login_spec.rb +152 -0
  68. data/spec/castronaut/presenters/logout_spec.rb +85 -0
  69. data/spec/castronaut/presenters/process_login_spec.rb +300 -0
  70. data/spec/castronaut/presenters/proxy_validate_spec.rb +103 -0
  71. data/spec/castronaut/presenters/service_validate_spec.rb +86 -0
  72. data/spec/castronaut/ticket_result_spec.rb +42 -0
  73. data/spec/castronaut/utilities/random_string_spec.rb +14 -0
  74. data/spec/castronaut_spec.rb +26 -0
  75. data/spec/spec.opts +2 -0
  76. data/spec/spec_controller_helper.rb +17 -0
  77. data/spec/spec_helper.rb +49 -0
  78. data/spec/spec_rails_mocks.rb +132 -0
  79. data/vendor/activerecord/CHANGELOG +5753 -0
  80. data/vendor/activerecord/README +351 -0
  81. data/vendor/activerecord/RUNNING_UNIT_TESTS +36 -0
  82. data/vendor/activerecord/Rakefile +248 -0
  83. data/vendor/activerecord/examples/associations.png +0 -0
  84. data/vendor/activerecord/install.rb +30 -0
  85. data/vendor/activerecord/lib/active_record/aggregations.rb +189 -0
  86. data/vendor/activerecord/lib/active_record/association_preload.rb +282 -0
  87. data/vendor/activerecord/lib/active_record/associations/association_collection.rb +368 -0
  88. data/vendor/activerecord/lib/active_record/associations/association_proxy.rb +220 -0
  89. data/vendor/activerecord/lib/active_record/associations/belongs_to_association.rb +58 -0
  90. data/vendor/activerecord/lib/active_record/associations/belongs_to_polymorphic_association.rb +49 -0
  91. data/vendor/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb +111 -0
  92. data/vendor/activerecord/lib/active_record/associations/has_many_association.rb +121 -0
  93. data/vendor/activerecord/lib/active_record/associations/has_many_through_association.rb +254 -0
  94. data/vendor/activerecord/lib/active_record/associations/has_one_association.rb +98 -0
  95. data/vendor/activerecord/lib/active_record/associations/has_one_through_association.rb +32 -0
  96. data/vendor/activerecord/lib/active_record/associations.rb +2012 -0
  97. data/vendor/activerecord/lib/active_record/attribute_methods.rb +379 -0
  98. data/vendor/activerecord/lib/active_record/base.rb +2744 -0
  99. data/vendor/activerecord/lib/active_record/calculations.rb +288 -0
  100. data/vendor/activerecord/lib/active_record/callbacks.rb +312 -0
  101. data/vendor/activerecord/lib/active_record/connection_adapters/abstract/connection_specification.rb +309 -0
  102. data/vendor/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb +176 -0
  103. data/vendor/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb +93 -0
  104. data/vendor/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb +69 -0
  105. data/vendor/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb +664 -0
  106. data/vendor/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb +428 -0
  107. data/vendor/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +169 -0
  108. data/vendor/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +559 -0
  109. data/vendor/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +994 -0
  110. data/vendor/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb +34 -0
  111. data/vendor/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb +418 -0
  112. data/vendor/activerecord/lib/active_record/dirty.rb +165 -0
  113. data/vendor/activerecord/lib/active_record/fixtures.rb +997 -0
  114. data/vendor/activerecord/lib/active_record/locking/optimistic.rb +148 -0
  115. data/vendor/activerecord/lib/active_record/locking/pessimistic.rb +77 -0
  116. data/vendor/activerecord/lib/active_record/migration.rb +523 -0
  117. data/vendor/activerecord/lib/active_record/named_scope.rb +168 -0
  118. data/vendor/activerecord/lib/active_record/observer.rb +197 -0
  119. data/vendor/activerecord/lib/active_record/query_cache.rb +21 -0
  120. data/vendor/activerecord/lib/active_record/reflection.rb +239 -0
  121. data/vendor/activerecord/lib/active_record/schema.rb +51 -0
  122. data/vendor/activerecord/lib/active_record/schema_dumper.rb +171 -0
  123. data/vendor/activerecord/lib/active_record/serialization.rb +98 -0
  124. data/vendor/activerecord/lib/active_record/serializers/json_serializer.rb +80 -0
  125. data/vendor/activerecord/lib/active_record/serializers/xml_serializer.rb +338 -0
  126. data/vendor/activerecord/lib/active_record/test_case.rb +47 -0
  127. data/vendor/activerecord/lib/active_record/timestamp.rb +41 -0
  128. data/vendor/activerecord/lib/active_record/transactions.rb +130 -0
  129. data/vendor/activerecord/lib/active_record/validations.rb +971 -0
  130. data/vendor/activerecord/lib/active_record/vendor/mysql.rb +1214 -0
  131. data/vendor/activerecord/lib/active_record/version.rb +9 -0
  132. data/vendor/activerecord/lib/active_record.rb +80 -0
  133. data/vendor/activerecord/lib/activerecord.rb +1 -0
  134. data/vendor/activerecord/test/assets/example.log +1 -0
  135. data/vendor/activerecord/test/assets/flowers.jpg +0 -0
  136. data/vendor/activerecord/test/cases/aaa_create_tables_test.rb +24 -0
  137. data/vendor/activerecord/test/cases/active_schema_test_mysql.rb +95 -0
  138. data/vendor/activerecord/test/cases/active_schema_test_postgresql.rb +24 -0
  139. data/vendor/activerecord/test/cases/adapter_test.rb +127 -0
  140. data/vendor/activerecord/test/cases/adapter_test_sqlserver.rb +95 -0
  141. data/vendor/activerecord/test/cases/aggregations_test.rb +128 -0
  142. data/vendor/activerecord/test/cases/ar_schema_test.rb +33 -0
  143. data/vendor/activerecord/test/cases/associations/belongs_to_associations_test.rb +431 -0
  144. data/vendor/activerecord/test/cases/associations/callbacks_test.rb +161 -0
  145. data/vendor/activerecord/test/cases/associations/cascaded_eager_loading_test.rb +123 -0
  146. data/vendor/activerecord/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -0
  147. data/vendor/activerecord/test/cases/associations/eager_load_nested_include_test.rb +83 -0
  148. data/vendor/activerecord/test/cases/associations/eager_singularization_test.rb +145 -0
  149. data/vendor/activerecord/test/cases/associations/eager_test.rb +636 -0
  150. data/vendor/activerecord/test/cases/associations/extension_test.rb +47 -0
  151. data/vendor/activerecord/test/cases/associations/has_and_belongs_to_many_associations_test.rb +706 -0
  152. data/vendor/activerecord/test/cases/associations/has_many_associations_test.rb +1034 -0
  153. data/vendor/activerecord/test/cases/associations/has_many_through_associations_test.rb +200 -0
  154. data/vendor/activerecord/test/cases/associations/has_one_associations_test.rb +345 -0
  155. data/vendor/activerecord/test/cases/associations/has_one_through_associations_test.rb +113 -0
  156. data/vendor/activerecord/test/cases/associations/inner_join_association_test.rb +88 -0
  157. data/vendor/activerecord/test/cases/associations/join_model_test.rb +714 -0
  158. data/vendor/activerecord/test/cases/associations_test.rb +262 -0
  159. data/vendor/activerecord/test/cases/attribute_methods_test.rb +238 -0
  160. data/vendor/activerecord/test/cases/base_test.rb +1997 -0
  161. data/vendor/activerecord/test/cases/binary_test.rb +34 -0
  162. data/vendor/activerecord/test/cases/calculations_test.rb +323 -0
  163. data/vendor/activerecord/test/cases/callbacks_test.rb +400 -0
  164. data/vendor/activerecord/test/cases/class_inheritable_attributes_test.rb +32 -0
  165. data/vendor/activerecord/test/cases/column_alias_test.rb +17 -0
  166. data/vendor/activerecord/test/cases/column_definition_test.rb +36 -0
  167. data/vendor/activerecord/test/cases/connection_test_firebird.rb +8 -0
  168. data/vendor/activerecord/test/cases/connection_test_mysql.rb +30 -0
  169. data/vendor/activerecord/test/cases/copy_table_test_sqlite.rb +69 -0
  170. data/vendor/activerecord/test/cases/database_statements_test.rb +12 -0
  171. data/vendor/activerecord/test/cases/datatype_test_postgresql.rb +203 -0
  172. data/vendor/activerecord/test/cases/date_time_test.rb +37 -0
  173. data/vendor/activerecord/test/cases/default_test_firebird.rb +16 -0
  174. data/vendor/activerecord/test/cases/defaults_test.rb +69 -0
  175. data/vendor/activerecord/test/cases/deprecated_finder_test.rb +30 -0
  176. data/vendor/activerecord/test/cases/dirty_test.rb +257 -0
  177. data/vendor/activerecord/test/cases/finder_respond_to_test.rb +76 -0
  178. data/vendor/activerecord/test/cases/finder_test.rb +890 -0
  179. data/vendor/activerecord/test/cases/fixtures_test.rb +626 -0
  180. data/vendor/activerecord/test/cases/helper.rb +47 -0
  181. data/vendor/activerecord/test/cases/inheritance_test.rb +262 -0
  182. data/vendor/activerecord/test/cases/invalid_date_test.rb +24 -0
  183. data/vendor/activerecord/test/cases/json_serialization_test.rb +205 -0
  184. data/vendor/activerecord/test/cases/lifecycle_test.rb +193 -0
  185. data/vendor/activerecord/test/cases/locking_test.rb +309 -0
  186. data/vendor/activerecord/test/cases/method_scoping_test.rb +462 -0
  187. data/vendor/activerecord/test/cases/migration_test.rb +1444 -0
  188. data/vendor/activerecord/test/cases/migration_test_firebird.rb +124 -0
  189. data/vendor/activerecord/test/cases/mixin_test.rb +96 -0
  190. data/vendor/activerecord/test/cases/modules_test.rb +39 -0
  191. data/vendor/activerecord/test/cases/multiple_db_test.rb +60 -0
  192. data/vendor/activerecord/test/cases/named_scope_test.rb +206 -0
  193. data/vendor/activerecord/test/cases/pk_test.rb +101 -0
  194. data/vendor/activerecord/test/cases/query_cache_test.rb +127 -0
  195. data/vendor/activerecord/test/cases/readonly_test.rb +107 -0
  196. data/vendor/activerecord/test/cases/reflection_test.rb +176 -0
  197. data/vendor/activerecord/test/cases/reserved_word_test_mysql.rb +176 -0
  198. data/vendor/activerecord/test/cases/schema_authorization_test_postgresql.rb +75 -0
  199. data/vendor/activerecord/test/cases/schema_dumper_test.rb +184 -0
  200. data/vendor/activerecord/test/cases/schema_test_postgresql.rb +102 -0
  201. data/vendor/activerecord/test/cases/serialization_test.rb +47 -0
  202. data/vendor/activerecord/test/cases/synonym_test_oracle.rb +17 -0
  203. data/vendor/activerecord/test/cases/table_name_test_sqlserver.rb +23 -0
  204. data/vendor/activerecord/test/cases/threaded_connections_test.rb +48 -0
  205. data/vendor/activerecord/test/cases/transactions_test.rb +307 -0
  206. data/vendor/activerecord/test/cases/unconnected_test.rb +32 -0
  207. data/vendor/activerecord/test/cases/validations_test.rb +1534 -0
  208. data/vendor/activerecord/test/cases/xml_serialization_test.rb +202 -0
  209. data/vendor/activerecord/test/config.rb +5 -0
  210. data/vendor/activerecord/test/connections/native_db2/connection.rb +25 -0
  211. data/vendor/activerecord/test/connections/native_firebird/connection.rb +26 -0
  212. data/vendor/activerecord/test/connections/native_frontbase/connection.rb +27 -0
  213. data/vendor/activerecord/test/connections/native_mysql/connection.rb +27 -0
  214. data/vendor/activerecord/test/connections/native_openbase/connection.rb +21 -0
  215. data/vendor/activerecord/test/connections/native_oracle/connection.rb +27 -0
  216. data/vendor/activerecord/test/connections/native_postgresql/connection.rb +21 -0
  217. data/vendor/activerecord/test/connections/native_sqlite/connection.rb +25 -0
  218. data/vendor/activerecord/test/connections/native_sqlite3/connection.rb +25 -0
  219. data/vendor/activerecord/test/connections/native_sqlite3/in_memory_connection.rb +18 -0
  220. data/vendor/activerecord/test/connections/native_sybase/connection.rb +23 -0
  221. data/vendor/activerecord/test/debug.log +358 -0
  222. data/vendor/activerecord/test/fixtures/accounts.yml +28 -0
  223. data/vendor/activerecord/test/fixtures/all/developers.yml +0 -0
  224. data/vendor/activerecord/test/fixtures/all/people.csv +0 -0
  225. data/vendor/activerecord/test/fixtures/all/tasks.yml +0 -0
  226. data/vendor/activerecord/test/fixtures/author_addresses.yml +5 -0
  227. data/vendor/activerecord/test/fixtures/author_favorites.yml +4 -0
  228. data/vendor/activerecord/test/fixtures/authors.yml +9 -0
  229. data/vendor/activerecord/test/fixtures/binaries.yml +132 -0
  230. data/vendor/activerecord/test/fixtures/books.yml +7 -0
  231. data/vendor/activerecord/test/fixtures/categories/special_categories.yml +9 -0
  232. data/vendor/activerecord/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
  233. data/vendor/activerecord/test/fixtures/categories.yml +14 -0
  234. data/vendor/activerecord/test/fixtures/categories_ordered.yml +7 -0
  235. data/vendor/activerecord/test/fixtures/categories_posts.yml +23 -0
  236. data/vendor/activerecord/test/fixtures/categorizations.yml +17 -0
  237. data/vendor/activerecord/test/fixtures/clubs.yml +6 -0
  238. data/vendor/activerecord/test/fixtures/comments.yml +59 -0
  239. data/vendor/activerecord/test/fixtures/companies.yml +55 -0
  240. data/vendor/activerecord/test/fixtures/computers.yml +4 -0
  241. data/vendor/activerecord/test/fixtures/courses.yml +7 -0
  242. data/vendor/activerecord/test/fixtures/customers.yml +17 -0
  243. data/vendor/activerecord/test/fixtures/developers.yml +21 -0
  244. data/vendor/activerecord/test/fixtures/developers_projects.yml +17 -0
  245. data/vendor/activerecord/test/fixtures/edges.yml +6 -0
  246. data/vendor/activerecord/test/fixtures/entrants.yml +14 -0
  247. data/vendor/activerecord/test/fixtures/fixture_database.sqlite3 +0 -0
  248. data/vendor/activerecord/test/fixtures/fixture_database_2.sqlite3 +0 -0
  249. data/vendor/activerecord/test/fixtures/fk_test_has_fk.yml +3 -0
  250. data/vendor/activerecord/test/fixtures/fk_test_has_pk.yml +2 -0
  251. data/vendor/activerecord/test/fixtures/funny_jokes.yml +10 -0
  252. data/vendor/activerecord/test/fixtures/items.yml +4 -0
  253. data/vendor/activerecord/test/fixtures/jobs.yml +7 -0
  254. data/vendor/activerecord/test/fixtures/legacy_things.yml +3 -0
  255. data/vendor/activerecord/test/fixtures/mateys.yml +4 -0
  256. data/vendor/activerecord/test/fixtures/members.yml +4 -0
  257. data/vendor/activerecord/test/fixtures/memberships.yml +20 -0
  258. data/vendor/activerecord/test/fixtures/minimalistics.yml +2 -0
  259. data/vendor/activerecord/test/fixtures/mixed_case_monkeys.yml +6 -0
  260. data/vendor/activerecord/test/fixtures/mixins.yml +29 -0
  261. data/vendor/activerecord/test/fixtures/movies.yml +7 -0
  262. data/vendor/activerecord/test/fixtures/naked/csv/accounts.csv +1 -0
  263. data/vendor/activerecord/test/fixtures/naked/yml/accounts.yml +1 -0
  264. data/vendor/activerecord/test/fixtures/naked/yml/companies.yml +1 -0
  265. data/vendor/activerecord/test/fixtures/naked/yml/courses.yml +1 -0
  266. data/vendor/activerecord/test/fixtures/owners.yml +7 -0
  267. data/vendor/activerecord/test/fixtures/parrots.yml +27 -0
  268. data/vendor/activerecord/test/fixtures/parrots_pirates.yml +7 -0
  269. data/vendor/activerecord/test/fixtures/people.yml +6 -0
  270. data/vendor/activerecord/test/fixtures/pets.yml +14 -0
  271. data/vendor/activerecord/test/fixtures/pirates.yml +9 -0
  272. data/vendor/activerecord/test/fixtures/posts.yml +49 -0
  273. data/vendor/activerecord/test/fixtures/price_estimates.yml +7 -0
  274. data/vendor/activerecord/test/fixtures/projects.yml +7 -0
  275. data/vendor/activerecord/test/fixtures/readers.yml +9 -0
  276. data/vendor/activerecord/test/fixtures/references.yml +17 -0
  277. data/vendor/activerecord/test/fixtures/reserved_words/distinct.yml +5 -0
  278. data/vendor/activerecord/test/fixtures/reserved_words/distincts_selects.yml +11 -0
  279. data/vendor/activerecord/test/fixtures/reserved_words/group.yml +14 -0
  280. data/vendor/activerecord/test/fixtures/reserved_words/select.yml +8 -0
  281. data/vendor/activerecord/test/fixtures/reserved_words/values.yml +7 -0
  282. data/vendor/activerecord/test/fixtures/ships.yml +5 -0
  283. data/vendor/activerecord/test/fixtures/sponsors.yml +9 -0
  284. data/vendor/activerecord/test/fixtures/subscribers.yml +7 -0
  285. data/vendor/activerecord/test/fixtures/subscriptions.yml +12 -0
  286. data/vendor/activerecord/test/fixtures/taggings.yml +28 -0
  287. data/vendor/activerecord/test/fixtures/tags.yml +7 -0
  288. data/vendor/activerecord/test/fixtures/tasks.yml +7 -0
  289. data/vendor/activerecord/test/fixtures/topics.yml +42 -0
  290. data/vendor/activerecord/test/fixtures/treasures.yml +10 -0
  291. data/vendor/activerecord/test/fixtures/vertices.yml +4 -0
  292. data/vendor/activerecord/test/fixtures/warehouse-things.yml +3 -0
  293. data/vendor/activerecord/test/migrations/decimal/1_give_me_big_numbers.rb +15 -0
  294. data/vendor/activerecord/test/migrations/duplicate/1_people_have_last_names.rb +9 -0
  295. data/vendor/activerecord/test/migrations/duplicate/2_we_need_reminders.rb +12 -0
  296. data/vendor/activerecord/test/migrations/duplicate/3_foo.rb +7 -0
  297. data/vendor/activerecord/test/migrations/duplicate/3_innocent_jointable.rb +12 -0
  298. data/vendor/activerecord/test/migrations/duplicate_names/20080507052938_chunky.rb +7 -0
  299. data/vendor/activerecord/test/migrations/duplicate_names/20080507053028_chunky.rb +7 -0
  300. data/vendor/activerecord/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +12 -0
  301. data/vendor/activerecord/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +9 -0
  302. data/vendor/activerecord/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +12 -0
  303. data/vendor/activerecord/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +9 -0
  304. data/vendor/activerecord/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +8 -0
  305. data/vendor/activerecord/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +12 -0
  306. data/vendor/activerecord/test/migrations/missing/1000_people_have_middle_names.rb +9 -0
  307. data/vendor/activerecord/test/migrations/missing/1_people_have_last_names.rb +9 -0
  308. data/vendor/activerecord/test/migrations/missing/3_we_need_reminders.rb +12 -0
  309. data/vendor/activerecord/test/migrations/missing/4_innocent_jointable.rb +12 -0
  310. data/vendor/activerecord/test/migrations/valid/1_people_have_last_names.rb +9 -0
  311. data/vendor/activerecord/test/migrations/valid/2_we_need_reminders.rb +12 -0
  312. data/vendor/activerecord/test/migrations/valid/3_innocent_jointable.rb +12 -0
  313. data/vendor/activerecord/test/models/author.rb +137 -0
  314. data/vendor/activerecord/test/models/auto_id.rb +4 -0
  315. data/vendor/activerecord/test/models/binary.rb +2 -0
  316. data/vendor/activerecord/test/models/book.rb +4 -0
  317. data/vendor/activerecord/test/models/categorization.rb +5 -0
  318. data/vendor/activerecord/test/models/category.rb +30 -0
  319. data/vendor/activerecord/test/models/citation.rb +6 -0
  320. data/vendor/activerecord/test/models/club.rb +7 -0
  321. data/vendor/activerecord/test/models/column_name.rb +3 -0
  322. data/vendor/activerecord/test/models/comment.rb +25 -0
  323. data/vendor/activerecord/test/models/company.rb +132 -0
  324. data/vendor/activerecord/test/models/company_in_module.rb +61 -0
  325. data/vendor/activerecord/test/models/computer.rb +3 -0
  326. data/vendor/activerecord/test/models/contact.rb +16 -0
  327. data/vendor/activerecord/test/models/course.rb +3 -0
  328. data/vendor/activerecord/test/models/customer.rb +55 -0
  329. data/vendor/activerecord/test/models/default.rb +2 -0
  330. data/vendor/activerecord/test/models/developer.rb +79 -0
  331. data/vendor/activerecord/test/models/edge.rb +5 -0
  332. data/vendor/activerecord/test/models/entrant.rb +3 -0
  333. data/vendor/activerecord/test/models/guid.rb +2 -0
  334. data/vendor/activerecord/test/models/item.rb +7 -0
  335. data/vendor/activerecord/test/models/job.rb +5 -0
  336. data/vendor/activerecord/test/models/joke.rb +3 -0
  337. data/vendor/activerecord/test/models/keyboard.rb +3 -0
  338. data/vendor/activerecord/test/models/legacy_thing.rb +3 -0
  339. data/vendor/activerecord/test/models/matey.rb +4 -0
  340. data/vendor/activerecord/test/models/member.rb +9 -0
  341. data/vendor/activerecord/test/models/membership.rb +9 -0
  342. data/vendor/activerecord/test/models/minimalistic.rb +2 -0
  343. data/vendor/activerecord/test/models/mixed_case_monkey.rb +3 -0
  344. data/vendor/activerecord/test/models/movie.rb +5 -0
  345. data/vendor/activerecord/test/models/order.rb +4 -0
  346. data/vendor/activerecord/test/models/owner.rb +4 -0
  347. data/vendor/activerecord/test/models/parrot.rb +13 -0
  348. data/vendor/activerecord/test/models/person.rb +10 -0
  349. data/vendor/activerecord/test/models/pet.rb +4 -0
  350. data/vendor/activerecord/test/models/pirate.rb +9 -0
  351. data/vendor/activerecord/test/models/post.rb +85 -0
  352. data/vendor/activerecord/test/models/price_estimate.rb +3 -0
  353. data/vendor/activerecord/test/models/project.rb +29 -0
  354. data/vendor/activerecord/test/models/reader.rb +4 -0
  355. data/vendor/activerecord/test/models/reference.rb +4 -0
  356. data/vendor/activerecord/test/models/reply.rb +39 -0
  357. data/vendor/activerecord/test/models/ship.rb +3 -0
  358. data/vendor/activerecord/test/models/sponsor.rb +4 -0
  359. data/vendor/activerecord/test/models/subject.rb +4 -0
  360. data/vendor/activerecord/test/models/subscriber.rb +8 -0
  361. data/vendor/activerecord/test/models/subscription.rb +4 -0
  362. data/vendor/activerecord/test/models/tag.rb +7 -0
  363. data/vendor/activerecord/test/models/tagging.rb +10 -0
  364. data/vendor/activerecord/test/models/task.rb +3 -0
  365. data/vendor/activerecord/test/models/topic.rb +66 -0
  366. data/vendor/activerecord/test/models/treasure.rb +6 -0
  367. data/vendor/activerecord/test/models/vertex.rb +9 -0
  368. data/vendor/activerecord/test/models/warehouse_thing.rb +5 -0
  369. data/vendor/activerecord/test/schema/mysql_specific_schema.rb +12 -0
  370. data/vendor/activerecord/test/schema/postgresql_specific_schema.rb +103 -0
  371. data/vendor/activerecord/test/schema/schema.rb +429 -0
  372. data/vendor/activerecord/test/schema/schema2.rb +6 -0
  373. data/vendor/activerecord/test/schema/sqlite_specific_schema.rb +25 -0
  374. data/vendor/activerecord/test/schema/sqlserver_specific_schema.rb +5 -0
  375. data/vendor/activesupport/CHANGELOG +1193 -0
  376. data/vendor/activesupport/README +43 -0
  377. data/vendor/activesupport/lib/active_support/base64.rb +22 -0
  378. data/vendor/activesupport/lib/active_support/basic_object.rb +24 -0
  379. data/vendor/activesupport/lib/active_support/buffered_logger.rb +121 -0
  380. data/vendor/activesupport/lib/active_support/cache/compressed_mem_cache_store.rb +15 -0
  381. data/vendor/activesupport/lib/active_support/cache/drb_store.rb +15 -0
  382. data/vendor/activesupport/lib/active_support/cache/file_store.rb +70 -0
  383. data/vendor/activesupport/lib/active_support/cache/mem_cache_store.rb +100 -0
  384. data/vendor/activesupport/lib/active_support/cache/memory_store.rb +38 -0
  385. data/vendor/activesupport/lib/active_support/cache.rb +147 -0
  386. data/vendor/activesupport/lib/active_support/callbacks.rb +275 -0
  387. data/vendor/activesupport/lib/active_support/clean_logger.rb +127 -0
  388. data/vendor/activesupport/lib/active_support/core_ext/array/access.rb +26 -0
  389. data/vendor/activesupport/lib/active_support/core_ext/array/conversions.rb +178 -0
  390. data/vendor/activesupport/lib/active_support/core_ext/array/extract_options.rb +20 -0
  391. data/vendor/activesupport/lib/active_support/core_ext/array/grouping.rb +63 -0
  392. data/vendor/activesupport/lib/active_support/core_ext/array/random_access.rb +12 -0
  393. data/vendor/activesupport/lib/active_support/core_ext/array.rb +13 -0
  394. data/vendor/activesupport/lib/active_support/core_ext/base64/encoding.rb +13 -0
  395. data/vendor/activesupport/lib/active_support/core_ext/base64.rb +4 -0
  396. data/vendor/activesupport/lib/active_support/core_ext/benchmark.rb +12 -0
  397. data/vendor/activesupport/lib/active_support/core_ext/bigdecimal/conversions.rb +41 -0
  398. data/vendor/activesupport/lib/active_support/core_ext/bigdecimal.rb +6 -0
  399. data/vendor/activesupport/lib/active_support/core_ext/blank.rb +53 -0
  400. data/vendor/activesupport/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +14 -0
  401. data/vendor/activesupport/lib/active_support/core_ext/cgi.rb +5 -0
  402. data/vendor/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb +54 -0
  403. data/vendor/activesupport/lib/active_support/core_ext/class/delegating_attributes.rb +46 -0
  404. data/vendor/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb +140 -0
  405. data/vendor/activesupport/lib/active_support/core_ext/class/removal.rb +50 -0
  406. data/vendor/activesupport/lib/active_support/core_ext/class.rb +4 -0
  407. data/vendor/activesupport/lib/active_support/core_ext/date/behavior.rb +39 -0
  408. data/vendor/activesupport/lib/active_support/core_ext/date/calculations.rb +215 -0
  409. data/vendor/activesupport/lib/active_support/core_ext/date/conversions.rb +107 -0
  410. data/vendor/activesupport/lib/active_support/core_ext/date.rb +10 -0
  411. data/vendor/activesupport/lib/active_support/core_ext/date_time/calculations.rb +112 -0
  412. data/vendor/activesupport/lib/active_support/core_ext/date_time/conversions.rb +96 -0
  413. data/vendor/activesupport/lib/active_support/core_ext/date_time.rb +12 -0
  414. data/vendor/activesupport/lib/active_support/core_ext/duplicable.rb +37 -0
  415. data/vendor/activesupport/lib/active_support/core_ext/enumerable.rb +69 -0
  416. data/vendor/activesupport/lib/active_support/core_ext/exception.rb +41 -0
  417. data/vendor/activesupport/lib/active_support/core_ext/file.rb +21 -0
  418. data/vendor/activesupport/lib/active_support/core_ext/float/rounding.rb +24 -0
  419. data/vendor/activesupport/lib/active_support/core_ext/float.rb +5 -0
  420. data/vendor/activesupport/lib/active_support/core_ext/hash/conversions.rb +259 -0
  421. data/vendor/activesupport/lib/active_support/core_ext/hash/diff.rb +19 -0
  422. data/vendor/activesupport/lib/active_support/core_ext/hash/except.rb +25 -0
  423. data/vendor/activesupport/lib/active_support/core_ext/hash/indifferent_access.rb +137 -0
  424. data/vendor/activesupport/lib/active_support/core_ext/hash/keys.rb +52 -0
  425. data/vendor/activesupport/lib/active_support/core_ext/hash/reverse_merge.rb +28 -0
  426. data/vendor/activesupport/lib/active_support/core_ext/hash/slice.rb +30 -0
  427. data/vendor/activesupport/lib/active_support/core_ext/hash.rb +13 -0
  428. data/vendor/activesupport/lib/active_support/core_ext/integer/even_odd.rb +29 -0
  429. data/vendor/activesupport/lib/active_support/core_ext/integer/inflections.rb +20 -0
  430. data/vendor/activesupport/lib/active_support/core_ext/integer.rb +7 -0
  431. data/vendor/activesupport/lib/active_support/core_ext/kernel/agnostics.rb +11 -0
  432. data/vendor/activesupport/lib/active_support/core_ext/kernel/daemonizing.rb +7 -0
  433. data/vendor/activesupport/lib/active_support/core_ext/kernel/debugger.rb +13 -0
  434. data/vendor/activesupport/lib/active_support/core_ext/kernel/reporting.rb +59 -0
  435. data/vendor/activesupport/lib/active_support/core_ext/kernel/requires.rb +24 -0
  436. data/vendor/activesupport/lib/active_support/core_ext/kernel.rb +5 -0
  437. data/vendor/activesupport/lib/active_support/core_ext/load_error.rb +38 -0
  438. data/vendor/activesupport/lib/active_support/core_ext/logger.rb +16 -0
  439. data/vendor/activesupport/lib/active_support/core_ext/module/aliasing.rb +70 -0
  440. data/vendor/activesupport/lib/active_support/core_ext/module/attr_accessor_with_default.rb +31 -0
  441. data/vendor/activesupport/lib/active_support/core_ext/module/attr_internal.rb +32 -0
  442. data/vendor/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb +58 -0
  443. data/vendor/activesupport/lib/active_support/core_ext/module/delegation.rb +64 -0
  444. data/vendor/activesupport/lib/active_support/core_ext/module/inclusion.rb +30 -0
  445. data/vendor/activesupport/lib/active_support/core_ext/module/introspection.rb +75 -0
  446. data/vendor/activesupport/lib/active_support/core_ext/module/loading.rb +23 -0
  447. data/vendor/activesupport/lib/active_support/core_ext/module/model_naming.rb +22 -0
  448. data/vendor/activesupport/lib/active_support/core_ext/module.rb +13 -0
  449. data/vendor/activesupport/lib/active_support/core_ext/name_error.rb +17 -0
  450. data/vendor/activesupport/lib/active_support/core_ext/numeric/bytes.rb +44 -0
  451. data/vendor/activesupport/lib/active_support/core_ext/numeric/conversions.rb +19 -0
  452. data/vendor/activesupport/lib/active_support/core_ext/numeric/time.rb +91 -0
  453. data/vendor/activesupport/lib/active_support/core_ext/numeric.rb +9 -0
  454. data/vendor/activesupport/lib/active_support/core_ext/object/conversions.rb +14 -0
  455. data/vendor/activesupport/lib/active_support/core_ext/object/extending.rb +59 -0
  456. data/vendor/activesupport/lib/active_support/core_ext/object/instance_variables.rb +74 -0
  457. data/vendor/activesupport/lib/active_support/core_ext/object/misc.rb +59 -0
  458. data/vendor/activesupport/lib/active_support/core_ext/object.rb +4 -0
  459. data/vendor/activesupport/lib/active_support/core_ext/pathname/clean_within.rb +14 -0
  460. data/vendor/activesupport/lib/active_support/core_ext/pathname.rb +7 -0
  461. data/vendor/activesupport/lib/active_support/core_ext/proc.rb +12 -0
  462. data/vendor/activesupport/lib/active_support/core_ext/process/daemon.rb +25 -0
  463. data/vendor/activesupport/lib/active_support/core_ext/process.rb +1 -0
  464. data/vendor/activesupport/lib/active_support/core_ext/range/blockless_step.rb +32 -0
  465. data/vendor/activesupport/lib/active_support/core_ext/range/conversions.rb +27 -0
  466. data/vendor/activesupport/lib/active_support/core_ext/range/include_range.rb +30 -0
  467. data/vendor/activesupport/lib/active_support/core_ext/range/overlaps.rb +15 -0
  468. data/vendor/activesupport/lib/active_support/core_ext/range.rb +11 -0
  469. data/vendor/activesupport/lib/active_support/core_ext/rexml.rb +35 -0
  470. data/vendor/activesupport/lib/active_support/core_ext/string/access.rb +82 -0
  471. data/vendor/activesupport/lib/active_support/core_ext/string/conversions.rb +28 -0
  472. data/vendor/activesupport/lib/active_support/core_ext/string/filters.rb +26 -0
  473. data/vendor/activesupport/lib/active_support/core_ext/string/inflections.rb +148 -0
  474. data/vendor/activesupport/lib/active_support/core_ext/string/iterators.rb +21 -0
  475. data/vendor/activesupport/lib/active_support/core_ext/string/starts_ends_with.rb +35 -0
  476. data/vendor/activesupport/lib/active_support/core_ext/string/unicode.rb +66 -0
  477. data/vendor/activesupport/lib/active_support/core_ext/string/xchar.rb +11 -0
  478. data/vendor/activesupport/lib/active_support/core_ext/string.rb +18 -0
  479. data/vendor/activesupport/lib/active_support/core_ext/symbol.rb +14 -0
  480. data/vendor/activesupport/lib/active_support/core_ext/test/unit/assertions.rb +64 -0
  481. data/vendor/activesupport/lib/active_support/core_ext/test.rb +1 -0
  482. data/vendor/activesupport/lib/active_support/core_ext/time/behavior.rb +13 -0
  483. data/vendor/activesupport/lib/active_support/core_ext/time/calculations.rb +276 -0
  484. data/vendor/activesupport/lib/active_support/core_ext/time/conversions.rb +89 -0
  485. data/vendor/activesupport/lib/active_support/core_ext/time/zones.rb +86 -0
  486. data/vendor/activesupport/lib/active_support/core_ext/time.rb +42 -0
  487. data/vendor/activesupport/lib/active_support/core_ext.rb +4 -0
  488. data/vendor/activesupport/lib/active_support/dependencies.rb +553 -0
  489. data/vendor/activesupport/lib/active_support/deprecation.rb +223 -0
  490. data/vendor/activesupport/lib/active_support/duration.rb +96 -0
  491. data/vendor/activesupport/lib/active_support/gzip.rb +25 -0
  492. data/vendor/activesupport/lib/active_support/inflections.rb +55 -0
  493. data/vendor/activesupport/lib/active_support/inflector.rb +313 -0
  494. data/vendor/activesupport/lib/active_support/json/decoding.rb +63 -0
  495. data/vendor/activesupport/lib/active_support/json/encoders/date.rb +14 -0
  496. data/vendor/activesupport/lib/active_support/json/encoders/date_time.rb +14 -0
  497. data/vendor/activesupport/lib/active_support/json/encoders/enumerable.rb +12 -0
  498. data/vendor/activesupport/lib/active_support/json/encoders/false_class.rb +5 -0
  499. data/vendor/activesupport/lib/active_support/json/encoders/hash.rb +47 -0
  500. data/vendor/activesupport/lib/active_support/json/encoders/nil_class.rb +5 -0
  501. data/vendor/activesupport/lib/active_support/json/encoders/numeric.rb +5 -0
  502. data/vendor/activesupport/lib/active_support/json/encoders/object.rb +6 -0
  503. data/vendor/activesupport/lib/active_support/json/encoders/regexp.rb +5 -0
  504. data/vendor/activesupport/lib/active_support/json/encoders/string.rb +36 -0
  505. data/vendor/activesupport/lib/active_support/json/encoders/symbol.rb +5 -0
  506. data/vendor/activesupport/lib/active_support/json/encoders/time.rb +14 -0
  507. data/vendor/activesupport/lib/active_support/json/encoders/true_class.rb +5 -0
  508. data/vendor/activesupport/lib/active_support/json/encoding.rb +37 -0
  509. data/vendor/activesupport/lib/active_support/json/variable.rb +10 -0
  510. data/vendor/activesupport/lib/active_support/json.rb +23 -0
  511. data/vendor/activesupport/lib/active_support/multibyte/chars.rb +137 -0
  512. data/vendor/activesupport/lib/active_support/multibyte/generators/generate_tables.rb +149 -0
  513. data/vendor/activesupport/lib/active_support/multibyte/handlers/passthru_handler.rb +9 -0
  514. data/vendor/activesupport/lib/active_support/multibyte/handlers/utf8_handler.rb +564 -0
  515. data/vendor/activesupport/lib/active_support/multibyte/handlers/utf8_handler_proc.rb +43 -0
  516. data/vendor/activesupport/lib/active_support/multibyte.rb +9 -0
  517. data/vendor/activesupport/lib/active_support/option_merger.rb +25 -0
  518. data/vendor/activesupport/lib/active_support/ordered_hash.rb +43 -0
  519. data/vendor/activesupport/lib/active_support/ordered_options.rb +19 -0
  520. data/vendor/activesupport/lib/active_support/string_inquirer.rb +11 -0
  521. data/vendor/activesupport/lib/active_support/test_case.rb +13 -0
  522. data/vendor/activesupport/lib/active_support/testing/default.rb +9 -0
  523. data/vendor/activesupport/lib/active_support/testing/setup_and_teardown.rb +93 -0
  524. data/vendor/activesupport/lib/active_support/time_with_zone.rb +304 -0
  525. data/vendor/activesupport/lib/active_support/values/time_zone.rb +396 -0
  526. data/vendor/activesupport/lib/active_support/values/unicode_tables.dat +0 -0
  527. data/vendor/activesupport/lib/active_support/vendor/builder-2.1.2/blankslate.rb +113 -0
  528. data/vendor/activesupport/lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb +20 -0
  529. data/vendor/activesupport/lib/active_support/vendor/builder-2.1.2/builder/css.rb +250 -0
  530. data/vendor/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb +115 -0
  531. data/vendor/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb +139 -0
  532. data/vendor/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb +63 -0
  533. data/vendor/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb +328 -0
  534. data/vendor/activesupport/lib/active_support/vendor/builder-2.1.2/builder.rb +13 -0
  535. data/vendor/activesupport/lib/active_support/vendor/memcache-client-1.5.0/memcache.rb +849 -0
  536. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/data_timezone.rb +47 -0
  537. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/data_timezone_info.rb +228 -0
  538. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Africa/Algiers.rb +55 -0
  539. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Africa/Cairo.rb +219 -0
  540. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Africa/Casablanca.rb +40 -0
  541. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Africa/Harare.rb +18 -0
  542. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Africa/Johannesburg.rb +25 -0
  543. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Africa/Monrovia.rb +22 -0
  544. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Africa/Nairobi.rb +23 -0
  545. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +166 -0
  546. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Argentina/San_Juan.rb +170 -0
  547. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Bogota.rb +23 -0
  548. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Caracas.rb +23 -0
  549. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Chicago.rb +283 -0
  550. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Chihuahua.rb +136 -0
  551. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Denver.rb +204 -0
  552. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Godthab.rb +161 -0
  553. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Guatemala.rb +27 -0
  554. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Halifax.rb +274 -0
  555. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Indiana/Indianapolis.rb +149 -0
  556. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Juneau.rb +194 -0
  557. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/La_Paz.rb +22 -0
  558. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Lima.rb +35 -0
  559. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Los_Angeles.rb +232 -0
  560. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Mazatlan.rb +139 -0
  561. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Mexico_City.rb +144 -0
  562. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Monterrey.rb +131 -0
  563. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/New_York.rb +282 -0
  564. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Phoenix.rb +30 -0
  565. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Regina.rb +74 -0
  566. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Santiago.rb +205 -0
  567. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/St_Johns.rb +288 -0
  568. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/America/Tijuana.rb +196 -0
  569. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Almaty.rb +67 -0
  570. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Baghdad.rb +73 -0
  571. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Baku.rb +161 -0
  572. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Bangkok.rb +20 -0
  573. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Chongqing.rb +33 -0
  574. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Dhaka.rb +27 -0
  575. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Hong_Kong.rb +87 -0
  576. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Irkutsk.rb +165 -0
  577. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Jakarta.rb +30 -0
  578. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Jerusalem.rb +163 -0
  579. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Kabul.rb +20 -0
  580. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Kamchatka.rb +163 -0
  581. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Karachi.rb +30 -0
  582. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Katmandu.rb +20 -0
  583. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Kolkata.rb +25 -0
  584. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Krasnoyarsk.rb +163 -0
  585. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Kuala_Lumpur.rb +31 -0
  586. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Kuwait.rb +18 -0
  587. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Magadan.rb +163 -0
  588. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Muscat.rb +18 -0
  589. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Novosibirsk.rb +164 -0
  590. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Rangoon.rb +24 -0
  591. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Riyadh.rb +18 -0
  592. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Seoul.rb +34 -0
  593. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Shanghai.rb +35 -0
  594. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Singapore.rb +33 -0
  595. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Taipei.rb +59 -0
  596. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Tashkent.rb +47 -0
  597. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Tbilisi.rb +78 -0
  598. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Tehran.rb +121 -0
  599. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Tokyo.rb +30 -0
  600. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Ulaanbaatar.rb +65 -0
  601. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Urumqi.rb +33 -0
  602. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Vladivostok.rb +164 -0
  603. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Yakutsk.rb +163 -0
  604. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Yekaterinburg.rb +165 -0
  605. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Asia/Yerevan.rb +165 -0
  606. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Atlantic/Azores.rb +270 -0
  607. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Atlantic/Cape_Verde.rb +23 -0
  608. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Atlantic/South_Georgia.rb +18 -0
  609. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Australia/Adelaide.rb +187 -0
  610. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Australia/Brisbane.rb +35 -0
  611. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Australia/Darwin.rb +29 -0
  612. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Australia/Hobart.rb +193 -0
  613. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Australia/Melbourne.rb +185 -0
  614. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Australia/Perth.rb +37 -0
  615. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Australia/Sydney.rb +185 -0
  616. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Etc/UTC.rb +16 -0
  617. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Amsterdam.rb +228 -0
  618. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Athens.rb +185 -0
  619. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Belgrade.rb +163 -0
  620. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Berlin.rb +188 -0
  621. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Bratislava.rb +13 -0
  622. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Brussels.rb +232 -0
  623. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Bucharest.rb +181 -0
  624. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Budapest.rb +197 -0
  625. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Copenhagen.rb +179 -0
  626. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Dublin.rb +276 -0
  627. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Helsinki.rb +163 -0
  628. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Istanbul.rb +218 -0
  629. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Kiev.rb +168 -0
  630. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Lisbon.rb +268 -0
  631. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Ljubljana.rb +13 -0
  632. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/London.rb +288 -0
  633. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Madrid.rb +211 -0
  634. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Minsk.rb +170 -0
  635. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Moscow.rb +181 -0
  636. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Paris.rb +232 -0
  637. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Prague.rb +187 -0
  638. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Riga.rb +176 -0
  639. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Rome.rb +215 -0
  640. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Sarajevo.rb +13 -0
  641. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Skopje.rb +13 -0
  642. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Sofia.rb +173 -0
  643. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Stockholm.rb +165 -0
  644. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Tallinn.rb +172 -0
  645. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Vienna.rb +183 -0
  646. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Vilnius.rb +170 -0
  647. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Warsaw.rb +212 -0
  648. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Europe/Zagreb.rb +13 -0
  649. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Auckland.rb +202 -0
  650. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Fiji.rb +23 -0
  651. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Guam.rb +22 -0
  652. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Honolulu.rb +28 -0
  653. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Majuro.rb +20 -0
  654. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Midway.rb +25 -0
  655. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Noumea.rb +25 -0
  656. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Pago_Pago.rb +26 -0
  657. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Port_Moresby.rb +20 -0
  658. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/definitions/Pacific/Tongatapu.rb +27 -0
  659. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/info_timezone.rb +52 -0
  660. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/linked_timezone.rb +51 -0
  661. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/linked_timezone_info.rb +44 -0
  662. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/offset_rationals.rb +95 -0
  663. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/time_or_datetime.rb +292 -0
  664. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/timezone.rb +508 -0
  665. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/timezone_definition.rb +56 -0
  666. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/timezone_info.rb +40 -0
  667. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/timezone_offset_info.rb +94 -0
  668. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/timezone_period.rb +198 -0
  669. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/timezone_transition_info.rb +138 -0
  670. data/vendor/activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo.rb +33 -0
  671. data/vendor/activesupport/lib/active_support/vendor/xml-simple-1.0.11/xmlsimple.rb +1021 -0
  672. data/vendor/activesupport/lib/active_support/vendor.rb +26 -0
  673. data/vendor/activesupport/lib/active_support/version.rb +9 -0
  674. data/vendor/activesupport/lib/active_support/whiny_nil.rb +58 -0
  675. data/vendor/activesupport/lib/active_support.rb +61 -0
  676. data/vendor/activesupport/lib/activesupport.rb +1 -0
  677. data/vendor/isaac/LICENSE +26 -0
  678. data/vendor/isaac/README +78 -0
  679. data/vendor/isaac/TODO +3 -0
  680. data/vendor/isaac/VERSIONS +3 -0
  681. data/vendor/isaac/crypt/ISAAC.rb +171 -0
  682. data/vendor/isaac/isaac.gemspec +39 -0
  683. data/vendor/isaac/setup.rb +596 -0
  684. data/vendor/isaac/test/TC_ISAAC.rb +76 -0
  685. data/vendor/json/CHANGES +93 -0
  686. data/vendor/json/GPL +340 -0
  687. data/vendor/json/README +78 -0
  688. data/vendor/json/RUBY +58 -0
  689. data/vendor/json/Rakefile +309 -0
  690. data/vendor/json/TODO +1 -0
  691. data/vendor/json/VERSION +1 -0
  692. data/vendor/json/benchmarks/benchmark.txt +133 -0
  693. data/vendor/json/benchmarks/benchmark_generator.rb +48 -0
  694. data/vendor/json/benchmarks/benchmark_parser.rb +26 -0
  695. data/vendor/json/benchmarks/benchmark_rails.rb +26 -0
  696. data/vendor/json/bin/edit_json.rb +10 -0
  697. data/vendor/json/bin/prettify_json.rb +76 -0
  698. data/vendor/json/data/example.json +1 -0
  699. data/vendor/json/data/index.html +38 -0
  700. data/vendor/json/data/prototype.js +4184 -0
  701. data/vendor/json/ext/json/ext/generator/extconf.rb +9 -0
  702. data/vendor/json/ext/json/ext/generator/generator.c +875 -0
  703. data/vendor/json/ext/json/ext/generator/unicode.c +182 -0
  704. data/vendor/json/ext/json/ext/generator/unicode.h +53 -0
  705. data/vendor/json/ext/json/ext/parser/extconf.rb +9 -0
  706. data/vendor/json/ext/json/ext/parser/parser.c +1758 -0
  707. data/vendor/json/ext/json/ext/parser/parser.rl +638 -0
  708. data/vendor/json/ext/json/ext/parser/unicode.c +154 -0
  709. data/vendor/json/ext/json/ext/parser/unicode.h +58 -0
  710. data/vendor/json/install.rb +26 -0
  711. data/vendor/json/lib/json/Array.xpm +21 -0
  712. data/vendor/json/lib/json/FalseClass.xpm +21 -0
  713. data/vendor/json/lib/json/Hash.xpm +21 -0
  714. data/vendor/json/lib/json/Key.xpm +73 -0
  715. data/vendor/json/lib/json/NilClass.xpm +21 -0
  716. data/vendor/json/lib/json/Numeric.xpm +28 -0
  717. data/vendor/json/lib/json/String.xpm +96 -0
  718. data/vendor/json/lib/json/TrueClass.xpm +21 -0
  719. data/vendor/json/lib/json/add/core.rb +135 -0
  720. data/vendor/json/lib/json/add/rails.rb +58 -0
  721. data/vendor/json/lib/json/common.rb +354 -0
  722. data/vendor/json/lib/json/editor.rb +1362 -0
  723. data/vendor/json/lib/json/ext.rb +13 -0
  724. data/vendor/json/lib/json/json.xpm +1499 -0
  725. data/vendor/json/lib/json/pure/generator.rb +394 -0
  726. data/vendor/json/lib/json/pure/parser.rb +259 -0
  727. data/vendor/json/lib/json/pure.rb +75 -0
  728. data/vendor/json/lib/json/version.rb +9 -0
  729. data/vendor/json/lib/json.rb +235 -0
  730. data/vendor/json/tests/fixtures/fail1.json +1 -0
  731. data/vendor/json/tests/fixtures/fail10.json +1 -0
  732. data/vendor/json/tests/fixtures/fail11.json +1 -0
  733. data/vendor/json/tests/fixtures/fail12.json +1 -0
  734. data/vendor/json/tests/fixtures/fail13.json +1 -0
  735. data/vendor/json/tests/fixtures/fail14.json +1 -0
  736. data/vendor/json/tests/fixtures/fail18.json +1 -0
  737. data/vendor/json/tests/fixtures/fail19.json +1 -0
  738. data/vendor/json/tests/fixtures/fail2.json +1 -0
  739. data/vendor/json/tests/fixtures/fail20.json +1 -0
  740. data/vendor/json/tests/fixtures/fail21.json +1 -0
  741. data/vendor/json/tests/fixtures/fail22.json +1 -0
  742. data/vendor/json/tests/fixtures/fail23.json +1 -0
  743. data/vendor/json/tests/fixtures/fail24.json +1 -0
  744. data/vendor/json/tests/fixtures/fail25.json +1 -0
  745. data/vendor/json/tests/fixtures/fail27.json +2 -0
  746. data/vendor/json/tests/fixtures/fail28.json +2 -0
  747. data/vendor/json/tests/fixtures/fail3.json +1 -0
  748. data/vendor/json/tests/fixtures/fail4.json +1 -0
  749. data/vendor/json/tests/fixtures/fail5.json +1 -0
  750. data/vendor/json/tests/fixtures/fail6.json +1 -0
  751. data/vendor/json/tests/fixtures/fail7.json +1 -0
  752. data/vendor/json/tests/fixtures/fail8.json +1 -0
  753. data/vendor/json/tests/fixtures/fail9.json +1 -0
  754. data/vendor/json/tests/fixtures/pass1.json +56 -0
  755. data/vendor/json/tests/fixtures/pass15.json +1 -0
  756. data/vendor/json/tests/fixtures/pass16.json +1 -0
  757. data/vendor/json/tests/fixtures/pass17.json +1 -0
  758. data/vendor/json/tests/fixtures/pass2.json +1 -0
  759. data/vendor/json/tests/fixtures/pass26.json +1 -0
  760. data/vendor/json/tests/fixtures/pass3.json +6 -0
  761. data/vendor/json/tests/runner.rb +25 -0
  762. data/vendor/json/tests/test_json.rb +293 -0
  763. data/vendor/json/tests/test_json_addition.rb +161 -0
  764. data/vendor/json/tests/test_json_fixtures.rb +30 -0
  765. data/vendor/json/tests/test_json_generate.rb +100 -0
  766. data/vendor/json/tests/test_json_rails.rb +118 -0
  767. data/vendor/json/tests/test_json_unicode.rb +61 -0
  768. data/vendor/json/tools/fuzz.rb +140 -0
  769. data/vendor/json/tools/server.rb +62 -0
  770. data/vendor/rack/AUTHORS +8 -0
  771. data/vendor/rack/COPYING +18 -0
  772. data/vendor/rack/KNOWN-ISSUES +18 -0
  773. data/vendor/rack/RDOX +265 -0
  774. data/vendor/rack/README +287 -0
  775. data/vendor/rack/Rakefile +179 -0
  776. data/vendor/rack/SPEC +126 -0
  777. data/vendor/rack/bin/rackup +172 -0
  778. data/vendor/rack/contrib/rack_logo.svg +111 -0
  779. data/vendor/rack/example/lobster.ru +4 -0
  780. data/vendor/rack/example/protectedlobster.rb +14 -0
  781. data/vendor/rack/example/protectedlobster.ru +8 -0
  782. data/vendor/rack/lib/rack/adapter/camping.rb +22 -0
  783. data/vendor/rack/lib/rack/auth/abstract/handler.rb +28 -0
  784. data/vendor/rack/lib/rack/auth/abstract/request.rb +37 -0
  785. data/vendor/rack/lib/rack/auth/basic.rb +58 -0
  786. data/vendor/rack/lib/rack/auth/digest/md5.rb +124 -0
  787. data/vendor/rack/lib/rack/auth/digest/nonce.rb +51 -0
  788. data/vendor/rack/lib/rack/auth/digest/params.rb +55 -0
  789. data/vendor/rack/lib/rack/auth/digest/request.rb +40 -0
  790. data/vendor/rack/lib/rack/auth/openid.rb +437 -0
  791. data/vendor/rack/lib/rack/builder.rb +56 -0
  792. data/vendor/rack/lib/rack/cascade.rb +36 -0
  793. data/vendor/rack/lib/rack/commonlogger.rb +61 -0
  794. data/vendor/rack/lib/rack/deflater.rb +63 -0
  795. data/vendor/rack/lib/rack/directory.rb +158 -0
  796. data/vendor/rack/lib/rack/file.rb +116 -0
  797. data/vendor/rack/lib/rack/handler/cgi.rb +57 -0
  798. data/vendor/rack/lib/rack/handler/evented_mongrel.rb +8 -0
  799. data/vendor/rack/lib/rack/handler/fastcgi.rb +84 -0
  800. data/vendor/rack/lib/rack/handler/lsws.rb +52 -0
  801. data/vendor/rack/lib/rack/handler/mongrel.rb +78 -0
  802. data/vendor/rack/lib/rack/handler/scgi.rb +57 -0
  803. data/vendor/rack/lib/rack/handler/webrick.rb +57 -0
  804. data/vendor/rack/lib/rack/handler.rb +44 -0
  805. data/vendor/rack/lib/rack/lint.rb +401 -0
  806. data/vendor/rack/lib/rack/lobster.rb +65 -0
  807. data/vendor/rack/lib/rack/mock.rb +160 -0
  808. data/vendor/rack/lib/rack/recursive.rb +57 -0
  809. data/vendor/rack/lib/rack/reloader.rb +64 -0
  810. data/vendor/rack/lib/rack/request.rb +209 -0
  811. data/vendor/rack/lib/rack/response.rb +166 -0
  812. data/vendor/rack/lib/rack/session/abstract/id.rb +140 -0
  813. data/vendor/rack/lib/rack/session/cookie.rb +71 -0
  814. data/vendor/rack/lib/rack/session/memcache.rb +97 -0
  815. data/vendor/rack/lib/rack/session/pool.rb +73 -0
  816. data/vendor/rack/lib/rack/showexceptions.rb +344 -0
  817. data/vendor/rack/lib/rack/showstatus.rb +105 -0
  818. data/vendor/rack/lib/rack/static.rb +38 -0
  819. data/vendor/rack/lib/rack/urlmap.rb +48 -0
  820. data/vendor/rack/lib/rack/utils.rb +318 -0
  821. data/vendor/rack/lib/rack.rb +81 -0
  822. data/vendor/rack/test/cgi/lighttpd.conf +20 -0
  823. data/vendor/rack/test/cgi/test +9 -0
  824. data/vendor/rack/test/cgi/test.fcgi +8 -0
  825. data/vendor/rack/test/cgi/test.ru +7 -0
  826. data/vendor/rack/test/spec_rack_auth_basic.rb +69 -0
  827. data/vendor/rack/test/spec_rack_auth_digest.rb +169 -0
  828. data/vendor/rack/test/spec_rack_auth_openid.rb +137 -0
  829. data/vendor/rack/test/spec_rack_builder.rb +50 -0
  830. data/vendor/rack/test/spec_rack_camping.rb +51 -0
  831. data/vendor/rack/test/spec_rack_cascade.rb +50 -0
  832. data/vendor/rack/test/spec_rack_cgi.rb +89 -0
  833. data/vendor/rack/test/spec_rack_commonlogger.rb +32 -0
  834. data/vendor/rack/test/spec_rack_deflater.rb +70 -0
  835. data/vendor/rack/test/spec_rack_directory.rb +56 -0
  836. data/vendor/rack/test/spec_rack_fastcgi.rb +89 -0
  837. data/vendor/rack/test/spec_rack_file.rb +50 -0
  838. data/vendor/rack/test/spec_rack_handler.rb +24 -0
  839. data/vendor/rack/test/spec_rack_lint.rb +303 -0
  840. data/vendor/rack/test/spec_rack_lobster.rb +45 -0
  841. data/vendor/rack/test/spec_rack_mock.rb +152 -0
  842. data/vendor/rack/test/spec_rack_mongrel.rb +170 -0
  843. data/vendor/rack/test/spec_rack_recursive.rb +77 -0
  844. data/vendor/rack/test/spec_rack_request.rb +401 -0
  845. data/vendor/rack/test/spec_rack_response.rb +167 -0
  846. data/vendor/rack/test/spec_rack_session_cookie.rb +49 -0
  847. data/vendor/rack/test/spec_rack_session_memcache.rb +132 -0
  848. data/vendor/rack/test/spec_rack_session_pool.rb +84 -0
  849. data/vendor/rack/test/spec_rack_showexceptions.rb +21 -0
  850. data/vendor/rack/test/spec_rack_showstatus.rb +72 -0
  851. data/vendor/rack/test/spec_rack_static.rb +37 -0
  852. data/vendor/rack/test/spec_rack_urlmap.rb +175 -0
  853. data/vendor/rack/test/spec_rack_utils.rb +174 -0
  854. data/vendor/rack/test/spec_rack_webrick.rb +106 -0
  855. data/vendor/rack/test/testrequest.rb +45 -0
  856. data/vendor/sinatra/CHANGELOG +64 -0
  857. data/vendor/sinatra/LICENSE +22 -0
  858. data/vendor/sinatra/README.rdoc +533 -0
  859. data/vendor/sinatra/Rakefile +111 -0
  860. data/vendor/sinatra/images/404.png +0 -0
  861. data/vendor/sinatra/images/500.png +0 -0
  862. data/vendor/sinatra/lib/sinatra/rack/handler/mongrel.rb +85 -0
  863. data/vendor/sinatra/lib/sinatra/test/methods.rb +76 -0
  864. data/vendor/sinatra/lib/sinatra/test/rspec.rb +10 -0
  865. data/vendor/sinatra/lib/sinatra/test/spec.rb +10 -0
  866. data/vendor/sinatra/lib/sinatra/test/unit.rb +13 -0
  867. data/vendor/sinatra/lib/sinatra.rb +1477 -0
  868. data/vendor/sinatra/sinatra.gemspec +78 -0
  869. data/vendor/sinatra/test/app_test.rb +299 -0
  870. data/vendor/sinatra/test/application_test.rb +318 -0
  871. data/vendor/sinatra/test/builder_test.rb +101 -0
  872. data/vendor/sinatra/test/custom_error_test.rb +62 -0
  873. data/vendor/sinatra/test/erb_test.rb +136 -0
  874. data/vendor/sinatra/test/event_context_test.rb +15 -0
  875. data/vendor/sinatra/test/events_test.rb +47 -0
  876. data/vendor/sinatra/test/filter_test.rb +30 -0
  877. data/vendor/sinatra/test/haml_test.rb +233 -0
  878. data/vendor/sinatra/test/helper.rb +7 -0
  879. data/vendor/sinatra/test/mapped_error_test.rb +72 -0
  880. data/vendor/sinatra/test/pipeline_test.rb +66 -0
  881. data/vendor/sinatra/test/public/foo.xml +1 -0
  882. data/vendor/sinatra/test/sass_test.rb +57 -0
  883. data/vendor/sinatra/test/sessions_test.rb +39 -0
  884. data/vendor/sinatra/test/streaming_test.rb +118 -0
  885. data/vendor/sinatra/test/sym_params_test.rb +19 -0
  886. data/vendor/sinatra/test/template_test.rb +30 -0
  887. data/vendor/sinatra/test/use_in_file_templates_test.rb +47 -0
  888. data/vendor/sinatra/test/views/foo.builder +1 -0
  889. data/vendor/sinatra/test/views/foo.erb +1 -0
  890. data/vendor/sinatra/test/views/foo.haml +1 -0
  891. data/vendor/sinatra/test/views/foo.sass +2 -0
  892. data/vendor/sinatra/test/views/foo_layout.erb +2 -0
  893. data/vendor/sinatra/test/views/foo_layout.haml +2 -0
  894. data/vendor/sinatra/test/views/layout_test/foo.builder +1 -0
  895. data/vendor/sinatra/test/views/layout_test/foo.erb +1 -0
  896. data/vendor/sinatra/test/views/layout_test/foo.haml +1 -0
  897. data/vendor/sinatra/test/views/layout_test/foo.sass +2 -0
  898. data/vendor/sinatra/test/views/layout_test/layout.builder +3 -0
  899. data/vendor/sinatra/test/views/layout_test/layout.erb +1 -0
  900. data/vendor/sinatra/test/views/layout_test/layout.haml +1 -0
  901. data/vendor/sinatra/test/views/layout_test/layout.sass +2 -0
  902. data/vendor/sinatra/test/views/no_layout/no_layout.builder +1 -0
  903. data/vendor/sinatra/test/views/no_layout/no_layout.haml +1 -0
  904. metadata +1121 -0
@@ -0,0 +1,1034 @@
1
+ require "cases/helper"
2
+ require 'models/developer'
3
+ require 'models/project'
4
+ require 'models/company'
5
+ require 'models/topic'
6
+ require 'models/reply'
7
+ require 'models/category'
8
+ require 'models/post'
9
+ require 'models/author'
10
+ require 'models/comment'
11
+ require 'models/person'
12
+ require 'models/reader'
13
+
14
+ class HasManyAssociationsTest < ActiveRecord::TestCase
15
+ fixtures :accounts, :categories, :companies, :developers, :projects,
16
+ :developers_projects, :topics, :authors, :comments, :author_addresses,
17
+ :people, :posts, :readers
18
+
19
+ def setup
20
+ Client.destroyed_client_ids.clear
21
+ end
22
+
23
+ def force_signal37_to_load_all_clients_of_firm
24
+ companies(:first_firm).clients_of_firm.each {|f| }
25
+ end
26
+
27
+ def test_counting_with_counter_sql
28
+ assert_equal 2, Firm.find(:first).clients.count
29
+ end
30
+
31
+ def test_counting
32
+ assert_equal 2, Firm.find(:first).plain_clients.count
33
+ end
34
+
35
+ def test_counting_with_empty_hash_conditions
36
+ assert_equal 2, Firm.find(:first).plain_clients.count(:conditions => {})
37
+ end
38
+
39
+ def test_counting_with_single_conditions
40
+ assert_equal 1, Firm.find(:first).plain_clients.count(:conditions => ['name=?', "Microsoft"])
41
+ end
42
+
43
+ def test_counting_with_single_hash
44
+ assert_equal 1, Firm.find(:first).plain_clients.count(:conditions => {:name => "Microsoft"})
45
+ end
46
+
47
+ def test_counting_with_column_name_and_hash
48
+ assert_equal 2, Firm.find(:first).plain_clients.count(:name)
49
+ end
50
+
51
+ def test_counting_with_association_limit
52
+ firm = companies(:first_firm)
53
+ assert_equal firm.limited_clients.length, firm.limited_clients.size
54
+ assert_equal firm.limited_clients.length, firm.limited_clients.count
55
+ end
56
+
57
+ def test_finding
58
+ assert_equal 2, Firm.find(:first).clients.length
59
+ end
60
+
61
+ def test_find_with_blank_conditions
62
+ [[], {}, nil, ""].each do |blank|
63
+ assert_equal 2, Firm.find(:first).clients.find(:all, :conditions => blank).size
64
+ end
65
+ end
66
+
67
+ def test_find_many_with_merged_options
68
+ assert_equal 1, companies(:first_firm).limited_clients.size
69
+ assert_equal 1, companies(:first_firm).limited_clients.find(:all).size
70
+ assert_equal 2, companies(:first_firm).limited_clients.find(:all, :limit => nil).size
71
+ end
72
+
73
+ def test_dynamic_find_should_respect_association_order
74
+ assert_equal companies(:second_client), companies(:first_firm).clients_sorted_desc.find(:first, :conditions => "type = 'Client'")
75
+ assert_equal companies(:second_client), companies(:first_firm).clients_sorted_desc.find_by_type('Client')
76
+ end
77
+
78
+ def test_dynamic_find_order_should_override_association_order
79
+ assert_equal companies(:first_client), companies(:first_firm).clients_sorted_desc.find(:first, :conditions => "type = 'Client'", :order => 'id')
80
+ assert_equal companies(:first_client), companies(:first_firm).clients_sorted_desc.find_by_type('Client', :order => 'id')
81
+ end
82
+
83
+ def test_dynamic_find_all_should_respect_association_order
84
+ assert_equal [companies(:second_client), companies(:first_client)], companies(:first_firm).clients_sorted_desc.find(:all, :conditions => "type = 'Client'")
85
+ assert_equal [companies(:second_client), companies(:first_client)], companies(:first_firm).clients_sorted_desc.find_all_by_type('Client')
86
+ end
87
+
88
+ def test_dynamic_find_all_order_should_override_association_order
89
+ assert_equal [companies(:first_client), companies(:second_client)], companies(:first_firm).clients_sorted_desc.find(:all, :conditions => "type = 'Client'", :order => 'id')
90
+ assert_equal [companies(:first_client), companies(:second_client)], companies(:first_firm).clients_sorted_desc.find_all_by_type('Client', :order => 'id')
91
+ end
92
+
93
+ def test_dynamic_find_all_should_respect_association_limit
94
+ assert_equal 1, companies(:first_firm).limited_clients.find(:all, :conditions => "type = 'Client'").length
95
+ assert_equal 1, companies(:first_firm).limited_clients.find_all_by_type('Client').length
96
+ end
97
+
98
+ def test_dynamic_find_all_limit_should_override_association_limit
99
+ assert_equal 2, companies(:first_firm).limited_clients.find(:all, :conditions => "type = 'Client'", :limit => 9_000).length
100
+ assert_equal 2, companies(:first_firm).limited_clients.find_all_by_type('Client', :limit => 9_000).length
101
+ end
102
+
103
+ def test_dynamic_find_all_should_respect_readonly_access
104
+ companies(:first_firm).readonly_clients.find(:all).each { |c| assert_raise(ActiveRecord::ReadOnlyRecord) { c.save! } }
105
+ companies(:first_firm).readonly_clients.find(:all).each { |c| assert c.readonly? }
106
+ end
107
+
108
+ def test_cant_save_has_many_readonly_association
109
+ authors(:david).readonly_comments.each { |c| assert_raise(ActiveRecord::ReadOnlyRecord) { c.save! } }
110
+ authors(:david).readonly_comments.each { |c| assert c.readonly? }
111
+ end
112
+
113
+ def test_triple_equality
114
+ assert !(Array === Firm.find(:first).clients)
115
+ assert Firm.find(:first).clients === Array
116
+ end
117
+
118
+ def test_finding_default_orders
119
+ assert_equal "Summit", Firm.find(:first).clients.first.name
120
+ end
121
+
122
+ def test_finding_with_different_class_name_and_order
123
+ assert_equal "Microsoft", Firm.find(:first).clients_sorted_desc.first.name
124
+ end
125
+
126
+ def test_finding_with_foreign_key
127
+ assert_equal "Microsoft", Firm.find(:first).clients_of_firm.first.name
128
+ end
129
+
130
+ def test_finding_with_condition
131
+ assert_equal "Microsoft", Firm.find(:first).clients_like_ms.first.name
132
+ end
133
+
134
+ def test_finding_with_condition_hash
135
+ assert_equal "Microsoft", Firm.find(:first).clients_like_ms_with_hash_conditions.first.name
136
+ end
137
+
138
+ def test_finding_using_sql
139
+ firm = Firm.find(:first)
140
+ first_client = firm.clients_using_sql.first
141
+ assert_not_nil first_client
142
+ assert_equal "Microsoft", first_client.name
143
+ assert_equal 1, firm.clients_using_sql.size
144
+ assert_equal 1, Firm.find(:first).clients_using_sql.size
145
+ end
146
+
147
+ def test_counting_using_sql
148
+ assert_equal 1, Firm.find(:first).clients_using_counter_sql.size
149
+ assert Firm.find(:first).clients_using_counter_sql.any?
150
+ assert_equal 0, Firm.find(:first).clients_using_zero_counter_sql.size
151
+ assert !Firm.find(:first).clients_using_zero_counter_sql.any?
152
+ end
153
+
154
+ def test_counting_non_existant_items_using_sql
155
+ assert_equal 0, Firm.find(:first).no_clients_using_counter_sql.size
156
+ end
157
+
158
+ def test_belongs_to_sanity
159
+ c = Client.new
160
+ assert_nil c.firm
161
+
162
+ if c.firm
163
+ assert false, "belongs_to failed if check"
164
+ end
165
+
166
+ unless c.firm
167
+ else
168
+ assert false, "belongs_to failed unless check"
169
+ end
170
+ end
171
+
172
+ def test_find_ids
173
+ firm = Firm.find(:first)
174
+
175
+ assert_raises(ActiveRecord::RecordNotFound) { firm.clients.find }
176
+
177
+ client = firm.clients.find(2)
178
+ assert_kind_of Client, client
179
+
180
+ client_ary = firm.clients.find([2])
181
+ assert_kind_of Array, client_ary
182
+ assert_equal client, client_ary.first
183
+
184
+ client_ary = firm.clients.find(2, 3)
185
+ assert_kind_of Array, client_ary
186
+ assert_equal 2, client_ary.size
187
+ assert_equal client, client_ary.first
188
+
189
+ assert_raises(ActiveRecord::RecordNotFound) { firm.clients.find(2, 99) }
190
+ end
191
+
192
+ def test_find_string_ids_when_using_finder_sql
193
+ firm = Firm.find(:first)
194
+
195
+ client = firm.clients_using_finder_sql.find("2")
196
+ assert_kind_of Client, client
197
+
198
+ client_ary = firm.clients_using_finder_sql.find(["2"])
199
+ assert_kind_of Array, client_ary
200
+ assert_equal client, client_ary.first
201
+
202
+ client_ary = firm.clients_using_finder_sql.find("2", "3")
203
+ assert_kind_of Array, client_ary
204
+ assert_equal 2, client_ary.size
205
+ assert client_ary.include?(client)
206
+ end
207
+
208
+ def test_find_all
209
+ firm = Firm.find(:first)
210
+ assert_equal 2, firm.clients.find(:all, :conditions => "#{QUOTED_TYPE} = 'Client'").length
211
+ assert_equal 1, firm.clients.find(:all, :conditions => "name = 'Summit'").length
212
+ end
213
+
214
+ def test_find_all_sanitized
215
+ firm = Firm.find(:first)
216
+ summit = firm.clients.find(:all, :conditions => "name = 'Summit'")
217
+ assert_equal summit, firm.clients.find(:all, :conditions => ["name = ?", "Summit"])
218
+ assert_equal summit, firm.clients.find(:all, :conditions => ["name = :name", { :name => "Summit" }])
219
+ end
220
+
221
+ def test_find_first
222
+ firm = Firm.find(:first)
223
+ client2 = Client.find(2)
224
+ assert_equal firm.clients.first, firm.clients.find(:first)
225
+ assert_equal client2, firm.clients.find(:first, :conditions => "#{QUOTED_TYPE} = 'Client'")
226
+ end
227
+
228
+ def test_find_first_sanitized
229
+ firm = Firm.find(:first)
230
+ client2 = Client.find(2)
231
+ assert_equal client2, firm.clients.find(:first, :conditions => ["#{QUOTED_TYPE} = ?", 'Client'])
232
+ assert_equal client2, firm.clients.find(:first, :conditions => ["#{QUOTED_TYPE} = :type", { :type => 'Client' }])
233
+ end
234
+
235
+ def test_find_in_collection
236
+ assert_equal Client.find(2).name, companies(:first_firm).clients.find(2).name
237
+ assert_raises(ActiveRecord::RecordNotFound) { companies(:first_firm).clients.find(6) }
238
+ end
239
+
240
+ def test_find_grouped
241
+ all_clients_of_firm1 = Client.find(:all, :conditions => "firm_id = 1")
242
+ grouped_clients_of_firm1 = Client.find(:all, :conditions => "firm_id = 1", :group => "firm_id", :select => 'firm_id, count(id) as clients_count')
243
+ assert_equal 2, all_clients_of_firm1.size
244
+ assert_equal 1, grouped_clients_of_firm1.size
245
+ end
246
+
247
+ def test_adding
248
+ force_signal37_to_load_all_clients_of_firm
249
+ natural = Client.new("name" => "Natural Company")
250
+ companies(:first_firm).clients_of_firm << natural
251
+ assert_equal 2, companies(:first_firm).clients_of_firm.size # checking via the collection
252
+ assert_equal 2, companies(:first_firm).clients_of_firm(true).size # checking using the db
253
+ assert_equal natural, companies(:first_firm).clients_of_firm.last
254
+ end
255
+
256
+ def test_adding_using_create
257
+ first_firm = companies(:first_firm)
258
+ assert_equal 2, first_firm.plain_clients.size
259
+ natural = first_firm.plain_clients.create(:name => "Natural Company")
260
+ assert_equal 3, first_firm.plain_clients.length
261
+ assert_equal 3, first_firm.plain_clients.size
262
+ end
263
+
264
+ def test_create_with_bang_on_has_many_when_parent_is_new_raises
265
+ assert_raises(ActiveRecord::RecordNotSaved) do
266
+ firm = Firm.new
267
+ firm.plain_clients.create! :name=>"Whoever"
268
+ end
269
+ end
270
+
271
+ def test_regular_create_on_has_many_when_parent_is_new_raises
272
+ assert_raises(ActiveRecord::RecordNotSaved) do
273
+ firm = Firm.new
274
+ firm.plain_clients.create :name=>"Whoever"
275
+ end
276
+ end
277
+
278
+ def test_create_with_bang_on_has_many_raises_when_record_not_saved
279
+ assert_raises(ActiveRecord::RecordInvalid) do
280
+ firm = Firm.find(:first)
281
+ firm.plain_clients.create!
282
+ end
283
+ end
284
+
285
+ def test_create_with_bang_on_habtm_when_parent_is_new_raises
286
+ assert_raises(ActiveRecord::RecordNotSaved) do
287
+ Developer.new("name" => "Aredridel").projects.create!
288
+ end
289
+ end
290
+
291
+ def test_adding_a_mismatch_class
292
+ assert_raises(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).clients_of_firm << nil }
293
+ assert_raises(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).clients_of_firm << 1 }
294
+ assert_raises(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).clients_of_firm << Topic.find(1) }
295
+ end
296
+
297
+ def test_adding_a_collection
298
+ force_signal37_to_load_all_clients_of_firm
299
+ companies(:first_firm).clients_of_firm.concat([Client.new("name" => "Natural Company"), Client.new("name" => "Apple")])
300
+ assert_equal 3, companies(:first_firm).clients_of_firm.size
301
+ assert_equal 3, companies(:first_firm).clients_of_firm(true).size
302
+ end
303
+
304
+ def test_adding_before_save
305
+ no_of_firms = Firm.count
306
+ no_of_clients = Client.count
307
+
308
+ new_firm = Firm.new("name" => "A New Firm, Inc")
309
+ c = Client.new("name" => "Apple")
310
+
311
+ new_firm.clients_of_firm.push Client.new("name" => "Natural Company")
312
+ assert_equal 1, new_firm.clients_of_firm.size
313
+ new_firm.clients_of_firm << c
314
+ assert_equal 2, new_firm.clients_of_firm.size
315
+
316
+ assert_equal no_of_firms, Firm.count # Firm was not saved to database.
317
+ assert_equal no_of_clients, Client.count # Clients were not saved to database.
318
+ assert new_firm.save
319
+ assert !new_firm.new_record?
320
+ assert !c.new_record?
321
+ assert_equal new_firm, c.firm
322
+ assert_equal no_of_firms+1, Firm.count # Firm was saved to database.
323
+ assert_equal no_of_clients+2, Client.count # Clients were saved to database.
324
+
325
+ assert_equal 2, new_firm.clients_of_firm.size
326
+ assert_equal 2, new_firm.clients_of_firm(true).size
327
+ end
328
+
329
+ def test_invalid_adding
330
+ firm = Firm.find(1)
331
+ assert !(firm.clients_of_firm << c = Client.new)
332
+ assert c.new_record?
333
+ assert !firm.valid?
334
+ assert !firm.save
335
+ assert c.new_record?
336
+ end
337
+
338
+ def test_invalid_adding_before_save
339
+ no_of_firms = Firm.count
340
+ no_of_clients = Client.count
341
+ new_firm = Firm.new("name" => "A New Firm, Inc")
342
+ new_firm.clients_of_firm.concat([c = Client.new, Client.new("name" => "Apple")])
343
+ assert c.new_record?
344
+ assert !c.valid?
345
+ assert !new_firm.valid?
346
+ assert !new_firm.save
347
+ assert c.new_record?
348
+ assert new_firm.new_record?
349
+ end
350
+
351
+ def test_invalid_adding_with_validate_false
352
+ firm = Firm.find(:first)
353
+ client = Client.new
354
+ firm.unvalidated_clients_of_firm << client
355
+
356
+ assert firm.valid?
357
+ assert !client.valid?
358
+ assert firm.save
359
+ assert client.new_record?
360
+ end
361
+
362
+ def test_valid_adding_with_validate_false
363
+ no_of_clients = Client.count
364
+
365
+ firm = Firm.find(:first)
366
+ client = Client.new("name" => "Apple")
367
+
368
+ assert firm.valid?
369
+ assert client.valid?
370
+ assert client.new_record?
371
+
372
+ firm.unvalidated_clients_of_firm << client
373
+
374
+ assert firm.save
375
+ assert !client.new_record?
376
+ assert_equal no_of_clients+1, Client.count
377
+ end
378
+
379
+ def test_build
380
+ company = companies(:first_firm)
381
+ new_client = assert_no_queries { company.clients_of_firm.build("name" => "Another Client") }
382
+ assert !company.clients_of_firm.loaded?
383
+
384
+ assert_equal "Another Client", new_client.name
385
+ assert new_client.new_record?
386
+ assert_equal new_client, company.clients_of_firm.last
387
+ company.name += '-changed'
388
+ assert_queries(2) { assert company.save }
389
+ assert !new_client.new_record?
390
+ assert_equal 2, company.clients_of_firm(true).size
391
+ end
392
+
393
+ def test_collection_size_after_building
394
+ company = companies(:first_firm) # company already has one client
395
+ company.clients_of_firm.build("name" => "Another Client")
396
+ company.clients_of_firm.build("name" => "Yet Another Client")
397
+ assert_equal 3, company.clients_of_firm.size
398
+ end
399
+
400
+ def test_collection_size_twice_for_regressions
401
+ post = posts(:thinking)
402
+ assert_equal 0, post.readers.size
403
+ # This test needs a post that has no readers, we assert it to ensure it holds,
404
+ # but need to reload the post because the very call to #size hides the bug.
405
+ post.reload
406
+ post.readers.build
407
+ size1 = post.readers.size
408
+ size2 = post.readers.size
409
+ assert_equal size1, size2
410
+ end
411
+
412
+ def test_build_many
413
+ company = companies(:first_firm)
414
+ new_clients = assert_no_queries { company.clients_of_firm.build([{"name" => "Another Client"}, {"name" => "Another Client II"}]) }
415
+
416
+ assert_equal 2, new_clients.size
417
+ company.name += '-changed'
418
+ assert_queries(3) { assert company.save }
419
+ assert_equal 3, company.clients_of_firm(true).size
420
+ end
421
+
422
+ def test_build_followed_by_save_does_not_load_target
423
+ new_client = companies(:first_firm).clients_of_firm.build("name" => "Another Client")
424
+ assert companies(:first_firm).save
425
+ assert !companies(:first_firm).clients_of_firm.loaded?
426
+ end
427
+
428
+ def test_build_without_loading_association
429
+ first_topic = topics(:first)
430
+ Reply.column_names
431
+
432
+ assert_equal 1, first_topic.replies.length
433
+
434
+ assert_no_queries do
435
+ first_topic.replies.build(:title => "Not saved", :content => "Superstars")
436
+ assert_equal 2, first_topic.replies.size
437
+ end
438
+
439
+ assert_equal 2, first_topic.replies.to_ary.size
440
+ end
441
+
442
+ def test_build_via_block
443
+ company = companies(:first_firm)
444
+ new_client = assert_no_queries { company.clients_of_firm.build {|client| client.name = "Another Client" } }
445
+ assert !company.clients_of_firm.loaded?
446
+
447
+ assert_equal "Another Client", new_client.name
448
+ assert new_client.new_record?
449
+ assert_equal new_client, company.clients_of_firm.last
450
+ company.name += '-changed'
451
+ assert_queries(2) { assert company.save }
452
+ assert !new_client.new_record?
453
+ assert_equal 2, company.clients_of_firm(true).size
454
+ end
455
+
456
+ def test_build_many_via_block
457
+ company = companies(:first_firm)
458
+ new_clients = assert_no_queries do
459
+ company.clients_of_firm.build([{"name" => "Another Client"}, {"name" => "Another Client II"}]) do |client|
460
+ client.name = "changed"
461
+ end
462
+ end
463
+
464
+ assert_equal 2, new_clients.size
465
+ assert_equal "changed", new_clients.first.name
466
+ assert_equal "changed", new_clients.last.name
467
+
468
+ company.name += '-changed'
469
+ assert_queries(3) { assert company.save }
470
+ assert_equal 3, company.clients_of_firm(true).size
471
+ end
472
+
473
+ def test_create_without_loading_association
474
+ first_firm = companies(:first_firm)
475
+ Firm.column_names
476
+ Client.column_names
477
+
478
+ assert_equal 1, first_firm.clients_of_firm.size
479
+ first_firm.clients_of_firm.reset
480
+
481
+ assert_queries(1) do
482
+ first_firm.clients_of_firm.create(:name => "Superstars")
483
+ end
484
+
485
+ assert_equal 2, first_firm.clients_of_firm.size
486
+ end
487
+
488
+ def test_invalid_build
489
+ new_client = companies(:first_firm).clients_of_firm.build
490
+ assert new_client.new_record?
491
+ assert !new_client.valid?
492
+ assert_equal new_client, companies(:first_firm).clients_of_firm.last
493
+ assert !companies(:first_firm).save
494
+ assert new_client.new_record?
495
+ assert_equal 1, companies(:first_firm).clients_of_firm(true).size
496
+ end
497
+
498
+ def test_create
499
+ force_signal37_to_load_all_clients_of_firm
500
+ new_client = companies(:first_firm).clients_of_firm.create("name" => "Another Client")
501
+ assert !new_client.new_record?
502
+ assert_equal new_client, companies(:first_firm).clients_of_firm.last
503
+ assert_equal new_client, companies(:first_firm).clients_of_firm(true).last
504
+ end
505
+
506
+ def test_create_many
507
+ companies(:first_firm).clients_of_firm.create([{"name" => "Another Client"}, {"name" => "Another Client II"}])
508
+ assert_equal 3, companies(:first_firm).clients_of_firm(true).size
509
+ end
510
+
511
+ def test_create_followed_by_save_does_not_load_target
512
+ new_client = companies(:first_firm).clients_of_firm.create("name" => "Another Client")
513
+ assert companies(:first_firm).save
514
+ assert !companies(:first_firm).clients_of_firm.loaded?
515
+ end
516
+
517
+ def test_find_or_initialize
518
+ the_client = companies(:first_firm).clients.find_or_initialize_by_name("Yet another client")
519
+ assert_equal companies(:first_firm).id, the_client.firm_id
520
+ assert_equal "Yet another client", the_client.name
521
+ assert the_client.new_record?
522
+ end
523
+
524
+ def test_find_or_create
525
+ number_of_clients = companies(:first_firm).clients.size
526
+ the_client = companies(:first_firm).clients.find_or_create_by_name("Yet another client")
527
+ assert_equal number_of_clients + 1, companies(:first_firm, :reload).clients.size
528
+ assert_equal the_client, companies(:first_firm).clients.find_or_create_by_name("Yet another client")
529
+ assert_equal number_of_clients + 1, companies(:first_firm, :reload).clients.size
530
+ end
531
+
532
+ def test_deleting
533
+ force_signal37_to_load_all_clients_of_firm
534
+ companies(:first_firm).clients_of_firm.delete(companies(:first_firm).clients_of_firm.first)
535
+ assert_equal 0, companies(:first_firm).clients_of_firm.size
536
+ assert_equal 0, companies(:first_firm).clients_of_firm(true).size
537
+ end
538
+
539
+ def test_deleting_before_save
540
+ new_firm = Firm.new("name" => "A New Firm, Inc.")
541
+ new_client = new_firm.clients_of_firm.build("name" => "Another Client")
542
+ assert_equal 1, new_firm.clients_of_firm.size
543
+ new_firm.clients_of_firm.delete(new_client)
544
+ assert_equal 0, new_firm.clients_of_firm.size
545
+ end
546
+
547
+ def test_deleting_a_collection
548
+ force_signal37_to_load_all_clients_of_firm
549
+ companies(:first_firm).clients_of_firm.create("name" => "Another Client")
550
+ assert_equal 2, companies(:first_firm).clients_of_firm.size
551
+ companies(:first_firm).clients_of_firm.delete([companies(:first_firm).clients_of_firm[0], companies(:first_firm).clients_of_firm[1]])
552
+ assert_equal 0, companies(:first_firm).clients_of_firm.size
553
+ assert_equal 0, companies(:first_firm).clients_of_firm(true).size
554
+ end
555
+
556
+ def test_delete_all
557
+ force_signal37_to_load_all_clients_of_firm
558
+ companies(:first_firm).clients_of_firm.create("name" => "Another Client")
559
+ assert_equal 2, companies(:first_firm).clients_of_firm.size
560
+ companies(:first_firm).clients_of_firm.delete_all
561
+ assert_equal 0, companies(:first_firm).clients_of_firm.size
562
+ assert_equal 0, companies(:first_firm).clients_of_firm(true).size
563
+ end
564
+
565
+ def test_delete_all_with_not_yet_loaded_association_collection
566
+ force_signal37_to_load_all_clients_of_firm
567
+ companies(:first_firm).clients_of_firm.create("name" => "Another Client")
568
+ assert_equal 2, companies(:first_firm).clients_of_firm.size
569
+ companies(:first_firm).clients_of_firm.reset
570
+ companies(:first_firm).clients_of_firm.delete_all
571
+ assert_equal 0, companies(:first_firm).clients_of_firm.size
572
+ assert_equal 0, companies(:first_firm).clients_of_firm(true).size
573
+ end
574
+
575
+ def test_clearing_an_association_collection
576
+ firm = companies(:first_firm)
577
+ client_id = firm.clients_of_firm.first.id
578
+ assert_equal 1, firm.clients_of_firm.size
579
+
580
+ firm.clients_of_firm.clear
581
+
582
+ assert_equal 0, firm.clients_of_firm.size
583
+ assert_equal 0, firm.clients_of_firm(true).size
584
+ assert_equal [], Client.destroyed_client_ids[firm.id]
585
+
586
+ # Should not be destroyed since the association is not dependent.
587
+ assert_nothing_raised do
588
+ assert Client.find(client_id).firm.nil?
589
+ end
590
+ end
591
+
592
+ def test_clearing_a_dependent_association_collection
593
+ firm = companies(:first_firm)
594
+ client_id = firm.dependent_clients_of_firm.first.id
595
+ assert_equal 1, firm.dependent_clients_of_firm.size
596
+
597
+ # :dependent means destroy is called on each client
598
+ firm.dependent_clients_of_firm.clear
599
+
600
+ assert_equal 0, firm.dependent_clients_of_firm.size
601
+ assert_equal 0, firm.dependent_clients_of_firm(true).size
602
+ assert_equal [client_id], Client.destroyed_client_ids[firm.id]
603
+
604
+ # Should be destroyed since the association is dependent.
605
+ assert Client.find_by_id(client_id).nil?
606
+ end
607
+
608
+ def test_clearing_an_exclusively_dependent_association_collection
609
+ firm = companies(:first_firm)
610
+ client_id = firm.exclusively_dependent_clients_of_firm.first.id
611
+ assert_equal 1, firm.exclusively_dependent_clients_of_firm.size
612
+
613
+ assert_equal [], Client.destroyed_client_ids[firm.id]
614
+
615
+ # :exclusively_dependent means each client is deleted directly from
616
+ # the database without looping through them calling destroy.
617
+ firm.exclusively_dependent_clients_of_firm.clear
618
+
619
+ assert_equal 0, firm.exclusively_dependent_clients_of_firm.size
620
+ assert_equal 0, firm.exclusively_dependent_clients_of_firm(true).size
621
+ # no destroy-filters should have been called
622
+ assert_equal [], Client.destroyed_client_ids[firm.id]
623
+
624
+ # Should be destroyed since the association is exclusively dependent.
625
+ assert Client.find_by_id(client_id).nil?
626
+ end
627
+
628
+ def test_dependent_association_respects_optional_conditions_on_delete
629
+ firm = companies(:odegy)
630
+ Client.create(:client_of => firm.id, :name => "BigShot Inc.")
631
+ Client.create(:client_of => firm.id, :name => "SmallTime Inc.")
632
+ # only one of two clients is included in the association due to the :conditions key
633
+ assert_equal 2, Client.find_all_by_client_of(firm.id).size
634
+ assert_equal 1, firm.dependent_conditional_clients_of_firm.size
635
+ firm.destroy
636
+ # only the correctly associated client should have been deleted
637
+ assert_equal 1, Client.find_all_by_client_of(firm.id).size
638
+ end
639
+
640
+ def test_dependent_association_respects_optional_sanitized_conditions_on_delete
641
+ firm = companies(:odegy)
642
+ Client.create(:client_of => firm.id, :name => "BigShot Inc.")
643
+ Client.create(:client_of => firm.id, :name => "SmallTime Inc.")
644
+ # only one of two clients is included in the association due to the :conditions key
645
+ assert_equal 2, Client.find_all_by_client_of(firm.id).size
646
+ assert_equal 1, firm.dependent_sanitized_conditional_clients_of_firm.size
647
+ firm.destroy
648
+ # only the correctly associated client should have been deleted
649
+ assert_equal 1, Client.find_all_by_client_of(firm.id).size
650
+ end
651
+
652
+ def test_creation_respects_hash_condition
653
+ ms_client = companies(:first_firm).clients_like_ms_with_hash_conditions.build
654
+
655
+ assert ms_client.save
656
+ assert_equal 'Microsoft', ms_client.name
657
+
658
+ another_ms_client = companies(:first_firm).clients_like_ms_with_hash_conditions.create
659
+
660
+ assert !another_ms_client.new_record?
661
+ assert_equal 'Microsoft', another_ms_client.name
662
+ end
663
+
664
+ def test_dependent_delete_and_destroy_with_belongs_to
665
+ author_address = author_addresses(:david_address)
666
+ assert_equal [], AuthorAddress.destroyed_author_address_ids[authors(:david).id]
667
+
668
+ assert_difference "AuthorAddress.count", -2 do
669
+ authors(:david).destroy
670
+ end
671
+
672
+ assert_equal [author_address.id], AuthorAddress.destroyed_author_address_ids[authors(:david).id]
673
+ end
674
+
675
+ def test_invalid_belongs_to_dependent_option_raises_exception
676
+ assert_raises ArgumentError do
677
+ Author.belongs_to :special_author_address, :dependent => :nullify
678
+ end
679
+ end
680
+
681
+ def test_clearing_without_initial_access
682
+ firm = companies(:first_firm)
683
+
684
+ firm.clients_of_firm.clear
685
+
686
+ assert_equal 0, firm.clients_of_firm.size
687
+ assert_equal 0, firm.clients_of_firm(true).size
688
+ end
689
+
690
+ def test_deleting_a_item_which_is_not_in_the_collection
691
+ force_signal37_to_load_all_clients_of_firm
692
+ summit = Client.find_by_name('Summit')
693
+ companies(:first_firm).clients_of_firm.delete(summit)
694
+ assert_equal 1, companies(:first_firm).clients_of_firm.size
695
+ assert_equal 1, companies(:first_firm).clients_of_firm(true).size
696
+ assert_equal 2, summit.client_of
697
+ end
698
+
699
+ def test_deleting_type_mismatch
700
+ david = Developer.find(1)
701
+ david.projects.reload
702
+ assert_raises(ActiveRecord::AssociationTypeMismatch) { david.projects.delete(1) }
703
+ end
704
+
705
+ def test_deleting_self_type_mismatch
706
+ david = Developer.find(1)
707
+ david.projects.reload
708
+ assert_raises(ActiveRecord::AssociationTypeMismatch) { david.projects.delete(Project.find(1).developers) }
709
+ end
710
+
711
+ def test_destroy_all
712
+ force_signal37_to_load_all_clients_of_firm
713
+ assert !companies(:first_firm).clients_of_firm.empty?, "37signals has clients after load"
714
+ companies(:first_firm).clients_of_firm.destroy_all
715
+ assert companies(:first_firm).clients_of_firm.empty?, "37signals has no clients after destroy all"
716
+ assert companies(:first_firm).clients_of_firm(true).empty?, "37signals has no clients after destroy all and refresh"
717
+ end
718
+
719
+ def test_dependence
720
+ firm = companies(:first_firm)
721
+ assert_equal 2, firm.clients.size
722
+ firm.destroy
723
+ assert Client.find(:all, :conditions => "firm_id=#{firm.id}").empty?
724
+ end
725
+
726
+ def test_destroy_dependent_when_deleted_from_association
727
+ firm = Firm.find(:first)
728
+ assert_equal 2, firm.clients.size
729
+
730
+ client = firm.clients.first
731
+ firm.clients.delete(client)
732
+
733
+ assert_raise(ActiveRecord::RecordNotFound) { Client.find(client.id) }
734
+ assert_raise(ActiveRecord::RecordNotFound) { firm.clients.find(client.id) }
735
+ assert_equal 1, firm.clients.size
736
+ end
737
+
738
+ def test_three_levels_of_dependence
739
+ topic = Topic.create "title" => "neat and simple"
740
+ reply = topic.replies.create "title" => "neat and simple", "content" => "still digging it"
741
+ silly_reply = reply.replies.create "title" => "neat and simple", "content" => "ain't complaining"
742
+
743
+ assert_nothing_raised { topic.destroy }
744
+ end
745
+
746
+ uses_transaction :test_dependence_with_transaction_support_on_failure
747
+ def test_dependence_with_transaction_support_on_failure
748
+ firm = companies(:first_firm)
749
+ clients = firm.clients
750
+ assert_equal 2, clients.length
751
+ clients.last.instance_eval { def before_destroy() raise "Trigger rollback" end }
752
+
753
+ firm.destroy rescue "do nothing"
754
+
755
+ assert_equal 2, Client.find(:all, :conditions => "firm_id=#{firm.id}").size
756
+ end
757
+
758
+ def test_dependence_on_account
759
+ num_accounts = Account.count
760
+ companies(:first_firm).destroy
761
+ assert_equal num_accounts - 1, Account.count
762
+ end
763
+
764
+ def test_depends_and_nullify
765
+ num_accounts = Account.count
766
+ num_companies = Company.count
767
+
768
+ core = companies(:rails_core)
769
+ assert_equal accounts(:rails_core_account), core.account
770
+ assert_equal companies(:leetsoft, :jadedpixel), core.companies
771
+ core.destroy
772
+ assert_nil accounts(:rails_core_account).reload.firm_id
773
+ assert_nil companies(:leetsoft).reload.client_of
774
+ assert_nil companies(:jadedpixel).reload.client_of
775
+
776
+
777
+ assert_equal num_accounts, Account.count
778
+ end
779
+
780
+ def test_included_in_collection
781
+ assert companies(:first_firm).clients.include?(Client.find(2))
782
+ end
783
+
784
+ def test_adding_array_and_collection
785
+ assert_nothing_raised { Firm.find(:first).clients + Firm.find(:all).last.clients }
786
+ end
787
+
788
+ def test_find_all_without_conditions
789
+ firm = companies(:first_firm)
790
+ assert_equal 2, firm.clients.find(:all).length
791
+ end
792
+
793
+ def test_replace_with_less
794
+ firm = Firm.find(:first)
795
+ firm.clients = [companies(:first_client)]
796
+ assert firm.save, "Could not save firm"
797
+ firm.reload
798
+ assert_equal 1, firm.clients.length
799
+ end
800
+
801
+ def test_replace_with_less_and_dependent_nullify
802
+ num_companies = Company.count
803
+ companies(:rails_core).companies = []
804
+ assert_equal num_companies, Company.count
805
+ end
806
+
807
+ def test_replace_with_new
808
+ firm = Firm.find(:first)
809
+ firm.clients = [companies(:second_client), Client.new("name" => "New Client")]
810
+ firm.save
811
+ firm.reload
812
+ assert_equal 2, firm.clients.length
813
+ assert !firm.clients.include?(:first_client)
814
+ end
815
+
816
+ def test_replace_on_new_object
817
+ firm = Firm.new("name" => "New Firm")
818
+ firm.clients = [companies(:second_client), Client.new("name" => "New Client")]
819
+ assert firm.save
820
+ firm.reload
821
+ assert_equal 2, firm.clients.length
822
+ assert firm.clients.include?(Client.find_by_name("New Client"))
823
+ end
824
+
825
+ def test_get_ids
826
+ assert_equal [companies(:first_client).id, companies(:second_client).id], companies(:first_firm).client_ids
827
+ end
828
+
829
+ def test_assign_ids
830
+ firm = Firm.new("name" => "Apple")
831
+ firm.client_ids = [companies(:first_client).id, companies(:second_client).id]
832
+ firm.save
833
+ firm.reload
834
+ assert_equal 2, firm.clients.length
835
+ assert firm.clients.include?(companies(:second_client))
836
+ end
837
+
838
+ def test_assign_ids_ignoring_blanks
839
+ firm = Firm.create!(:name => 'Apple')
840
+ firm.client_ids = [companies(:first_client).id, nil, companies(:second_client).id, '']
841
+ firm.save!
842
+
843
+ assert_equal 2, firm.clients(true).size
844
+ assert firm.clients.include?(companies(:second_client))
845
+ end
846
+
847
+ def test_get_ids_for_through
848
+ assert_equal [comments(:eager_other_comment1).id], authors(:mary).comment_ids
849
+ end
850
+
851
+ def test_modifying_a_through_a_has_many_should_raise
852
+ [
853
+ lambda { authors(:mary).comment_ids = [comments(:greetings).id, comments(:more_greetings).id] },
854
+ lambda { authors(:mary).comments = [comments(:greetings), comments(:more_greetings)] },
855
+ lambda { authors(:mary).comments << Comment.create!(:body => "Yay", :post_id => 424242) },
856
+ lambda { authors(:mary).comments.delete(authors(:mary).comments.first) },
857
+ ].each {|block| assert_raise(ActiveRecord::HasManyThroughCantAssociateThroughHasManyReflection, &block) }
858
+ end
859
+
860
+
861
+ def test_assign_ids_for_through_a_belongs_to
862
+ post = Post.new(:title => "Assigning IDs works!", :body => "You heared it here first, folks!")
863
+ post.person_ids = [people(:david).id, people(:michael).id]
864
+ post.save
865
+ post.reload
866
+ assert_equal 2, post.people.length
867
+ assert post.people.include?(people(:david))
868
+ end
869
+
870
+ def test_dynamic_find_should_respect_association_order_for_through
871
+ assert_equal Comment.find(10), authors(:david).comments_desc.find(:first, :conditions => "comments.type = 'SpecialComment'")
872
+ assert_equal Comment.find(10), authors(:david).comments_desc.find_by_type('SpecialComment')
873
+ end
874
+
875
+ def test_dynamic_find_order_should_override_association_order_for_through
876
+ assert_equal Comment.find(3), authors(:david).comments_desc.find(:first, :conditions => "comments.type = 'SpecialComment'", :order => 'comments.id')
877
+ assert_equal Comment.find(3), authors(:david).comments_desc.find_by_type('SpecialComment', :order => 'comments.id')
878
+ end
879
+
880
+ def test_dynamic_find_all_should_respect_association_order_for_through
881
+ assert_equal [Comment.find(10), Comment.find(7), Comment.find(6), Comment.find(3)], authors(:david).comments_desc.find(:all, :conditions => "comments.type = 'SpecialComment'")
882
+ assert_equal [Comment.find(10), Comment.find(7), Comment.find(6), Comment.find(3)], authors(:david).comments_desc.find_all_by_type('SpecialComment')
883
+ end
884
+
885
+ def test_dynamic_find_all_order_should_override_association_order_for_through
886
+ assert_equal [Comment.find(3), Comment.find(6), Comment.find(7), Comment.find(10)], authors(:david).comments_desc.find(:all, :conditions => "comments.type = 'SpecialComment'", :order => 'comments.id')
887
+ assert_equal [Comment.find(3), Comment.find(6), Comment.find(7), Comment.find(10)], authors(:david).comments_desc.find_all_by_type('SpecialComment', :order => 'comments.id')
888
+ end
889
+
890
+ def test_dynamic_find_all_should_respect_association_limit_for_through
891
+ assert_equal 1, authors(:david).limited_comments.find(:all, :conditions => "comments.type = 'SpecialComment'").length
892
+ assert_equal 1, authors(:david).limited_comments.find_all_by_type('SpecialComment').length
893
+ end
894
+
895
+ def test_dynamic_find_all_order_should_override_association_limit_for_through
896
+ assert_equal 4, authors(:david).limited_comments.find(:all, :conditions => "comments.type = 'SpecialComment'", :limit => 9_000).length
897
+ assert_equal 4, authors(:david).limited_comments.find_all_by_type('SpecialComment', :limit => 9_000).length
898
+ end
899
+
900
+ def test_find_all_include_over_the_same_table_for_through
901
+ assert_equal 2, people(:michael).posts.find(:all, :include => :people).length
902
+ end
903
+
904
+ def test_has_many_through_respects_hash_conditions
905
+ assert_equal authors(:david).hello_posts, authors(:david).hello_posts_with_hash_conditions
906
+ assert_equal authors(:david).hello_post_comments, authors(:david).hello_post_comments_with_hash_conditions
907
+ end
908
+
909
+ def test_include_uses_array_include_after_loaded
910
+ firm = companies(:first_firm)
911
+ firm.clients.class # force load target
912
+
913
+ client = firm.clients.first
914
+
915
+ assert_no_queries do
916
+ assert firm.clients.loaded?
917
+ assert firm.clients.include?(client)
918
+ end
919
+ end
920
+
921
+ def test_include_checks_if_record_exists_if_target_not_loaded
922
+ firm = companies(:first_firm)
923
+ client = firm.clients.first
924
+
925
+ firm.reload
926
+ assert ! firm.clients.loaded?
927
+ assert_queries(1) do
928
+ assert firm.clients.include?(client)
929
+ end
930
+ assert ! firm.clients.loaded?
931
+ end
932
+
933
+ def test_include_loads_collection_if_target_uses_finder_sql
934
+ firm = companies(:first_firm)
935
+ client = firm.clients_using_sql.first
936
+
937
+ firm.reload
938
+ assert ! firm.clients_using_sql.loaded?
939
+ assert firm.clients_using_sql.include?(client)
940
+ assert firm.clients_using_sql.loaded?
941
+ end
942
+
943
+
944
+ def test_include_returns_false_for_non_matching_record_to_verify_scoping
945
+ firm = companies(:first_firm)
946
+ client = Client.create!(:name => 'Not Associated')
947
+
948
+ assert ! firm.clients.loaded?
949
+ assert ! firm.clients.include?(client)
950
+ end
951
+
952
+ def test_calling_first_or_last_on_association_should_not_load_association
953
+ firm = companies(:first_firm)
954
+ firm.clients.first
955
+ firm.clients.last
956
+ assert !firm.clients.loaded?
957
+ end
958
+
959
+ def test_calling_first_or_last_on_loaded_association_should_not_fetch_with_query
960
+ firm = companies(:first_firm)
961
+ firm.clients.class # force load target
962
+ assert firm.clients.loaded?
963
+
964
+ assert_no_queries do
965
+ firm.clients.first
966
+ assert_equal 2, firm.clients.first(2).size
967
+ firm.clients.last
968
+ assert_equal 2, firm.clients.last(2).size
969
+ end
970
+ end
971
+
972
+ def test_calling_first_or_last_on_existing_record_with_build_should_load_association
973
+ firm = companies(:first_firm)
974
+ firm.clients.build(:name => 'Foo')
975
+ assert !firm.clients.loaded?
976
+
977
+ assert_queries 1 do
978
+ firm.clients.first
979
+ firm.clients.last
980
+ end
981
+
982
+ assert firm.clients.loaded?
983
+ end
984
+
985
+ def test_calling_first_or_last_on_new_record_should_not_run_queries
986
+ firm = Firm.new
987
+
988
+ assert_no_queries do
989
+ firm.clients.first
990
+ firm.clients.last
991
+ end
992
+ end
993
+
994
+ def test_calling_first_or_last_with_find_options_on_loaded_association_should_fetch_with_query
995
+ firm = companies(:first_firm)
996
+ firm.clients.class # force load target
997
+
998
+ assert_queries 2 do
999
+ assert firm.clients.loaded?
1000
+ firm.clients.first(:order => 'name')
1001
+ firm.clients.last(:order => 'name')
1002
+ end
1003
+ end
1004
+
1005
+ def test_calling_first_or_last_with_integer_on_association_should_load_association
1006
+ firm = companies(:first_firm)
1007
+
1008
+ assert_queries 1 do
1009
+ firm.clients.first(2)
1010
+ firm.clients.last(2)
1011
+ end
1012
+
1013
+ assert firm.clients.loaded?
1014
+ end
1015
+
1016
+ def test_joins_with_namespaced_model_should_use_correct_type
1017
+ old = ActiveRecord::Base.store_full_sti_class
1018
+ ActiveRecord::Base.store_full_sti_class = true
1019
+
1020
+ firm = Namespaced::Firm.create({ :name => 'Some Company' })
1021
+ firm.clients.create({ :name => 'Some Client' })
1022
+
1023
+ stats = Namespaced::Firm.find(firm.id, {
1024
+ :select => "#{Namespaced::Firm.table_name}.id, COUNT(#{Namespaced::Client.table_name}.id) AS num_clients",
1025
+ :joins => :clients,
1026
+ :group => "#{Namespaced::Firm.table_name}.id"
1027
+ })
1028
+ assert_equal 1, stats.num_clients.to_i
1029
+
1030
+ ensure
1031
+ ActiveRecord::Base.store_full_sti_class = old
1032
+ end
1033
+
1034
+ end