activerecord 2.3.18 → 3.0.0.beta

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 (378) hide show
  1. data/CHANGELOG +105 -34
  2. data/examples/performance.rb +3 -39
  3. data/examples/simple.rb +14 -0
  4. data/lib/active_record.rb +81 -47
  5. data/lib/active_record/aggregations.rb +1 -3
  6. data/lib/active_record/association_preload.rb +39 -54
  7. data/lib/active_record/associations.rb +262 -419
  8. data/lib/active_record/associations/association_collection.rb +85 -100
  9. data/lib/active_record/associations/association_proxy.rb +20 -18
  10. data/lib/active_record/associations/belongs_to_association.rb +8 -8
  11. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +13 -35
  12. data/lib/active_record/associations/has_many_association.rb +11 -19
  13. data/lib/active_record/associations/has_many_through_association.rb +30 -183
  14. data/lib/active_record/associations/has_one_association.rb +10 -10
  15. data/lib/active_record/associations/has_one_through_association.rb +13 -11
  16. data/lib/active_record/associations/through_association_scope.rb +153 -0
  17. data/lib/active_record/attribute_methods.rb +17 -370
  18. data/lib/active_record/attribute_methods/before_type_cast.rb +33 -0
  19. data/lib/active_record/attribute_methods/dirty.rb +87 -0
  20. data/lib/active_record/attribute_methods/primary_key.rb +44 -0
  21. data/lib/active_record/attribute_methods/query.rb +37 -0
  22. data/lib/active_record/attribute_methods/read.rb +116 -0
  23. data/lib/active_record/attribute_methods/time_zone_conversion.rb +60 -0
  24. data/lib/active_record/attribute_methods/write.rb +37 -0
  25. data/lib/active_record/autosave_association.rb +20 -41
  26. data/lib/active_record/base.rb +357 -1180
  27. data/lib/active_record/batches.rb +10 -16
  28. data/lib/active_record/callbacks.rb +66 -126
  29. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +17 -13
  30. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +5 -25
  31. data/lib/active_record/connection_adapters/abstract/database_statements.rb +4 -43
  32. data/lib/active_record/connection_adapters/abstract/query_cache.rb +3 -2
  33. data/lib/active_record/connection_adapters/abstract/quoting.rb +15 -4
  34. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +1 -1
  35. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +18 -72
  36. data/lib/active_record/connection_adapters/abstract_adapter.rb +16 -49
  37. data/lib/active_record/connection_adapters/mysql_adapter.rb +15 -27
  38. data/lib/active_record/connection_adapters/postgresql_adapter.rb +84 -46
  39. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +9 -3
  40. data/lib/active_record/connection_adapters/sqlite_adapter.rb +34 -65
  41. data/lib/active_record/fixtures.rb +21 -25
  42. data/lib/active_record/locale/en.yml +9 -27
  43. data/lib/active_record/locking/optimistic.rb +16 -48
  44. data/lib/active_record/migration.rb +59 -46
  45. data/lib/active_record/named_scope.rb +85 -92
  46. data/lib/active_record/nested_attributes.rb +18 -24
  47. data/lib/active_record/observer.rb +18 -94
  48. data/lib/active_record/railtie.rb +83 -0
  49. data/lib/active_record/railties/controller_runtime.rb +38 -0
  50. data/lib/active_record/railties/databases.rake +477 -0
  51. data/lib/active_record/railties/subscriber.rb +27 -0
  52. data/lib/active_record/reflection.rb +2 -15
  53. data/lib/active_record/relation.rb +339 -0
  54. data/lib/active_record/relation/calculations.rb +259 -0
  55. data/lib/active_record/relation/finder_methods.rb +315 -0
  56. data/lib/active_record/relation/predicate_builder.rb +46 -0
  57. data/lib/active_record/relation/query_methods.rb +218 -0
  58. data/lib/active_record/relation/spawn_methods.rb +102 -0
  59. data/lib/active_record/schema_dumper.rb +10 -6
  60. data/lib/active_record/serialization.rb +31 -74
  61. data/lib/active_record/serializers/xml_serializer.rb +33 -121
  62. data/lib/active_record/session_store.rb +1 -9
  63. data/lib/active_record/test_case.rb +1 -3
  64. data/lib/active_record/timestamp.rb +7 -5
  65. data/lib/active_record/transactions.rb +9 -9
  66. data/lib/active_record/validations.rb +51 -1100
  67. data/lib/active_record/validations/associated.rb +47 -0
  68. data/lib/active_record/validations/uniqueness.rb +181 -0
  69. data/lib/active_record/version.rb +3 -3
  70. data/lib/generators/active_record.rb +30 -0
  71. data/lib/generators/active_record/migration/migration_generator.rb +25 -0
  72. data/lib/generators/active_record/migration/templates/migration.rb +11 -0
  73. data/lib/generators/active_record/model/model_generator.rb +33 -0
  74. data/lib/generators/active_record/model/templates/migration.rb +16 -0
  75. data/lib/generators/active_record/model/templates/model.rb +5 -0
  76. data/lib/generators/active_record/observer/observer_generator.rb +15 -0
  77. data/lib/generators/active_record/observer/templates/observer.rb +2 -0
  78. data/lib/generators/active_record/session_migration/session_migration_generator.rb +24 -0
  79. data/lib/generators/active_record/session_migration/templates/migration.rb +16 -0
  80. metadata +67 -325
  81. data/RUNNING_UNIT_TESTS +0 -36
  82. data/Rakefile +0 -268
  83. data/install.rb +0 -30
  84. data/lib/active_record/calculations.rb +0 -321
  85. data/lib/active_record/connection_adapters/abstract/database_limits.rb +0 -57
  86. data/lib/active_record/dirty.rb +0 -183
  87. data/lib/active_record/serializers/json_serializer.rb +0 -91
  88. data/lib/activerecord.rb +0 -2
  89. data/test/assets/example.log +0 -1
  90. data/test/assets/flowers.jpg +0 -0
  91. data/test/cases/aaa_create_tables_test.rb +0 -24
  92. data/test/cases/active_schema_test_mysql.rb +0 -122
  93. data/test/cases/active_schema_test_postgresql.rb +0 -24
  94. data/test/cases/adapter_test.rb +0 -144
  95. data/test/cases/aggregations_test.rb +0 -167
  96. data/test/cases/ar_schema_test.rb +0 -32
  97. data/test/cases/associations/belongs_to_associations_test.rb +0 -438
  98. data/test/cases/associations/callbacks_test.rb +0 -161
  99. data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
  100. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
  101. data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
  102. data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
  103. data/test/cases/associations/eager_singularization_test.rb +0 -145
  104. data/test/cases/associations/eager_test.rb +0 -852
  105. data/test/cases/associations/extension_test.rb +0 -62
  106. data/test/cases/associations/habtm_join_table_test.rb +0 -56
  107. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
  108. data/test/cases/associations/has_many_associations_test.rb +0 -1273
  109. data/test/cases/associations/has_many_through_associations_test.rb +0 -360
  110. data/test/cases/associations/has_one_associations_test.rb +0 -330
  111. data/test/cases/associations/has_one_through_associations_test.rb +0 -209
  112. data/test/cases/associations/inner_join_association_test.rb +0 -93
  113. data/test/cases/associations/inverse_associations_test.rb +0 -566
  114. data/test/cases/associations/join_model_test.rb +0 -712
  115. data/test/cases/associations_test.rb +0 -282
  116. data/test/cases/attribute_methods_test.rb +0 -305
  117. data/test/cases/autosave_association_test.rb +0 -1218
  118. data/test/cases/base_test.rb +0 -2166
  119. data/test/cases/batches_test.rb +0 -81
  120. data/test/cases/binary_test.rb +0 -30
  121. data/test/cases/calculations_test.rb +0 -360
  122. data/test/cases/callbacks_observers_test.rb +0 -38
  123. data/test/cases/callbacks_test.rb +0 -438
  124. data/test/cases/class_inheritable_attributes_test.rb +0 -32
  125. data/test/cases/column_alias_test.rb +0 -17
  126. data/test/cases/column_definition_test.rb +0 -70
  127. data/test/cases/connection_pool_test.rb +0 -25
  128. data/test/cases/connection_test_firebird.rb +0 -8
  129. data/test/cases/connection_test_mysql.rb +0 -65
  130. data/test/cases/copy_table_test_sqlite.rb +0 -80
  131. data/test/cases/counter_cache_test.rb +0 -84
  132. data/test/cases/database_statements_test.rb +0 -12
  133. data/test/cases/datatype_test_postgresql.rb +0 -204
  134. data/test/cases/date_time_test.rb +0 -37
  135. data/test/cases/default_test_firebird.rb +0 -16
  136. data/test/cases/defaults_test.rb +0 -111
  137. data/test/cases/deprecated_finder_test.rb +0 -30
  138. data/test/cases/dirty_test.rb +0 -316
  139. data/test/cases/finder_respond_to_test.rb +0 -76
  140. data/test/cases/finder_test.rb +0 -1098
  141. data/test/cases/fixtures_test.rb +0 -661
  142. data/test/cases/helper.rb +0 -68
  143. data/test/cases/i18n_test.rb +0 -46
  144. data/test/cases/inheritance_test.rb +0 -262
  145. data/test/cases/invalid_date_test.rb +0 -24
  146. data/test/cases/json_serialization_test.rb +0 -219
  147. data/test/cases/lifecycle_test.rb +0 -193
  148. data/test/cases/locking_test.rb +0 -350
  149. data/test/cases/method_scoping_test.rb +0 -704
  150. data/test/cases/migration_test.rb +0 -1649
  151. data/test/cases/migration_test_firebird.rb +0 -124
  152. data/test/cases/mixin_test.rb +0 -96
  153. data/test/cases/modules_test.rb +0 -109
  154. data/test/cases/multiple_db_test.rb +0 -85
  155. data/test/cases/named_scope_test.rb +0 -372
  156. data/test/cases/nested_attributes_test.rb +0 -840
  157. data/test/cases/pk_test.rb +0 -119
  158. data/test/cases/pooled_connections_test.rb +0 -103
  159. data/test/cases/query_cache_test.rb +0 -129
  160. data/test/cases/readonly_test.rb +0 -107
  161. data/test/cases/reflection_test.rb +0 -234
  162. data/test/cases/reload_models_test.rb +0 -22
  163. data/test/cases/repair_helper.rb +0 -50
  164. data/test/cases/reserved_word_test_mysql.rb +0 -176
  165. data/test/cases/sanitize_test.rb +0 -25
  166. data/test/cases/schema_authorization_test_postgresql.rb +0 -75
  167. data/test/cases/schema_dumper_test.rb +0 -211
  168. data/test/cases/schema_test_postgresql.rb +0 -178
  169. data/test/cases/serialization_test.rb +0 -47
  170. data/test/cases/sp_test_mysql.rb +0 -16
  171. data/test/cases/synonym_test_oracle.rb +0 -17
  172. data/test/cases/timestamp_test.rb +0 -75
  173. data/test/cases/transactions_test.rb +0 -543
  174. data/test/cases/unconnected_test.rb +0 -32
  175. data/test/cases/validations_i18n_test.rb +0 -925
  176. data/test/cases/validations_test.rb +0 -1684
  177. data/test/cases/xml_serialization_test.rb +0 -240
  178. data/test/cases/yaml_serialization_test.rb +0 -11
  179. data/test/config.rb +0 -5
  180. data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
  181. data/test/connections/jdbc_jdbch2/connection.rb +0 -18
  182. data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
  183. data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
  184. data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
  185. data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
  186. data/test/connections/native_db2/connection.rb +0 -25
  187. data/test/connections/native_firebird/connection.rb +0 -26
  188. data/test/connections/native_frontbase/connection.rb +0 -27
  189. data/test/connections/native_mysql/connection.rb +0 -25
  190. data/test/connections/native_openbase/connection.rb +0 -21
  191. data/test/connections/native_oracle/connection.rb +0 -27
  192. data/test/connections/native_postgresql/connection.rb +0 -21
  193. data/test/connections/native_sqlite/connection.rb +0 -25
  194. data/test/connections/native_sqlite3/connection.rb +0 -25
  195. data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
  196. data/test/connections/native_sybase/connection.rb +0 -23
  197. data/test/fixtures/accounts.yml +0 -29
  198. data/test/fixtures/all/developers.yml +0 -0
  199. data/test/fixtures/all/people.csv +0 -0
  200. data/test/fixtures/all/tasks.yml +0 -0
  201. data/test/fixtures/author_addresses.yml +0 -5
  202. data/test/fixtures/author_favorites.yml +0 -4
  203. data/test/fixtures/authors.yml +0 -9
  204. data/test/fixtures/binaries.yml +0 -132
  205. data/test/fixtures/books.yml +0 -7
  206. data/test/fixtures/categories.yml +0 -14
  207. data/test/fixtures/categories/special_categories.yml +0 -9
  208. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
  209. data/test/fixtures/categories_ordered.yml +0 -7
  210. data/test/fixtures/categories_posts.yml +0 -23
  211. data/test/fixtures/categorizations.yml +0 -17
  212. data/test/fixtures/clubs.yml +0 -6
  213. data/test/fixtures/comments.yml +0 -59
  214. data/test/fixtures/companies.yml +0 -56
  215. data/test/fixtures/computers.yml +0 -4
  216. data/test/fixtures/courses.yml +0 -7
  217. data/test/fixtures/customers.yml +0 -26
  218. data/test/fixtures/developers.yml +0 -21
  219. data/test/fixtures/developers_projects.yml +0 -17
  220. data/test/fixtures/edges.yml +0 -6
  221. data/test/fixtures/entrants.yml +0 -14
  222. data/test/fixtures/faces.yml +0 -11
  223. data/test/fixtures/fk_test_has_fk.yml +0 -3
  224. data/test/fixtures/fk_test_has_pk.yml +0 -2
  225. data/test/fixtures/funny_jokes.yml +0 -10
  226. data/test/fixtures/interests.yml +0 -33
  227. data/test/fixtures/items.yml +0 -4
  228. data/test/fixtures/jobs.yml +0 -7
  229. data/test/fixtures/legacy_things.yml +0 -3
  230. data/test/fixtures/mateys.yml +0 -4
  231. data/test/fixtures/member_types.yml +0 -6
  232. data/test/fixtures/members.yml +0 -6
  233. data/test/fixtures/memberships.yml +0 -20
  234. data/test/fixtures/men.yml +0 -5
  235. data/test/fixtures/minimalistics.yml +0 -2
  236. data/test/fixtures/mixed_case_monkeys.yml +0 -6
  237. data/test/fixtures/mixins.yml +0 -29
  238. data/test/fixtures/movies.yml +0 -7
  239. data/test/fixtures/naked/csv/accounts.csv +0 -1
  240. data/test/fixtures/naked/yml/accounts.yml +0 -1
  241. data/test/fixtures/naked/yml/companies.yml +0 -1
  242. data/test/fixtures/naked/yml/courses.yml +0 -1
  243. data/test/fixtures/organizations.yml +0 -5
  244. data/test/fixtures/owners.yml +0 -7
  245. data/test/fixtures/parrots.yml +0 -27
  246. data/test/fixtures/parrots_pirates.yml +0 -7
  247. data/test/fixtures/people.yml +0 -15
  248. data/test/fixtures/pets.yml +0 -14
  249. data/test/fixtures/pirates.yml +0 -9
  250. data/test/fixtures/polymorphic_designs.yml +0 -19
  251. data/test/fixtures/polymorphic_prices.yml +0 -19
  252. data/test/fixtures/posts.yml +0 -52
  253. data/test/fixtures/price_estimates.yml +0 -7
  254. data/test/fixtures/projects.yml +0 -7
  255. data/test/fixtures/readers.yml +0 -9
  256. data/test/fixtures/references.yml +0 -17
  257. data/test/fixtures/reserved_words/distinct.yml +0 -5
  258. data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
  259. data/test/fixtures/reserved_words/group.yml +0 -14
  260. data/test/fixtures/reserved_words/select.yml +0 -8
  261. data/test/fixtures/reserved_words/values.yml +0 -7
  262. data/test/fixtures/ships.yml +0 -5
  263. data/test/fixtures/sponsors.yml +0 -9
  264. data/test/fixtures/subscribers.yml +0 -7
  265. data/test/fixtures/subscriptions.yml +0 -12
  266. data/test/fixtures/taggings.yml +0 -28
  267. data/test/fixtures/tags.yml +0 -7
  268. data/test/fixtures/tasks.yml +0 -7
  269. data/test/fixtures/tees.yml +0 -4
  270. data/test/fixtures/ties.yml +0 -4
  271. data/test/fixtures/topics.yml +0 -42
  272. data/test/fixtures/toys.yml +0 -4
  273. data/test/fixtures/treasures.yml +0 -10
  274. data/test/fixtures/vertices.yml +0 -4
  275. data/test/fixtures/warehouse-things.yml +0 -3
  276. data/test/fixtures/zines.yml +0 -5
  277. data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
  278. data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
  279. data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
  280. data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
  281. data/test/migrations/duplicate/3_foo.rb +0 -7
  282. data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
  283. data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
  284. data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
  285. data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
  286. data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
  287. data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
  288. data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
  289. data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
  290. data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
  291. data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
  292. data/test/migrations/missing/1_people_have_last_names.rb +0 -9
  293. data/test/migrations/missing/3_we_need_reminders.rb +0 -12
  294. data/test/migrations/missing/4_innocent_jointable.rb +0 -12
  295. data/test/migrations/valid/1_people_have_last_names.rb +0 -9
  296. data/test/migrations/valid/2_we_need_reminders.rb +0 -12
  297. data/test/migrations/valid/3_innocent_jointable.rb +0 -12
  298. data/test/models/author.rb +0 -151
  299. data/test/models/auto_id.rb +0 -4
  300. data/test/models/binary.rb +0 -2
  301. data/test/models/bird.rb +0 -9
  302. data/test/models/book.rb +0 -4
  303. data/test/models/categorization.rb +0 -5
  304. data/test/models/category.rb +0 -34
  305. data/test/models/citation.rb +0 -6
  306. data/test/models/club.rb +0 -13
  307. data/test/models/column_name.rb +0 -3
  308. data/test/models/comment.rb +0 -29
  309. data/test/models/company.rb +0 -173
  310. data/test/models/company_in_module.rb +0 -78
  311. data/test/models/computer.rb +0 -3
  312. data/test/models/contact.rb +0 -16
  313. data/test/models/contract.rb +0 -5
  314. data/test/models/course.rb +0 -3
  315. data/test/models/customer.rb +0 -73
  316. data/test/models/default.rb +0 -2
  317. data/test/models/developer.rb +0 -101
  318. data/test/models/edge.rb +0 -5
  319. data/test/models/entrant.rb +0 -3
  320. data/test/models/essay.rb +0 -3
  321. data/test/models/event.rb +0 -3
  322. data/test/models/event_author.rb +0 -8
  323. data/test/models/face.rb +0 -7
  324. data/test/models/guid.rb +0 -2
  325. data/test/models/interest.rb +0 -5
  326. data/test/models/invoice.rb +0 -4
  327. data/test/models/item.rb +0 -7
  328. data/test/models/job.rb +0 -5
  329. data/test/models/joke.rb +0 -3
  330. data/test/models/keyboard.rb +0 -3
  331. data/test/models/legacy_thing.rb +0 -3
  332. data/test/models/line_item.rb +0 -3
  333. data/test/models/man.rb +0 -9
  334. data/test/models/matey.rb +0 -4
  335. data/test/models/member.rb +0 -12
  336. data/test/models/member_detail.rb +0 -5
  337. data/test/models/member_type.rb +0 -3
  338. data/test/models/membership.rb +0 -9
  339. data/test/models/minimalistic.rb +0 -2
  340. data/test/models/mixed_case_monkey.rb +0 -3
  341. data/test/models/movie.rb +0 -5
  342. data/test/models/order.rb +0 -4
  343. data/test/models/organization.rb +0 -6
  344. data/test/models/owner.rb +0 -5
  345. data/test/models/parrot.rb +0 -22
  346. data/test/models/person.rb +0 -16
  347. data/test/models/pet.rb +0 -5
  348. data/test/models/pirate.rb +0 -80
  349. data/test/models/polymorphic_design.rb +0 -3
  350. data/test/models/polymorphic_price.rb +0 -3
  351. data/test/models/post.rb +0 -102
  352. data/test/models/price_estimate.rb +0 -3
  353. data/test/models/project.rb +0 -30
  354. data/test/models/reader.rb +0 -4
  355. data/test/models/reference.rb +0 -4
  356. data/test/models/reply.rb +0 -46
  357. data/test/models/ship.rb +0 -19
  358. data/test/models/ship_part.rb +0 -7
  359. data/test/models/sponsor.rb +0 -4
  360. data/test/models/subject.rb +0 -4
  361. data/test/models/subscriber.rb +0 -8
  362. data/test/models/subscription.rb +0 -4
  363. data/test/models/tag.rb +0 -7
  364. data/test/models/tagging.rb +0 -10
  365. data/test/models/task.rb +0 -3
  366. data/test/models/tee.rb +0 -4
  367. data/test/models/tie.rb +0 -4
  368. data/test/models/topic.rb +0 -80
  369. data/test/models/toy.rb +0 -6
  370. data/test/models/treasure.rb +0 -8
  371. data/test/models/vertex.rb +0 -9
  372. data/test/models/warehouse_thing.rb +0 -5
  373. data/test/models/zine.rb +0 -3
  374. data/test/schema/mysql_specific_schema.rb +0 -31
  375. data/test/schema/postgresql_specific_schema.rb +0 -114
  376. data/test/schema/schema.rb +0 -550
  377. data/test/schema/schema2.rb +0 -6
  378. data/test/schema/sqlite_specific_schema.rb +0 -25
