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,40 +1,60 @@
1
- require 'active_record'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+
5
+ databases = ActiveRecord::Tasks::DatabaseTasks.setup_initial_database_yaml
2
6
 
3
7
  db_namespace = namespace :db do
4
8
  desc "Set the environment value for the database"
5
- task "environment:set" => [:environment, :load_config] do
9
+ task "environment:set" => :load_config do
6
10
  ActiveRecord::InternalMetadata.create_table
7
- ActiveRecord::InternalMetadata[:environment] = ActiveRecord::Migrator.current_environment
11
+ ActiveRecord::InternalMetadata[:environment] = ActiveRecord::Base.connection.migration_context.current_environment
8
12
  end
9
13
 
10
- task :check_protected_environments => [:environment, :load_config] do
14
+ task check_protected_environments: :load_config do
11
15
  ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
12
16
  end
13
17
 
14
- task :load_config do
18
+ task load_config: :environment do
15
19
  ActiveRecord::Base.configurations = ActiveRecord::Tasks::DatabaseTasks.database_configuration || {}
16
20
  ActiveRecord::Migrator.migrations_paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
17
21
  end
18
22
 
19
23
  namespace :create do
20
- task :all => :load_config do
24
+ task all: :load_config do
21
25
  ActiveRecord::Tasks::DatabaseTasks.create_all
22
26
  end
27
+
28
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |spec_name|
29
+ desc "Create #{spec_name} database for current environment"
30
+ task spec_name => :load_config do
31
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name)
32
+ ActiveRecord::Tasks::DatabaseTasks.create(db_config.config)
33
+ end
34
+ end
23
35
  end
24
36
 
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
37
+ 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."
38
+ task create: [:load_config] do
27
39
  ActiveRecord::Tasks::DatabaseTasks.create_current
28
40
  end
29
41
 
30
42
  namespace :drop do
31
- task :all => [:load_config, :check_protected_environments] do
43
+ task all: [:load_config, :check_protected_environments] do
32
44
  ActiveRecord::Tasks::DatabaseTasks.drop_all
33
45
  end
46
+
47
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |spec_name|
48
+ desc "Drop #{spec_name} database for current environment"
49
+ task spec_name => [:load_config, :check_protected_environments] do
50
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name)
51
+ ActiveRecord::Tasks::DatabaseTasks.drop(db_config.config)
52
+ end
53
+ end
34
54
  end
35
55
 
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
56
+ 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."
57
+ task drop: [:load_config, :check_protected_environments] do
38
58
  db_namespace["drop:_unsafe"].invoke
39
59
  end
40
60
 
@@ -43,20 +63,31 @@ db_namespace = namespace :db do
43
63
  end
44
64
 
45
65
  namespace :purge do
46
- task :all => [:load_config, :check_protected_environments] do
66
+ task all: [:load_config, :check_protected_environments] do
47
67
  ActiveRecord::Tasks::DatabaseTasks.purge_all
48
68
  end
49
69
  end
50
70
 
71
+ # desc "Truncates tables of each database for current environment"
72
+ task truncate_all: [:load_config, :check_protected_environments] do
73
+ ActiveRecord::Tasks::DatabaseTasks.truncate_all
74
+ end
75
+
51
76
  # 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
+ task purge: [:load_config, :check_protected_environments] do
53
78
  ActiveRecord::Tasks::DatabaseTasks.purge_current
54
79
  end
55
80
 
56
81
  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
82
+ task migrate: :load_config do
83
+ original_config = ActiveRecord::Base.connection_config
84
+ ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
85
+ ActiveRecord::Base.establish_connection(db_config.config)
86
+ ActiveRecord::Tasks::DatabaseTasks.migrate
87
+ end
88
+ db_namespace["_dump"].invoke
89
+ ensure
90
+ ActiveRecord::Base.establish_connection(original_config)
60
91
  end
61
92
 
62
93
  # IMPORTANT: This task won't dump the schema if ActiveRecord::Base.dump_schema_after_migration is set to false
@@ -71,155 +102,276 @@ db_namespace = namespace :db do
71
102
  end
72
103
  # Allow this task to be called as many times as required. An example is the
73
104
  # migrate:redo task, which calls other two internally that depend on this one.
74
- db_namespace['_dump'].reenable
105
+ db_namespace["_dump"].reenable
75
106
  end
76
107
 
77
108
  namespace :migrate do
