activerecord 4.2.11.1 → 6.0.3

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 (373) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +711 -1547
  3. data/MIT-LICENSE +4 -2
  4. data/README.rdoc +14 -13
  5. data/examples/performance.rb +33 -32
  6. data/examples/simple.rb +5 -4
  7. data/lib/active_record/advisory_lock_base.rb +18 -0
  8. data/lib/active_record/aggregations.rb +266 -251
  9. data/lib/active_record/association_relation.rb +20 -13
  10. data/lib/active_record/associations/alias_tracker.rb +29 -36
  11. data/lib/active_record/associations/association.rb +128 -57
  12. data/lib/active_record/associations/association_scope.rb +103 -132
  13. data/lib/active_record/associations/belongs_to_association.rb +65 -60
  14. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  15. data/lib/active_record/associations/builder/association.rb +27 -40
  16. data/lib/active_record/associations/builder/belongs_to.rb +69 -55
  17. data/lib/active_record/associations/builder/collection_association.rb +10 -33
  18. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +50 -66
  19. data/lib/active_record/associations/builder/has_many.rb +8 -4
  20. data/lib/active_record/associations/builder/has_one.rb +46 -5
  21. data/lib/active_record/associations/builder/singular_association.rb +16 -10
  22. data/lib/active_record/associations/collection_association.rb +136 -288
  23. data/lib/active_record/associations/collection_proxy.rb +241 -147
  24. data/lib/active_record/associations/foreign_association.rb +10 -1
  25. data/lib/active_record/associations/has_many_association.rb +34 -98
  26. data/lib/active_record/associations/has_many_through_association.rb +60 -87
  27. data/lib/active_record/associations/has_one_association.rb +61 -49
  28. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  29. data/lib/active_record/associations/join_dependency/join_association.rb +38 -86
  30. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  31. data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
  32. data/lib/active_record/associations/join_dependency.rb +149 -166
  33. data/lib/active_record/associations/preloader/association.rb +90 -123
  34. data/lib/active_record/associations/preloader/through_association.rb +85 -65
  35. data/lib/active_record/associations/preloader.rb +90 -93
  36. data/lib/active_record/associations/singular_association.rb +18 -39
  37. data/lib/active_record/associations/through_association.rb +38 -18
  38. data/lib/active_record/associations.rb +1737 -1597
  39. data/lib/active_record/attribute_assignment.rb +57 -185
  40. data/lib/active_record/attribute_decorators.rb +39 -17
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -9
  42. data/lib/active_record/attribute_methods/dirty.rb +174 -144
  43. data/lib/active_record/attribute_methods/primary_key.rb +90 -84
  44. data/lib/active_record/attribute_methods/query.rb +6 -5
  45. data/lib/active_record/attribute_methods/read.rb +20 -77
  46. data/lib/active_record/attribute_methods/serialization.rb +40 -21
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +57 -37
  48. data/lib/active_record/attribute_methods/write.rb +32 -55
  49. data/lib/active_record/attribute_methods.rb +120 -135
  50. data/lib/active_record/attributes.rb +213 -82
  51. data/lib/active_record/autosave_association.rb +97 -41
  52. data/lib/active_record/base.rb +57 -45
  53. data/lib/active_record/callbacks.rb +101 -76
  54. data/lib/active_record/coders/json.rb +3 -1
  55. data/lib/active_record/coders/yaml_column.rb +23 -12
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +804 -297
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +26 -8
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +240 -115
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +83 -24
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +170 -53
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +74 -47
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +371 -242
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +694 -256
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +190 -83
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +473 -202
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +507 -639
  69. data/lib/active_record/connection_adapters/column.rb +56 -43
  70. data/lib/active_record/connection_adapters/connection_specification.rb +174 -153
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
  72. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +196 -0
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +71 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +58 -181
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +21 -11
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +70 -114
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +49 -58
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +9 -8
  87. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +4 -2
  89. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +5 -1
  90. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
  91. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +9 -22
  92. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  93. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
  94. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +31 -20
  95. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  97. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -9
  99. data/lib/active_record/connection_adapters/postgresql/oid/{infinity.rb → oid.rb} +5 -3
  100. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +32 -11
  101. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +51 -34
  102. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -5
  103. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  104. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +9 -5
  105. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +3 -1
  106. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +3 -1
  107. data/lib/active_record/connection_adapters/postgresql/oid.rb +23 -25
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +144 -47
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +178 -108
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +49 -0
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +462 -296
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +11 -8
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +558 -356
  117. data/lib/active_record/connection_adapters/schema_cache.rb +72 -25
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
  119. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +119 -0
  120. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +102 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  125. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  126. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +299 -349
  127. data/lib/active_record/connection_adapters/statement_pool.rb +33 -13
  128. data/lib/active_record/connection_handling.rb +167 -41
  129. data/lib/active_record/core.rb +252 -230
  130. data/lib/active_record/counter_cache.rb +70 -49
  131. data/lib/active_record/database_configurations/database_config.rb +37 -0
  132. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  133. data/lib/active_record/database_configurations/url_config.rb +78 -0
  134. data/lib/active_record/database_configurations.rb +233 -0
  135. data/lib/active_record/define_callbacks.rb +22 -0
  136. data/lib/active_record/dynamic_matchers.rb +87 -106
  137. data/lib/active_record/enum.rb +163 -86
  138. data/lib/active_record/errors.rb +188 -53
  139. data/lib/active_record/explain.rb +22 -11
  140. data/lib/active_record/explain_registry.rb +4 -2
  141. data/lib/active_record/explain_subscriber.rb +10 -5
  142. data/lib/active_record/fixture_set/file.rb +35 -9
  143. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  144. data/lib/active_record/fixture_set/render_context.rb +17 -0
  145. data/lib/active_record/fixture_set/table_row.rb +152 -0
  146. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  147. data/lib/active_record/fixtures.rb +227 -501
  148. data/lib/active_record/gem_version.rb +6 -4
  149. data/lib/active_record/inheritance.rb +158 -115
  150. data/lib/active_record/insert_all.rb +179 -0
  151. data/lib/active_record/integration.rb +123 -29
  152. data/lib/active_record/internal_metadata.rb +53 -0
  153. data/lib/active_record/legacy_yaml_adapter.rb +21 -3
  154. data/lib/active_record/locale/en.yml +3 -2
  155. data/lib/active_record/locking/optimistic.rb +86 -96
  156. data/lib/active_record/locking/pessimistic.rb +18 -6
  157. data/lib/active_record/log_subscriber.rb +76 -33
  158. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  159. data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
  160. data/lib/active_record/middleware/database_selector.rb +74 -0
  161. data/lib/active_record/migration/command_recorder.rb +166 -91
  162. data/lib/active_record/migration/compatibility.rb +244 -0
  163. data/lib/active_record/migration/join_table.rb +8 -7
  164. data/lib/active_record/migration.rb +623 -305
  165. data/lib/active_record/model_schema.rb +313 -112
  166. data/lib/active_record/nested_attributes.rb +263 -223
  167. data/lib/active_record/no_touching.rb +15 -2
  168. data/lib/active_record/null_relation.rb +24 -38
  169. data/lib/active_record/persistence.rb +557 -126
  170. data/lib/active_record/query_cache.rb +19 -23
  171. data/lib/active_record/querying.rb +44 -30
  172. data/lib/active_record/railtie.rb +143 -44
  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 +331 -185
  177. data/lib/active_record/readonly_attributes.rb +5 -4
  178. data/lib/active_record/reflection.rb +430 -281
  179. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  180. data/lib/active_record/relation/batches.rb +206 -55
  181. data/lib/active_record/relation/calculations.rb +268 -254
  182. data/lib/active_record/relation/delegation.rb +75 -84
  183. data/lib/active_record/relation/finder_methods.rb +285 -241
  184. data/lib/active_record/relation/from_clause.rb +30 -0
  185. data/lib/active_record/relation/merger.rb +78 -88
  186. data/lib/active_record/relation/predicate_builder/array_handler.rb +27 -26
  187. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  188. data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
  189. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  190. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  191. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  192. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  193. data/lib/active_record/relation/predicate_builder.rb +110 -119
  194. data/lib/active_record/relation/query_attribute.rb +50 -0
  195. data/lib/active_record/relation/query_methods.rb +603 -397
  196. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  197. data/lib/active_record/relation/spawn_methods.rb +11 -14
  198. data/lib/active_record/relation/where_clause.rb +189 -0
  199. data/lib/active_record/relation/where_clause_factory.rb +33 -0
  200. data/lib/active_record/relation.rb +530 -341
  201. data/lib/active_record/result.rb +79 -43
  202. data/lib/active_record/runtime_registry.rb +6 -4
  203. data/lib/active_record/sanitization.rb +144 -121
  204. data/lib/active_record/schema.rb +21 -24
  205. data/lib/active_record/schema_dumper.rb +112 -93
  206. data/lib/active_record/schema_migration.rb +24 -17
  207. data/lib/active_record/scoping/default.rb +98 -83
  208. data/lib/active_record/scoping/named.rb +86 -33
  209. data/lib/active_record/scoping.rb +45 -27
  210. data/lib/active_record/secure_token.rb +40 -0
  211. data/lib/active_record/serialization.rb +5 -5
  212. data/lib/active_record/statement_cache.rb +73 -36
  213. data/lib/active_record/store.rb +127 -42
  214. data/lib/active_record/suppressor.rb +61 -0
  215. data/lib/active_record/table_metadata.rb +90 -0
  216. data/lib/active_record/tasks/database_tasks.rb +307 -100
  217. data/lib/active_record/tasks/mysql_database_tasks.rb +55 -100
  218. data/lib/active_record/tasks/postgresql_database_tasks.rb +80 -41
  219. data/lib/active_record/tasks/sqlite_database_tasks.rb +37 -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 +86 -41
  223. data/lib/active_record/touch_later.rb +65 -0
  224. data/lib/active_record/transactions.rb +223 -157
  225. data/lib/active_record/translation.rb +3 -1
  226. data/lib/active_record/type/adapter_specific_registry.rb +126 -0
  227. data/lib/active_record/type/date.rb +4 -45
  228. data/lib/active_record/type/date_time.rb +4 -49
  229. data/lib/active_record/type/decimal_without_scale.rb +6 -2
  230. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  231. data/lib/active_record/type/internal/timezone.rb +17 -0
  232. data/lib/active_record/type/json.rb +30 -0
  233. data/lib/active_record/type/serialized.rb +23 -15
  234. data/lib/active_record/type/text.rb +2 -2
  235. data/lib/active_record/type/time.rb +11 -16
  236. data/lib/active_record/type/type_map.rb +16 -19
  237. data/lib/active_record/type/unsigned_integer.rb +9 -8
  238. data/lib/active_record/type.rb +77 -23
  239. data/lib/active_record/type_caster/connection.rb +34 -0
  240. data/lib/active_record/type_caster/map.rb +20 -0
  241. data/lib/active_record/type_caster.rb +9 -0
  242. data/lib/active_record/validations/absence.rb +25 -0
  243. data/lib/active_record/validations/associated.rb +12 -4
  244. data/lib/active_record/validations/length.rb +26 -0
  245. data/lib/active_record/validations/presence.rb +14 -13
  246. data/lib/active_record/validations/uniqueness.rb +42 -55
  247. data/lib/active_record/validations.rb +38 -35
  248. data/lib/active_record/version.rb +3 -1
  249. data/lib/active_record.rb +42 -22
  250. data/lib/arel/alias_predication.rb +9 -0
  251. data/lib/arel/attributes/attribute.rb +37 -0
  252. data/lib/arel/attributes.rb +22 -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/and.rb +32 -0
  266. data/lib/arel/nodes/ascending.rb +23 -0
  267. data/lib/arel/nodes/binary.rb +52 -0
  268. data/lib/arel/nodes/bind_param.rb +36 -0
  269. data/lib/arel/nodes/case.rb +55 -0
  270. data/lib/arel/nodes/casted.rb +50 -0
  271. data/lib/arel/nodes/comment.rb +29 -0
  272. data/lib/arel/nodes/count.rb +12 -0
  273. data/lib/arel/nodes/delete_statement.rb +45 -0
  274. data/lib/arel/nodes/descending.rb +23 -0
  275. data/lib/arel/nodes/equality.rb +18 -0
  276. data/lib/arel/nodes/extract.rb +24 -0
  277. data/lib/arel/nodes/false.rb +16 -0
  278. data/lib/arel/nodes/full_outer_join.rb +8 -0
  279. data/lib/arel/nodes/function.rb +44 -0
  280. data/lib/arel/nodes/grouping.rb +8 -0
  281. data/lib/arel/nodes/in.rb +8 -0
  282. data/lib/arel/nodes/infix_operation.rb +80 -0
  283. data/lib/arel/nodes/inner_join.rb +8 -0
  284. data/lib/arel/nodes/insert_statement.rb +37 -0
  285. data/lib/arel/nodes/join_source.rb +20 -0
  286. data/lib/arel/nodes/matches.rb +18 -0
  287. data/lib/arel/nodes/named_function.rb +23 -0
  288. data/lib/arel/nodes/node.rb +50 -0
  289. data/lib/arel/nodes/node_expression.rb +13 -0
  290. data/lib/arel/nodes/outer_join.rb +8 -0
  291. data/lib/arel/nodes/over.rb +15 -0
  292. data/lib/arel/nodes/regexp.rb +16 -0
  293. data/lib/arel/nodes/right_outer_join.rb +8 -0
  294. data/lib/arel/nodes/select_core.rb +67 -0
  295. data/lib/arel/nodes/select_statement.rb +41 -0
  296. data/lib/arel/nodes/sql_literal.rb +16 -0
  297. data/lib/arel/nodes/string_join.rb +11 -0
  298. data/lib/arel/nodes/table_alias.rb +27 -0
  299. data/lib/arel/nodes/terminal.rb +16 -0
  300. data/lib/arel/nodes/true.rb +16 -0
  301. data/lib/arel/nodes/unary.rb +45 -0
  302. data/lib/arel/nodes/unary_operation.rb +20 -0
  303. data/lib/arel/nodes/unqualified_column.rb +22 -0
  304. data/lib/arel/nodes/update_statement.rb +41 -0
  305. data/lib/arel/nodes/values_list.rb +9 -0
  306. data/lib/arel/nodes/window.rb +126 -0
  307. data/lib/arel/nodes/with.rb +11 -0
  308. data/lib/arel/nodes.rb +68 -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/depth_first.rb +203 -0
  316. data/lib/arel/visitors/dot.rb +296 -0
  317. data/lib/arel/visitors/ibm_db.rb +34 -0
  318. data/lib/arel/visitors/informix.rb +62 -0
  319. data/lib/arel/visitors/mssql.rb +156 -0
  320. data/lib/arel/visitors/mysql.rb +83 -0
  321. data/lib/arel/visitors/oracle.rb +158 -0
  322. data/lib/arel/visitors/oracle12.rb +65 -0
  323. data/lib/arel/visitors/postgresql.rb +109 -0
  324. data/lib/arel/visitors/sqlite.rb +38 -0
  325. data/lib/arel/visitors/to_sql.rb +888 -0
  326. data/lib/arel/visitors/visitor.rb +45 -0
  327. data/lib/arel/visitors/where_sql.rb +22 -0
  328. data/lib/arel/visitors.rb +20 -0
  329. data/lib/arel/window_predications.rb +9 -0
  330. data/lib/arel.rb +62 -0
  331. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  332. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  333. data/lib/rails/generators/active_record/migration/migration_generator.rb +42 -37
  334. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
  335. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +11 -2
  336. data/lib/rails/generators/active_record/migration.rb +30 -1
  337. data/lib/rails/generators/active_record/model/model_generator.rb +18 -22
  338. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  339. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  340. data/lib/rails/generators/active_record.rb +7 -5
  341. metadata +168 -59
  342. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  343. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  344. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  345. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  346. data/lib/active_record/associations/preloader/has_one.rb +0 -23
  347. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  348. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  349. data/lib/active_record/attribute.rb +0 -163
  350. data/lib/active_record/attribute_set/builder.rb +0 -106
  351. data/lib/active_record/attribute_set.rb +0 -81
  352. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -498
  353. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  354. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  355. data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
  356. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
  357. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  358. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  359. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  360. data/lib/active_record/type/big_integer.rb +0 -13
  361. data/lib/active_record/type/binary.rb +0 -50
  362. data/lib/active_record/type/boolean.rb +0 -31
  363. data/lib/active_record/type/decimal.rb +0 -64
  364. data/lib/active_record/type/decorator.rb +0 -14
  365. data/lib/active_record/type/float.rb +0 -19
  366. data/lib/active_record/type/integer.rb +0 -59
  367. data/lib/active_record/type/mutable.rb +0 -16
  368. data/lib/active_record/type/numeric.rb +0 -36
  369. data/lib/active_record/type/string.rb +0 -40
  370. data/lib/active_record/type/time_value.rb +0 -38
  371. data/lib/active_record/type/value.rb +0 -110
  372. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -19
  373. data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
