activerecord 5.0.7.2 → 6.1.1

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 (363) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +829 -2015
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +11 -9
  5. data/examples/performance.rb +31 -29
  6. data/examples/simple.rb +5 -3
  7. data/lib/active_record.rb +37 -29
  8. data/lib/active_record/aggregations.rb +249 -247
  9. data/lib/active_record/association_relation.rb +30 -18
  10. data/lib/active_record/associations.rb +1714 -1596
  11. data/lib/active_record/associations/alias_tracker.rb +36 -42
  12. data/lib/active_record/associations/association.rb +143 -68
  13. data/lib/active_record/associations/association_scope.rb +98 -94
  14. data/lib/active_record/associations/belongs_to_association.rb +76 -46
  15. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -12
  16. data/lib/active_record/associations/builder/association.rb +27 -28
  17. data/lib/active_record/associations/builder/belongs_to.rb +52 -60
  18. data/lib/active_record/associations/builder/collection_association.rb +12 -22
  19. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +40 -62
  20. data/lib/active_record/associations/builder/has_many.rb +10 -2
  21. data/lib/active_record/associations/builder/has_one.rb +35 -2
  22. data/lib/active_record/associations/builder/singular_association.rb +5 -1
  23. data/lib/active_record/associations/collection_association.rb +104 -259
  24. data/lib/active_record/associations/collection_proxy.rb +169 -125
  25. data/lib/active_record/associations/foreign_association.rb +22 -0
  26. data/lib/active_record/associations/has_many_association.rb +46 -31
  27. data/lib/active_record/associations/has_many_through_association.rb +66 -46
  28. data/lib/active_record/associations/has_one_association.rb +71 -52
  29. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  30. data/lib/active_record/associations/join_dependency.rb +169 -180
  31. data/lib/active_record/associations/join_dependency/join_association.rb +53 -79
  32. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  33. data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
  34. data/lib/active_record/associations/preloader.rb +97 -104
  35. data/lib/active_record/associations/preloader/association.rb +109 -97
  36. data/lib/active_record/associations/preloader/through_association.rb +77 -76
  37. data/lib/active_record/associations/singular_association.rb +12 -45
  38. data/lib/active_record/associations/through_association.rb +27 -15
  39. data/lib/active_record/attribute_assignment.rb +55 -60
  40. data/lib/active_record/attribute_methods.rb +111 -141
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +17 -9
  42. data/lib/active_record/attribute_methods/dirty.rb +172 -112
  43. data/lib/active_record/attribute_methods/primary_key.rb +88 -91
  44. data/lib/active_record/attribute_methods/query.rb +6 -8
  45. data/lib/active_record/attribute_methods/read.rb +18 -50
  46. data/lib/active_record/attribute_methods/serialization.rb +38 -10
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +38 -66
  48. data/lib/active_record/attribute_methods/write.rb +25 -32
  49. data/lib/active_record/attributes.rb +69 -31
  50. data/lib/active_record/autosave_association.rb +102 -66
  51. data/lib/active_record/base.rb +16 -25
  52. data/lib/active_record/callbacks.rb +202 -43
  53. data/lib/active_record/coders/json.rb +2 -0
  54. data/lib/active_record/coders/yaml_column.rb +11 -12
  55. data/lib/active_record/connection_adapters.rb +50 -0
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +661 -375
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +14 -38
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +269 -105
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +54 -35
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +137 -93
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +155 -113
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +328 -162
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +591 -259
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +229 -91
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +392 -244
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +457 -582
  69. data/lib/active_record/connection_adapters/column.rb +55 -13
  70. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  71. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
  72. data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +135 -49
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -23
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +79 -49
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +66 -56
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +20 -12
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +74 -37
  82. data/lib/active_record/connection_adapters/pool_config.rb +63 -0
  83. data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
  84. data/lib/active_record/connection_adapters/postgresql/column.rb +39 -28
  85. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +70 -101
  86. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
  87. data/lib/active_record/connection_adapters/postgresql/oid.rb +26 -21
  88. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
  89. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
  90. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +6 -6
  93. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +14 -4
  95. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  96. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
  97. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -18
  98. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  101. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
  104. data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
  105. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
  106. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -30
  107. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  108. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  109. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +18 -4
  110. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
  111. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
  112. data/lib/active_record/connection_adapters/postgresql/quoting.rb +98 -38
  113. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +21 -27
  114. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +80 -0
  115. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
  116. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
  117. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +426 -324
  118. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +32 -23
  119. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
  120. data/lib/active_record/connection_adapters/postgresql_adapter.rb +418 -293
  121. data/lib/active_record/connection_adapters/schema_cache.rb +135 -18
  122. data/lib/active_record/connection_adapters/sql_type_metadata.rb +22 -7
  123. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +144 -0
  124. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
  125. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
  126. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -6
  127. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  128. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  129. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +170 -0
  130. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +282 -290
  131. data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
  132. data/lib/active_record/connection_handling.rb +287 -45
  133. data/lib/active_record/core.rb +385 -181
  134. data/lib/active_record/counter_cache.rb +60 -28
  135. data/lib/active_record/database_configurations.rb +272 -0
  136. data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
  137. data/lib/active_record/database_configurations/database_config.rb +80 -0
  138. data/lib/active_record/database_configurations/hash_config.rb +96 -0
  139. data/lib/active_record/database_configurations/url_config.rb +53 -0
  140. data/lib/active_record/delegated_type.rb +209 -0
  141. data/lib/active_record/destroy_association_async_job.rb +36 -0
  142. data/lib/active_record/dynamic_matchers.rb +87 -87
  143. data/lib/active_record/enum.rb +122 -47
  144. data/lib/active_record/errors.rb +153 -22
  145. data/lib/active_record/explain.rb +13 -8
  146. data/lib/active_record/explain_registry.rb +3 -1
  147. data/lib/active_record/explain_subscriber.rb +9 -4
  148. data/lib/active_record/fixture_set/file.rb +20 -22
  149. data/lib/active_record/fixture_set/model_metadata.rb +32 -0
  150. data/lib/active_record/fixture_set/render_context.rb +17 -0
  151. data/lib/active_record/fixture_set/table_row.rb +152 -0
  152. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  153. data/lib/active_record/fixtures.rb +246 -507
  154. data/lib/active_record/gem_version.rb +6 -4
  155. data/lib/active_record/inheritance.rb +168 -95
  156. data/lib/active_record/insert_all.rb +208 -0
  157. data/lib/active_record/integration.rb +114 -25
  158. data/lib/active_record/internal_metadata.rb +30 -24
  159. data/lib/active_record/legacy_yaml_adapter.rb +11 -5
  160. data/lib/active_record/locking/optimistic.rb +81 -85
  161. data/lib/active_record/locking/pessimistic.rb +22 -6
  162. data/lib/active_record/log_subscriber.rb +68 -31
  163. data/lib/active_record/middleware/database_selector.rb +77 -0
  164. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  165. data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
  166. data/lib/active_record/migration.rb +439 -342
  167. data/lib/active_record/migration/command_recorder.rb +152 -98
  168. data/lib/active_record/migration/compatibility.rb +229 -60
  169. data/lib/active_record/migration/join_table.rb +8 -7
  170. data/lib/active_record/model_schema.rb +230 -122
  171. data/lib/active_record/nested_attributes.rb +213 -203
  172. data/lib/active_record/no_touching.rb +11 -2
  173. data/lib/active_record/null_relation.rb +12 -34
  174. data/lib/active_record/persistence.rb +471 -97
  175. data/lib/active_record/query_cache.rb +23 -12
  176. data/lib/active_record/querying.rb +43 -25
  177. data/lib/active_record/railtie.rb +155 -43
  178. data/lib/active_record/railties/console_sandbox.rb +2 -0
  179. data/lib/active_record/railties/controller_runtime.rb +34 -33
  180. data/lib/active_record/railties/databases.rake +507 -195
  181. data/lib/active_record/readonly_attributes.rb +9 -4
  182. data/lib/active_record/reflection.rb +245 -269
  183. data/lib/active_record/relation.rb +475 -324
  184. data/lib/active_record/relation/batches.rb +125 -72
  185. data/lib/active_record/relation/batches/batch_enumerator.rb +28 -10
  186. data/lib/active_record/relation/calculations.rb +267 -171
  187. data/lib/active_record/relation/delegation.rb +73 -69
  188. data/lib/active_record/relation/finder_methods.rb +238 -248
  189. data/lib/active_record/relation/from_clause.rb +7 -9
  190. data/lib/active_record/relation/merger.rb +95 -77
  191. data/lib/active_record/relation/predicate_builder.rb +109 -110
  192. data/lib/active_record/relation/predicate_builder/array_handler.rb +22 -17
  193. data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -0
  194. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
  195. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +55 -0
  196. data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
  197. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  198. data/lib/active_record/relation/query_attribute.rb +33 -2
  199. data/lib/active_record/relation/query_methods.rb +654 -374
  200. data/lib/active_record/relation/record_fetch_warning.rb +8 -6
  201. data/lib/active_record/relation/spawn_methods.rb +15 -14
  202. data/lib/active_record/relation/where_clause.rb +171 -109
  203. data/lib/active_record/result.rb +88 -51
  204. data/lib/active_record/runtime_registry.rb +5 -3
  205. data/lib/active_record/sanitization.rb +73 -100
  206. data/lib/active_record/schema.rb +7 -14
  207. data/lib/active_record/schema_dumper.rb +101 -69
  208. data/lib/active_record/schema_migration.rb +16 -12
  209. data/lib/active_record/scoping.rb +20 -20
  210. data/lib/active_record/scoping/default.rb +92 -95
  211. data/lib/active_record/scoping/named.rb +39 -30
  212. data/lib/active_record/secure_token.rb +19 -9
  213. data/lib/active_record/serialization.rb +7 -3
  214. data/lib/active_record/signed_id.rb +116 -0
  215. data/lib/active_record/statement_cache.rb +80 -29
  216. data/lib/active_record/store.rb +122 -42
  217. data/lib/active_record/suppressor.rb +6 -3
  218. data/lib/active_record/table_metadata.rb +51 -39
  219. data/lib/active_record/tasks/database_tasks.rb +332 -115
  220. data/lib/active_record/tasks/mysql_database_tasks.rb +66 -104
  221. data/lib/active_record/tasks/postgresql_database_tasks.rb +84 -56
  222. data/lib/active_record/tasks/sqlite_database_tasks.rb +40 -19
  223. data/lib/active_record/test_databases.rb +24 -0
  224. data/lib/active_record/test_fixtures.rb +246 -0
  225. data/lib/active_record/timestamp.rb +70 -38
  226. data/lib/active_record/touch_later.rb +26 -24
  227. data/lib/active_record/transactions.rb +121 -184
  228. data/lib/active_record/translation.rb +3 -1
  229. data/lib/active_record/type.rb +29 -17
  230. data/lib/active_record/type/adapter_specific_registry.rb +44 -48
  231. data/lib/active_record/type/date.rb +2 -0
  232. data/lib/active_record/type/date_time.rb +2 -0
  233. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  234. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  235. data/lib/active_record/type/internal/timezone.rb +2 -0
  236. data/lib/active_record/type/json.rb +30 -0
  237. data/lib/active_record/type/serialized.rb +20 -9
  238. data/lib/active_record/type/text.rb +11 -0
  239. data/lib/active_record/type/time.rb +12 -1
  240. data/lib/active_record/type/type_map.rb +14 -17
  241. data/lib/active_record/type/unsigned_integer.rb +16 -0
  242. data/lib/active_record/type_caster.rb +4 -2
  243. data/lib/active_record/type_caster/connection.rb +17 -13
  244. data/lib/active_record/type_caster/map.rb +10 -6
  245. data/lib/active_record/validations.rb +8 -5
  246. data/lib/active_record/validations/absence.rb +2 -0
  247. data/lib/active_record/validations/associated.rb +4 -3
  248. data/lib/active_record/validations/length.rb +2 -0
  249. data/lib/active_record/validations/numericality.rb +35 -0
  250. data/lib/active_record/validations/presence.rb +4 -2
  251. data/lib/active_record/validations/uniqueness.rb +52 -45
  252. data/lib/active_record/version.rb +3 -1
  253. data/lib/arel.rb +54 -0
  254. data/lib/arel/alias_predication.rb +9 -0
  255. data/lib/arel/attributes/attribute.rb +41 -0
  256. data/lib/arel/collectors/bind.rb +29 -0
  257. data/lib/arel/collectors/composite.rb +39 -0
  258. data/lib/arel/collectors/plain_string.rb +20 -0
  259. data/lib/arel/collectors/sql_string.rb +27 -0
  260. data/lib/arel/collectors/substitute_binds.rb +35 -0
  261. data/lib/arel/crud.rb +42 -0
  262. data/lib/arel/delete_manager.rb +18 -0
  263. data/lib/arel/errors.rb +9 -0
  264. data/lib/arel/expressions.rb +29 -0
  265. data/lib/arel/factory_methods.rb +49 -0
  266. data/lib/arel/insert_manager.rb +49 -0
  267. data/lib/arel/math.rb +45 -0
  268. data/lib/arel/nodes.rb +70 -0
  269. data/lib/arel/nodes/and.rb +32 -0
  270. data/lib/arel/nodes/ascending.rb +23 -0
  271. data/lib/arel/nodes/binary.rb +126 -0
  272. data/lib/arel/nodes/bind_param.rb +44 -0
  273. data/lib/arel/nodes/case.rb +55 -0
  274. data/lib/arel/nodes/casted.rb +62 -0
  275. data/lib/arel/nodes/comment.rb +29 -0
  276. data/lib/arel/nodes/count.rb +12 -0
  277. data/lib/arel/nodes/delete_statement.rb +45 -0
  278. data/lib/arel/nodes/descending.rb +23 -0
  279. data/lib/arel/nodes/equality.rb +15 -0
  280. data/lib/arel/nodes/extract.rb +24 -0
  281. data/lib/arel/nodes/false.rb +16 -0
  282. data/lib/arel/nodes/full_outer_join.rb +8 -0
  283. data/lib/arel/nodes/function.rb +44 -0
  284. data/lib/arel/nodes/grouping.rb +11 -0
  285. data/lib/arel/nodes/homogeneous_in.rb +72 -0
  286. data/lib/arel/nodes/in.rb +15 -0
  287. data/lib/arel/nodes/infix_operation.rb +92 -0
  288. data/lib/arel/nodes/inner_join.rb +8 -0
  289. data/lib/arel/nodes/insert_statement.rb +37 -0
  290. data/lib/arel/nodes/join_source.rb +20 -0
  291. data/lib/arel/nodes/matches.rb +18 -0
  292. data/lib/arel/nodes/named_function.rb +23 -0
  293. data/lib/arel/nodes/node.rb +51 -0
  294. data/lib/arel/nodes/node_expression.rb +13 -0
  295. data/lib/arel/nodes/ordering.rb +27 -0
  296. data/lib/arel/nodes/outer_join.rb +8 -0
  297. data/lib/arel/nodes/over.rb +15 -0
  298. data/lib/arel/nodes/regexp.rb +16 -0
  299. data/lib/arel/nodes/right_outer_join.rb +8 -0
  300. data/lib/arel/nodes/select_core.rb +67 -0
  301. data/lib/arel/nodes/select_statement.rb +41 -0
  302. data/lib/arel/nodes/sql_literal.rb +19 -0
  303. data/lib/arel/nodes/string_join.rb +11 -0
  304. data/lib/arel/nodes/table_alias.rb +31 -0
  305. data/lib/arel/nodes/terminal.rb +16 -0
  306. data/lib/arel/nodes/true.rb +16 -0
  307. data/lib/arel/nodes/unary.rb +44 -0
  308. data/lib/arel/nodes/unary_operation.rb +20 -0
  309. data/lib/arel/nodes/unqualified_column.rb +22 -0
  310. data/lib/arel/nodes/update_statement.rb +41 -0
  311. data/lib/arel/nodes/values_list.rb +9 -0
  312. data/lib/arel/nodes/window.rb +126 -0
  313. data/lib/arel/nodes/with.rb +11 -0
  314. data/lib/arel/order_predications.rb +13 -0
  315. data/lib/arel/predications.rb +250 -0
  316. data/lib/arel/select_manager.rb +270 -0
  317. data/lib/arel/table.rb +118 -0
  318. data/lib/arel/tree_manager.rb +72 -0
  319. data/lib/arel/update_manager.rb +34 -0
  320. data/lib/arel/visitors.rb +13 -0
  321. data/lib/arel/visitors/dot.rb +308 -0
  322. data/lib/arel/visitors/mysql.rb +93 -0
  323. data/lib/arel/visitors/postgresql.rb +120 -0
  324. data/lib/arel/visitors/sqlite.rb +38 -0
  325. data/lib/arel/visitors/to_sql.rb +899 -0
  326. data/lib/arel/visitors/visitor.rb +45 -0
  327. data/lib/arel/window_predications.rb +9 -0
  328. data/lib/rails/generators/active_record.rb +7 -5
  329. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  330. data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
  331. data/lib/rails/generators/active_record/migration.rb +22 -3
  332. data/lib/rails/generators/active_record/migration/migration_generator.rb +38 -35
  333. data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +3 -1
  334. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +7 -5
  335. data/lib/rails/generators/active_record/model/model_generator.rb +41 -25
  336. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  337. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
  338. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  339. metadata +141 -57
  340. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  341. data/lib/active_record/associations/preloader/collection_association.rb +0 -17
  342. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  343. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  344. data/lib/active_record/associations/preloader/has_one.rb +0 -15
  345. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  346. data/lib/active_record/associations/preloader/singular_association.rb +0 -20
  347. data/lib/active_record/attribute.rb +0 -213
  348. data/lib/active_record/attribute/user_provided_default.rb +0 -28
  349. data/lib/active_record/attribute_decorators.rb +0 -67
  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/connection_specification.rb +0 -263
  355. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -22
  356. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
  357. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  358. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
  359. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -17
  360. data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
  361. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
  362. data/lib/active_record/relation/where_clause_factory.rb +0 -38
  363. data/lib/active_record/type/internal/abstract_json.rb +0 -33