109
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |spec_name|
110
+ desc "Migrate #{spec_name} database for current environment"
111
+ task spec_name => :load_config do
112
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name)
113
+ ActiveRecord::Base.establish_connection(db_config.config)
114
+ ActiveRecord::Tasks::DatabaseTasks.migrate
115
+ end
116
+ end
117
+
78
118
  # desc 'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
79
- task :redo => [:environment, :load_config] do
119
+ task redo: :load_config do
80
120
  raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?
81
121
 
82
- if ENV['VERSION']
83
- db_namespace['migrate:down'].invoke
84
- db_namespace['migrate:up'].invoke
122
+ if ENV["VERSION"]
123
+ db_namespace["migrate:down"].invoke
124
+ db_namespace["migrate:up"].invoke
85
125
  else
86
- db_namespace['rollback'].invoke
87
- db_namespace['migrate'].invoke
126
+ db_namespace["rollback"].invoke
127
+ db_namespace["migrate"].invoke
88
128
  end
89
129
  end
90
130
 
91
131
  # desc 'Resets your database using your migrations for the current environment'
92
- task :reset => ['db:drop', 'db:create', 'db:migrate']
132
+ task reset: ["db:drop", "db:create", "db:migrate"]
93
133
 
94
134
  # desc 'Runs the "up" for a given migration VERSION.'
95
- task :up => [:environment, :load_config] do
135
+ task up: :load_config do
136
+ ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:migrate:up")
137
+
96
138
  raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
97
139
 
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
140
+ ActiveRecord::Tasks::DatabaseTasks.check_target_version
141
+
142
+ ActiveRecord::Base.connection.migration_context.run(
143
+ :up,
144
+ ActiveRecord::Tasks::DatabaseTasks.target_version
145
+ )
146
+ db_namespace["_dump"].invoke
147
+ end
148
+
149
+ namespace :up do
150
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |spec_name|
151
+ task spec_name => :load_config do
152
+ raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
153
+
154
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name)
155
+
156
+ ActiveRecord::Base.establish_connection(db_config.config)
157
+ ActiveRecord::Tasks::DatabaseTasks.check_target_version
158
+ ActiveRecord::Base.connection.migration_context.run(
159
+ :up,
160
+ ActiveRecord::Tasks::DatabaseTasks.target_version
161
+ )
162
+
163
+ db_namespace["_dump"].invoke
164
+ end
165
+ end
101
166
  end
102
167
 
103
168
  # desc 'Runs the "down" for a given migration VERSION.'
104
- task :down => [:environment, :load_config] do
169
+ task down: :load_config do
170
+ ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:migrate:down")
171
+
105
172
  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
173
+
174
+ ActiveRecord::Tasks::DatabaseTasks.check_target_version
175
+
176
+ ActiveRecord::Base.connection.migration_context.run(
177
+ :down,
178
+ ActiveRecord::Tasks::DatabaseTasks.target_version
179
+ )
180
+ db_namespace["_dump"].invoke
181
+ end
182
+
183
+ namespace :down do
184
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |spec_name|
185
+ task spec_name => :load_config do
186
+ raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
187
+
188
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name)
189
+
190
+ ActiveRecord::Base.establish_connection(db_config.config)
191
+ ActiveRecord::Tasks::DatabaseTasks.check_target_version
192
+ ActiveRecord::Base.connection.migration_context.run(
193
+ :down,
194
+ ActiveRecord::Tasks::DatabaseTasks.target_version
195
+ )
196
+
197
+ db_namespace["_dump"].invoke
198
+ end
199
+ end
109
200
  end
110
201
 
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.'
202
+ desc "Display status of migrations"
203
+ task status: :load_config do
204
+ ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
205
+ ActiveRecord::Base.establish_connection(db_config.config)
206
+ ActiveRecord::Tasks::DatabaseTasks.migrate_status
115
207
  end
208
+ end
116
209
 
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}"
210
+ namespace :status do
211
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |spec_name|
212
+ desc "Display status of migrations for #{spec_name} database"
213
+ task spec_name => :load_config do
214
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name)
215
+ ActiveRecord::Base.establish_connection(db_config.config)
216
+ ActiveRecord::Tasks::DatabaseTasks.migrate_status
217
+ end
124
218
  end
125
- puts
126
219
  end
127
220
  end
128
221
 
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
222
+ desc "Rolls the schema back to the previous version (specify steps w/ STEP=n)."
223
+ task rollback: :load_config do
224
+ step = ENV["STEP"] ? ENV["STEP"].to_i : 1
225
+ ActiveRecord::Base.connection.migration_context.rollback(step)
226
+ db_namespace["_dump"].invoke
134
227
  end
135
228
 
136
229
  # 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