@@ -1,48 +1,93 @@
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
- task :load_config do
8
+ desc "Set the environment value for the database"
9
+ task "environment:set" => :load_config do
10
+ ActiveRecord::InternalMetadata.create_table
11
+ ActiveRecord::InternalMetadata[:environment] = ActiveRecord::Base.connection.migration_context.current_environment
12
+ end
13
+
14
+ task check_protected_environments: :load_config do
15
+ ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
16
+ end
17
+
18
+ task load_config: :environment do
5
19
  ActiveRecord::Base.configurations = ActiveRecord::Tasks::DatabaseTasks.database_configuration || {}
6
20
  ActiveRecord::Migrator.migrations_paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
7
21
  end
8
22
 
9
23
  namespace :create do
10
- task :all => :load_config do
24
+ task all: :load_config do
11
25
  ActiveRecord::Tasks::DatabaseTasks.create_all
12
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
13
35
  end
14
36
 
15
- 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 it defaults to creating the development and test databases.'
16
- 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
17
39
  ActiveRecord::Tasks::DatabaseTasks.create_current
18
40
  end
19
41
 
20
42
  namespace :drop do
21
- task :all => :load_config do
43
+ task all: [:load_config, :check_protected_environments] do
22
44
  ActiveRecord::Tasks::DatabaseTasks.drop_all
