activerecord 3.2.6 → 6.0.0

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 (371) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +611 -6417
  3. data/MIT-LICENSE +4 -2
  4. data/README.rdoc +44 -47
  5. data/examples/performance.rb +79 -71
  6. data/examples/simple.rb +6 -5
  7. data/lib/active_record/aggregations.rb +268 -238
  8. data/lib/active_record/association_relation.rb +40 -0
  9. data/lib/active_record/associations/alias_tracker.rb +47 -42
  10. data/lib/active_record/associations/association.rb +173 -81
  11. data/lib/active_record/associations/association_scope.rb +124 -92
  12. data/lib/active_record/associations/belongs_to_association.rb +83 -38
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +11 -9
  14. data/lib/active_record/associations/builder/association.rb +113 -32
  15. data/lib/active_record/associations/builder/belongs_to.rb +105 -60
  16. data/lib/active_record/associations/builder/collection_association.rb +53 -56
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +98 -41
  18. data/lib/active_record/associations/builder/has_many.rb +11 -63
  19. data/lib/active_record/associations/builder/has_one.rb +47 -45
  20. data/lib/active_record/associations/builder/singular_association.rb +30 -18
  21. data/lib/active_record/associations/collection_association.rb +217 -295
  22. data/lib/active_record/associations/collection_proxy.rb +1074 -77
  23. data/lib/active_record/associations/foreign_association.rb +20 -0
  24. data/lib/active_record/associations/has_many_association.rb +78 -50
  25. data/lib/active_record/associations/has_many_through_association.rb +99 -61
  26. data/lib/active_record/associations/has_one_association.rb +75 -30
  27. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  28. data/lib/active_record/associations/join_dependency/join_association.rb +45 -119
  29. data/lib/active_record/associations/join_dependency/join_base.rb +11 -12
  30. data/lib/active_record/associations/join_dependency/join_part.rb +35 -42
  31. data/lib/active_record/associations/join_dependency.rb +208 -164
  32. data/lib/active_record/associations/preloader/association.rb +93 -87
  33. data/lib/active_record/associations/preloader/through_association.rb +87 -38
  34. data/lib/active_record/associations/preloader.rb +134 -110
  35. data/lib/active_record/associations/singular_association.rb +19 -24
  36. data/lib/active_record/associations/through_association.rb +61 -27
  37. data/lib/active_record/associations.rb +1766 -1505
  38. data/lib/active_record/attribute_assignment.rb +57 -193
  39. data/lib/active_record/attribute_decorators.rb +90 -0
  40. data/lib/active_record/attribute_methods/before_type_cast.rb +58 -8
  41. data/lib/active_record/attribute_methods/dirty.rb +187 -67
  42. data/lib/active_record/attribute_methods/primary_key.rb +100 -78
  43. data/lib/active_record/attribute_methods/query.rb +10 -8
  44. data/lib/active_record/attribute_methods/read.rb +29 -118
  45. data/lib/active_record/attribute_methods/serialization.rb +60 -72
  46. data/lib/active_record/attribute_methods/time_zone_conversion.rb +69 -42
  47. data/lib/active_record/attribute_methods/write.rb +36 -44
  48. data/lib/active_record/attribute_methods.rb +306 -161
  49. data/lib/active_record/attributes.rb +279 -0
  50. data/lib/active_record/autosave_association.rb +324 -238
  51. data/lib/active_record/base.rb +114 -507
  52. data/lib/active_record/callbacks.rb +147 -83
  53. data/lib/active_record/coders/json.rb +15 -0
  54. data/lib/active_record/coders/yaml_column.rb +32 -23
  55. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +962 -279
  56. data/lib/active_record/connection_adapters/abstract/database_limits.rb +32 -5
  57. data/lib/active_record/connection_adapters/abstract/database_statements.rb +331 -209
  58. data/lib/active_record/connection_adapters/abstract/query_cache.rb +95 -23
  59. data/lib/active_record/connection_adapters/abstract/quoting.rb +201 -65
  60. data/lib/active_record/connection_adapters/abstract/savepoints.rb +23 -0
  61. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -0
  62. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +510 -289
  63. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +93 -0
  64. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1182 -313
  65. data/lib/active_record/connection_adapters/abstract/transaction.rb +323 -0
  66. data/lib/active_record/connection_adapters/abstract_adapter.rb +585 -120
  67. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +610 -463
  68. data/lib/active_record/connection_adapters/column.rb +58 -233
  69. data/lib/active_record/connection_adapters/connection_specification.rb +297 -0
  70. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
  71. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  72. data/lib/active_record/connection_adapters/mysql/database_statements.rb +200 -0
  73. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +72 -0
  74. data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
  75. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +72 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
  78. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
  79. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
  80. data/lib/active_record/connection_adapters/mysql2_adapter.rb +75 -207
  81. data/lib/active_record/connection_adapters/postgresql/column.rb +30 -0
  82. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +182 -0
  83. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  84. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +92 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +53 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +15 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +17 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +50 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +23 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +15 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +21 -0
  93. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +71 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +15 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +15 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +41 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +15 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +65 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +97 -0
  101. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +18 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +113 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +26 -0
  104. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +28 -0
  105. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +30 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid.rb +34 -0
  107. data/lib/active_record/connection_adapters/postgresql/quoting.rb +205 -0
  108. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +43 -0
  109. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  110. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +222 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +50 -0
  112. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +776 -0
  113. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
  114. data/lib/active_record/connection_adapters/postgresql/utils.rb +81 -0
  115. data/lib/active_record/connection_adapters/postgresql_adapter.rb +695 -1052
  116. data/lib/active_record/connection_adapters/schema_cache.rb +115 -24
  117. data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
  118. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +118 -0
  119. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  120. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +103 -0
  121. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  125. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +528 -26
  126. data/lib/active_record/connection_adapters/statement_pool.rb +34 -13
  127. data/lib/active_record/connection_handling.rb +267 -0
  128. data/lib/active_record/core.rb +599 -0
  129. data/lib/active_record/counter_cache.rb +177 -103
  130. data/lib/active_record/database_configurations/database_config.rb +37 -0
  131. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  132. data/lib/active_record/database_configurations/url_config.rb +79 -0
  133. data/lib/active_record/database_configurations.rb +233 -0
  134. data/lib/active_record/define_callbacks.rb +22 -0
  135. data/lib/active_record/dynamic_matchers.rb +107 -64
  136. data/lib/active_record/enum.rb +274 -0
  137. data/lib/active_record/errors.rb +254 -61
  138. data/lib/active_record/explain.rb +35 -70
  139. data/lib/active_record/explain_registry.rb +32 -0
  140. data/lib/active_record/explain_subscriber.rb +18 -8
  141. data/lib/active_record/fixture_set/file.rb +82 -0
  142. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  143. data/lib/active_record/fixture_set/render_context.rb +17 -0
  144. data/lib/active_record/fixture_set/table_row.rb +153 -0
  145. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  146. data/lib/active_record/fixtures.rb +291 -475
  147. data/lib/active_record/gem_version.rb +17 -0
  148. data/lib/active_record/inheritance.rb +219 -100
  149. data/lib/active_record/insert_all.rb +179 -0
  150. data/lib/active_record/integration.rb +175 -17
  151. data/lib/active_record/internal_metadata.rb +53 -0
  152. data/lib/active_record/legacy_yaml_adapter.rb +48 -0
  153. data/lib/active_record/locale/en.yml +9 -1
  154. data/lib/active_record/locking/optimistic.rb +106 -92
  155. data/lib/active_record/locking/pessimistic.rb +23 -11
  156. data/lib/active_record/log_subscriber.rb +80 -30
  157. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  158. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  159. data/lib/active_record/middleware/database_selector.rb +75 -0
  160. data/lib/active_record/migration/command_recorder.rb +235 -56
  161. data/lib/active_record/migration/compatibility.rb +244 -0
  162. data/lib/active_record/migration/join_table.rb +17 -0
  163. data/lib/active_record/migration.rb +917 -301
  164. data/lib/active_record/model_schema.rb +351 -175
  165. data/lib/active_record/nested_attributes.rb +366 -235
  166. data/lib/active_record/no_touching.rb +65 -0
  167. data/lib/active_record/null_relation.rb +68 -0
  168. data/lib/active_record/persistence.rb +761 -166
  169. data/lib/active_record/query_cache.rb +22 -44
  170. data/lib/active_record/querying.rb +55 -31
  171. data/lib/active_record/railtie.rb +185 -47
  172. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  173. data/lib/active_record/railties/console_sandbox.rb +5 -4
  174. data/lib/active_record/railties/controller_runtime.rb +35 -33
  175. data/lib/active_record/railties/databases.rake +366 -463
  176. data/lib/active_record/readonly_attributes.rb +4 -6
  177. data/lib/active_record/reflection.rb +736 -228
  178. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  179. data/lib/active_record/relation/batches.rb +252 -52
  180. data/lib/active_record/relation/calculations.rb +340 -270
  181. data/lib/active_record/relation/delegation.rb +117 -36
  182. data/lib/active_record/relation/finder_methods.rb +439 -286
  183. data/lib/active_record/relation/from_clause.rb +26 -0
  184. data/lib/active_record/relation/merger.rb +184 -0
  185. data/lib/active_record/relation/predicate_builder/array_handler.rb +49 -0
  186. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  187. data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
  188. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  189. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  190. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  191. data/lib/active_record/relation/predicate_builder/relation_handler.rb +19 -0
  192. data/lib/active_record/relation/predicate_builder.rb +131 -39
  193. data/lib/active_record/relation/query_attribute.rb +50 -0
  194. data/lib/active_record/relation/query_methods.rb +1163 -221
  195. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  196. data/lib/active_record/relation/spawn_methods.rb +49 -120
  197. data/lib/active_record/relation/where_clause.rb +190 -0
  198. data/lib/active_record/relation/where_clause_factory.rb +33 -0
  199. data/lib/active_record/relation.rb +671 -349
  200. data/lib/active_record/result.rb +149 -15
  201. data/lib/active_record/runtime_registry.rb +24 -0
  202. data/lib/active_record/sanitization.rb +153 -133
  203. data/lib/active_record/schema.rb +22 -19
  204. data/lib/active_record/schema_dumper.rb +178 -112
  205. data/lib/active_record/schema_migration.rb +60 -0
  206. data/lib/active_record/scoping/default.rb +107 -98
  207. data/lib/active_record/scoping/named.rb +130 -115
  208. data/lib/active_record/scoping.rb +77 -123
  209. data/lib/active_record/secure_token.rb +40 -0
  210. data/lib/active_record/serialization.rb +10 -6
  211. data/lib/active_record/statement_cache.rb +148 -0
  212. data/lib/active_record/store.rb +256 -16
  213. data/lib/active_record/suppressor.rb +61 -0
  214. data/lib/active_record/table_metadata.rb +75 -0
  215. data/lib/active_record/tasks/database_tasks.rb +506 -0
  216. data/lib/active_record/tasks/mysql_database_tasks.rb +115 -0
  217. data/lib/active_record/tasks/postgresql_database_tasks.rb +141 -0
  218. data/lib/active_record/tasks/sqlite_database_tasks.rb +77 -0
  219. data/lib/active_record/test_databases.rb +23 -0
  220. data/lib/active_record/test_fixtures.rb +224 -0
  221. data/lib/active_record/timestamp.rb +93 -39
  222. data/lib/active_record/touch_later.rb +66 -0
  223. data/lib/active_record/transactions.rb +260 -129
  224. data/lib/active_record/translation.rb +3 -1
  225. data/lib/active_record/type/adapter_specific_registry.rb +129 -0
  226. data/lib/active_record/type/date.rb +9 -0
  227. data/lib/active_record/type/date_time.rb +9 -0
  228. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  229. data/lib/active_record/type/hash_lookup_type_map.rb +25 -0
  230. data/lib/active_record/type/internal/timezone.rb +17 -0
  231. data/lib/active_record/type/json.rb +30 -0
  232. data/lib/active_record/type/serialized.rb +71 -0
  233. data/lib/active_record/type/text.rb +11 -0
  234. data/lib/active_record/type/time.rb +21 -0
  235. data/lib/active_record/type/type_map.rb +62 -0
  236. data/lib/active_record/type/unsigned_integer.rb +17 -0
  237. data/lib/active_record/type.rb +78 -0
  238. data/lib/active_record/type_caster/connection.rb +34 -0
  239. data/lib/active_record/type_caster/map.rb +20 -0
  240. data/lib/active_record/type_caster.rb +9 -0
  241. data/lib/active_record/validations/absence.rb +25 -0
  242. data/lib/active_record/validations/associated.rb +35 -18
  243. data/lib/active_record/validations/length.rb +26 -0
  244. data/lib/active_record/validations/presence.rb +68 -0
  245. data/lib/active_record/validations/uniqueness.rb +123 -77
  246. data/lib/active_record/validations.rb +54 -43
  247. data/lib/active_record/version.rb +7 -7
  248. data/lib/active_record.rb +97 -49
  249. data/lib/arel/alias_predication.rb +9 -0
  250. data/lib/arel/attributes/attribute.rb +37 -0
  251. data/lib/arel/attributes.rb +22 -0
  252. data/lib/arel/collectors/bind.rb +24 -0
  253. data/lib/arel/collectors/composite.rb +31 -0
  254. data/lib/arel/collectors/plain_string.rb +20 -0
  255. data/lib/arel/collectors/sql_string.rb +20 -0
  256. data/lib/arel/collectors/substitute_binds.rb +28 -0
  257. data/lib/arel/crud.rb +42 -0
  258. data/lib/arel/delete_manager.rb +18 -0
  259. data/lib/arel/errors.rb +9 -0
  260. data/lib/arel/expressions.rb +29 -0
  261. data/lib/arel/factory_methods.rb +49 -0
  262. data/lib/arel/insert_manager.rb +49 -0
  263. data/lib/arel/math.rb +45 -0
  264. data/lib/arel/nodes/and.rb +32 -0
  265. data/lib/arel/nodes/ascending.rb +23 -0
  266. data/lib/arel/nodes/binary.rb +52 -0
  267. data/lib/arel/nodes/bind_param.rb +36 -0
  268. data/lib/arel/nodes/case.rb +55 -0
  269. data/lib/arel/nodes/casted.rb +50 -0
  270. data/lib/arel/nodes/comment.rb +29 -0
  271. data/lib/arel/nodes/count.rb +12 -0
  272. data/lib/arel/nodes/delete_statement.rb +45 -0
  273. data/lib/arel/nodes/descending.rb +23 -0
  274. data/lib/arel/nodes/equality.rb +18 -0
  275. data/lib/arel/nodes/extract.rb +24 -0
  276. data/lib/arel/nodes/false.rb +16 -0
  277. data/lib/arel/nodes/full_outer_join.rb +8 -0
  278. data/lib/arel/nodes/function.rb +44 -0
  279. data/lib/arel/nodes/grouping.rb +8 -0
  280. data/lib/arel/nodes/in.rb +8 -0
  281. data/lib/arel/nodes/infix_operation.rb +80 -0
  282. data/lib/arel/nodes/inner_join.rb +8 -0
  283. data/lib/arel/nodes/insert_statement.rb +37 -0
  284. data/lib/arel/nodes/join_source.rb +20 -0
  285. data/lib/arel/nodes/matches.rb +18 -0
  286. data/lib/arel/nodes/named_function.rb +23 -0
  287. data/lib/arel/nodes/node.rb +50 -0
  288. data/lib/arel/nodes/node_expression.rb +13 -0
  289. data/lib/arel/nodes/outer_join.rb +8 -0
  290. data/lib/arel/nodes/over.rb +15 -0
  291. data/lib/arel/nodes/regexp.rb +16 -0
  292. data/lib/arel/nodes/right_outer_join.rb +8 -0
  293. data/lib/arel/nodes/select_core.rb +67 -0
  294. data/lib/arel/nodes/select_statement.rb +41 -0
  295. data/lib/arel/nodes/sql_literal.rb +16 -0
  296. data/lib/arel/nodes/string_join.rb +11 -0
  297. data/lib/arel/nodes/table_alias.rb +27 -0
  298. data/lib/arel/nodes/terminal.rb +16 -0
  299. data/lib/arel/nodes/true.rb +16 -0
  300. data/lib/arel/nodes/unary.rb +45 -0
  301. data/lib/arel/nodes/unary_operation.rb +20 -0
  302. data/lib/arel/nodes/unqualified_column.rb +22 -0
  303. data/lib/arel/nodes/update_statement.rb +41 -0
  304. data/lib/arel/nodes/values_list.rb +9 -0
  305. data/lib/arel/nodes/window.rb +126 -0
  306. data/lib/arel/nodes/with.rb +11 -0
  307. data/lib/arel/nodes.rb +68 -0
  308. data/lib/arel/order_predications.rb +13 -0
  309. data/lib/arel/predications.rb +257 -0
  310. data/lib/arel/select_manager.rb +271 -0
  311. data/lib/arel/table.rb +110 -0
  312. data/lib/arel/tree_manager.rb +72 -0
  313. data/lib/arel/update_manager.rb +34 -0
  314. data/lib/arel/visitors/depth_first.rb +204 -0
  315. data/lib/arel/visitors/dot.rb +297 -0
  316. data/lib/arel/visitors/ibm_db.rb +34 -0
  317. data/lib/arel/visitors/informix.rb +62 -0
  318. data/lib/arel/visitors/mssql.rb +157 -0
  319. data/lib/arel/visitors/mysql.rb +83 -0
  320. data/lib/arel/visitors/oracle.rb +159 -0
  321. data/lib/arel/visitors/oracle12.rb +66 -0
  322. data/lib/arel/visitors/postgresql.rb +110 -0
  323. data/lib/arel/visitors/sqlite.rb +39 -0
  324. data/lib/arel/visitors/to_sql.rb +889 -0
  325. data/lib/arel/visitors/visitor.rb +46 -0
  326. data/lib/arel/visitors/where_sql.rb +23 -0
  327. data/lib/arel/visitors.rb +20 -0
  328. data/lib/arel/window_predications.rb +9 -0
  329. data/lib/arel.rb +51 -0
  330. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
  331. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  332. data/lib/rails/generators/active_record/migration/migration_generator.rb +59 -9
  333. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
  334. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +48 -0
  335. data/lib/rails/generators/active_record/migration.rb +41 -8
  336. data/lib/rails/generators/active_record/model/model_generator.rb +24 -22
  337. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  338. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +1 -1
  339. data/lib/rails/generators/active_record.rb +10 -16
  340. metadata +285 -149
  341. data/examples/associations.png +0 -0
  342. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +0 -63
  343. data/lib/active_record/associations/join_helper.rb +0 -55
  344. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  345. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  346. data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +0 -60
  347. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  348. data/lib/active_record/associations/preloader/has_many_through.rb +0 -15
  349. data/lib/active_record/associations/preloader/has_one.rb +0 -23
  350. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  351. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  352. data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +0 -32
  353. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +0 -188
  354. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -426
  355. data/lib/active_record/connection_adapters/sqlite_adapter.rb +0 -579
  356. data/lib/active_record/dynamic_finder_match.rb +0 -68
  357. data/lib/active_record/dynamic_scope_match.rb +0 -23
  358. data/lib/active_record/fixtures/file.rb +0 -65
  359. data/lib/active_record/identity_map.rb +0 -162
  360. data/lib/active_record/observer.rb +0 -121
  361. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  362. data/lib/active_record/serializers/xml_serializer.rb +0 -203
  363. data/lib/active_record/session_store.rb +0 -358
  364. data/lib/active_record/test_case.rb +0 -73
  365. data/lib/rails/generators/active_record/migration/templates/migration.rb +0 -34
  366. data/lib/rails/generators/active_record/model/templates/migration.rb +0 -15
  367. data/lib/rails/generators/active_record/model/templates/model.rb +0 -12
  368. data/lib/rails/generators/active_record/observer/observer_generator.rb +0 -15
  369. data/lib/rails/generators/active_record/observer/templates/observer.rb +0 -4
  370. data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +0 -25
  371. data/lib/rails/generators/active_record/session_migration/templates/migration.rb +0 -12
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  class Migration
3
5
  # <tt>ActiveRecord::Migration::CommandRecorder</tt> records commands done during
