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,7 +1,9 @@
1
- require 'observer'
1
+ require 'active_support/core_ext/array/wrap'
2
2
 
3
3
  module ActiveRecord
4
- # Callbacks are hooks into the lifecycle of an Active Record object that allow you to trigger logic
4
+ # = Active Record Callbacks
5
+ #
6
+ # Callbacks are hooks into the life cycle of an Active Record object that allow you to trigger logic
5
7
  # before or after an alteration of the object state. This can be used to make sure that associated and
6
8
  # dependent objects are deleted when +destroy+ is called (by overwriting +before_destroy+) or to massage attributes
7
9
  # before they're validated (by overwriting +before_validation+). As an example of the callbacks initiated, consider
@@ -10,26 +12,32 @@ module ActiveRecord
10
12
  # * (-) <tt>save</tt>
11
13
  # * (-) <tt>valid</tt>
12
14
  # * (1) <tt>before_validation</tt>
13
- # * (2) <tt>before_validation_on_create</tt>
14
15
  # * (-) <tt>validate</tt>
15
- # * (-) <tt>validate_on_create</tt>
16
- # * (3) <tt>after_validation</tt>
17
- # * (4) <tt>after_validation_on_create</tt>
18
- # * (5) <tt>before_save</tt>
19
- # * (6) <tt>before_create</tt>
16
+ # * (2) <tt>after_validation</tt>
17
+ # * (3) <tt>before_save</tt>
18
+ # * (4) <tt>before_create</tt>
20
19
  # * (-) <tt>create</tt>
21
- # * (7) <tt>after_create</tt>
22
- # * (8) <tt>after_save</tt>
20
+ # * (5) <tt>after_create</tt>
21
+ # * (6) <tt>after_save</tt>
22
+ # * (7) <tt>after_commit</tt>
23
+ #
24
+ # Also, an <tt>after_rollback</tt> callback can be configured to be triggered whenever a rollback is issued.
25
+ # Check out <tt>ActiveRecord::Transactions</tt> for more details about <tt>after_commit</tt> and
26
+ # <tt>after_rollback</tt>.
23
27
  #
24
- # That's a total of eight callbacks, which gives you immense power to react and prepare for each state in the
25
- # Active Record lifecycle. The sequence for calling <tt>Base#save</tt> an existing record is similar, except that each
26
- # <tt>_on_create</tt> callback is replaced by the corresponding <tt>_on_update</tt> callback.
28
+ # Lastly an <tt>after_find</tt> and <tt>after_initialize</tt> callback is triggered for each object that
29
+ # is found and instantiated by a finder, with <tt>after_initialize</tt> being triggered after new objects
30
+ # are instantiated as well.
31
+ #
32
+ # That's a total of twelve callbacks, which gives you immense power to react and prepare for each state in the
33
+ # Active Record life cycle. The sequence for calling <tt>Base#save</tt> for an existing record is similar,
34
+ # except that each <tt>_create</tt> callback is replaced by the corresponding <tt>_update</tt> callback.
27
35
  #
28
36
  # Examples:
29
37
  # class CreditCard < ActiveRecord::Base
30
38
  # # Strip everything but digits, so the user can specify "555 234 34" or
31
39
  # # "5552-3434" or both will mean "55523434"
32
- # def before_validation_on_create
40
+ # before_validation(:on => :create) do
33
41
  # self.number = number.gsub(/[^0-9]/, "") if attribute_present?("number")
34
42
  # end
35
43
  # end
@@ -51,9 +59,9 @@ module ActiveRecord
51
59
  #
52
60
  # == Inheritable callback queues
53
61
  #
54
- # Besides the overwritable callback methods, it's also possible to register callbacks through the use of the callback macros.
55
- # Their main advantage is that the macros add behavior into a callback queue that is kept intact down through an inheritance
56
- # hierarchy. Example:
62
+ # Besides the overwritable callback methods, it's also possible to register callbacks through the
63
+ # use of the callback macros. Their main advantage is that the macros add behavior into a callback
64
+ # queue that is kept intact down through an inheritance hierarchy.
57
65
  #