23
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
54
+ end
55
+
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
58
+ db_namespace["drop:_unsafe"].invoke
24
59
  end
25
60
 
26
- 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 it defaults to dropping the development and test databases.'
27
- task :drop => [:load_config] do
61
+ task "drop:_unsafe" => [:load_config] do
28
62
  ActiveRecord::Tasks::DatabaseTasks.drop_current
29
63
  end
30
64
 
31
65
  namespace :purge do
32
- task :all => :load_config do
66
+ task all: [:load_config, :check_protected_environments] do
33
67
  ActiveRecord::Tasks::DatabaseTasks.purge_all
34
68
  end
35
69
  end
36
70
 
37
- # desc "Empty 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 it defaults to purging the development and test databases."
38
- task :purge => [:load_config] do
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
+
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."
77
+ task purge: [:load_config, :check_protected_environments] do
39
78
  ActiveRecord::Tasks::DatabaseTasks.purge_current
40
79
  end
41
80
 
42
81
  desc "Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)."
43
- task :migrate => [:environment, :load_config] do
44
- ActiveRecord::Tasks::DatabaseTasks.migrate
45
- 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)
46
91
  end
47
92
 
48
93
  # IMPORTANT: This task won't dump the schema if ActiveRecord::Base.dump_schema_after_migration is set to false