@@ -5,101 +7,278 @@ module ActiveRecord
5
7
  # knows how to invert the following commands:
6
8
  #
7
9
  # * add_column
10
+ # * add_foreign_key
8
11
  # * add_index
12
+ # * add_reference
9
13
  # * add_timestamps
14
+ # * change_column
15
+ # * change_column_default (must supply a :from and :to option)
16
+ # * change_column_null
17
+ # * change_column_comment (must supply a :from and :to option)
18
+ # * change_table_comment (must supply a :from and :to option)
19
+ # * create_join_table
10
20
  # * create_table
21
+ # * disable_extension
22
+ # * drop_join_table
23
+ # * drop_table (must supply a block)
24
+ # * enable_extension
25
+ # * remove_column (must supply a type)
26
+ # * remove_columns (must specify at least one column name or more)
27
+ # * remove_foreign_key (must supply a second table)
28
+ # * remove_index
29
+ # * remove_reference
11
30
  # * remove_timestamps
12
31
  # * rename_column
13
32
  # * rename_index
14
33
  # * rename_table
15
34
  class CommandRecorder
16
- attr_accessor :commands, :delegate
35
+ ReversibleAndIrreversibleMethods = [:create_table, :create_join_table, :rename_table, :add_column, :remove_column,
36
+ :rename_index, :rename_column, :add_index, :remove_index, :add_timestamps, :remove_timestamps,
37
+ :change_column_default, :add_reference, :remove_reference, :transaction,
38
+ :drop_join_table, :drop_table, :execute_block, :enable_extension, :disable_extension,
39
+ :change_column, :execute, :remove_columns, :change_column_null,
40
+ :add_foreign_key, :remove_foreign_key,
41
+ :change_column_comment, :change_table_comment
42
+ ]
43
+ include JoinTable
44
+
45
+ attr_accessor :commands, :delegate, :reverting
17
46
 