230
+ task forward: :load_config do
231
+ step = ENV["STEP"] ? ENV["STEP"].to_i : 1
232
+ ActiveRecord::Base.connection.migration_context.forward(step)
233
+ db_namespace["_dump"].invoke
141
234
  end
142
235
 
143
236
  # 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' ]
237
+ task reset: [ "db:drop", "db:setup" ]
145
238
 
146
239
  # desc "Retrieves the charset for the current environment's database"
147
- task :charset => [:environment, :load_config] do
240
+ task charset: :load_config do
148
241
  puts ActiveRecord::Tasks::DatabaseTasks.charset_current
149
242
  end
150
243
 
151
244
  # 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
245
+ task collation: :load_config do
246
+ puts ActiveRecord::Tasks::DatabaseTasks.collation_current
247
+ rescue NoMethodError
248
+ $stderr.puts "Sorry, your database adapter is not supported yet. Feel free to submit a patch."
158
249
  end
159
250
 
160
- desc 'Retrieves the current schema version number'
161
- task :version => [:environment, :load_config] do
162
- puts "Current version: #{ActiveRecord::Migrator.current_version}"
251
+ desc "Retrieves the current schema version number"
252
+ task version: :load_config do
253
+ puts "Current version: #{ActiveRecord::Base.connection.migration_context.current_version}"
163
254
  end
164
255
 
165
256
  # 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
257
+ task abort_if_pending_migrations: :load_config do
258
+ pending_migrations = ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).flat_map do |db_config|
259
+ ActiveRecord::Base.establish_connection(db_config.config)
260
+
261
+ ActiveRecord::Base.connection.migration_context.open.pending_migrations
262
+ end
168
263
 
169
264
  if pending_migrations.any?
170
265
  puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
171
266
  pending_migrations.each do |pending_migration|
172
- puts ' %4d %s' % [pending_migration.version, pending_migration.name]
267
+ puts " %4d %s" % [pending_migration.version, pending_migration.name]
173
268
  end
174
269
  abort %{Run `rails db:migrate` to update your database then try again.}
175
270
  end
271
+ ensure
272
+ ActiveRecord::Base.establish_connection(ActiveRecord::Tasks::DatabaseTasks.env.to_sym)
273
+ end
274
+
275
+ namespace :abort_if_pending_migrations do
276
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |spec_name|
277
+ # desc "Raises an error if there are pending migrations for #{spec_name} database"
278
+ task spec_name => :load_config do
279
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name)
280
+ ActiveRecord::Base.establish_connection(db_config.config)
281
+
282
+ pending_migrations = ActiveRecord::Base.connection.migration_context.open.pending_migrations
283
+
284
+ if pending_migrations.any?
285
+ puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
286
+ pending_migrations.each do |pending_migration|
287
+ puts " %4d %s" % [pending_migration.version, pending_migration.name]
288
+ end
289
+ abort %{Run `rails db:migrate:#{spec_name}` to update your database then try again.}
290
+ end
291
+ end
292
+ end
176
293
  end
177
294
 
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]
295
+ desc "Creates the database, loads the schema, and initializes with the seed data (use db:reset to also drop the database first)"
296
+ task setup: ["db:schema:load_if_ruby", "db:structure:load_if_sql", :seed]
297
+
298
+ desc "Runs setup if database does not exist, or runs migrations if it does"
299
+ task prepare: :load_config do
300
+ seed = false
301
+
302
+ ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
303
+ ActiveRecord::Base.establish_connection(db_config.config)
304
+
305
+ # Skipped when no database
306
+ ActiveRecord::Tasks::DatabaseTasks.migrate
307
+ if ActiveRecord::Base.dump_schema_after_migration
308
+ ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config.config, ActiveRecord::Base.schema_format, db_config.spec_name)
309
+ end
310
+
311
+ rescue ActiveRecord::NoDatabaseError
312
+ ActiveRecord::Tasks::DatabaseTasks.create_current(db_config.env_name, db_config.spec_name)
313
+ ActiveRecord::Tasks::DatabaseTasks.load_schema(
314
+ db_config.config,
315
+ ActiveRecord::Base.schema_format,
316
+ nil,
317
+ db_config.env_name,
318
+ db_config.spec_name
319
+ )
320
+
321
+ seed = true
322
+ end
180
323
 
