activerecord 2.3.18 → 3.2.22

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

Potentially problematic release.


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

Files changed (454) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +1014 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +222 -0
  5. data/examples/performance.rb +100 -126
  6. data/examples/simple.rb +14 -0
  7. data/lib/active_record/aggregations.rb +93 -99
  8. data/lib/active_record/associations/alias_tracker.rb +76 -0
  9. data/lib/active_record/associations/association.rb +247 -0
  10. data/lib/active_record/associations/association_scope.rb +134 -0
  11. data/lib/active_record/associations/belongs_to_association.rb +54 -61
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +17 -59
  13. data/lib/active_record/associations/builder/association.rb +55 -0
  14. data/lib/active_record/associations/builder/belongs_to.rb +88 -0
  15. data/lib/active_record/associations/builder/collection_association.rb +75 -0
  16. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +57 -0
  17. data/lib/active_record/associations/builder/has_many.rb +71 -0
  18. data/lib/active_record/associations/builder/has_one.rb +62 -0
  19. data/lib/active_record/associations/builder/singular_association.rb +32 -0
  20. data/lib/active_record/associations/collection_association.rb +580 -0
  21. data/lib/active_record/associations/collection_proxy.rb +133 -0
  22. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +39 -119
  23. data/lib/active_record/associations/has_many_association.rb +60 -79
  24. data/lib/active_record/associations/has_many_through_association.rb +127 -206
  25. data/lib/active_record/associations/has_one_association.rb +55 -114
  26. data/lib/active_record/associations/has_one_through_association.rb +25 -26
  27. data/lib/active_record/associations/join_dependency/join_association.rb +159 -0
  28. data/lib/active_record/associations/join_dependency/join_base.rb +24 -0
  29. data/lib/active_record/associations/join_dependency/join_part.rb +78 -0
  30. data/lib/active_record/associations/join_dependency.rb +214 -0
  31. data/lib/active_record/associations/join_helper.rb +55 -0
  32. data/lib/active_record/associations/preloader/association.rb +125 -0
  33. data/lib/active_record/associations/preloader/belongs_to.rb +17 -0
  34. data/lib/active_record/associations/preloader/collection_association.rb +24 -0
  35. data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +60 -0
  36. data/lib/active_record/associations/preloader/has_many.rb +17 -0
  37. data/lib/active_record/associations/preloader/has_many_through.rb +15 -0
  38. data/lib/active_record/associations/preloader/has_one.rb +23 -0
  39. data/lib/active_record/associations/preloader/has_one_through.rb +9 -0
  40. data/lib/active_record/associations/preloader/singular_association.rb +21 -0
  41. data/lib/active_record/associations/preloader/through_association.rb +67 -0
  42. data/lib/active_record/associations/preloader.rb +181 -0
  43. data/lib/active_record/associations/singular_association.rb +64 -0
  44. data/lib/active_record/associations/through_association.rb +87 -0
  45. data/lib/active_record/associations.rb +693 -1337
  46. data/lib/active_record/attribute_assignment.rb +221 -0
  47. data/lib/active_record/attribute_methods/before_type_cast.rb +31 -0
  48. data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +32 -0
  49. data/lib/active_record/attribute_methods/dirty.rb +111 -0
  50. data/lib/active_record/attribute_methods/primary_key.rb +114 -0
  51. data/lib/active_record/attribute_methods/query.rb +39 -0
  52. data/lib/active_record/attribute_methods/read.rb +136 -0
  53. data/lib/active_record/attribute_methods/serialization.rb +120 -0
  54. data/lib/active_record/attribute_methods/time_zone_conversion.rb +65 -0
  55. data/lib/active_record/attribute_methods/write.rb +70 -0
  56. data/lib/active_record/attribute_methods.rb +211 -339
  57. data/lib/active_record/autosave_association.rb +179 -149
  58. data/lib/active_record/base.rb +401 -2907
  59. data/lib/active_record/callbacks.rb +91 -176
  60. data/lib/active_record/coders/yaml_column.rb +41 -0
  61. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +236 -119
  62. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +110 -58
  63. data/lib/active_record/connection_adapters/abstract/database_limits.rb +12 -11
  64. data/lib/active_record/connection_adapters/abstract/database_statements.rb +175 -74
  65. data/lib/active_record/connection_adapters/abstract/query_cache.rb +31 -35
  66. data/lib/active_record/connection_adapters/abstract/quoting.rb +71 -21
  67. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +81 -311
  68. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +194 -78
  69. data/lib/active_record/connection_adapters/abstract_adapter.rb +130 -83
  70. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +676 -0
  71. data/lib/active_record/connection_adapters/column.rb +296 -0
  72. data/lib/active_record/connection_adapters/mysql2_adapter.rb +280 -0
  73. data/lib/active_record/connection_adapters/mysql_adapter.rb +272 -493
  74. data/lib/active_record/connection_adapters/postgresql_adapter.rb +650 -405
  75. data/lib/active_record/connection_adapters/schema_cache.rb +69 -0
  76. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +30 -9
  77. data/lib/active_record/connection_adapters/sqlite_adapter.rb +276 -147
  78. data/lib/active_record/connection_adapters/statement_pool.rb +40 -0
  79. data/lib/active_record/counter_cache.rb +123 -0
  80. data/lib/active_record/dynamic_finder_match.rb +41 -14
  81. data/lib/active_record/dynamic_matchers.rb +84 -0
  82. data/lib/active_record/dynamic_scope_match.rb +13 -15
  83. data/lib/active_record/errors.rb +195 -0
  84. data/lib/active_record/explain.rb +86 -0
  85. data/lib/active_record/explain_subscriber.rb +25 -0
  86. data/lib/active_record/fixtures/file.rb +65 -0
  87. data/lib/active_record/fixtures.rb +695 -770
  88. data/lib/active_record/identity_map.rb +162 -0
  89. data/lib/active_record/inheritance.rb +174 -0
  90. data/lib/active_record/integration.rb +60 -0
  91. data/lib/active_record/locale/en.yml +9 -27
  92. data/lib/active_record/locking/optimistic.rb +76 -73
  93. data/lib/active_record/locking/pessimistic.rb +32 -10
  94. data/lib/active_record/log_subscriber.rb +72 -0
  95. data/lib/active_record/migration/command_recorder.rb +105 -0
  96. data/lib/active_record/migration.rb +415 -205
  97. data/lib/active_record/model_schema.rb +368 -0
  98. data/lib/active_record/nested_attributes.rb +153 -63
  99. data/lib/active_record/observer.rb +27 -103
  100. data/lib/active_record/persistence.rb +376 -0
  101. data/lib/active_record/query_cache.rb +49 -8
  102. data/lib/active_record/querying.rb +58 -0
  103. data/lib/active_record/railtie.rb +131 -0
  104. data/lib/active_record/railties/console_sandbox.rb +6 -0
  105. data/lib/active_record/railties/controller_runtime.rb +49 -0
  106. data/lib/active_record/railties/databases.rake +659 -0
  107. data/lib/active_record/railties/jdbcmysql_error.rb +16 -0
  108. data/lib/active_record/readonly_attributes.rb +26 -0
  109. data/lib/active_record/reflection.rb +269 -120
  110. data/lib/active_record/relation/batches.rb +90 -0
  111. data/lib/active_record/relation/calculations.rb +372 -0
  112. data/lib/active_record/relation/delegation.rb +49 -0
  113. data/lib/active_record/relation/finder_methods.rb +402 -0
  114. data/lib/active_record/relation/predicate_builder.rb +63 -0
  115. data/lib/active_record/relation/query_methods.rb +417 -0
  116. data/lib/active_record/relation/spawn_methods.rb +180 -0
  117. data/lib/active_record/relation.rb +537 -0
  118. data/lib/active_record/result.rb +40 -0
  119. data/lib/active_record/sanitization.rb +194 -0
  120. data/lib/active_record/schema.rb +9 -6
  121. data/lib/active_record/schema_dumper.rb +55 -32
  122. data/lib/active_record/scoping/default.rb +142 -0
  123. data/lib/active_record/scoping/named.rb +200 -0
  124. data/lib/active_record/scoping.rb +152 -0
  125. data/lib/active_record/serialization.rb +8 -91
  126. data/lib/active_record/serializers/xml_serializer.rb +43 -197
  127. data/lib/active_record/session_store.rb +129 -103
  128. data/lib/active_record/store.rb +52 -0
  129. data/lib/active_record/test_case.rb +30 -23
  130. data/lib/active_record/timestamp.rb +95 -52
  131. data/lib/active_record/transactions.rb +212 -66
  132. data/lib/active_record/translation.rb +22 -0
  133. data/lib/active_record/validations/associated.rb +43 -0
  134. data/lib/active_record/validations/uniqueness.rb +180 -0
  135. data/lib/active_record/validations.rb +43 -1106
  136. data/lib/active_record/version.rb +5 -4
  137. data/lib/active_record.rb +121 -48
  138. data/lib/rails/generators/active_record/migration/migration_generator.rb +25 -0
  139. data/lib/rails/generators/active_record/migration/templates/migration.rb +34 -0
  140. data/lib/rails/generators/active_record/migration.rb +15 -0
  141. data/lib/rails/generators/active_record/model/model_generator.rb +47 -0
  142. data/lib/rails/generators/active_record/model/templates/migration.rb +15 -0
  143. data/lib/rails/generators/active_record/model/templates/model.rb +12 -0
  144. data/lib/rails/generators/active_record/model/templates/module.rb +7 -0
  145. data/lib/rails/generators/active_record/observer/observer_generator.rb +15 -0
  146. data/lib/rails/generators/active_record/observer/templates/observer.rb +4 -0
  147. data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +25 -0
  148. data/lib/rails/generators/active_record/session_migration/templates/migration.rb +12 -0
  149. data/lib/rails/generators/active_record.rb +25 -0
  150. metadata +187 -363
  151. data/CHANGELOG +0 -5904
  152. data/README +0 -351
  153. data/RUNNING_UNIT_TESTS +0 -36
  154. data/Rakefile +0 -268
  155. data/install.rb +0 -30
  156. data/lib/active_record/association_preload.rb +0 -406
  157. data/lib/active_record/associations/association_collection.rb +0 -533
  158. data/lib/active_record/associations/association_proxy.rb +0 -288
  159. data/lib/active_record/batches.rb +0 -85
  160. data/lib/active_record/calculations.rb +0 -321
  161. data/lib/active_record/dirty.rb +0 -183
  162. data/lib/active_record/named_scope.rb +0 -197
  163. data/lib/active_record/serializers/json_serializer.rb +0 -91
  164. data/lib/activerecord.rb +0 -2
  165. data/test/assets/example.log +0 -1
  166. data/test/assets/flowers.jpg +0 -0
  167. data/test/cases/aaa_create_tables_test.rb +0 -24
  168. data/test/cases/active_schema_test_mysql.rb +0 -122
  169. data/test/cases/active_schema_test_postgresql.rb +0 -24
  170. data/test/cases/adapter_test.rb +0 -144
  171. data/test/cases/aggregations_test.rb +0 -167
  172. data/test/cases/ar_schema_test.rb +0 -32
  173. data/test/cases/associations/belongs_to_associations_test.rb +0 -438
  174. data/test/cases/associations/callbacks_test.rb +0 -161
  175. data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
  176. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
  177. data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
  178. data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
  179. data/test/cases/associations/eager_singularization_test.rb +0 -145
  180. data/test/cases/associations/eager_test.rb +0 -852
  181. data/test/cases/associations/extension_test.rb +0 -62
  182. data/test/cases/associations/habtm_join_table_test.rb +0 -56
  183. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
  184. data/test/cases/associations/has_many_associations_test.rb +0 -1273
  185. data/test/cases/associations/has_many_through_associations_test.rb +0 -360
  186. data/test/cases/associations/has_one_associations_test.rb +0 -330
  187. data/test/cases/associations/has_one_through_associations_test.rb +0 -209
  188. data/test/cases/associations/inner_join_association_test.rb +0 -93
  189. data/test/cases/associations/inverse_associations_test.rb +0 -566
  190. data/test/cases/associations/join_model_test.rb +0 -712
  191. data/test/cases/associations_test.rb +0 -282
  192. data/test/cases/attribute_methods_test.rb +0 -305
  193. data/test/cases/autosave_association_test.rb +0 -1218
  194. data/test/cases/base_test.rb +0 -2166
  195. data/test/cases/batches_test.rb +0 -81
  196. data/test/cases/binary_test.rb +0 -30
  197. data/test/cases/calculations_test.rb +0 -360
  198. data/test/cases/callbacks_observers_test.rb +0 -38
  199. data/test/cases/callbacks_test.rb +0 -438
  200. data/test/cases/class_inheritable_attributes_test.rb +0 -32
  201. data/test/cases/column_alias_test.rb +0 -17
  202. data/test/cases/column_definition_test.rb +0 -70
  203. data/test/cases/connection_pool_test.rb +0 -25
  204. data/test/cases/connection_test_firebird.rb +0 -8
  205. data/test/cases/connection_test_mysql.rb +0 -65
  206. data/test/cases/copy_table_test_sqlite.rb +0 -80
  207. data/test/cases/counter_cache_test.rb +0 -84
  208. data/test/cases/database_statements_test.rb +0 -12
  209. data/test/cases/datatype_test_postgresql.rb +0 -204
  210. data/test/cases/date_time_test.rb +0 -37
  211. data/test/cases/default_test_firebird.rb +0 -16
  212. data/test/cases/defaults_test.rb +0 -111
  213. data/test/cases/deprecated_finder_test.rb +0 -30
  214. data/test/cases/dirty_test.rb +0 -316
  215. data/test/cases/finder_respond_to_test.rb +0 -76
  216. data/test/cases/finder_test.rb +0 -1098
  217. data/test/cases/fixtures_test.rb +0 -661
  218. data/test/cases/helper.rb +0 -68
  219. data/test/cases/i18n_test.rb +0 -46
  220. data/test/cases/inheritance_test.rb +0 -262
  221. data/test/cases/invalid_date_test.rb +0 -24
  222. data/test/cases/json_serialization_test.rb +0 -219
  223. data/test/cases/lifecycle_test.rb +0 -193
  224. data/test/cases/locking_test.rb +0 -350
  225. data/test/cases/method_scoping_test.rb +0 -704
  226. data/test/cases/migration_test.rb +0 -1649
  227. data/test/cases/migration_test_firebird.rb +0 -124
  228. data/test/cases/mixin_test.rb +0 -96
  229. data/test/cases/modules_test.rb +0 -109
  230. data/test/cases/multiple_db_test.rb +0 -85
  231. data/test/cases/named_scope_test.rb +0 -372
  232. data/test/cases/nested_attributes_test.rb +0 -840
  233. data/test/cases/pk_test.rb +0 -119
  234. data/test/cases/pooled_connections_test.rb +0 -103
  235. data/test/cases/query_cache_test.rb +0 -129
  236. data/test/cases/readonly_test.rb +0 -107
  237. data/test/cases/reflection_test.rb +0 -234
  238. data/test/cases/reload_models_test.rb +0 -22
  239. data/test/cases/repair_helper.rb +0 -50
  240. data/test/cases/reserved_word_test_mysql.rb +0 -176
  241. data/test/cases/sanitize_test.rb +0 -25
  242. data/test/cases/schema_authorization_test_postgresql.rb +0 -75
  243. data/test/cases/schema_dumper_test.rb +0 -211
  244. data/test/cases/schema_test_postgresql.rb +0 -178
  245. data/test/cases/serialization_test.rb +0 -47
  246. data/test/cases/sp_test_mysql.rb +0 -16
  247. data/test/cases/synonym_test_oracle.rb +0 -17
  248. data/test/cases/timestamp_test.rb +0 -75
  249. data/test/cases/transactions_test.rb +0 -543
  250. data/test/cases/unconnected_test.rb +0 -32
  251. data/test/cases/validations_i18n_test.rb +0 -925
  252. data/test/cases/validations_test.rb +0 -1684
  253. data/test/cases/xml_serialization_test.rb +0 -240
  254. data/test/cases/yaml_serialization_test.rb +0 -11
  255. data/test/config.rb +0 -5
  256. data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
  257. data/test/connections/jdbc_jdbch2/connection.rb +0 -18
  258. data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
  259. data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
  260. data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
  261. data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
  262. data/test/connections/native_db2/connection.rb +0 -25
  263. data/test/connections/native_firebird/connection.rb +0 -26
  264. data/test/connections/native_frontbase/connection.rb +0 -27
  265. data/test/connections/native_mysql/connection.rb +0 -25
  266. data/test/connections/native_openbase/connection.rb +0 -21
  267. data/test/connections/native_oracle/connection.rb +0 -27
  268. data/test/connections/native_postgresql/connection.rb +0 -21
  269. data/test/connections/native_sqlite/connection.rb +0 -25
  270. data/test/connections/native_sqlite3/connection.rb +0 -25
  271. data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
  272. data/test/connections/native_sybase/connection.rb +0 -23
  273. data/test/fixtures/accounts.yml +0 -29
  274. data/test/fixtures/all/developers.yml +0 -0
  275. data/test/fixtures/all/people.csv +0 -0
  276. data/test/fixtures/all/tasks.yml +0 -0
  277. data/test/fixtures/author_addresses.yml +0 -5
  278. data/test/fixtures/author_favorites.yml +0 -4
  279. data/test/fixtures/authors.yml +0 -9
  280. data/test/fixtures/binaries.yml +0 -132
  281. data/test/fixtures/books.yml +0 -7
  282. data/test/fixtures/categories/special_categories.yml +0 -9
  283. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
  284. data/test/fixtures/categories.yml +0 -14
  285. data/test/fixtures/categories_ordered.yml +0 -7
  286. data/test/fixtures/categories_posts.yml +0 -23
  287. data/test/fixtures/categorizations.yml +0 -17
  288. data/test/fixtures/clubs.yml +0 -6
  289. data/test/fixtures/comments.yml +0 -59
  290. data/test/fixtures/companies.yml +0 -56
  291. data/test/fixtures/computers.yml +0 -4
  292. data/test/fixtures/courses.yml +0 -7
  293. data/test/fixtures/customers.yml +0 -26
  294. data/test/fixtures/developers.yml +0 -21
  295. data/test/fixtures/developers_projects.yml +0 -17
  296. data/test/fixtures/edges.yml +0 -6
  297. data/test/fixtures/entrants.yml +0 -14
  298. data/test/fixtures/faces.yml +0 -11
  299. data/test/fixtures/fk_test_has_fk.yml +0 -3
  300. data/test/fixtures/fk_test_has_pk.yml +0 -2
  301. data/test/fixtures/funny_jokes.yml +0 -10
  302. data/test/fixtures/interests.yml +0 -33
  303. data/test/fixtures/items.yml +0 -4
  304. data/test/fixtures/jobs.yml +0 -7
  305. data/test/fixtures/legacy_things.yml +0 -3
  306. data/test/fixtures/mateys.yml +0 -4
  307. data/test/fixtures/member_types.yml +0 -6
  308. data/test/fixtures/members.yml +0 -6
  309. data/test/fixtures/memberships.yml +0 -20
  310. data/test/fixtures/men.yml +0 -5
  311. data/test/fixtures/minimalistics.yml +0 -2
  312. data/test/fixtures/mixed_case_monkeys.yml +0 -6
  313. data/test/fixtures/mixins.yml +0 -29
  314. data/test/fixtures/movies.yml +0 -7
  315. data/test/fixtures/naked/csv/accounts.csv +0 -1
  316. data/test/fixtures/naked/yml/accounts.yml +0 -1
  317. data/test/fixtures/naked/yml/companies.yml +0 -1
  318. data/test/fixtures/naked/yml/courses.yml +0 -1
  319. data/test/fixtures/organizations.yml +0 -5
  320. data/test/fixtures/owners.yml +0 -7
  321. data/test/fixtures/parrots.yml +0 -27
  322. data/test/fixtures/parrots_pirates.yml +0 -7
  323. data/test/fixtures/people.yml +0 -15
  324. data/test/fixtures/pets.yml +0 -14
  325. data/test/fixtures/pirates.yml +0 -9
  326. data/test/fixtures/polymorphic_designs.yml +0 -19
  327. data/test/fixtures/polymorphic_prices.yml +0 -19
  328. data/test/fixtures/posts.yml +0 -52
  329. data/test/fixtures/price_estimates.yml +0 -7
  330. data/test/fixtures/projects.yml +0 -7
  331. data/test/fixtures/readers.yml +0 -9
  332. data/test/fixtures/references.yml +0 -17
  333. data/test/fixtures/reserved_words/distinct.yml +0 -5
  334. data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
  335. data/test/fixtures/reserved_words/group.yml +0 -14
  336. data/test/fixtures/reserved_words/select.yml +0 -8
  337. data/test/fixtures/reserved_words/values.yml +0 -7
  338. data/test/fixtures/ships.yml +0 -5
  339. data/test/fixtures/sponsors.yml +0 -9
  340. data/test/fixtures/subscribers.yml +0 -7
  341. data/test/fixtures/subscriptions.yml +0 -12
  342. data/test/fixtures/taggings.yml +0 -28
  343. data/test/fixtures/tags.yml +0 -7
  344. data/test/fixtures/tasks.yml +0 -7
  345. data/test/fixtures/tees.yml +0 -4
  346. data/test/fixtures/ties.yml +0 -4
  347. data/test/fixtures/topics.yml +0 -42
  348. data/test/fixtures/toys.yml +0 -4
  349. data/test/fixtures/treasures.yml +0 -10
  350. data/test/fixtures/vertices.yml +0 -4
  351. data/test/fixtures/warehouse-things.yml +0 -3
  352. data/test/fixtures/zines.yml +0 -5
  353. data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
  354. data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
  355. data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
  356. data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
  357. data/test/migrations/duplicate/3_foo.rb +0 -7
  358. data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
  359. data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
  360. data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
  361. data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
  362. data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
  363. data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
  364. data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
  365. data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
  366. data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
  367. data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
  368. data/test/migrations/missing/1_people_have_last_names.rb +0 -9
  369. data/test/migrations/missing/3_we_need_reminders.rb +0 -12
  370. data/test/migrations/missing/4_innocent_jointable.rb +0 -12
  371. data/test/migrations/valid/1_people_have_last_names.rb +0 -9
  372. data/test/migrations/valid/2_we_need_reminders.rb +0 -12
  373. data/test/migrations/valid/3_innocent_jointable.rb +0 -12
  374. data/test/models/author.rb +0 -151
  375. data/test/models/auto_id.rb +0 -4
  376. data/test/models/binary.rb +0 -2
  377. data/test/models/bird.rb +0 -9
  378. data/test/models/book.rb +0 -4
  379. data/test/models/categorization.rb +0 -5
  380. data/test/models/category.rb +0 -34
  381. data/test/models/citation.rb +0 -6
  382. data/test/models/club.rb +0 -13
  383. data/test/models/column_name.rb +0 -3
  384. data/test/models/comment.rb +0 -29
  385. data/test/models/company.rb +0 -173
  386. data/test/models/company_in_module.rb +0 -78
  387. data/test/models/computer.rb +0 -3
  388. data/test/models/contact.rb +0 -16
  389. data/test/models/contract.rb +0 -5
  390. data/test/models/course.rb +0 -3
  391. data/test/models/customer.rb +0 -73
  392. data/test/models/default.rb +0 -2
  393. data/test/models/developer.rb +0 -101
  394. data/test/models/edge.rb +0 -5
  395. data/test/models/entrant.rb +0 -3
  396. data/test/models/essay.rb +0 -3
  397. data/test/models/event.rb +0 -3
  398. data/test/models/event_author.rb +0 -8
  399. data/test/models/face.rb +0 -7
  400. data/test/models/guid.rb +0 -2
  401. data/test/models/interest.rb +0 -5
  402. data/test/models/invoice.rb +0 -4
  403. data/test/models/item.rb +0 -7
  404. data/test/models/job.rb +0 -5
  405. data/test/models/joke.rb +0 -3
  406. data/test/models/keyboard.rb +0 -3
  407. data/test/models/legacy_thing.rb +0 -3
  408. data/test/models/line_item.rb +0 -3
  409. data/test/models/man.rb +0 -9
  410. data/test/models/matey.rb +0 -4
  411. data/test/models/member.rb +0 -12
  412. data/test/models/member_detail.rb +0 -5
  413. data/test/models/member_type.rb +0 -3
  414. data/test/models/membership.rb +0 -9
  415. data/test/models/minimalistic.rb +0 -2
  416. data/test/models/mixed_case_monkey.rb +0 -3
  417. data/test/models/movie.rb +0 -5
  418. data/test/models/order.rb +0 -4
  419. data/test/models/organization.rb +0 -6
  420. data/test/models/owner.rb +0 -5
  421. data/test/models/parrot.rb +0 -22
  422. data/test/models/person.rb +0 -16
  423. data/test/models/pet.rb +0 -5
  424. data/test/models/pirate.rb +0 -80
  425. data/test/models/polymorphic_design.rb +0 -3
  426. data/test/models/polymorphic_price.rb +0 -3
  427. data/test/models/post.rb +0 -102
  428. data/test/models/price_estimate.rb +0 -3
  429. data/test/models/project.rb +0 -30
  430. data/test/models/reader.rb +0 -4
  431. data/test/models/reference.rb +0 -4
  432. data/test/models/reply.rb +0 -46
  433. data/test/models/ship.rb +0 -19
  434. data/test/models/ship_part.rb +0 -7
  435. data/test/models/sponsor.rb +0 -4
  436. data/test/models/subject.rb +0 -4
  437. data/test/models/subscriber.rb +0 -8
  438. data/test/models/subscription.rb +0 -4
  439. data/test/models/tag.rb +0 -7
  440. data/test/models/tagging.rb +0 -10
  441. data/test/models/task.rb +0 -3
  442. data/test/models/tee.rb +0 -4
  443. data/test/models/tie.rb +0 -4
  444. data/test/models/topic.rb +0 -80
  445. data/test/models/toy.rb +0 -6
  446. data/test/models/treasure.rb +0 -8
  447. data/test/models/vertex.rb +0 -9
  448. data/test/models/warehouse_thing.rb +0 -5
  449. data/test/models/zine.rb +0 -3
  450. data/test/schema/mysql_specific_schema.rb +0 -31
  451. data/test/schema/postgresql_specific_schema.rb +0 -114
  452. data/test/schema/schema.rb +0 -550
  453. data/test/schema/schema2.rb +0 -6
  454. data/test/schema/sqlite_specific_schema.rb +0 -25
