activerecord 5.0.7.2 → 6.0.3.4

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