@@ -57,158 +102,276 @@ db_namespace = namespace :db do
57
102
  end
58
103
  # Allow this task to be called as many times as required. An example is the
59
104
  # migrate:redo task, which calls other two internally that depend on this one.
60
- db_namespace['_dump'].reenable
105
+ db_namespace["_dump"].reenable
61
106
  end
62
107
 
63
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
+
64
118
  # desc 'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
65
- task :redo => [:environment, :load_config] do
119
+ task redo: :load_config do
66
120
  raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?
67
121
 
68
- if ENV['VERSION']
69
- db_namespace['migrate:down'].invoke
70
- db_namespace['migrate:up'].invoke
122
+ if ENV["VERSION"]
123
+ db_namespace["migrate:down"].invoke
124
+ db_namespace["migrate:up"].invoke
71
125
  else
72
- db_namespace['rollback'].invoke
73
- db_namespace['migrate'].invoke
126
+ db_namespace["rollback"].invoke
127
+ db_namespace["migrate"].invoke
74
128
  end
75
129
  end
76
130
 
77
131
  # desc 'Resets your database using your migrations for the current environment'
78
- task :reset => ['db:drop', 'db:create', 'db:migrate']
132
+ task reset: ["db:drop", "db:create", "db:migrate"]
79
133
 