@@ -1,50 +1,51 @@
1
- require 'active_support/core_ext/module/attr_internal'
2
- require 'active_record/log_subscriber'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/module/attr_internal"
4
+ require "active_record/log_subscriber"
3
5
 
4
6
  module ActiveRecord
5
7
  module Railties # :nodoc:
6
8
  module ControllerRuntime #:nodoc:
7
9
  extend ActiveSupport::Concern
8
10
 
9
- protected
10
-
11
- attr_internal :db_runtime
12
-
13
- def process_action(action, *args)
14
- # We also need to reset the runtime before each action
15
- # because of queries in middleware or in cases we are streaming
16
- # and it won't be cleaned up by the method below.
17
- ActiveRecord::LogSubscriber.reset_runtime
18
- super
11
+ module ClassMethods # :nodoc:
12
+ def log_process_action(payload)
13
+ messages, db_runtime = super, payload[:db_runtime]
14
+ messages << ("ActiveRecord: %.1fms" % db_runtime.to_f) if db_runtime
15
+ messages
16
+ end
19
17
  end
20
18
 
21
- def cleanup_view_runtime
22
- if logger && logger.info? && ActiveRecord::Base.connected?
23
- db_rt_before_render = ActiveRecord::LogSubscriber.reset_runtime
24
- self.db_runtime = (db_runtime || 0) + db_rt_before_render
25
- runtime = super
26
- db_rt_after_render = ActiveRecord::LogSubscriber.reset_runtime
27
- self.db_runtime += db_rt_after_render
28
- runtime - db_rt_after_render
29
- else
19
+ private
20
+ attr_internal :db_runtime
21
+
22
+ def process_action(action, *args)
23
+ # We also need to reset the runtime before each action
24
+ # because of queries in middleware or in cases we are streaming
25
+ # and it won't be cleaned up by the method below.
26
+ ActiveRecord::LogSubscriber.reset_runtime
30
27
  super