58
66
  # class Topic < ActiveRecord::Base
59
67
  # before_destroy :destroy_author
@@ -63,9 +71,9 @@ module ActiveRecord
63
71
  # before_destroy :destroy_readers
64
72
  # end
65
73
  #
66
- # Now, when <tt>Topic#destroy</tt> is run only +destroy_author+ is called. When <tt>Reply#destroy</tt> is run, both +destroy_author+ and
67
- # +destroy_readers+ are called. Contrast this to the situation where we've implemented the save behavior through overwriteable
68
- # methods:
74
+ # Now, when <tt>Topic#destroy</tt> is run only +destroy_author+ is called. When <tt>Reply#destroy</tt> is
75
+ # run, both +destroy_author+ and +destroy_readers+ are called. Contrast this to the following situation
76
+ # where the +before_destroy+ method is overridden:
69
77
  #
70
78
  # class Topic < ActiveRecord::Base
71
79
  # def before_destroy() destroy_author end
@@ -75,20 +83,21 @@ module ActiveRecord
75
83
  # def before_destroy() destroy_readers end
76
84
  # end
77
85
  #
78
- # In that case, <tt>Reply#destroy</tt> would only run +destroy_readers+ and _not_ +destroy_author+. So, use the callback macros when
79
- # you want to ensure that a certain callback is called for the entire hierarchy, and use the regular overwriteable methods
80
- # when you want to leave it up to each descendant to decide whether they want to call +super+ and trigger the inherited callbacks.
86
+ # In that case, <tt>Reply#destroy</tt> would only run +destroy_readers+ and _not_ +destroy_author+.
87
+ # So, use the callback macros when you want to ensure that a certain callback is called for the entire
88
+ # hierarchy, and use the regular overwriteable methods when you want to leave it up to each descendant
89
+ # to decide whether they want to call +super+ and trigger the inherited callbacks.
81
90
  #
82
- # *IMPORTANT:* In order for inheritance to work for the callback queues, you must specify the callbacks before specifying the
83
- # associations. Otherwise, you might trigger the loading of a child before the parent has registered the callbacks and they won't
84
- # be inherited.
91
+ # *IMPORTANT:* In order for inheritance to work for the callback queues, you must specify the
92
+ # callbacks before specifying the associations. Otherwise, you might trigger the loading of a
93
+ # child before the parent has registered the callbacks and they won't be inherited.
85
94
  #
86
95
  # == Types of callbacks
87
96
  #
88
97
  # There are four types of callbacks accepted by the callback macros: Method references (symbol), callback objects,
89
- # inline methods (using a proc), and inline eval methods (using a string). Method references and callback objects are the
90
- # recommended approaches, inline methods using a proc are sometimes appropriate (such as for creating mix-ins), and inline
91
- # eval methods are deprecated.
98
+ # inline methods (using a proc), and inline eval methods (using a string). Method references and callback objects
99
+ # are the recommended approaches, inline methods using a proc are sometimes appropriate (such as for
100
+ # creating mix-ins), and inline eval methods are deprecated.
92
101
  #
93
102
  # The method reference callbacks work by specifying a protected or private method available in the object, like this:
94
103
  #
@@ -165,39 +174,33 @@ module ActiveRecord
165
174
  # end
166
175
  # end
167
176
  #
168
- # The callback macros usually accept a symbol for the method they're supposed to run, but you can also pass a "method string",
169
- # which will then be evaluated within the binding of the callback. Example:
177
+ # The callback macros usually accept a symbol for the method they're supposed to run, but you can also
178
+ # pass a "method string", which will then be evaluated within the binding of the callback. Example:
170
179
  #
171
180
  # class Topic < ActiveRecord::Base
172
181
  # before_destroy 'self.class.delete_all "parent_id = #{id}"'
173
182
  # end
174
183
  #
175
- # Notice that single quotes (') are used so the <tt>#{id}</tt> part isn't evaluated until the callback is triggered. Also note that these
176
- # inline callbacks can be stacked just like the regular ones:
184
+ # Notice that single quotes (') are used so the <tt>#{id}</tt> part isn't evaluated until the callback
185
+ # is triggered. Also note that these inline callbacks can be stacked just like the regular ones:
177
186
  #