80
134
  # desc 'Runs the "up" for a given migration VERSION.'
81
- task :up => [:environment, :load_config] do
82
- raise "VERSION is required" if ENV["VERSION"] && ENV["VERSION"].empty?
135
+ task up: :load_config do
136
+ ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:migrate:up")
137
+
138
+ raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
139
+
140
+ ActiveRecord::Tasks::DatabaseTasks.check_target_version
83
141
 
84
- version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
85
- ActiveRecord::Migrator.run(:up, ActiveRecord::Migrator.migrations_paths, version)
86
- db_namespace['_dump'].invoke
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
87
166
  end
88
167
 
89
168
  # desc 'Runs the "down" for a given migration VERSION.'
90
- task :down => [:environment, :load_config] do
91
- raise "VERSION is required - To go down one migration, use db:rollback" if ENV["VERSION"] && ENV["VERSION"].empty?
92
- version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
93
- ActiveRecord::Migrator.run(:down, ActiveRecord::Migrator.migrations_paths, version)
94
- db_namespace['_dump'].invoke
169
+ task down: :load_config do
170
+ ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:migrate:down")
171
+
172
+ raise "VERSION is required - To go down one migration, use db:rollback" if !ENV["VERSION"] || ENV["VERSION"].empty?
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
95
200
  end
96
201
 
97
- desc 'Display status of migrations'
98
- task :status => [:environment, :load_config] do
99
- unless ActiveRecord::SchemaMigration.table_exists?
100
- 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
101
207
  end
208
+ end
102
209
 