18
47
  def initialize(delegate = nil)
19
48
  @commands = []
20
49
  @delegate = delegate
50
+ @reverting = false
51
+ end
52
+
53
+ # While executing the given block, the recorded will be in reverting mode.
54
+ # All commands recorded will end up being recorded reverted
55
+ # and in reverse order.
56
+ # For example:
57
+ #
58
+ # recorder.revert{ recorder.record(:rename_table, [:old, :new]) }
59
+ # # same effect as recorder.record(:rename_table, [:new, :old])
60
+ def revert
61
+ @reverting = !@reverting
62
+ previous = @commands
63
+ @commands = []
64
+ yield
65
+ ensure
66
+ @commands = previous.concat(@commands.reverse)
67
+ @reverting = !@reverting
21
68
  end
22
69
 
23
- # record +command+. +command+ should be a method name and arguments.
70
+ # Record +command+. +command+ should be a method name and arguments.
24
71
  # For example:
25
72
  #
26
73
  # recorder.record(:method_name, [:arg1, :arg2])
27
- def record(*command)
28
- @commands << command
74
+ def record(*command, &block)
75
+ if @reverting
76
+ @commands << inverse_of(*command, &block)
77
+ else
78
+ @commands << (command << block)
79
+ end
29
80
  end
30
81
 