178
187
  # class Topic < ActiveRecord::Base
179
188
  # before_destroy 'self.class.delete_all "parent_id = #{id}"',
180
189
  # 'puts "Evaluated after parents are destroyed"'
181
190
  # end
182
191
  #
183
- # == The +after_find+ and +after_initialize+ exceptions
184
- #
185
- # Because +after_find+ and +after_initialize+ are called for each object found and instantiated by a finder, such as <tt>Base.find(:all)</tt>, we've had
186
- # to implement a simple performance constraint (50% more speed on a simple test case). Unlike all the other callbacks, +after_find+ and
187
- # +after_initialize+ will only be run if an explicit implementation is defined (<tt>def after_find</tt>). In that case, all of the
188
- # callback types will be called.
189
- #
190
192
  # == <tt>before_validation*</tt> returning statements
191
193
  #
192
- # If the returning value of a +before_validation+ callback can be evaluated to +false+, the process will be aborted and <tt>Base#save</tt> will return +false+.
193
- # If Base#save! is called it will raise a ActiveRecord::RecordInvalid exception.
194
- # Nothing will be appended to the errors object.
194
+ # If the returning value of a +before_validation+ callback can be evaluated to +false+, the process will be
195
+ # aborted and <tt>Base#save</tt> will return +false+. If Base#save! is called it will raise a
196
+ # ActiveRecord::RecordInvalid exception. Nothing will be appended to the errors object.
195
197
  #
196
198
  # == Canceling callbacks
197
199
  #
198
- # If a <tt>before_*</tt> callback returns +false+, all the later callbacks and the associated action are cancelled. If an <tt>after_*</tt> callback returns
199
- # +false+, all the later callbacks are cancelled. Callbacks are generally run in the order they are defined, with the exception of callbacks
200
- # defined as methods on the model, which are called last.
200
+ # If a <tt>before_*</tt> callback returns +false+, all the later callbacks and the associated action are
201
+ # cancelled. If an <tt>after_*</tt> callback returns +false+, all the later callbacks are cancelled.
202
+ # Callbacks are generally run in the order they are defined, with the exception of callbacks defined as
203
+ # methods on the model, which are called last.
201
204
  #
202
205
  # == Transactions
203
206
  #
@@ -210,151 +213,63 @@ module ActiveRecord
210
213
  # including <tt>after_*</tt> hooks. Note, however, that in that case the client
211
214
  # needs to be aware of it because an ordinary +save+ will raise such exception
212
215
  # instead of quietly returning +false+.
216
+ #
217
+ # == Debugging callbacks
218
+ #
219
+ # The callback chain is accessible via the <tt>_*_callbacks</tt> method on an object. ActiveModel Callbacks support
220
+ # <tt>:before</tt>, <tt>:after</tt> and <tt>:around</tt> as values for the <tt>kind</tt> property. The <tt>kind</tt> property
221
+ # defines what part of the chain the callback runs in.
222
+ #
223
+ # To find all callbacks in the before_save callback chain:
224
+ #
225
+ # Topic._save_callbacks.select { |cb| cb.kind.eql?(:before) }
226
+ #
227
+ # Returns an array of callback objects that form the before_save chain.
228
+ #
229
+ # To further check if the before_save chain contains a proc defined as <tt>rest_when_dead</tt> use the <tt>filter</tt> property of the callback object:
230
+ #
231
+ # Topic._save_callbacks.select { |cb| cb.kind.eql?(:before) }.collect(&:filter).include?(:rest_when_dead)
232
+ #
233
+ # Returns true or false depending on whether the proc is contained in the before_save callback chain on a Topic model.
234
+ #
213
235
  module Callbacks
214
- CALLBACKS = %w(
215
- after_find after_initialize before_save after_save before_create after_create before_update after_update before_validation
216
- after_validation before_validation_on_create after_validation_on_create before_validation_on_update
217
- after_validation_on_update before_destroy after_destroy
218
- )
236
+ extend ActiveSupport::Concern
219
237
 