103
- # output
104
- puts "\ndatabase: #{ActiveRecord::Base.connection_config[:database]}\n\n"
105
- puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
106
- puts "-" * 50
107
- paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
108
- ActiveRecord::Migrator.migrations_status(paths).each do |status, version, name|
109
- 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
110
218
  end
111
- puts
112
219
  end
113
220
  end
114
221
 
115
- desc 'Rolls the schema back to the previous version (specify steps w/ STEP=n).'
116
- task :rollback => [:environment, :load_config] do
117
- step = ENV['STEP'] ? ENV['STEP'].to_i : 1
118
- ActiveRecord::Migrator.rollback(ActiveRecord::Migrator.migrations_paths, step)
119
- 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
120
227
  end
121
228
 
122
229
  # desc 'Pushes the schema to the next version (specify steps w/ STEP=n).'
123
- task :forward => [:environment, :load_config] do
124
- step = ENV['STEP'] ? ENV['STEP'].to_i : 1
125
- ActiveRecord::Migrator.forward(ActiveRecord::Migrator.migrations_paths, step)
126
- 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
127
234
  end
128
235
 
129
236
  # desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
130
- task :reset => [:environment, :load_config] do
131
- db_namespace["drop"].invoke
132
- db_namespace["setup"].invoke
133
- end
237
+ task reset: [ "db:drop", "db:setup" ]
134
238
 
135
239
  # desc "Retrieves the charset for the current environment's database"
136
- task :charset => [:environment, :load_config] do
240
+ task charset: :load_config do
137
241
  puts ActiveRecord::Tasks::DatabaseTasks.charset_current
138
242
  end
139
243
 
140
244
  # desc "Retrieves the collation for the current environment's database"
141
- task :collation => [:environment, :load_config] do
142
- begin
143
- puts ActiveRecord::Tasks::DatabaseTasks.collation_current
144
- rescue NoMethodError
145
- $stderr.puts 'Sorry, your database adapter is not supported yet. Feel free to submit a patch.'
146
- 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."
147
249
  end
148
250
 
149
- desc 'Retrieves the current schema version number'
150
- task :version => [:environment, :load_config] do
151
- 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}"
152
254
  end
153
255
 
154
256
  # desc "Raises an error if there are pending migrations"
155
- task :abort_if_pending_migrations => :environment do
156
- pending_migrations = ActiveRecord::Migrator.open(ActiveRecord::Migrator.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
157
263
 
158
264
  if pending_migrations.any?
159
265
  puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
160
266
  pending_migrations.each do |pending_migration|
161
- puts ' %4d %s' % [pending_migration.version, pending_migration.name]
267
+ puts " %4d %s" % [pending_migration.version, pending_migration.name]
162
268
  end
163
- abort %{Run `rake db:migrate` to update your database then try again.}
269
+ abort %{Run `rails db:migrate` to update your database then try again.}
164
270
  end
271
+ ensure
272
+ ActiveRecord::Base.establish_connection(ActiveRecord::Tasks::DatabaseTasks.env.to_sym)
165
273
  end
166
274
 
167
- desc 'Create the database, load the schema, and initialize with the seed data (use db:reset to also drop the database first)'
168
- task :setup => ['db:schema:load_if_ruby', 'db:structure:load_if_sql', :seed]
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
293
+ end
294
+
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)
169
304
 
170
- desc 'Load the seed data from db/seeds.rb'
171
- task :seed do
172
- db_namespace['abort_if_pending_migrations'].invoke
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
323
+
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
173
331
  ActiveRecord::Tasks::DatabaseTasks.load_seed
174
332
  end
175
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
+
176
339
  namespace :fixtures do
177
- desc "Load 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."
178
- task :load => [:environment, :load_config] do
179
- require 'active_record/fixtures'
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."
341
+ task load: :load_config do
342
+ require "active_record/fixtures"
180
343
 
181
344
  base_dir = ActiveRecord::Tasks::DatabaseTasks.fixtures_path
182
345
 
183
- fixtures_dir = if ENV['FIXTURES_DIR']
184
- File.join base_dir, ENV['FIXTURES_DIR']
185
- else
186
- base_dir
187
- end
346
+ fixtures_dir = if ENV["FIXTURES_DIR"]
347
+ File.join base_dir, ENV["FIXTURES_DIR"]
348
+ else
349
+ base_dir
350
+ end
188
351
 
189
- fixture_files = if ENV['FIXTURES']
190
- ENV['FIXTURES'].split(',')
191
- else
192
- # The use of String#[] here is to support namespaced fixtures
193
- Dir["#{fixtures_dir}/**/*.yml"].map {|f| f[(fixtures_dir.size + 1)..-5] }
194
- 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
195
358
 