181
- desc 'Loads the seed data from db/seeds.rb'
182
- task :seed do
183
- db_namespace['abort_if_pending_migrations'].invoke
324
+ ActiveRecord::Base.establish_connection
325
+ ActiveRecord::Tasks::DatabaseTasks.load_seed if seed
326
+ end
327
+
328
+ desc "Loads the seed data from db/seeds.rb"
329
+ task seed: :load_config do
330
+ db_namespace["abort_if_pending_migrations"].invoke
184
331
  ActiveRecord::Tasks::DatabaseTasks.load_seed
185
332
  end
186
333
 
334
+ namespace :seed do
335
+ desc "Truncates tables of each database for current environment and loads the seeds"
336
+ task replant: [:load_config, :truncate_all, :seed]
337
+ end
338
+
187
339
  namespace :fixtures do
188
340
  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'
341
+ task load: :load_config do
342
+ require "active_record/fixtures"
191
343
 
192
344
  base_dir = ActiveRecord::Tasks::DatabaseTasks.fixtures_path
193
345
 
194
- fixtures_dir = if ENV['FIXTURES_DIR']
195
- File.join base_dir, ENV['FIXTURES_DIR']
196
- else
197
- base_dir
198
- end
346
+ fixtures_dir = if ENV["FIXTURES_DIR"]
347
+ File.join base_dir, ENV["FIXTURES_DIR"]
348
+ else
349
+ base_dir
350
+ end
199
351
 
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
352
+ fixture_files = if ENV["FIXTURES"]
353
+ ENV["FIXTURES"].split(",")
354
+ else
355
+ # The use of String#[] here is to support namespaced fixtures.
356
+ Dir["#{fixtures_dir}/**/*.yml"].map { |f| f[(fixtures_dir.size + 1)..-5] }
357
+ end
206
358
 
207
359
  ActiveRecord::FixtureSet.create_fixtures(fixtures_dir, fixture_files)
208
360
  end
209
361
 
210
362
  # 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'
363
+ task identify: :load_config do
364
+ require "active_record/fixtures"
213
365
 
214
- label, id = ENV['LABEL'], ENV['ID']
215
- raise 'LABEL or ID required' if label.blank? && id.blank?
366
+ label, id = ENV["LABEL"], ENV["ID"]
367
+ raise "LABEL or ID required" if label.blank? && id.blank?
216
368
 
217
369
  puts %Q(The fixture ID for "#{label}" is #{ActiveRecord::FixtureSet.identify(label)}.) if label
218
370
 
219
371
  base_dir = ActiveRecord::Tasks::DatabaseTasks.fixtures_path
220
372
 
221
373
  Dir["#{base_dir}/**/*.yml"].each do |file|
222
- if data = YAML::load(ERB.new(IO.read(file)).result)
374
+ if data = YAML.load(ERB.new(IO.read(file)).result)
223
375
  data.each_key do |key|
224
376
  key_id = ActiveRecord::FixtureSet.identify(key)
225
377
 
@@ -233,134 +385,113 @@ db_namespace = namespace :db do
233
385
  end
234
386
 
235
387
  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)
388
+ desc "Creates a db/schema.rb file that is portable against any DB supported by Active Record"
389
+ task dump: :load_config do
390
+ ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
391
+ ActiveRecord::Base.establish_connection(db_config.config)
392
+ ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config.config, :ruby, db_config.spec_name)
242
393
  end
243
- db_namespace['schema:dump'].reenable
394
+
395
+ db_namespace["schema:dump"].reenable
244
396
  end
245
397
 
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'])
398
+ desc "Loads a schema.rb file into the database"
399
+ task load: [:load_config, :check_protected_environments] do
400
+ ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV["SCHEMA"])
249
401
  end
250
402
 
251
- task :load_if_ruby => ['db:create', :environment] do
403
+ task load_if_ruby: ["db:create", :environment] do
252
404
  db_namespace["schema:load"].invoke if ActiveRecord::Base.schema_format == :ruby
253
405
  end
254
406
 
255
407
  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)) }
408
+ desc "Creates a db/schema_cache.yml file."
409
+ task dump: :load_config do
410
+ ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
411
+ ActiveRecord::Base.establish_connection(db_config.config)
412
+ filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(db_config.spec_name)
413
+ ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(
414
+ ActiveRecord::Base.connection,
415
+ filename,
416
+ )
417
+ end
264
418
  end
265
419
 
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
420
+ desc "Clears a db/schema_cache.yml file."
421
+ task clear: :load_config do
422
+ ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
423
+ filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(db_config.spec_name)
424
+ rm_f filename, verbose: false
425
+ end
270
426
  end
271
427
  end
272
-
273
428
  end
274
429
 
275
430
  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"