220
- def self.included(base) #:nodoc:
221
- base.extend Observable
238
+ CALLBACKS = [
239
+ :after_initialize, :after_find, :after_touch, :before_validation, :after_validation,
240
+ :before_save, :around_save, :after_save, :before_create, :around_create,
241
+ :after_create, :before_update, :around_update, :after_update,
242
+ :before_destroy, :around_destroy, :after_destroy, :after_commit, :after_rollback
243
+ ]
222
244
 
223
- [:create_or_update, :valid?, :create, :update, :destroy].each do |method|
224
- base.send :alias_method_chain, method, :callbacks
225
- end
245
+ included do
246
+ extend ActiveModel::Callbacks
247
+ include ActiveModel::Validations::Callbacks
226
248
 
227
- base.send :include, ActiveSupport::Callbacks
228
- base.define_callbacks *CALLBACKS
249
+ define_model_callbacks :initialize, :find, :touch, :only => :after
250
+ define_model_callbacks :save, :create, :update, :destroy
229
251
  end
230
252
 
231
- # Is called when the object was instantiated by one of the finders, like <tt>Base.find</tt>.
232
- #def after_find() end
233
-
234
- # Is called after the object has been instantiated by a call to <tt>Base.new</tt>.
235
- #def after_initialize() end
236
-
237
- # Is called _before_ <tt>Base.save</tt> (regardless of whether it's a +create+ or +update+ save).
238
- def before_save() end
239
-
240
- # Is called _after_ <tt>Base.save</tt> (regardless of whether it's a +create+ or +update+ save).
241
- # Note that this callback is still wrapped in the transaction around +save+. For example, if you
242
- # invoke an external indexer at this point it won't see the changes in the database.
243
- #
244
- # class Contact < ActiveRecord::Base
245
- # after_save { logger.info( 'New contact saved!' ) }
246
- # end
247
- def after_save() end
248
- def create_or_update_with_callbacks #:nodoc:
249
- return false if callback(:before_save) == false
250
- if result = create_or_update_without_callbacks
251
- callback(:after_save)
252
- end
253
- result
253
+ def destroy #:nodoc:
254
+ run_callbacks(:destroy) { super }
254
255
  end
255
- private :create_or_update_with_callbacks
256
-
257
- # Is called _before_ <tt>Base.save</tt> on new objects that haven't been saved yet (no record exists).
258
- def before_create() end
259
256
 
260
- # Is called _after_ <tt>Base.save</tt> on new objects that haven't been saved yet (no record exists).
261
- # Note that this callback is still wrapped in the transaction around +save+. For example, if you
262
- # invoke an external indexer at this point it won't see the changes in the database.
263
- def after_create() end
264
- def create_with_callbacks #:nodoc:
265
- return false if callback(:before_create) == false
266
- result = create_without_callbacks
267
- callback(:after_create)
268
- result
257
+ def touch(*) #:nodoc:
258
+ run_callbacks(:touch) { super }
269
259
  end
270
- private :create_with_callbacks
271
260
 
272
- # Is called _before_ <tt>Base.save</tt> on existing objects that have a record.
273
- def before_update() end
261
+ private
274
262
 
275
- # Is called _after_ <tt>Base.save</tt> on existing objects that have a record.
276
- # Note that this callback is still wrapped in the transaction around +save+. For example, if you
277
- # invoke an external indexer at this point it won't see the changes in the database.
278
- def after_update() end
279
-
280
- def update_with_callbacks(*args) #:nodoc:
281
- return false if callback(:before_update) == false
282
- result = update_without_callbacks(*args)
283
- callback(:after_update)
284
- result
263
+ def create_or_update #:nodoc:
264
+ run_callbacks(:save) { super }
285
265
  end
286
- private :update_with_callbacks
287
-
288
- # Is called _before_ <tt>Validations.validate</tt> (which is part of the <tt>Base.save</tt> call).
289
- def before_validation() end
290
-
291
- # Is called _after_ <tt>Validations.validate</tt> (which is part of the <tt>Base.save</tt> call).
292
- def after_validation() end
293
266
 