196
359
  ActiveRecord::FixtureSet.create_fixtures(fixtures_dir, fixture_files)
197
360
  end
198
361
 
199
362
  # desc "Search for a fixture given a LABEL or ID. Specify an alternative path (eg. spec/fixtures) using FIXTURES_PATH=spec/fixtures."
200
- task :identify => [:environment, :load_config] do
201
- require 'active_record/fixtures'
363
+ task identify: :load_config do
364
+ require "active_record/fixtures"
202
365
 
203
- label, id = ENV['LABEL'], ENV['ID']
204
- 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?
205
368
 
206
369
  puts %Q(The fixture ID for "#{label}" is #{ActiveRecord::FixtureSet.identify(label)}.) if label
207
370
 
208
371
  base_dir = ActiveRecord::Tasks::DatabaseTasks.fixtures_path
209
372
 
210
373
  Dir["#{base_dir}/**/*.yml"].each do |file|
211
- if data = YAML::load(ERB.new(IO.read(file)).result)
374
+ if data = YAML.load(ERB.new(IO.read(file)).result)
212
375
  data.each_key do |key|
213
376
  key_id = ActiveRecord::FixtureSet.identify(key)
214
377
 
@@ -222,134 +385,113 @@ db_namespace = namespace :db do
222
385
  end
223
386
 
224
387
  namespace :schema do
225
- desc 'Create a db/schema.rb file that is portable against any DB supported by AR'
226
- task :dump => [:environment, :load_config] do
227
- require 'active_record/schema_dumper'
228
- filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
229
- File.open(filename, "w:utf-8") do |file|
230
- 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)
231
393
  end
232
- db_namespace['schema:dump'].reenable
394
+
395
+ db_namespace["schema:dump"].reenable
233
396
  end
234
397
 
235
- desc 'Load a schema.rb file into the database'
236
- task :load => [:environment, :load_config] do
237
- 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"])
238
401
  end
239
402
 
240
- task :load_if_ruby => ['db:create', :environment] do
403
+ task load_if_ruby: ["db:create", :environment] do
241
404
  db_namespace["schema:load"].invoke if ActiveRecord::Base.schema_format == :ruby
242
405
  end
243
406
 
244
407
  namespace :cache do
245
- desc 'Create a db/schema_cache.dump file.'
246
- task :dump => [:environment, :load_config] do
247
- con = ActiveRecord::Base.connection
248
- filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.dump")
249
-
250
- con.schema_cache.clear!
251
- con.tables.each { |table| con.schema_cache.add(table) }
252
- 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
253
418
  end
254
419
 
255
- desc 'Clear a db/schema_cache.dump file.'
256
- task :clear => [:environment, :load_config] do
257
- filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.dump")
258
- FileUtils.rm(filename) if File.exist?(filename)
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
259
426
  end
260
427
  end
261
-
262
428
  end
263
429
 
264
430
  namespace :structure do
265
- desc 'Dump the database structure to db/structure.sql. Specify another file with DB_STRUCTURE=db/my_structure.sql'
266
- task :dump => [:environment, :load_config] do
267
- filename = ENV['DB_STRUCTURE'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "structure.sql")
268
- current_config = ActiveRecord::Tasks::DatabaseTasks.current_config
269
- ActiveRecord::Tasks::DatabaseTasks.structure_dump(current_config, filename)
270
-
271
- if ActiveRecord::Base.connection.supports_migrations? &&
272
- ActiveRecord::SchemaMigration.table_exists?
273
- File.open(filename, "a") do |f|
274
- f.puts ActiveRecord::Base.connection.dump_schema_information
275
- f.print "\n"
276
- 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)
277
436
  end
278
- db_namespace['structure:dump'].reenable
437
+
438
+ db_namespace["structure:dump"].reenable
279
439
  end
280
440
 
281
- desc "Recreate the databases from the structure.sql file"
282
- task :load => [:load_config] do
283
- ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:sql, ENV['DB_STRUCTURE'])
441
+ desc "Recreates the databases from the structure.sql file"
442
+ task load: [:load_config, :check_protected_environments] do
443
+ ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:sql, ENV["SCHEMA"])
284
444
  end
285
445
 
286
- task :load_if_sql => ['db:create', :environment] do
446
+ task load_if_sql: ["db:create", :environment] do
287
447
  db_namespace["structure:load"].invoke if ActiveRecord::Base.schema_format == :sql
288
448
  end
289
449
  end
290
450
 
291
451
  namespace :test do