287
- end
431
+ desc "Dumps the database structure to db/structure.sql. Specify another file with SCHEMA=db/my_structure.sql"
432
+ task dump: :load_config do
433
+ ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
434
+ ActiveRecord::Base.establish_connection(db_config.config)
435
+ ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config.config, :sql, db_config.spec_name)
288
436
  end
289
- db_namespace['structure:dump'].reenable
437
+
438
+ db_namespace["structure:dump"].reenable
290
439
  end
291
440
 
292
441
  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'])
442
+ task load: [:load_config, :check_protected_environments] do
443
+ ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:sql, ENV["SCHEMA"])
295
444
  end
296
445
 
297
- task :load_if_sql => ['db:create', :environment] do
446
+ task load_if_sql: ["db:create", :environment] do
298
447
  db_namespace["structure:load"].invoke if ActiveRecord::Base.schema_format == :sql
299
448
  end
300
449
  end
301
450
 
302
451
  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
309
- end
310
-
311
452
  # desc "Recreate the test database from the current schema"
312
- task :load => %w(db:test:purge) do
453
+ task load: %w(db:test:purge) do
313
454
  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
455
+ when :ruby
456
+ db_namespace["test:load_schema"].invoke
457
+ when :sql
458
+ db_namespace["test:load_structure"].invoke
318
459
  end
319
460
  end
320
461
 
321
462
  # 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])
330
- end
463
+ task load_schema: %w(db:test:purge) do
464
+ should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
465
+ ActiveRecord::Schema.verbose = false
466
+ ActiveRecord::Base.configurations.configs_for(env_name: "test").each do |db_config|
467
+ filename = ActiveRecord::Tasks::DatabaseTasks.dump_filename(db_config.spec_name, :ruby)
468
+ ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config.config, :ruby, filename, "test")
469
+ end
470
+ ensure
471
+ if should_reconnect
472
+ ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations.default_hash(ActiveRecord::Tasks::DatabaseTasks.env))
331
473
  end
332
474
  end
333
475
 
334
476
  # 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"
337
- end
338
-
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
477
+ task load_structure: %w(db:test:purge) do
478
+ ActiveRecord::Base.configurations.configs_for(env_name: "test").each do |db_config|
479
+ filename = ActiveRecord::Tasks::DatabaseTasks.dump_filename(db_config.spec_name, :sql)
480
+ ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config.config, :sql, filename, "test")
346
481
  end
347
482
  end
348
483
 
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)
354
-
355
484
  # 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']
485
+ task purge: %w(load_config check_protected_environments) do
486
+ ActiveRecord::Base.configurations.configs_for(env_name: "test").each do |db_config|
487
+ ActiveRecord::Tasks::DatabaseTasks.purge(db_config.config)
488
+ end
358
489
  end
359
490
 
360
491
  # desc 'Load the test schema'
361
- task :prepare => %w(environment load_config) do
492
+ task prepare: :load_config do
362
493
  unless ActiveRecord::Base.configurations.blank?
363
- db_namespace['test:load'].invoke
494
+ db_namespace["test:load"].invoke
364
495
  end
365
496
  end
366
497
  end
@@ -369,15 +500,19 @@ end
369
500
  namespace :railties do
370
501
  namespace :install do
371
502
  # 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)
503
+ task migrations: :'db:load_config' do
504
+ to_load = ENV["FROM"].blank? ? :all : ENV["FROM"].split(",").map(&:strip)
374
505
  railties = {}
375
506
  Rails.application.migration_railties.each do |railtie|
376
507
  next unless to_load == :all || to_load.include?(railtie.railtie_name)
377
508
 
378
- if railtie.respond_to?(:paths) && (path = railtie.paths['db/migrate'].first)
509
+ if railtie.respond_to?(:paths) && (path = railtie.paths["db/migrate"].first)
379
510
  railties[railtie.railtie_name] = path
380
511
  end
512
+
513
+ unless ENV["MIGRATIONS_PATH"].blank?
514
+ railties[railtie.railtie_name] = railtie.root + ENV["MIGRATIONS_PATH"]
515
+ end
381
516
  end
382
517
 
383
518
  on_skip = Proc.new do |name, migration|
@@ -389,7 +524,7 @@ namespace :railties do
389
524
  end
390
525
 
391
526
  ActiveRecord::Migration.copy(ActiveRecord::Tasks::DatabaseTasks.migrations_paths.first, railties,
392
- :on_skip => on_skip, :on_copy => on_copy)
527
+ on_skip: on_skip, on_copy: on_copy)
393
528
  end
394
529
  end
395
530
  end