31
- # Returns a list that represents commands that are the inverse of the
32
- # commands stored in +commands+. For example:
82
+ # Returns the inverse of the given command. For example:
33
83
  #
34
- # recorder.record(:rename_table, [:old, :new])
35
- # recorder.inverse # => [:rename_table, [:new, :old]]
84
+ # recorder.inverse_of(:rename_table, [:old, :new])
85
+ # # => [:rename_table, [:new, :old]]
36
86
  #
37
87
  # This method will raise an +IrreversibleMigration+ exception if it cannot
38
- # invert the +commands+.
39
- def inverse
40
- @commands.reverse.map { |name, args|
41
- method = :"invert_#{name}"
42
- raise IrreversibleMigration unless respond_to?(method, true)
43
- send(method, args)
44
- }
45
- end
46
-
47
- def respond_to?(*args) # :nodoc:
48
- super || delegate.respond_to?(*args)
88
+ # invert the +command+.
89
+ def inverse_of(command, args, &block)
90
+ method = :"invert_#{command}"
91
+ raise IrreversibleMigration, <<~MSG unless respond_to?(method, true)
92
+ This migration uses #{command}, which is not automatically reversible.
93
+ To make the migration reversible you can either:
94
+ 1. Define #up and #down methods in place of the #change method.
95
+ 2. Use the #reversible method to define reversible behavior.
96
+ MSG
97
+ send(method, args, &block)
49
98
  end