292
-
293
- task :deprecated do
294
- Rake.application.top_level_tasks.grep(/^db:test:/).each do |task|
295
- $stderr.puts "WARNING: #{task} is deprecated. The Rails test helper now maintains " \
296
- "your test schema automatically, see the release notes for details."
297
- end
298
- end
299
-
300
452
  # desc "Recreate the test database from the current schema"
301
- task :load => %w(db:test:purge) do
453
+ task load: %w(db:test:purge) do
302
454
  case ActiveRecord::Base.schema_format
303
- when :ruby
304
- db_namespace["test:load_schema"].invoke
305
- when :sql
306
- 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
307
459
  end
308
460
  end
309
461
 
310
462
  # desc "Recreate the test database from an existent schema.rb file"
311
- task :load_schema => %w(db:test:purge) do
312
- begin
313
- should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
314
- ActiveRecord::Schema.verbose = false
315
- ActiveRecord::Tasks::DatabaseTasks.load_schema_for ActiveRecord::Base.configurations['test'], :ruby, ENV['SCHEMA']
316
- ensure
317
- if should_reconnect
318
- ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[ActiveRecord::Tasks::DatabaseTasks.env])
319
- 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))
320
473
  end
321
474
  end
322
475
 
323
476
  # desc "Recreate the test database from an existent structure.sql file"
324
- task :load_structure => %w(db:test:purge) do
325
- ActiveRecord::Tasks::DatabaseTasks.load_schema_for ActiveRecord::Base.configurations['test'], :sql, ENV['SCHEMA']
326
- end
327
-
328
- # desc "Recreate the test database from a fresh schema"
329
- task :clone => %w(db:test:deprecated environment) do
330
- case ActiveRecord::Base.schema_format
331
- when :ruby
332
- db_namespace["test:clone_schema"].invoke
333
- when :sql
334
- 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")
335
481
  end
336
482
  end
337
483
 
338
- # desc "Recreate the test database from a fresh schema.rb file"
339
- task :clone_schema => %w(db:test:deprecated db:schema:dump db:test:load_schema)
340
-
341
- # desc "Recreate the test database from a fresh structure.sql file"
342
- task :clone_structure => %w(db:test:deprecated db:structure:dump db:test:load_structure)
343
-
344
484
  # desc "Empty the test database"
345
- task :purge => %w(environment load_config) do
346
- 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
347
489
  end
348
490
 
349
- # desc 'Check for pending migrations and load the test schema'
350
- task :prepare => %w(environment load_config) do
491
+ # desc 'Load the test schema'
492
+ task prepare: :load_config do
351
493
  unless ActiveRecord::Base.configurations.blank?
352
- db_namespace['test:load'].invoke
494
+ db_namespace["test:load"].invoke
353
495
  end
354
496
  end
355
497
  end
@@ -358,15 +500,19 @@ end
358
500
  namespace :railties do
359
501
  namespace :install do
360
502
  # desc "Copies missing migrations from Railties (e.g. engines). You can specify Railties to use with FROM=railtie1,railtie2"
361
- task :migrations => :'db:load_config' do
362
- to_load = ENV['FROM'].blank? ? :all : ENV['FROM'].split(",").map {|n| n.strip }
503
+ task migrations: :'db:load_config' do
504
+ to_load = ENV["FROM"].blank? ? :all : ENV["FROM"].split(",").map(&:strip)
363
505
  railties = {}
364
506
  Rails.application.migration_railties.each do |railtie|
365
507
  next unless to_load == :all || to_load.include?(railtie.railtie_name)
366
508
 
367
- if railtie.respond_to?(:paths) && (path = railtie.paths['db/migrate'].first)
509
+ if railtie.respond_to?(:paths) && (path = railtie.paths["db/migrate"].first)
368
510
  railties[railtie.railtie_name] = path
369
511
  end
512
+
513
+ unless ENV["MIGRATIONS_PATH"].blank?
514
+ railties[railtie.railtie_name] = railtie.root + ENV["MIGRATIONS_PATH"]
515
+ end
370
516
  end
371
517
 
372
518
  on_skip = Proc.new do |name, migration|
@@ -377,8 +523,8 @@ namespace :railties do
377
523
  puts "Copied migration #{migration.basename} from #{name}"
378
524
  end
379
525
 
380
- ActiveRecord::Migration.copy(ActiveRecord::Migrator.migrations_paths.first, railties,
381
- :on_skip => on_skip, :on_copy => on_copy)
526
+ ActiveRecord::Migration.copy(ActiveRecord::Tasks::DatabaseTasks.migrations_paths.first, railties,
527
+ on_skip: on_skip, on_copy: on_copy)
382
528
  end
383
529
  end
384
530
  end