31
28
  end
32
- end
33
29
 
34
- def append_info_to_payload(payload)
35
- super
36
- if ActiveRecord::Base.connected?
37
- payload[:db_runtime] = (db_runtime || 0) + ActiveRecord::LogSubscriber.reset_runtime
30
+ def cleanup_view_runtime
31
+ if logger && logger.info? && ActiveRecord::Base.connected?
32
+ db_rt_before_render = ActiveRecord::LogSubscriber.reset_runtime
33
+ self.db_runtime = (db_runtime || 0) + db_rt_before_render
34
+ runtime = super
35
+ db_rt_after_render = ActiveRecord::LogSubscriber.reset_runtime
36
+ self.db_runtime += db_rt_after_render
37
+ runtime - db_rt_after_render
38
+ else
39
+ super
40
+ end
38
41
  end
39
- end
40
42
 
41
- module ClassMethods # :nodoc:
42
- def log_process_action(payload)
43
- messages, db_runtime = super, payload[:db_runtime]
44
- messages << ("ActiveRecord: %.1fms" % db_runtime.to_f) if db_runtime
45
- messages
43
+ def append_info_to_payload(payload)
44
+ super
45
+ if ActiveRecord::Base.connected?
46
+ payload[:db_runtime] = (db_runtime || 0) + ActiveRecord::LogSubscriber.reset_runtime
47
+ end
46
48
  end
47
- end
48
49
  end
49
50
  end
50
51
  end
@@ -1,40 +1,66 @@
1
- require 'active_record'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "active_support/configuration_file"
5
+ require "active_support/deprecation"
6
+
7
+ databases = ActiveRecord::Tasks::DatabaseTasks.setup_initial_database_yaml
2
8
 
3
9
  db_namespace = namespace :db do
4
10
  desc "Set the environment value for the database"
5
- task "environment:set" => [:environment, :load_config] do
11
+ task "environment:set" => :load_config do
12
+ raise ActiveRecord::EnvironmentStorageError unless ActiveRecord::InternalMetadata.enabled?
6
13
  ActiveRecord::InternalMetadata.create_table
7
- ActiveRecord::InternalMetadata[:environment] = ActiveRecord::Migrator.current_environment
14
+ ActiveRecord::InternalMetadata[:environment] = ActiveRecord::Base.connection.migration_context.current_environment
8
15
  end
9
16
 
10
- task :check_protected_environments => [:environment, :load_config] do
17
+ task check_protected_environments: :load_config do
11
18
  ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
12
19
  end
13
20
 