@@ -1,38 +0,0 @@
1
- require "cases/helper"
2
-
3
- class Comment < ActiveRecord::Base
4
- attr_accessor :callers
5
-
6
- before_validation :record_callers
7
-
8
- def after_validation
9
- record_callers
10
- end
11
-
12
- def record_callers
13
- callers << self.class if callers
14
- end
15
- end
16
-
17
- class CommentObserver < ActiveRecord::Observer
18
- attr_accessor :callers
19
-
20
- def after_validation(model)
21
- callers << self.class if callers
22
- end
23
- end
24
-
25
- class CallbacksObserversTest < ActiveRecord::TestCase
26
- def test_model_callbacks_fire_before_observers_are_notified
27
- callers = []
28
-
29
- comment = Comment.new
30
- comment.callers = callers
31
-
32
- CommentObserver.instance.callers = callers
33
-
34
- comment.valid?
35
-
36
- assert_equal [Comment, Comment, CommentObserver], callers, "model callbacks did not fire before observers were notified"
37
- end
38
- end
@@ -1,438 +0,0 @@
1
- require "cases/helper"
2
-
3
- class CallbackDeveloper < ActiveRecord::Base
4
- set_table_name 'developers'
5
-
6
- class << self
7
- def callback_string(callback_method)
8
- "history << [#{callback_method.to_sym.inspect}, :string]"
9
- end
10
-
11
- def callback_proc(callback_method)
12
- Proc.new { |model| model.history << [callback_method, :proc] }
13
- end
14
-
15
- def define_callback_method(callback_method)
16
- define_method("#{callback_method}_method") do |model|
17
- model.history << [callback_method, :method]
18
- end
19
- end
20
-
21
- def callback_object(callback_method)
22
- klass = Class.new
23
- klass.send(:define_method, callback_method) do |model|
24
- model.history << [callback_method, :object]
25
- end
26
- klass.new
27
- end
28
- end
29
-
30
- ActiveRecord::Callbacks::CALLBACKS.each do |callback_method|
31
- callback_method_sym = callback_method.to_sym
32
- define_callback_method(callback_method_sym)
33
- send(callback_method, callback_method_sym)
34
- send(callback_method, callback_string(callback_method_sym))
35
- send(callback_method, callback_proc(callback_method_sym))
36
- send(callback_method, callback_object(callback_method_sym))
37
- send(callback_method) { |model| model.history << [callback_method_sym, :block] }
38
- end
39
-
40
- def history
41
- @history ||= []
42
- end
43
-
44
- # after_initialize and after_find are invoked only if instance methods have been defined.
45
- def after_initialize
46
- end
47
-
48
- def after_find
49
- end
50
- end
51
-
52
- class ParentDeveloper < ActiveRecord::Base
53
- set_table_name 'developers'
54
- attr_accessor :after_save_called
55
- before_validation {|record| record.after_save_called = true}
56
- end
57
-
58
- class ChildDeveloper < ParentDeveloper
59
-
60
- end
61
-
62
- class RecursiveCallbackDeveloper < ActiveRecord::Base
63
- set_table_name 'developers'
64
-
65
- before_save :on_before_save
66
- after_save :on_after_save
67
-
68
- attr_reader :on_before_save_called, :on_after_save_called
69
-
70
- def on_before_save
71
- @on_before_save_called ||= 0
72
- @on_before_save_called += 1
73
- save unless @on_before_save_called > 1
74
- end
75
-
76
- def on_after_save
77
- @on_after_save_called ||= 0
78
- @on_after_save_called += 1
79
- save unless @on_after_save_called > 1
80
- end
81
- end
82
-
83
- class ImmutableDeveloper < ActiveRecord::Base
84
- set_table_name 'developers'
85
-
86
- validates_inclusion_of :salary, :in => 50000..200000
87
-
88
- before_save :cancel
89
- before_destroy :cancel
90
-
91
- def cancelled?
92
- @cancelled == true
93
- end
94
-
95
- private
96
- def cancel
97
- @cancelled = true
98
- false
99
- end
100
- end
101
-
102
- class ImmutableMethodDeveloper < ActiveRecord::Base
103
- set_table_name 'developers'
104
-
105
- validates_inclusion_of :salary, :in => 50000..200000
106
-
107
- def cancelled?
108
- @cancelled == true
109
- end
110
-
111
- def before_save
112
- @cancelled = true
113
- false
114
- end
115
-
116
- def before_destroy
117
- @cancelled = true
118
- false
119
- end
120
- end
121
-
122
- class CallbackCancellationDeveloper < ActiveRecord::Base
123
- set_table_name 'developers'
124
-
125
- attr_reader :after_save_called, :after_create_called, :after_update_called, :after_destroy_called
126
- attr_accessor :cancel_before_save, :cancel_before_create, :cancel_before_update, :cancel_before_destroy
127
-
128
- def before_save; !@cancel_before_save; end
129
- def before_create; !@cancel_before_create; end
130
- def before_update; !@cancel_before_update; end
131
- def before_destroy; !@cancel_before_destroy; end
132
-
133
- def after_save; @after_save_called = true; end
134
- def after_update; @after_update_called = true; end
135
- def after_create; @after_create_called = true; end
136
- def after_destroy; @after_destroy_called = true; end
137
- end
138
-
139
- class CallbacksTest < ActiveRecord::TestCase
140
- fixtures :developers
141
-
142
- def test_initialize
143
- david = CallbackDeveloper.new
144
- assert_equal [
145
- [ :after_initialize, :string ],
146
- [ :after_initialize, :proc ],
147
- [ :after_initialize, :object ],
148
- [ :after_initialize, :block ],
149
- ], david.history
150
- end
151
-
152
- def test_find
153
- david = CallbackDeveloper.find(1)
154
- assert_equal [
155
- [ :after_find, :string ],
156
- [ :after_find, :proc ],
157
- [ :after_find, :object ],
158
- [ :after_find, :block ],
159
- [ :after_initialize, :string ],
160
- [ :after_initialize, :proc ],
161
- [ :after_initialize, :object ],
162
- [ :after_initialize, :block ],
163
- ], david.history
164
- end
165
-
166
- def test_new_valid?
167
- david = CallbackDeveloper.new
168
- david.valid?
169
- assert_equal [
170
- [ :after_initialize, :string ],
171
- [ :after_initialize, :proc ],
172
- [ :after_initialize, :object ],
173
- [ :after_initialize, :block ],
174
- [ :before_validation, :string ],
175
- [ :before_validation, :proc ],
176
- [ :before_validation, :object ],
177
- [ :before_validation, :block ],
178
- [ :before_validation_on_create, :string ],
179
- [ :before_validation_on_create, :proc ],
180
- [ :before_validation_on_create, :object ],
181
- [ :before_validation_on_create, :block ],
182
- [ :after_validation, :string ],
183
- [ :after_validation, :proc ],
184
- [ :after_validation, :object ],
185
- [ :after_validation, :block ],
186
- [ :after_validation_on_create, :string ],
187
- [ :after_validation_on_create, :proc ],
188
- [ :after_validation_on_create, :object ],
189
- [ :after_validation_on_create, :block ]
190
- ], david.history
191
- end
192
-
193
- def test_existing_valid?
194
- david = CallbackDeveloper.find(1)
195
- david.valid?
196
- assert_equal [
197
- [ :after_find, :string ],
198
- [ :after_find, :proc ],
199
- [ :after_find, :object ],
200
- [ :after_find, :block ],
201
- [ :after_initialize, :string ],
202
- [ :after_initialize, :proc ],
203
- [ :after_initialize, :object ],
204
- [ :after_initialize, :block ],
205
- [ :before_validation, :string ],
206
- [ :before_validation, :proc ],
207
- [ :before_validation, :object ],
208
- [ :before_validation, :block ],
209
- [ :before_validation_on_update, :string ],
210
- [ :before_validation_on_update, :proc ],
211
- [ :before_validation_on_update, :object ],
212
- [ :before_validation_on_update, :block ],
213
- [ :after_validation, :string ],
214
- [ :after_validation, :proc ],
215
- [ :after_validation, :object ],
216
- [ :after_validation, :block ],
217
- [ :after_validation_on_update, :string ],
218
- [ :after_validation_on_update, :proc ],
219
- [ :after_validation_on_update, :object ],
220
- [ :after_validation_on_update, :block ]
221
- ], david.history
222
- end
223
-
224
- def test_create
225
- david = CallbackDeveloper.create('name' => 'David', 'salary' => 1000000)
226
- assert_equal [
227
- [ :after_initialize, :string ],
228
- [ :after_initialize, :proc ],
229
- [ :after_initialize, :object ],
230
- [ :after_initialize, :block ],
231
- [ :before_validation, :string ],
232
- [ :before_validation, :proc ],
233
- [ :before_validation, :object ],
234
- [ :before_validation, :block ],
235
- [ :before_validation_on_create, :string ],
236
- [ :before_validation_on_create, :proc ],
237
- [ :before_validation_on_create, :object ],
238
- [ :before_validation_on_create, :block ],
239
- [ :after_validation, :string ],
240
- [ :after_validation, :proc ],
241
- [ :after_validation, :object ],
242
- [ :after_validation, :block ],
243
- [ :after_validation_on_create, :string ],
244
- [ :after_validation_on_create, :proc ],
245
- [ :after_validation_on_create, :object ],
246
- [ :after_validation_on_create, :block ],
247
- [ :before_save, :string ],
248
- [ :before_save, :proc ],
249
- [ :before_save, :object ],
250
- [ :before_save, :block ],
251
- [ :before_create, :string ],
252
- [ :before_create, :proc ],
253
- [ :before_create, :object ],
254
- [ :before_create, :block ],
255
- [ :after_create, :string ],
256
- [ :after_create, :proc ],
257
- [ :after_create, :object ],
258
- [ :after_create, :block ],
259
- [ :after_save, :string ],
260
- [ :after_save, :proc ],
261
- [ :after_save, :object ],
262
- [ :after_save, :block ]
263
- ], david.history
264
- end
265
-
266
- def test_save
267
- david = CallbackDeveloper.find(1)
268
- david.save
269
- assert_equal [
270
- [ :after_find, :string ],
271
- [ :after_find, :proc ],
272
- [ :after_find, :object ],
273
- [ :after_find, :block ],
274
- [ :after_initialize, :string ],
275
- [ :after_initialize, :proc ],
276
- [ :after_initialize, :object ],
277
- [ :after_initialize, :block ],
278
- [ :before_validation, :string ],
279
- [ :before_validation, :proc ],
280
- [ :before_validation, :object ],
281
- [ :before_validation, :block ],
282
- [ :before_validation_on_update, :string ],
283
- [ :before_validation_on_update, :proc ],
284
- [ :before_validation_on_update, :object ],
285
- [ :before_validation_on_update, :block ],
286
- [ :after_validation, :string ],
287
- [ :after_validation, :proc ],
288
- [ :after_validation, :object ],
289
- [ :after_validation, :block ],
290
- [ :after_validation_on_update, :string ],
291
- [ :after_validation_on_update, :proc ],
292
- [ :after_validation_on_update, :object ],
293
- [ :after_validation_on_update, :block ],
294
- [ :before_save, :string ],
295
- [ :before_save, :proc ],
296
- [ :before_save, :object ],
297
- [ :before_save, :block ],
298
- [ :before_update, :string ],
299
- [ :before_update, :proc ],
300
- [ :before_update, :object ],
301
- [ :before_update, :block ],
302
- [ :after_update, :string ],
303
- [ :after_update, :proc ],
304
- [ :after_update, :object ],
305
- [ :after_update, :block ],
306
- [ :after_save, :string ],
307
- [ :after_save, :proc ],
308
- [ :after_save, :object ],
309
- [ :after_save, :block ]
310
- ], david.history
311
- end
312
-
313
- def test_destroy
314
- david = CallbackDeveloper.find(1)
315
- david.destroy
316
- assert_equal [
317
- [ :after_find, :string ],
318
- [ :after_find, :proc ],
319
- [ :after_find, :object ],
320
- [ :after_find, :block ],
321
- [ :after_initialize, :string ],
322
- [ :after_initialize, :proc ],
323
- [ :after_initialize, :object ],
324
- [ :after_initialize, :block ],
325
- [ :before_destroy, :string ],
326
- [ :before_destroy, :proc ],
327
- [ :before_destroy, :object ],
328
- [ :before_destroy, :block ],
329
- [ :after_destroy, :string ],
330
- [ :after_destroy, :proc ],
331
- [ :after_destroy, :object ],
332
- [ :after_destroy, :block ]
333
- ], david.history
334
- end
335
-
336
- def test_delete
337
- david = CallbackDeveloper.find(1)
338
- CallbackDeveloper.delete(david.id)
339
- assert_equal [
340
- [ :after_find, :string ],
341
- [ :after_find, :proc ],
342
- [ :after_find, :object ],
343
- [ :after_find, :block ],
344
- [ :after_initialize, :string ],
345
- [ :after_initialize, :proc ],
346
- [ :after_initialize, :object ],
347
- [ :after_initialize, :block ],
348
- ], david.history
349
- end
350
-
351
- def test_before_save_returning_false
352
- david = ImmutableDeveloper.find(1)
353
- assert david.valid?
354
- assert !david.save
355
- assert_raise(ActiveRecord::RecordNotSaved) { david.save! }
356
-
357
- david = ImmutableDeveloper.find(1)
358
- david.salary = 10_000_000
359
- assert !david.valid?
360
- assert !david.save
361
- assert_raise(ActiveRecord::RecordInvalid) { david.save! }
362
-
363
- someone = CallbackCancellationDeveloper.find(1)
364
- someone.cancel_before_save = true
365
- assert someone.valid?
366
- assert !someone.save
367
- assert_save_callbacks_not_called(someone)
368
- end
369
-
370
- def test_before_create_returning_false
371
- someone = CallbackCancellationDeveloper.new
372
- someone.cancel_before_create = true
373
- assert someone.valid?
374
- assert !someone.save
375
- assert_save_callbacks_not_called(someone)
376
- end
377
-
378
- def test_before_update_returning_false
379
- someone = CallbackCancellationDeveloper.find(1)
380
- someone.cancel_before_update = true
381
- assert someone.valid?
382
- assert !someone.save
383
- assert_save_callbacks_not_called(someone)
384
- end
385
-
386
- def test_before_destroy_returning_false
387
- david = ImmutableDeveloper.find(1)
388
- assert !david.destroy
389
- assert_not_nil ImmutableDeveloper.find_by_id(1)
390
-
391
- someone = CallbackCancellationDeveloper.find(1)
392
- someone.cancel_before_destroy = true
393
- assert !someone.destroy
394
- assert !someone.after_destroy_called
395
- end
396
-
397
- def assert_save_callbacks_not_called(someone)
398
- assert !someone.after_save_called
399
- assert !someone.after_create_called
400
- assert !someone.after_update_called
401
- end
402
- private :assert_save_callbacks_not_called
403
-
404
- def test_zzz_callback_returning_false # must be run last since we modify CallbackDeveloper
405
- david = CallbackDeveloper.find(1)
406
- CallbackDeveloper.before_validation proc { |model| model.history << [:before_validation, :returning_false]; return false }
407
- CallbackDeveloper.before_validation proc { |model| model.history << [:before_validation, :should_never_get_here] }
408
- david.save
409
- assert_equal [
410
- [ :after_find, :string ],
411
- [ :after_find, :proc ],
412
- [ :after_find, :object ],
413
- [ :after_find, :block ],
414
- [ :after_initialize, :string ],
415
- [ :after_initialize, :proc ],
416
- [ :after_initialize, :object ],
417
- [ :after_initialize, :block ],
418
- [ :before_validation, :string ],
419
- [ :before_validation, :proc ],
420
- [ :before_validation, :object ],
421
- [ :before_validation, :block ],
422
- [ :before_validation, :returning_false ]
423
- ], david.history
424
- end
425
-
426
- def test_inheritence_of_callbacks
427
- parent = ParentDeveloper.new
428
- assert !parent.after_save_called
429
- parent.save
430
- assert parent.after_save_called
431
-
432
- child = ChildDeveloper.new
433
- assert !child.after_save_called
434
- child.save
435
- assert child.after_save_called
436
- end
437
-
438
- end