@@ -1,543 +0,0 @@
1
- require "cases/helper"
2
- require 'models/topic'
3
- require 'models/reply'
4
- require 'models/developer'
5
- require 'models/book'
6
- require 'models/author'
7
- require 'models/post'
8
-
9
- class TransactionTest < ActiveRecord::TestCase
10
- self.use_transactional_fixtures = false
11
- fixtures :topics, :developers, :authors, :posts
12
-
13
- def setup
14
- @first, @second = Topic.find(1, 2).sort_by { |t| t.id }
15
- end
16
-
17
- def test_successful
18
- Topic.transaction do
19
- @first.approved = true
20
- @second.approved = false
21
- @first.save
22
- @second.save
23
- end
24
-
25
- assert Topic.find(1).approved?, "First should have been approved"
26
- assert !Topic.find(2).approved?, "Second should have been unapproved"
27
- end
28
-
29
- def transaction_with_return
30
- Topic.transaction do
31
- @first.approved = true
32
- @second.approved = false
33
- @first.save
34
- @second.save
35
- return
36
- end
37
- end
38
-
39
- def test_update_attributes_should_rollback_on_failure
40
- author = Author.find(1)
41
- posts_count = author.posts.size
42
- assert posts_count > 0
43
- status = author.update_attributes(:name => nil, :post_ids => [])
44
- assert !status
45
- assert_equal posts_count, author.posts(true).size
46
- end
47
-
48
- def test_update_attributes_should_rollback_on_failure!
49
- author = Author.find(1)
50
- posts_count = author.posts.size
51
- assert posts_count > 0
52
- assert_raise(ActiveRecord::RecordInvalid) do
53
- author.update_attributes!(:name => nil, :post_ids => [])
54
- end
55
- assert_equal posts_count, author.posts(true).size
56
- end
57
-
58
- def test_successful_with_return
59
- class << Topic.connection
60
- alias :real_commit_db_transaction :commit_db_transaction
61
- def commit_db_transaction
62
- $committed = true
63
- real_commit_db_transaction
64
- end
65
- end
66
-
67
- $committed = false
68
- transaction_with_return
69
- assert $committed
70
-
71
- assert Topic.find(1).approved?, "First should have been approved"
72
- assert !Topic.find(2).approved?, "Second should have been unapproved"
73
- ensure
74
- class << Topic.connection
75
- alias :commit_db_transaction :real_commit_db_transaction rescue nil
76
- end
77
- end
78
-
79
- def test_successful_with_instance_method
80
- @first.transaction do
81
- @first.approved = true
82
- @second.approved = false
83
- @first.save
84
- @second.save
85
- end
86
-
87
- assert Topic.find(1).approved?, "First should have been approved"
88
- assert !Topic.find(2).approved?, "Second should have been unapproved"
89
- end
90
-
91
- def test_failing_on_exception
92
- begin
93
- Topic.transaction do
94
- @first.approved = true
95
- @second.approved = false
96
- @first.save
97
- @second.save
98
- raise "Bad things!"
99
- end
100
- rescue
101
- # caught it
102
- end
103
-
104
- assert @first.approved?, "First should still be changed in the objects"
105
- assert !@second.approved?, "Second should still be changed in the objects"
106
-
107
- assert !Topic.find(1).approved?, "First shouldn't have been approved"
108
- assert Topic.find(2).approved?, "Second should still be approved"
109
- end
110
-
111
- def test_raising_exception_in_callback_rollbacks_in_save
112
- add_exception_raising_after_save_callback_to_topic
113
-
114
- begin
115
- @first.approved = true
116
- @first.save
117
- flunk
118
- rescue => e
119
- assert_equal "Make the transaction rollback", e.message
120
- assert !Topic.find(1).approved?
121
- ensure
122
- remove_exception_raising_after_save_callback_to_topic
123
- end
124
- end
125
-
126
- def test_cancellation_from_before_destroy_rollbacks_in_destroy
127
- add_cancelling_before_destroy_with_db_side_effect_to_topic
128
- begin
129
- nbooks_before_destroy = Book.count
130
- status = @first.destroy
131
- assert !status
132
- assert_nothing_raised(ActiveRecord::RecordNotFound) { @first.reload }
133
- assert_equal nbooks_before_destroy, Book.count
134
- ensure
135
- remove_cancelling_before_destroy_with_db_side_effect_to_topic
136
- end
137
- end
138
-
139
- def test_cancellation_from_before_filters_rollbacks_in_save
140
- %w(validation save).each do |filter|
141
- send("add_cancelling_before_#{filter}_with_db_side_effect_to_topic")
142
- begin
143
- nbooks_before_save = Book.count
144
- original_author_name = @first.author_name
145
- @first.author_name += '_this_should_not_end_up_in_the_db'
146
- status = @first.save
147
- assert !status
148
- assert_equal original_author_name, @first.reload.author_name
149
- assert_equal nbooks_before_save, Book.count
150
- ensure
151
- send("remove_cancelling_before_#{filter}_with_db_side_effect_to_topic")
152
- end
153
- end
154
- end
155
-
156
- def test_cancellation_from_before_filters_rollbacks_in_save!
157
- %w(validation save).each do |filter|
158
- send("add_cancelling_before_#{filter}_with_db_side_effect_to_topic")
159
- begin
160
- nbooks_before_save = Book.count
161
- original_author_name = @first.author_name
162
- @first.author_name += '_this_should_not_end_up_in_the_db'
163
- @first.save!
164
- flunk
165
- rescue => e
166
- assert_equal original_author_name, @first.reload.author_name
167
- assert_equal nbooks_before_save, Book.count
168
- ensure
169
- send("remove_cancelling_before_#{filter}_with_db_side_effect_to_topic")
170
- end
171
- end
172
- end
173
-
174
- def test_callback_rollback_in_create
175
- new_topic = Topic.new(
176
- :title => "A new topic",
177
- :author_name => "Ben",
178
- :author_email_address => "ben@example.com",
179
- :written_on => "2003-07-16t15:28:11.2233+01:00",
180
- :last_read => "2004-04-15",
181
- :bonus_time => "2005-01-30t15:28:00.00+01:00",
182
- :content => "Have a nice day",
183
- :approved => false)
184
- new_record_snapshot = new_topic.new_record?
185
- id_present = new_topic.has_attribute?(Topic.primary_key)
186
- id_snapshot = new_topic.id
187
-
188
- # Make sure the second save gets the after_create callback called.
189
- 2.times do
190
- begin
191
- add_exception_raising_after_create_callback_to_topic
192
- new_topic.approved = true
193
- new_topic.save
194
- flunk
195
- rescue => e
196
- assert_equal "Make the transaction rollback", e.message
197
- assert_equal new_record_snapshot, new_topic.new_record?, "The topic should have its old new_record value"
198
- assert_equal id_snapshot, new_topic.id, "The topic should have its old id"
199
- assert_equal id_present, new_topic.has_attribute?(Topic.primary_key)
200
- ensure
201
- remove_exception_raising_after_create_callback_to_topic
202
- end
203
- end
204
- end
205
-
206
- def test_nested_explicit_transactions
207
- Topic.transaction do
208
- Topic.transaction do
209
- @first.approved = true
210
- @second.approved = false
211
- @first.save
212
- @second.save
213
- end
214
- end
215
-
216
- assert Topic.find(1).approved?, "First should have been approved"
217
- assert !Topic.find(2).approved?, "Second should have been unapproved"
218
- end
219
-
220
- def test_manually_rolling_back_a_transaction
221
- Topic.transaction do
222
- @first.approved = true
223
- @second.approved = false
224
- @first.save
225
- @second.save
226
-
227
- raise ActiveRecord::Rollback
228
- end
229
-
230
- assert @first.approved?, "First should still be changed in the objects"
231
- assert !@second.approved?, "Second should still be changed in the objects"
232
-
233
- assert !Topic.find(1).approved?, "First shouldn't have been approved"
234
- assert Topic.find(2).approved?, "Second should still be approved"
235
- end
236
-
237
- def test_invalid_keys_for_transaction
238
- assert_raise ArgumentError do
239
- Topic.transaction :nested => true do
240
- end
241
- end
242
- end
243
-
244
- def test_force_savepoint_in_nested_transaction
245
- Topic.transaction do
246
- @first.approved = true
247
- @second.approved = false
248
- @first.save!
249
- @second.save!
250
-
251
- begin
252
- Topic.transaction :requires_new => true do
253
- @first.happy = false
254
- @first.save!
255
- raise
256
- end
257
- rescue
258
- end
259
- end
260
-
261
- assert @first.reload.approved?
262
- assert !@second.reload.approved?
263
- end if Topic.connection.supports_savepoints?
264
-
265
- def test_no_savepoint_in_nested_transaction_without_force
266
- Topic.transaction do
267
- @first.approved = true
268
- @second.approved = false
269
- @first.save!
270
- @second.save!
271
-
272
- begin
273
- Topic.transaction do
274
- @first.approved = false
275
- @first.save!
276
- raise
277
- end
278
- rescue
279
- end
280
- end
281
-
282
- assert !@first.reload.approved?
283
- assert !@second.reload.approved?
284
- end if Topic.connection.supports_savepoints?
285
-
286
- def test_many_savepoints
287
- Topic.transaction do
288
- @first.content = "One"
289
- @first.save!
290
-
291
- begin
292
- Topic.transaction :requires_new => true do
293
- @first.content = "Two"
294
- @first.save!
295
-
296
- begin
297
- Topic.transaction :requires_new => true do
298
- @first.content = "Three"
299
- @first.save!
300
-
301
- begin
302
- Topic.transaction :requires_new => true do
303
- @first.content = "Four"
304
- @first.save!
305
- raise
306
- end
307
- rescue
308
- end
309
-
310
- @three = @first.reload.content
311
- raise
312
- end
313
- rescue
314
- end
315
-
316
- @two = @first.reload.content
317
- raise
318
- end
319
- rescue
320
- end
321
-
322
- @one = @first.reload.content
323
- end
324
-
325
- assert_equal "One", @one
326
- assert_equal "Two", @two
327
- assert_equal "Three", @three
328
- end if Topic.connection.supports_savepoints?
329
-
330
- def test_rollback_when_commit_raises
331
- Topic.connection.expects(:begin_db_transaction)
332
- Topic.connection.expects(:commit_db_transaction).raises('OH NOES')
333
- Topic.connection.expects(:outside_transaction?).returns(false)
334
- Topic.connection.expects(:rollback_db_transaction)
335
-
336
- assert_raise RuntimeError do
337
- Topic.transaction do
338
- # do nothing
339
- end
340
- end
341
- end
342
-
343
- if current_adapter?(:PostgreSQLAdapter) && defined?(PGconn::PQTRANS_IDLE)
344
- def test_outside_transaction_works
345
- assert Topic.connection.outside_transaction?
346
- Topic.connection.begin_db_transaction
347
- assert !Topic.connection.outside_transaction?
348
- Topic.connection.rollback_db_transaction
349
- assert Topic.connection.outside_transaction?
350
- end
351
-
352
- def test_rollback_wont_be_executed_if_no_transaction_active
353
- assert_raise RuntimeError do
354
- Topic.transaction do
355
- Topic.connection.rollback_db_transaction
356
- Topic.connection.expects(:rollback_db_transaction).never
357
- raise "Rails doesn't scale!"
358
- end
359
- end
360
- end
361
-
362
- def test_open_transactions_count_is_reset_to_zero_if_no_transaction_active
363
- Topic.transaction do
364
- Topic.transaction do
365
- Topic.connection.rollback_db_transaction
366
- end
367
- assert_equal 0, Topic.connection.open_transactions
368
- end
369
- assert_equal 0, Topic.connection.open_transactions
370
- end
371
- end
372
-
373
- def test_sqlite_add_column_in_transaction
374
- return true unless current_adapter?(:SQLite3Adapter, :SQLiteAdapter)
375
-
376
- # Test first if column creation/deletion works correctly when no
377
- # transaction is in place.
378
- #
379
- # We go back to the connection for the column queries because
380
- # Topic.columns is cached and won't report changes to the DB
381
-
382
- assert_nothing_raised do
383
- Topic.reset_column_information
384
- Topic.connection.add_column('topics', 'stuff', :string)
385
- assert Topic.column_names.include?('stuff')
386
-
387
- Topic.reset_column_information
388
- Topic.connection.remove_column('topics', 'stuff')
389
- assert !Topic.column_names.include?('stuff')
390
- end
391
-
392
- if Topic.connection.supports_ddl_transactions?
393
- assert_nothing_raised do
394
- Topic.transaction { Topic.connection.add_column('topics', 'stuff', :string) }
395
- end
396
- else
397
- Topic.transaction do
398
- assert_raise(ActiveRecord::StatementInvalid) { Topic.connection.add_column('topics', 'stuff', :string) }
399
- raise ActiveRecord::Rollback
400
- end
401
- end
402
- end
403
-
404
- private
405
- def add_exception_raising_after_save_callback_to_topic
406
- Topic.class_eval { def after_save() raise "Make the transaction rollback" end }
407
- end
408
-
409
- def remove_exception_raising_after_save_callback_to_topic
410
- Topic.class_eval { remove_method :after_save }
411
- end
412
-
413
- def add_exception_raising_after_create_callback_to_topic
414
- Topic.class_eval { def after_create() raise "Make the transaction rollback" end }
415
- end
416
-
417
- def remove_exception_raising_after_create_callback_to_topic
418
- Topic.class_eval { remove_method :after_create }
419
- end
420
-
421
- %w(validation save destroy).each do |filter|
422
- define_method("add_cancelling_before_#{filter}_with_db_side_effect_to_topic") do
423
- Topic.class_eval "def before_#{filter}() Book.create; false end"
424
- end
425
-
426
- define_method("remove_cancelling_before_#{filter}_with_db_side_effect_to_topic") do
427
- Topic.class_eval "remove_method :before_#{filter}"
428
- end
429
- end
430
- end
431
-
432
- class TransactionsWithTransactionalFixturesTest < ActiveRecord::TestCase
433
- self.use_transactional_fixtures = true
434
- fixtures :topics
435
-
436
- def test_automatic_savepoint_in_outer_transaction
437
- @first = Topic.find(1)
438
-
439
- begin
440
- Topic.transaction do
441
- @first.approved = true
442
- @first.save!
443
- raise
444
- end
445
- rescue
446
- assert !@first.reload.approved?
447
- end
448
- end
449
-
450
- def test_no_automatic_savepoint_for_inner_transaction
451
- @first = Topic.find(1)
452
-
453
- Topic.transaction do
454
- @first.approved = true
455
- @first.save!
456
-
457
- begin
458
- Topic.transaction do
459
- @first.approved = false
460
- @first.save!
461
- raise
462
- end
463
- rescue
464
- end
465
- end
466
-
467
- assert !@first.reload.approved?
468
- end
469
- end if Topic.connection.supports_savepoints?
470
-
471
- if current_adapter?(:PostgreSQLAdapter)
472
- class ConcurrentTransactionTest < TransactionTest
473
- use_concurrent_connections
474
-
475
- # This will cause transactions to overlap and fail unless they are performed on
476
- # separate database connections.
477
- def test_transaction_per_thread
478
- assert_nothing_raised do
479
- threads = (1..3).map do
480
- Thread.new do
481
- Topic.transaction do
482
- topic = Topic.find(1)
483
- topic.approved = !topic.approved?
484
- topic.save!
485
- topic.approved = !topic.approved?
486
- topic.save!
487
- end
488
- end
489
- end
490
-
491
- threads.each { |t| t.join }
492
- end
493
- end
494
-
495
- # Test for dirty reads among simultaneous transactions.
496
- def test_transaction_isolation__read_committed
497
- # Should be invariant.
498
- original_salary = Developer.find(1).salary
499
- temporary_salary = 200000
500
-
501
- assert_nothing_raised do
502
- threads = (1..3).map do
503
- Thread.new do
504
- Developer.transaction do
505
- # Expect original salary.
506
- dev = Developer.find(1)
507
- assert_equal original_salary, dev.salary
508
-
509
- dev.salary = temporary_salary
510
- dev.save!
511
-
512
- # Expect temporary salary.
513
- dev = Developer.find(1)
514
- assert_equal temporary_salary, dev.salary
515
-
516
- dev.salary = original_salary
517
- dev.save!
518
-
519
- # Expect original salary.
520
- dev = Developer.find(1)
521
- assert_equal original_salary, dev.salary
522
- end
523
- end
524
- end
525
-
526
- # Keep our eyes peeled.
527
- threads << Thread.new do
528
- 10.times do
529
- sleep 0.05
530
- Developer.transaction do
531
- # Always expect original salary.
532
- assert_equal original_salary, Developer.find(1).salary
533
- end
534
- end
535
- end
536
-
537
- threads.each { |t| t.join }
538
- end
539
-
540
- assert_equal original_salary, Developer.find(1).salary
541
- end
542
- end
543
- end
@@ -1,32 +0,0 @@
1
- require "cases/helper"
2
-
3
- class TestRecord < ActiveRecord::Base
4
- end
5
-
6
- class TestUnconnectedAdapter < ActiveRecord::TestCase
7
- self.use_transactional_fixtures = false
8
-
9
- def setup
10
- @underlying = ActiveRecord::Base.connection
11
- @specification = ActiveRecord::Base.remove_connection
12
- end
13
-
14
- def teardown
15
- @underlying = nil
16
- ActiveRecord::Base.establish_connection(@specification)
17
- end
18
-
19
- def test_connection_no_longer_established
20
- assert_raise(ActiveRecord::ConnectionNotEstablished) do
21
- TestRecord.find(1)
22
- end
23
-
24
- assert_raise(ActiveRecord::ConnectionNotEstablished) do
25
- TestRecord.new.save
26
- end
27
- end
28
-
29
- def test_underlying_adapter_no_longer_active
30
- assert !@underlying.active?, "Removed adapter should no longer be active"
31
- end
32
- end