14
- task :load_config do
15
- ActiveRecord::Base.configurations = ActiveRecord::Tasks::DatabaseTasks.database_configuration || {}
21
+ task load_config: :environment do
22
+ if ActiveRecord::Base.configurations.empty?
23
+ ActiveRecord::Base.configurations = ActiveRecord::Tasks::DatabaseTasks.database_configuration
24
+ end
25
+
16
26
  ActiveRecord::Migrator.migrations_paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
17
27
  end
18
28
 
19
29
  namespace :create do
20
- task :all => :load_config do
30
+ task all: :load_config do
21
31
  ActiveRecord::Tasks::DatabaseTasks.create_all
22
32
  end
33
+
34
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
35
+ desc "Create #{name} database for current environment"
36
+ task name => :load_config do
37
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
38
+ ActiveRecord::Tasks::DatabaseTasks.create(db_config)
39
+ end
40
+ end
23
41
  end
24
42
 
25
- desc 'Creates the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:create:all to create all databases in the config). Without RAILS_ENV or when RAILS_ENV is development, it defaults to creating the development and test databases.'
26
- task :create => [:load_config] do
43
+ desc "Creates the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:create:all to create all databases in the config). Without RAILS_ENV or when RAILS_ENV is development, it defaults to creating the development and test databases, except when DATABASE_URL is present."
44
+ task create: [:load_config] do
27
45
  ActiveRecord::Tasks::DatabaseTasks.create_current
28
46
  end
29
47
 
30
48
  namespace :drop do
31
- task :all => [:load_config, :check_protected_environments] do
49
+ task all: [:load_config, :check_protected_environments] do
32
50
  ActiveRecord::Tasks::DatabaseTasks.drop_all
33
51
  end
52
+
53
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
54
+ desc "Drop #{name} database for current environment"
55
+ task name => [:load_config, :check_protected_environments] do
56
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
57
+ ActiveRecord::Tasks::DatabaseTasks.drop(db_config)
58
+ end
59
+ end
34
60
  end
35
61
 
36
- desc 'Drops the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV or when RAILS_ENV is development, it defaults to dropping the development and test databases.'
37
- task :drop => [:load_config, :check_protected_environments] do
62
+ desc "Drops the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV or when RAILS_ENV is development, it defaults to dropping the development and test databases, except when DATABASE_URL is present."
63
+ task drop: [:load_config, :check_protected_environments] do
38
64
  db_namespace["drop:_unsafe"].invoke
39
65
  end
40
66
 
@@ -43,183 +69,370 @@ db_namespace = namespace :db do
43
69
  end
44
70
 
45
71
  namespace :purge do
46
- task :all => [:load_config, :check_protected_environments] do
72
+ task all: [:load_config, :check_protected_environments] do
47
73
  ActiveRecord::Tasks::DatabaseTasks.purge_all
48
74
  end
49
75
  end
50
76
 
51
- # desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:purge:all to purge all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases."
52
- task :purge => [:load_config, :check_protected_environments] do
77
+ # desc "Truncates tables of each database for current environment"
78
+ task truncate_all: [:load_config, :check_protected_environments] do
79
+ ActiveRecord::Tasks::DatabaseTasks.truncate_all
80
+ end
81
+
82
+ # desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:purge:all to purge all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases, except when DATABASE_URL is present."
83
+ task purge: [:load_config, :check_protected_environments] do
53
84
  ActiveRecord::Tasks::DatabaseTasks.purge_current
54
85
  end
55
86
 
56
87
  desc "Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)."
57
- task :migrate => [:environment, :load_config] do
58
- ActiveRecord::Tasks::DatabaseTasks.migrate
59
- db_namespace['_dump'].invoke
88
+ task migrate: :load_config do
89
+ original_db_config = ActiveRecord::Base.connection_db_config
90
+ ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
91
+ ActiveRecord::Base.establish_connection(db_config)
92
+ ActiveRecord::Tasks::DatabaseTasks.migrate
93
+ end
94
+ db_namespace["_dump"].invoke
95
+ ensure
96
+ ActiveRecord::Base.establish_connection(original_db_config)
60
97
  end
61
98
 
62
99
  # IMPORTANT: This task won't dump the schema if ActiveRecord::Base.dump_schema_after_migration is set to false
63
100
  task :_dump do
64
101
  if ActiveRecord::Base.dump_schema_after_migration
65
- case ActiveRecord::Base.schema_format
66
- when :ruby then db_namespace["schema:dump"].invoke
67
- when :sql then db_namespace["structure:dump"].invoke
68
- else
69
- raise "unknown schema format #{ActiveRecord::Base.schema_format}"
70
- end
102
+ db_namespace["schema:dump"].invoke
71
103
  end
72
104
  # Allow this task to be called as many times as required. An example is the
73
105
  # migrate:redo task, which calls other two internally that depend on this one.
74
- db_namespace['_dump'].reenable
106
+ db_namespace["_dump"].reenable
107
+ end
108
+
109
+ namespace :_dump do
110
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
111
+ # IMPORTANT: This task won't dump the schema if ActiveRecord::Base.dump_schema_after_migration is set to false
112
+ task name do
113
+ if ActiveRecord::Base.dump_schema_after_migration
114
+ db_namespace["schema:dump:#{name}"].invoke
115
+ end
116
+ # Allow this task to be called as many times as required. An example is the
117
+ # migrate:redo task, which calls other two internally that depend on this one.
118
+ db_namespace["_dump:#{name}"].reenable
119
+ end
120
+ end
75
121
  end
76
122
 
77
123
  namespace :migrate do
78
- # desc 'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
79
- task :redo => [:environment, :load_config] do
124
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
125
+ desc "Migrate #{name} database for current environment"
126
+ task name => :load_config do
127
+ original_db_config = ActiveRecord::Base.connection_db_config
128
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
129
+ ActiveRecord::Base.establish_connection(db_config)
130
+ ActiveRecord::Tasks::DatabaseTasks.migrate
131
+ db_namespace["_dump:#{name}"].invoke
132
+ ensure
133
+ ActiveRecord::Base.establish_connection(original_db_config)
134
+ end
135
+ end
136
+
137
+ desc "Rolls back the database one migration and re-migrates up (options: STEP=x, VERSION=x)."
138
+ task redo: :load_config do
139
+ ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:migrate:redo")
140
+
80
141
  raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?
81
142
 
82
- if ENV['VERSION']
83
- db_namespace['migrate:down'].invoke
84
- db_namespace['migrate:up'].invoke
143
+ if ENV["VERSION"]
144
+ db_namespace["migrate:down"].invoke
145
+ db_namespace["migrate:up"].invoke
85
146
  else
86
- db_namespace['rollback'].invoke
87
- db_namespace['migrate'].invoke
147
+ db_namespace["rollback"].invoke
148
+ db_namespace["migrate"].invoke
149
+ end
150
+ end
151
+
152
+ namespace :redo do
153
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
154
+ desc "Rolls back #{name} database one migration and re-migrates up (options: STEP=x, VERSION=x)."
155
+ task name => :load_config do
156
+ raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?
157
+
158
+ if ENV["VERSION"]
159
+ db_namespace["migrate:down:#{name}"].invoke
160
+ db_namespace["migrate:up:#{name}"].invoke
161
+ else
162
+ db_namespace["rollback:#{name}"].invoke
163
+ db_namespace["migrate:#{name}"].invoke
164
+ end
165
+ end
88
166
  end
89
167
  end
90
168
 
91
169
  # desc 'Resets your database using your migrations for the current environment'
92
- task :reset => ['db:drop', 'db:create', 'db:migrate']
170
+ task reset: ["db:drop", "db:create", "db:migrate"]
171
+
172
+ desc 'Runs the "up" for a given migration VERSION.'
173
+ task up: :load_config do
174
+ ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:migrate:up")
93
175
 