294
- # Is called _before_ <tt>Validations.validate</tt> (which is part of the <tt>Base.save</tt> call) on new objects
295
- # that haven't been saved yet (no record exists).
296
- def before_validation_on_create() end
297
-
298
- # Is called _after_ <tt>Validations.validate</tt> (which is part of the <tt>Base.save</tt> call) on new objects
299
- # that haven't been saved yet (no record exists).
300
- def after_validation_on_create() end
301
-
302
- # Is called _before_ <tt>Validations.validate</tt> (which is part of the <tt>Base.save</tt> call) on
303
- # existing objects that have a record.
304
- def before_validation_on_update() end
305
-
306
- # Is called _after_ <tt>Validations.validate</tt> (which is part of the <tt>Base.save</tt> call) on
307
- # existing objects that have a record.
308
- def after_validation_on_update() end
309
-
310
- def valid_with_callbacks? #:nodoc:
311
- return false if callback(:before_validation) == false
312
- if new_record? then result = callback(:before_validation_on_create) else result = callback(:before_validation_on_update) end
313
- return false if false == result
314
-
315
- result = valid_without_callbacks?
316
-
317
- callback(:after_validation)
318
- if new_record? then callback(:after_validation_on_create) else callback(:after_validation_on_update) end
319
-
320
- return result
267
+ def create #:nodoc:
268
+ run_callbacks(:create) { super }
321
269
  end
322
270
 
323
- # Is called _before_ <tt>Base.destroy</tt>.
324
- #
325
- # Note: If you need to _destroy_ or _nullify_ associated records first,
326
- # use the <tt>:dependent</tt> option on your associations.
327
- def before_destroy() end
328
-
329
- # Is called _after_ <tt>Base.destroy</tt> (and all the attributes have been frozen).
330
- #
331
- # class Contact < ActiveRecord::Base
332
- # after_destroy { |record| logger.info( "Contact #{record.id} was destroyed." ) }
333
- # end
334
- def after_destroy() end
335
- def destroy_with_callbacks #:nodoc:
336
- return false if callback(:before_destroy) == false
337
- result = destroy_without_callbacks
338
- callback(:after_destroy)
339
- result
271
+ def update(*) #:nodoc:
272
+ run_callbacks(:update) { super }
340
273
  end
341
-
342
- private
343
- def callback(method)
344
- result = run_callbacks(method) { |result, object| false == result }
345
-
346
- if result != false && respond_to_without_attributes?(method)
347
- result = send(method)
348
- end
349
-
350
- notify(method)
351
-
352
- return result
353
- end
354
-
355
- def notify(method) #:nodoc:
356
- self.class.changed
357
- self.class.notify_observers(method, self)
358
- end
359
274
  end
360
275
  end
@@ -0,0 +1,41 @@
1
+ module ActiveRecord
2
+ # :stopdoc:
3
+ module Coders
4
+ class YAMLColumn
5
+ RESCUE_ERRORS = [ ArgumentError ]
6
+
7
+ if defined?(Psych) && defined?(Psych::SyntaxError)
8
+ RESCUE_ERRORS << Psych::SyntaxError
9
+ end
10
+
11
+ attr_accessor :object_class
12
+
13
+ def initialize(object_class = Object)
14
+ @object_class = object_class
15
+ end
16
+
17
+ def dump(obj)
18
+ YAML.dump obj
19
+ end
20
+
21
+ def load(yaml)
22
+ return object_class.new if object_class != Object && yaml.nil?
23
+ return yaml unless yaml.is_a?(String) && yaml =~ /^---/
24
+ begin
25
+ obj = YAML.load(yaml)
26
+
27
+ unless obj.is_a?(object_class) || obj.nil?
28
+ raise SerializationTypeMismatch,
29
+ "Attribute was supposed to be a #{object_class}, but was a #{obj.class}"
30
+ end
31
+ obj ||= object_class.new if object_class != Object
32
+
33
+ obj
34
+ rescue *RESCUE_ERRORS
35
+ yaml
36
+ end
37
+ end
38
+ end
39
+ end
40
+ # :startdoc
41
+ end