50
99
 
51
- [:create_table, :change_table, :rename_table, :add_column, :remove_column, :rename_index, :rename_column, :add_index, :remove_index, :add_timestamps, :remove_timestamps, :change_column, :change_column_default].each do |method|
100
+ ReversibleAndIrreversibleMethods.each do |method|
52
101
  class_eval <<-EOV, __FILE__, __LINE__ + 1
53
- def #{method}(*args) # def create_table(*args)
54
- record(:"#{method}", args) # record(:create_table, args)
55
- end # end
102
+ def #{method}(*args, &block) # def create_table(*args, &block)
103
+ record(:"#{method}", args, &block) # record(:create_table, args, &block)
104
+ end # end
56
105
  EOV
57
106
  end
107
+ alias :add_belongs_to :add_reference
108
+ alias :remove_belongs_to :remove_reference
58
109
 
59
- private
60
-
61
- def invert_create_table(args)
62
- [:drop_table, [args.first]]
110
+ def change_table(table_name, options = {}) # :nodoc:
111
+ yield delegate.update_table_definition(table_name, self)
63
112
  end
64
113
 
65
- def invert_rename_table(args)
66
- [:rename_table, args.reverse]
114
+ def replay(migration)
115
+ commands.each do |cmd, args, block|
116
+ migration.send(cmd, *args, &block)
117
+ end
67
118
  end