94
- # desc 'Runs the "up" for a given migration VERSION.'
95
- task :up => [:environment, :load_config] do
96
176
  raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
97
177
 
98
- version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
99
- ActiveRecord::Migrator.run(:up, ActiveRecord::Tasks::DatabaseTasks.migrations_paths, version)
100
- db_namespace['_dump'].invoke
178
+ ActiveRecord::Tasks::DatabaseTasks.check_target_version
179
+
180
+ ActiveRecord::Base.connection.migration_context.run(
181
+ :up,
182
+ ActiveRecord::Tasks::DatabaseTasks.target_version
183
+ )
184
+ db_namespace["_dump"].invoke
101
185
  end
102
186
 
103
- # desc 'Runs the "down" for a given migration VERSION.'
104
- task :down => [:environment, :load_config] do
187
+ namespace :up do
188
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
189
+ task name => :load_config do
190
+ raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
191
+
192
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
193
+
194
+ ActiveRecord::Base.establish_connection(db_config)
195
+ ActiveRecord::Tasks::DatabaseTasks.check_target_version
196
+ ActiveRecord::Base.connection.migration_context.run(
197
+ :up,
198
+ ActiveRecord::Tasks::DatabaseTasks.target_version
199
+ )
200
+
201
+ db_namespace["_dump"].invoke
202
+ end
203
+ end
204
+ end
205
+
206
+ desc 'Runs the "down" for a given migration VERSION.'
207
+ task down: :load_config do
208
+ ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:migrate:down")
209
+
105
210
  raise "VERSION is required - To go down one migration, use db:rollback" if !ENV["VERSION"] || ENV["VERSION"].empty?
106
- version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
107
- ActiveRecord::Migrator.run(:down, ActiveRecord::Tasks::DatabaseTasks.migrations_paths, version)
108
- db_namespace['_dump'].invoke
211
+
212
+ ActiveRecord::Tasks::DatabaseTasks.check_target_version
213
+
214
+ ActiveRecord::Base.connection.migration_context.run(
215
+ :down,
216
+ ActiveRecord::Tasks::DatabaseTasks.target_version
217
+ )
218
+ db_namespace["_dump"].invoke
219
+ end
220
+
221
+ namespace :down do
222
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
223
+ task name => :load_config do
224
+ raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
225
+
226
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
227
+
228
+ ActiveRecord::Base.establish_connection(db_config)
229
+ ActiveRecord::Tasks::DatabaseTasks.check_target_version
230
+ ActiveRecord::Base.connection.migration_context.run(
231
+ :down,
232
+ ActiveRecord::Tasks::DatabaseTasks.target_version
233
+ )
234
+
235
+ db_namespace["_dump"].invoke
236
+ end
237
+ end
238
+ end
239
+
240
+ desc "Display status of migrations"
241
+ task status: :load_config do
242
+ ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
243
+ ActiveRecord::Base.establish_connection(db_config)
244
+ ActiveRecord::Tasks::DatabaseTasks.migrate_status
245
+ end
109
246
  end
110
247
 
111
- desc 'Display status of migrations'
112
- task :status => [:environment, :load_config] do
113
- unless ActiveRecord::SchemaMigration.table_exists?
114
- abort 'Schema migrations table does not exist yet.'
248
+ namespace :status do
249
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
250
+ desc "Display status of migrations for #{name} database"
251
+ task name => :load_config do
252
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
253
+ ActiveRecord::Base.establish_connection(db_config)
254
+ ActiveRecord::Tasks::DatabaseTasks.migrate_status
255
+ end
115
256
  end
257
+ end
258
+ end
259
+
260
+ namespace :rollback do
261
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
262
+ desc "Rollback #{name} database for current environment (specify steps w/ STEP=n)."
263
+ task name => :load_config do
264
+ step = ENV["STEP"] ? ENV["STEP"].to_i : 1
265
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
266
+
267
+ ActiveRecord::Base.establish_connection(db_config)
268
+ ActiveRecord::Base.connection.migration_context.rollback(step)
116
269
 
117
- # output
118
- puts "\ndatabase: #{ActiveRecord::Base.connection_config[:database]}\n\n"
119
- puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
120
- puts "-" * 50
121
- paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
122
- ActiveRecord::Migrator.migrations_status(paths).each do |status, version, name|
123
- puts "#{status.center(8)} #{version.ljust(14)} #{name}"
270
+ db_namespace["_dump"].invoke
124
271
  end
125
- puts
126
272
  end
127
273
  end
128
274
 
129
- desc 'Rolls the schema back to the previous version (specify steps w/ STEP=n).'
130
- task :rollback => [:environment, :load_config] do
131
- step = ENV['STEP'] ? ENV['STEP'].to_i : 1
132
- ActiveRecord::Migrator.rollback(ActiveRecord::Tasks::DatabaseTasks.migrations_paths, step)
133
- db_namespace['_dump'].invoke
275
+ desc "Rolls the schema back to the previous version (specify steps w/ STEP=n)."
276
+ task rollback: :load_config do
277
+ ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:rollback")
278
+
279
+ step = ENV["STEP"] ? ENV["STEP"].to_i : 1
280
+
281
+ ActiveRecord::Base.connection.migration_context.rollback(step)
282
+
283
+ db_namespace["_dump"].invoke
134
284
  end
135
285
 
136
286
  # desc 'Pushes the schema to the next version (specify steps w/ STEP=n).'
137
- task :forward => [:environment, :load_config] do
138
- step = ENV['STEP'] ? ENV['STEP'].to_i : 1
139
- ActiveRecord::Migrator.forward(ActiveRecord::Tasks::DatabaseTasks.migrations_paths, step)
140
- db_namespace['_dump'].invoke
287
+ task forward: :load_config do
288
+ step = ENV["STEP"] ? ENV["STEP"].to_i : 1
289
+ ActiveRecord::Base.connection.migration_context.forward(step)
290
+ db_namespace["_dump"].invoke
141
291
  end
142
292
 
143
- # desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
144
- task :reset => [ 'db:drop', 'db:setup' ]
293
+ desc "Drops and recreates the database from db/schema.rb for the current environment and loads the seeds."
294
+ task reset: [ "db:drop", "db:setup" ]
145
295
 
146
296
  # desc "Retrieves the charset for the current environment's database"
147
- task :charset => [:environment, :load_config] do
297
+ task charset: :load_config do
148
298
  puts ActiveRecord::Tasks::DatabaseTasks.charset_current
149
299
  end
150
300
 
151
301
  # desc "Retrieves the collation for the current environment's database"
152
- task :collation => [:environment, :load_config] do
153
- begin
154
- puts ActiveRecord::Tasks::DatabaseTasks.collation_current
155
- rescue NoMethodError
156
- $stderr.puts 'Sorry, your database adapter is not supported yet. Feel free to submit a patch.'
157
- end
302
+ task collation: :load_config do
303
+ puts ActiveRecord::Tasks::DatabaseTasks.collation_current
304
+ rescue NoMethodError
305
+ $stderr.puts "Sorry, your database adapter is not supported yet. Feel free to submit a patch."
158
306
  end
159
307
 
160
- desc 'Retrieves the current schema version number'
161
- task :version => [:environment, :load_config] do
162
- puts "Current version: #{ActiveRecord::Migrator.current_version}"
308
+ desc "Retrieves the current schema version number"
309
+ task version: :load_config do
310
+ puts "Current version: #{ActiveRecord::Base.connection.migration_context.current_version}"
163
311
  end
164
312
 
165
313
  # desc "Raises an error if there are pending migrations"
