activerecord 4.2.0 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

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