68
119
 
69
- def invert_add_column(args)
70
- [:remove_column, args.first(2)]
71
- end
120
+ private
72
121
 
73
- def invert_rename_index(args)
74
- [:rename_index, [args.first] + args.last(2).reverse]
75
- end
122
+ module StraightReversions # :nodoc:
123
+ private
124
+ {
125
+ execute_block: :execute_block,
126
+ create_table: :drop_table,
127
+ create_join_table: :drop_join_table,
128
+ add_column: :remove_column,
129
+ add_timestamps: :remove_timestamps,
130
+ add_reference: :remove_reference,
131
+ enable_extension: :disable_extension
132
+ }.each do |cmd, inv|
133
+ [[inv, cmd], [cmd, inv]].uniq.each do |method, inverse|
134
+ class_eval <<-EOV, __FILE__, __LINE__ + 1
135
+ def invert_#{method}(args, &block) # def invert_create_table(args, &block)
136
+ [:#{inverse}, args, block] # [:drop_table, args, block]
137
+ end # end
138
+ EOV
139
+ end
140
+ end
141
+ end
76
142
 
77
- def invert_rename_column(args)
78
- [:rename_column, [args.first] + args.last(2).reverse]
79
- end
143
+ include StraightReversions
80
144
 
81
- def invert_add_index(args)
82
- table, columns, options = *args
83
- index_name = options.try(:[], :name)
84
- options_hash = index_name ? {:name => index_name} : {:column => columns}
85
- [:remove_index, [table, options_hash]]
86
- end
145
+ def invert_transaction(args)
146
+ sub_recorder = CommandRecorder.new(delegate)
147
+ sub_recorder.revert { yield }
87
148
 
88
- def invert_remove_timestamps(args)
89
- [:add_timestamps, args]
90
- end
149
+ invertions_proc = proc {
150
+ sub_recorder.replay(self)
151
+ }
91
152
 
92
- def invert_add_timestamps(args)
93
- [:remove_timestamps, args]
94
- end
153
+ [:transaction, args, invertions_proc]
154
+ end
95
155
 
96
- # Forwards any missing method call to the \target.
97
- def method_missing(method, *args, &block)
98
- @delegate.send(method, *args, &block)
99
- rescue NoMethodError => e
100
- raise e, e.message.sub(/ for #<.*$/, " via proxy for #{@delegate}")
101
- end
156
+ def invert_drop_table(args, &block)
157
+ if args.size == 1 && block == nil
158
+ raise ActiveRecord::IrreversibleMigration, "To avoid mistakes, drop_table is only reversible if given options or a block (can be empty)."
159
+ end
160
+ super
161
+ end
162
+
163
+ def invert_rename_table(args)
164
+ [:rename_table, args.reverse]
165
+ end
166
+
167
+ def invert_remove_column(args)
168
+ raise ActiveRecord::IrreversibleMigration, "remove_column is only reversible if given a type." if args.size <= 2
169
+ super
170
+ end
171
+
172
+ def invert_rename_index(args)
173
+ [:rename_index, [args.first] + args.last(2).reverse]
174
+ end
175
+
176
+ def invert_rename_column(args)
177
+ [:rename_column, [args.first] + args.last(2).reverse]
178
+ end
179
+
180
+ def invert_add_index(args)
181
+ table, columns, options = *args
182
+ options ||= {}
183
+
184
+ options_hash = options.slice(:name, :algorithm)
185
+ options_hash[:column] = columns if !options_hash[:name]
186
+
187
+ [:remove_index, [table, options_hash]]
188
+ end
189
+
190
+ def invert_remove_index(args)
191
+ table, options_or_column = *args
192
+ if (options = options_or_column).is_a?(Hash)
193
+ unless options[:column]
194
+ raise ActiveRecord::IrreversibleMigration, "remove_index is only reversible if given a :column option."
195
+ end
196
+ options = options.dup
197
+ [:add_index, [table, options.delete(:column), options]]
198
+ elsif (column = options_or_column).present?
199
+ [:add_index, [table, column]]
200
+ end
201
+ end
202
+
203
+ alias :invert_add_belongs_to :invert_add_reference
204
+ alias :invert_remove_belongs_to :invert_remove_reference
205
+
206
+ def invert_change_column_default(args)
207
+ table, column, options = *args
208
+
209
+ unless options && options.is_a?(Hash) && options.has_key?(:from) && options.has_key?(:to)
210
+ raise ActiveRecord::IrreversibleMigration, "change_column_default is only reversible if given a :from and :to option."
211
+ end
212
+
213
+ [:change_column_default, [table, column, from: options[:to], to: options[:from]]]
214
+ end
215
+
216
+ def invert_change_column_null(args)
217
+ args[2] = !args[2]
218
+ [:change_column_null, args]
219
+ end
220
+
221
+ def invert_add_foreign_key(args)
222
+ from_table, to_table, add_options = args
223
+ add_options ||= {}
224
+
225
+ if add_options[:name]
226
+ options = { name: add_options[:name] }
227
+ elsif add_options[:column]
228
+ options = { column: add_options[:column] }
229
+ else
230
+ options = to_table
231
+ end
232
+
233
+ [:remove_foreign_key, [from_table, options]]
234
+ end
235
+
236
+ def invert_remove_foreign_key(args)
237
+ options = args.extract_options!
238
+ from_table, to_table = args
239
+
240
+ to_table ||= options.delete(:to_table)
241
+
242
+ raise ActiveRecord::IrreversibleMigration, "remove_foreign_key is only reversible if given a second table" if to_table.nil?
243
+
244
+ reversed_args = [from_table, to_table]
245
+ reversed_args << options unless options.empty?
246
+
247
+ [:add_foreign_key, reversed_args]
248
+ end
249
+
250
+ def invert_change_column_comment(args)
251
+ table, column, options = *args
252
+
253
+ unless options && options.is_a?(Hash) && options.has_key?(:from) && options.has_key?(:to)
254
+ raise ActiveRecord::IrreversibleMigration, "change_column_comment is only reversible if given a :from and :to option."
255
+ end
256
+
257
+ [:change_column_comment, [table, column, from: options[:to], to: options[:from]]]
258
+ end
259
+
260
+ def invert_change_table_comment(args)
261
+ table, options = *args
262
+
263
+ unless options && options.is_a?(Hash) && options.has_key?(:from) && options.has_key?(:to)
264
+ raise ActiveRecord::IrreversibleMigration, "change_table_comment is only reversible if given a :from and :to option."
265
+ end
266
+
267
+ [:change_table_comment, [table, from: options[:to], to: options[:from]]]
268
+ end
269
+
270
+ def respond_to_missing?(method, _)
271
+ super || delegate.respond_to?(method)
272
+ end
102
273
 
274
+ # Forwards any missing method call to the \target.
275
+ def method_missing(method, *args, &block)
276
+ if delegate.respond_to?(method)
277
+ delegate.public_send(method, *args, &block)
278
+ else
279
+ super
280
+ end
281
+ end
103
282
  end
104
283
  end
105
284
  end
@@ -0,0 +1,244 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ module Compatibility # :nodoc: all
6
+ def self.find(version)
7
+ version = version.to_s
8
+ name = "V#{version.tr('.', '_')}"
9
+ unless const_defined?(name)
10
+ versions = constants.grep(/\AV[0-9_]+\z/).map { |s| s.to_s.delete("V").tr("_", ".").inspect }
11
+ raise ArgumentError, "Unknown migration version #{version.inspect}; expected one of #{versions.sort.join(', ')}"
12
+ end
13
+ const_get(name)
14
+ end
15
+
16
+ V6_0 = Current
17
+
18
+ class V5_2 < V6_0
19
+ module TableDefinition
20
+ def timestamps(**options)
21
+ options[:precision] ||= nil
22
+ super
23
+ end
24
+ end
25
+
26
+ module CommandRecorder
27
+ def invert_transaction(args, &block)
28
+ [:transaction, args, block]
29
+ end
30
+
31
+ def invert_change_column_comment(args)
32
+ table_name, column_name, comment = args
33
+ [:change_column_comment, [table_name, column_name, from: comment, to: comment]]
34
+ end
35
+
36
+ def invert_change_table_comment(args)
37
+ table_name, comment = args
38
+ [:change_table_comment, [table_name, from: comment, to: comment]]
39
+ end
40
+ end
41
+
42
+ def create_table(table_name, **options)
43
+ if block_given?
44
+ super { |t| yield compatible_table_definition(t) }
45
+ else
46
+ super
47
+ end
48
+ end
49
+
50
+ def change_table(table_name, **options)
51
+ if block_given?
52
+ super { |t| yield compatible_table_definition(t) }
53
+ else
54
+ super
55
+ end
56
+ end
57
+
58
+ def create_join_table(table_1, table_2, **options)
59
+ if block_given?
60
+ super { |t| yield compatible_table_definition(t) }
61
+ else
62
+ super
63
+ end
64
+ end
65
+
66
+ def add_timestamps(table_name, **options)
67
+ options[:precision] ||= nil
68
+ super
69
+ end
70
+
71
+ private
72
+ def compatible_table_definition(t)
73
+ class << t
74
+ prepend TableDefinition
75
+ end
76
+ t
77
+ end
78
+
79
+ def command_recorder
80
+ recorder = super
81
+ class << recorder
82
+ prepend CommandRecorder
83
+ end
84
+ recorder
85
+ end
86
+ end
87
+
88
+ class V5_1 < V5_2
89
+ def change_column(table_name, column_name, type, options = {})
90
+ if connection.adapter_name == "PostgreSQL"
91
+ super(table_name, column_name, type, options.except(:default, :null, :comment))
92
+ connection.change_column_default(table_name, column_name, options[:default]) if options.key?(:default)
93
+ connection.change_column_null(table_name, column_name, options[:null], options[:default]) if options.key?(:null)
94
+ connection.change_column_comment(table_name, column_name, options[:comment]) if options.key?(:comment)
95
+ else
96
+ super
97
+ end
98
+ end
99
+
100
+ def create_table(table_name, options = {})
101
+ if connection.adapter_name == "Mysql2"
102
+ super(table_name, options: "ENGINE=InnoDB", **options)
103
+ else
104
+ super
105
+ end
106
+ end
107
+ end
108
+
109
+ class V5_0 < V5_1
110
+ module TableDefinition
111
+ def primary_key(name, type = :primary_key, **options)
112
+ type = :integer if type == :primary_key
113
+ super
114
+ end
115
+
116
+ def references(*args, **options)
117
+ super(*args, type: :integer, **options)
118
+ end
119
+ alias :belongs_to :references
120
+ end
121
+
122
+ def create_table(table_name, options = {})
123
+ if connection.adapter_name == "PostgreSQL"
124
+ if options[:id] == :uuid && !options.key?(:default)
125
+ options[:default] = "uuid_generate_v4()"
126
+ end
127
+ end
128
+
129
+ unless connection.adapter_name == "Mysql2" && options[:id] == :bigint
130
+ if [:integer, :bigint].include?(options[:id]) && !options.key?(:default)
131
+ options[:default] = nil
132
+ end
133
+ end
134
+
135
+ # Since 5.1 PostgreSQL adapter uses bigserial type for primary
136
+ # keys by default and MySQL uses bigint. This compat layer makes old migrations utilize
137
+ # serial/int type instead -- the way it used to work before 5.1.
138
+ unless options.key?(:id)
139
+ options[:id] = :integer
140
+ end
141
+
142
+ super
143
+ end
144
+
145
+ def create_join_table(table_1, table_2, column_options: {}, **options)
146
+ column_options.reverse_merge!(type: :integer)
147
+ super
148
+ end
149
+
150
+ def add_column(table_name, column_name, type, options = {})
151
+ if type == :primary_key
152
+ type = :integer
153
+ options[:primary_key] = true
154
+ end
155
+ super
156
+ end
157
+
158
+ def add_reference(table_name, ref_name, **options)
159
+ super(table_name, ref_name, type: :integer, **options)
160
+ end
161
+ alias :add_belongs_to :add_reference
162
+
163
+ private
164
+ def compatible_table_definition(t)
165
+ class << t
166
+ prepend TableDefinition
167
+ end
168
+ super
169
+ end
170
+ end
171
+
172
+ class V4_2 < V5_0
173
+ module TableDefinition
174
+ def references(*, **options)
175
+ options[:index] ||= false
176
+ super
177
+ end
178
+ alias :belongs_to :references
179
+
180
+ def timestamps(**options)
181
+ options[:null] = true if options[:null].nil?
182
+ super
183
+ end
184
+ end
185
+
186
+ def add_reference(table_name, ref_name, **options)
187
+ options[:index] ||= false
188
+ super
189
+ end
190
+ alias :add_belongs_to :add_reference
191
+
192
+ def add_timestamps(table_name, **options)
193
+ options[:null] = true if options[:null].nil?
194
+ super
195
+ end
196
+
197
+ def index_exists?(table_name, column_name, options = {})
198
+ column_names = Array(column_name).map(&:to_s)
199
+ options[:name] =
200
+ if options[:name].present?
201
+ options[:name].to_s
202
+ else
203
+ connection.index_name(table_name, column: column_names)
204
+ end
205
+ super
206
+ end
207
+
208
+ def remove_index(table_name, options = {})
209
+ options = { column: options } unless options.is_a?(Hash)
210
+ options[:name] = index_name_for_remove(table_name, options)
211
+ super(table_name, options)
212
+ end
213
+
214
+ private
215
+ def compatible_table_definition(t)
216
+ class << t
217
+ prepend TableDefinition
218
+ end
219
+ super
220
+ end
221
+
222
+ def index_name_for_remove(table_name, options = {})
223
+ index_name = connection.index_name(table_name, options)
224
+
225
+ unless connection.index_name_exists?(table_name, index_name)
226
+ if options.is_a?(Hash) && options.has_key?(:name)
227
+ options_without_column = options.dup
228
+ options_without_column.delete :column
229
+ index_name_without_column = connection.index_name(table_name, options_without_column)
230
+
231
+ if connection.index_name_exists?(table_name, index_name_without_column)
232
+ return index_name_without_column
233
+ end
234
+ end
235
+
236
+ raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' does not exist"
237
+ end
238
+
239
+ index_name
240
+ end
241
+ end
242
+ end
243
+ end
244
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ module JoinTable #:nodoc:
6
+ private
7
+
8
+ def find_join_table_name(table_1, table_2, options = {})
9
+ options.delete(:table_name) || join_table_name(table_1, table_2)
10
+ end
11
+
12
+ def join_table_name(table_1, table_2)
13
+ ModelSchema.derive_join_table_name(table_1, table_2).to_sym
14
+ end
15
+ end
16
+ end
17
+ end