166
- task :abort_if_pending_migrations => [:environment, :load_config] do
167
- pending_migrations = ActiveRecord::Migrator.open(ActiveRecord::Tasks::DatabaseTasks.migrations_paths).pending_migrations
314
+ task abort_if_pending_migrations: :load_config do
315
+ pending_migrations = ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).flat_map do |db_config|
316
+ ActiveRecord::Base.establish_connection(db_config)
317
+
318
+ ActiveRecord::Base.connection.migration_context.open.pending_migrations
319
+ end
168
320
 
169
321
  if pending_migrations.any?
170
322
  puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
171
323
  pending_migrations.each do |pending_migration|
172
- puts ' %4d %s' % [pending_migration.version, pending_migration.name]
324
+ puts " %4d %s" % [pending_migration.version, pending_migration.name]
325
+ end
326
+ abort %{Run `bin/rails db:migrate` to update your database then try again.}
327
+ end
328
+ ensure
329
+ ActiveRecord::Base.establish_connection(ActiveRecord::Tasks::DatabaseTasks.env.to_sym)
330
+ end
331
+
332
+ namespace :abort_if_pending_migrations do
333
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
334
+ # desc "Raises an error if there are pending migrations for #{name} database"
335
+ task name => :load_config do
336
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
337
+ ActiveRecord::Base.establish_connection(db_config)
338
+
339
+ pending_migrations = ActiveRecord::Base.connection.migration_context.open.pending_migrations
340
+
341
+ if pending_migrations.any?
342
+ puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
343
+ pending_migrations.each do |pending_migration|
344
+ puts " %4d %s" % [pending_migration.version, pending_migration.name]
345
+ end
346
+ abort %{Run `bin/rails db:migrate:#{name}` to update your database then try again.}
347
+ end
173
348
  end
174
- abort %{Run `rails db:migrate` to update your database then try again.}
175
349
  end
176
350
  end
177
351
 
178
- desc 'Creates the database, loads the schema, and initializes with the seed data (use db:reset to also drop the database first)'
179
- task :setup => ['db:schema:load_if_ruby', 'db:structure:load_if_sql', :seed]
352
+ desc "Creates the database, loads the schema, and initializes with the seed data (use db:reset to also drop the database first)"
353
+ task setup: ["db:create", :environment, "db:schema:load", :seed]
354
+
355
+ desc "Runs setup if database does not exist, or runs migrations if it does"
356
+ task prepare: :load_config do
357
+ seed = false
358
+
359
+ ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
360
+ ActiveRecord::Base.establish_connection(db_config)
361
+
362
+ # Skipped when no database
363
+ ActiveRecord::Tasks::DatabaseTasks.migrate
364
+
365
+ if ActiveRecord::Base.dump_schema_after_migration
366
+ ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config, ActiveRecord::Base.schema_format)
367
+ end
368
+ rescue ActiveRecord::NoDatabaseError
369
+ config_name = db_config.name
370
+ ActiveRecord::Tasks::DatabaseTasks.create_current(db_config.env_name, config_name)
371
+
372
+ if File.exist?(ActiveRecord::Tasks::DatabaseTasks.dump_filename(config_name))
373
+ ActiveRecord::Tasks::DatabaseTasks.load_schema(
374
+ db_config,
375
+ ActiveRecord::Base.schema_format,
376
+ nil
377
+ )
378
+ else
379
+ ActiveRecord::Tasks::DatabaseTasks.migrate
380
+ end
381
+
382
+ seed = true
383
+ end
180
384
 
181
- desc 'Loads the seed data from db/seeds.rb'
182
- task :seed do
183
- db_namespace['abort_if_pending_migrations'].invoke
385
+ ActiveRecord::Base.establish_connection
386
+ ActiveRecord::Tasks::DatabaseTasks.load_seed if seed
387
+ end
388
+
389
+ desc "Loads the seed data from db/seeds.rb"
390
+ task seed: :load_config do
391
+ db_namespace["abort_if_pending_migrations"].invoke
184
392
  ActiveRecord::Tasks::DatabaseTasks.load_seed
185
393
  end
186
394
 
395
+ namespace :seed do
396
+ desc "Truncates tables of each database for current environment and loads the seeds"
397
+ task replant: [:load_config, :truncate_all, :seed]
398
+ end
399
+
187
400
  namespace :fixtures do
188
- desc "Loads fixtures into the current environment's database. Load specific fixtures using FIXTURES=x,y. Load from subdirectory in test/fixtures using FIXTURES_DIR=z. Specify an alternative path (eg. spec/fixtures) using FIXTURES_PATH=spec/fixtures."
189
- task :load => [:environment, :load_config] do
190
- require 'active_record/fixtures'
401
+ desc "Loads fixtures into the current environment's database. Load specific fixtures using FIXTURES=x,y. Load from subdirectory in test/fixtures using FIXTURES_DIR=z. Specify an alternative path (e.g. spec/fixtures) using FIXTURES_PATH=spec/fixtures."
402
+ task load: :load_config do
403
+ require "active_record/fixtures"
191
404
 
192
405
  base_dir = ActiveRecord::Tasks::DatabaseTasks.fixtures_path
193
406
 
194
- fixtures_dir = if ENV['FIXTURES_DIR']
195
- File.join base_dir, ENV['FIXTURES_DIR']
196
- else
197
- base_dir
198
- end
407
+ fixtures_dir = if ENV["FIXTURES_DIR"]
408
+ File.join base_dir, ENV["FIXTURES_DIR"]
409
+ else
410
+ base_dir
411
+ end
199
412
 
200
- fixture_files = if ENV['FIXTURES']
201
- ENV['FIXTURES'].split(',')
202
- else
203
- # The use of String#[] here is to support namespaced fixtures
204
- Dir["#{fixtures_dir}/**/*.yml"].map {|f| f[(fixtures_dir.size + 1)..-5] }
205
- end
413
+ fixture_files = if ENV["FIXTURES"]
414
+ ENV["FIXTURES"].split(",")
415
+ else
416
+ # The use of String#[] here is to support namespaced fixtures.
417
+ Dir["#{fixtures_dir}/**/*.yml"].map { |f| f[(fixtures_dir.size + 1)..-5] }
418
+ end
206
419
 
207
420
  ActiveRecord::FixtureSet.create_fixtures(fixtures_dir, fixture_files)
208
421
  end
209
422
 
210
- # desc "Search for a fixture given a LABEL or ID. Specify an alternative path (eg. spec/fixtures) using FIXTURES_PATH=spec/fixtures."
211
- task :identify => [:environment, :load_config] do
212
- require 'active_record/fixtures'
423
+ # desc "Search for a fixture given a LABEL or ID. Specify an alternative path (e.g. spec/fixtures) using FIXTURES_PATH=spec/fixtures."
424
+ task identify: :load_config do
425
+ require "active_record/fixtures"
213
426
 
214
- label, id = ENV['LABEL'], ENV['ID']
215
- raise 'LABEL or ID required' if label.blank? && id.blank?
427
+ label, id = ENV["LABEL"], ENV["ID"]
428
+ raise "LABEL or ID required" if label.blank? && id.blank?
216
429
 
217
430
  puts %Q(The fixture ID for "#{label}" is #{ActiveRecord::FixtureSet.identify(label)}.) if label
218
431
 
219
432
  base_dir = ActiveRecord::Tasks::DatabaseTasks.fixtures_path
220
433
 
221
434
  Dir["#{base_dir}/**/*.yml"].each do |file|
222
- if data = YAML::load(ERB.new(IO.read(file)).result)
435
+ if data = ActiveSupport::ConfigurationFile.parse(file)
223
436
  data.each_key do |key|
224
437
  key_id = ActiveRecord::FixtureSet.identify(key)
225
438
 
@@ -233,134 +446,229 @@ db_namespace = namespace :db do
233
446
  end
234
447
 
235
448
  namespace :schema do
236
- desc 'Creates a db/schema.rb file that is portable against any DB supported by Active Record'
237
- task :dump => [:environment, :load_config] do
238
- require 'active_record/schema_dumper'
239
- filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
240
- File.open(filename, "w:utf-8") do |file|
241
- ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
449
+ desc "Creates a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`)"
450
+ task dump: :load_config do
451
+ ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
452
+ ActiveRecord::Base.establish_connection(db_config)
453
+ ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config)
242
454
  end
243
- db_namespace['schema:dump'].reenable
455
+
456
+ db_namespace["schema:dump"].reenable
244
457
  end
245
458
 
246
- desc 'Loads a schema.rb file into the database'
247
- task :load => [:environment, :load_config, :check_protected_environments] do
248
- ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
459
+ desc "Loads a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`) into the database"
460
+ task load: [:load_config, :check_protected_environments] do
461
+ ActiveRecord::Tasks::DatabaseTasks.load_schema_current(ActiveRecord::Base.schema_format, ENV["SCHEMA"])
249
462
  end
250
463
 
251
- task :load_if_ruby => ['db:create', :environment] do
464
+ task load_if_ruby: ["db:create", :environment] do
465
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
466
+ Using `bin/rails db:schema:load_if_ruby` is deprecated and will be removed in Rails 6.2.
467
+ Configure the format using `config.active_record.schema_format = :ruby` to use `schema.rb` and run `bin/rails db:schema:load` instead.
468
+ MSG
252
469
  db_namespace["schema:load"].invoke if ActiveRecord::Base.schema_format == :ruby
253
470
  end
254
471
 
255
- namespace :cache do
256
- desc 'Creates a db/schema_cache.dump file.'
257
- task :dump => [:environment, :load_config] do
258
- con = ActiveRecord::Base.connection
259
- filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.dump")
260
-
261
- con.schema_cache.clear!
262
- con.data_sources.each { |table| con.schema_cache.add(table) }
263
- open(filename, 'wb') { |f| f.write(Marshal.dump(con.schema_cache)) }
472
+ namespace :dump do
473
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
474
+ desc "Creates a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`) for #{name} database"
475
+ task name => :load_config do
476
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env, name: name)
477
+ ActiveRecord::Base.establish_connection(db_config)
478
+ ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config)
479
+ db_namespace["schema:dump:#{name}"].reenable
480
+ end
264
481
  end
482
+ end
265
483
 
266
- desc 'Clears a db/schema_cache.dump file.'
267
- task :clear => [:environment, :load_config] do
268
- filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.dump")
269
- rm_f filename, verbose: false
484
+ namespace :load do
485
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
486
+ desc "Loads a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`) into the #{name} database"
487
+ task name => :load_config do
488
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env, name: name)
489
+ ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, ActiveRecord::Base.schema_format, ENV["SCHEMA"])
490
+ end
270
491
  end
271
492
  end
272
493
 
273
- end
494
+ namespace :cache do
495
+ desc "Creates a db/schema_cache.yml file."
496
+ task dump: :load_config do
497
+ ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
498
+ ActiveRecord::Base.establish_connection(db_config)
499
+ filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(
500
+ db_config.name,
501
+ schema_cache_path: db_config.schema_cache_path,
502
+ )
503
+ ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(
504
+ ActiveRecord::Base.connection,
505
+ filename,
506
+ )
507
+ end
508
+ end
274
509
 
275
- namespace :structure do
276
- desc 'Dumps the database structure to db/structure.sql. Specify another file with SCHEMA=db/my_structure.sql'
277
- task :dump => [:environment, :load_config] do
278
- filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "structure.sql")
279
- current_config = ActiveRecord::Tasks::DatabaseTasks.current_config
280
- ActiveRecord::Tasks::DatabaseTasks.structure_dump(current_config, filename)
281
-
282
- if ActiveRecord::Base.connection.supports_migrations? &&
283
- ActiveRecord::SchemaMigration.table_exists?
284
- File.open(filename, "a") do |f|
285
- f.puts ActiveRecord::Base.connection.dump_schema_information
286
- f.print "\n"
510
+ desc "Clears a db/schema_cache.yml file."
511
+ task clear: :load_config do
512
+ ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
513
+ filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(
514
+ db_config.name,
515
+ schema_cache_path: db_config.schema_cache_path,
516
+ )
517
+ ActiveRecord::Tasks::DatabaseTasks.clear_schema_cache(
518
+ filename,
519
+ )
287
520
  end
288
521
  end
289
- db_namespace['structure:dump'].reenable
290
522
  end
523
+ end
291
524
 
292
- desc "Recreates the databases from the structure.sql file"
293
- task :load => [:environment, :load_config, :check_protected_environments] do
294
- ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:sql, ENV['SCHEMA'])
525
+ namespace :structure do
526
+ desc "Dumps the database structure to db/structure.sql. Specify another file with SCHEMA=db/my_structure.sql"
527
+ task dump: :load_config do
528
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
529
+ Using `bin/rails db:structure:dump` is deprecated and will be removed in Rails 6.2.
530
+ Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:dump` instead.
531
+ MSG
532
+
533
+ db_namespace["schema:dump"].invoke
534
+ db_namespace["structure:dump"].reenable
295
535
  end
296
536
 
297
- task :load_if_sql => ['db:create', :environment] do
298
- db_namespace["structure:load"].invoke if ActiveRecord::Base.schema_format == :sql
537
+ desc "Recreates the databases from the structure.sql file"
538
+ task load: [:load_config, :check_protected_environments] do
539
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
540
+ Using `bin/rails db:structure:load` is deprecated and will be removed in Rails 6.2.
541
+ Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:load` instead.
542
+ MSG
543
+ db_namespace["schema:load"].invoke
299
544
  end
300
- end
301
545
 
302
- namespace :test do
303
-
304
- task :deprecated do
305
- Rake.application.top_level_tasks.grep(/^db:test:/).each do |task|
306
- $stderr.puts "WARNING: #{task} is deprecated. The Rails test helper now maintains " \
307
- "your test schema automatically, see the release notes for details."
308
- end
546
+ task load_if_sql: ["db:create", :environment] do
547
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
548
+ Using `bin/rails db:structure:load_if_sql` is deprecated and will be removed in Rails 6.2.
549
+ Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:load` instead.
550
+ MSG
551
+ db_namespace["schema:load"].invoke if ActiveRecord::Base.schema_format == :sql
309
552
  end
310
553
 
311
- # desc "Recreate the test database from the current schema"
312
- task :load => %w(db:test:purge) do
313
- case ActiveRecord::Base.schema_format
314
- when :ruby
315
- db_namespace["test:load_schema"].invoke
316
- when :sql
317
- db_namespace["test:load_structure"].invoke
554
+ namespace :dump do
555
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
556
+ desc "Dumps the #{name} database structure to db/structure.sql. Specify another file with SCHEMA=db/my_structure.sql"
557
+ task name => :load_config do
558
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
559
+ Using `bin/rails db:structure:dump:#{name}` is deprecated and will be removed in Rails 6.2.
560
+ Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:dump:#{name}` instead.
561
+ MSG
562
+ db_namespace["schema:dump:#{name}"].invoke
563
+ db_namespace["structure:dump:#{name}"].reenable
564
+ end
318
565
  end
319
566
  end
320
567
 
321
- # desc "Recreate the test database from an existent schema.rb file"
322
- task :load_schema => %w(db:test:purge) do
323
- begin
324
- should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
325
- ActiveRecord::Schema.verbose = false
326
- ActiveRecord::Tasks::DatabaseTasks.load_schema ActiveRecord::Base.configurations["test"], :ruby, ENV["SCHEMA"], "test"
327
- ensure
328
- if should_reconnect
329
- ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[ActiveRecord::Tasks::DatabaseTasks.env])
568
+ namespace :load do
569
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
570
+ desc "Recreates the #{name} database from the structure.sql file"
571
+ task name => :load_config do
572
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
573
+ Using `bin/rails db:structure:load:#{name}` is deprecated and will be removed in Rails 6.2.
574
+ Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:load:#{name}` instead.
575
+ MSG
576
+ db_namespace["schema:load:#{name}"].invoke
330
577
  end
331
578
  end
332
579
  end
580
+ end
333
581
 
334
- # desc "Recreate the test database from an existent structure.sql file"
335
- task :load_structure => %w(db:test:purge) do
336
- ActiveRecord::Tasks::DatabaseTasks.load_schema ActiveRecord::Base.configurations["test"], :sql, ENV["SCHEMA"], "test"
582
+ namespace :test do
583
+ # desc "Recreate the test database from the current schema"
584
+ task load: %w(db:test:purge) do
585
+ db_namespace["test:load_schema"].invoke
337
586
  end
338
587
 
339
- # desc "Recreate the test database from a fresh schema"
340
- task :clone => %w(db:test:deprecated environment) do
341
- case ActiveRecord::Base.schema_format
342
- when :ruby
343
- db_namespace["test:clone_schema"].invoke
344
- when :sql
345
- db_namespace["test:clone_structure"].invoke
588
+ # desc "Recreate the test database from an existent schema file (schema.rb or structure.sql, depending on `config.active_record.schema_format`)"
589
+ task load_schema: %w(db:test:purge) do
590
+ should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
591
+ ActiveRecord::Schema.verbose = false
592
+ ActiveRecord::Base.configurations.configs_for(env_name: "test").each do |db_config|
593
+ filename = ActiveRecord::Tasks::DatabaseTasks.dump_filename(db_config.name)
594
+ ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, ActiveRecord::Base.schema_format, filename)
595
+ end
596
+ ensure
597
+ if should_reconnect
598
+ ActiveRecord::Base.establish_connection(ActiveRecord::Tasks::DatabaseTasks.env.to_sym)
346
599
  end
347
600
  end
348
601
 
349
- # desc "Recreate the test database from a fresh schema.rb file"
350
- task :clone_schema => %w(db:test:deprecated db:schema:dump db:test:load_schema)
351
-
352
- # desc "Recreate the test database from a fresh structure.sql file"
353
- task :clone_structure => %w(db:test:deprecated db:structure:dump db:test:load_structure)
602
+ # desc "Recreate the test database from an existent structure.sql file"
603
+ task load_structure: %w(db:test:purge) do
604
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
605
+ Using `bin/rails db:test:load_structure` is deprecated and will be removed in Rails 6.2.
606
+ Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:test:load_schema` instead.
607
+ MSG
608
+ db_namespace["test:load_schema"].invoke
609
+ end
354
610
 
355
611
  # desc "Empty the test database"
356
- task :purge => %w(environment load_config check_protected_environments) do
357
- ActiveRecord::Tasks::DatabaseTasks.purge ActiveRecord::Base.configurations['test']
612
+ task purge: %w(load_config check_protected_environments) do
613
+ ActiveRecord::Base.configurations.configs_for(env_name: "test").each do |db_config|
614
+ ActiveRecord::Tasks::DatabaseTasks.purge(db_config)
615
+ end
358
616
  end
359
617
 
360
618
  # desc 'Load the test schema'
361
- task :prepare => %w(environment load_config) do
619
+ task prepare: :load_config do
362
620
  unless ActiveRecord::Base.configurations.blank?
363
- db_namespace['test:load'].invoke
621
+ db_namespace["test:load"].invoke
622
+ end
623
+ end
624
+
625
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
626
+ # desc "Recreate the #{name} test database"
627
+ namespace :load do
628
+ task name => "db:test:purge:#{name}" do
629
+ db_namespace["test:load_schema:#{name}"].invoke
630
+ end
631
+ end
632
+
633
+ # desc "Recreate the #{name} test database from an existent schema.rb file"
634
+ namespace :load_schema do
635
+ task name => "db:test:purge:#{name}" do
636
+ should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
637
+ ActiveRecord::Schema.verbose = false
638
+ filename = ActiveRecord::Tasks::DatabaseTasks.dump_filename(name)
639
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", name: name)
640
+ ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, ActiveRecord::Base.schema_format, filename)
641
+ ensure
642
+ if should_reconnect
643
+ ActiveRecord::Base.establish_connection(ActiveRecord::Tasks::DatabaseTasks.env.to_sym)
644
+ end
645
+ end
646
+ end
647
+
648
+ # desc "Recreate the #{name} test database from an existent structure.sql file"
649
+ namespace :load_structure do
650
+ task name => "db:test:purge:#{name}" do
651
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
652
+ Using `bin/rails db:test:load_structure:#{name}` is deprecated and will be removed in Rails 6.2.
653
+ Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:test:load_structure:#{name}` instead.
654
+ MSG
655
+ db_namespace["test:load_schema:#{name}"].invoke
656
+ end
657
+ end
658
+
659
+ # desc "Empty the #{name} test database"
660
+ namespace :purge do
661
+ task name => %w(load_config check_protected_environments) do
662
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", name: name)
663
+ ActiveRecord::Tasks::DatabaseTasks.purge(db_config)
664
+ end
665
+ end
666
+
667
+ # desc 'Load the #{name} database test schema'
668
+ namespace :prepare do
669
+ task name => :load_config do
670
+ db_namespace["test:load:#{name}"].invoke
671
+ end
364
672
  end
365
673
  end
366
674
  end
@@ -369,15 +677,19 @@ end
369
677
  namespace :railties do
370
678
  namespace :install do
371
679
  # desc "Copies missing migrations from Railties (e.g. engines). You can specify Railties to use with FROM=railtie1,railtie2"
372
- task :migrations => :'db:load_config' do
373
- to_load = ENV['FROM'].blank? ? :all : ENV['FROM'].split(",").map(&:strip)
680
+ task migrations: :'db:load_config' do
681
+ to_load = ENV["FROM"].blank? ? :all : ENV["FROM"].split(",").map(&:strip)
374
682
  railties = {}
375
683
  Rails.application.migration_railties.each do |railtie|
376
684
  next unless to_load == :all || to_load.include?(railtie.railtie_name)
377
685
 
378
- if railtie.respond_to?(:paths) && (path = railtie.paths['db/migrate'].first)
686
+ if railtie.respond_to?(:paths) && (path = railtie.paths["db/migrate"].first)
379
687
  railties[railtie.railtie_name] = path
380
688
  end
689
+
690
+ unless ENV["MIGRATIONS_PATH"].blank?
691
+ railties[railtie.railtie_name] = railtie.root + ENV["MIGRATIONS_PATH"]
692
+ end
381
693
  end
382
694
 
383
695
  on_skip = Proc.new do |name, migration|
@@ -389,7 +701,7 @@ namespace :railties do
389
701
  end
390
702
 
391
703
  ActiveRecord::Migration.copy(ActiveRecord::Tasks::DatabaseTasks.migrations_paths.first, railties,
392
- :on_skip => on_skip, :on_copy => on_copy)
704
+ on_skip: on_skip, on_copy: on_copy)
393
705
  end
394
706
  end
395
707
  end