activerecord 4.2.0 → 5.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 (249) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1537 -789
  3. data/MIT-LICENSE +2 -2
  4. data/README.rdoc +7 -8
  5. data/examples/performance.rb +2 -3
  6. data/examples/simple.rb +0 -1
  7. data/lib/active_record/aggregations.rb +37 -23
  8. data/lib/active_record/association_relation.rb +16 -3
  9. data/lib/active_record/associations/alias_tracker.rb +19 -16
  10. data/lib/active_record/associations/association.rb +23 -9
  11. data/lib/active_record/associations/association_scope.rb +74 -102
  12. data/lib/active_record/associations/belongs_to_association.rb +26 -29
  13. data/lib/active_record/associations/builder/association.rb +28 -34
  14. data/lib/active_record/associations/builder/belongs_to.rb +43 -18
  15. data/lib/active_record/associations/builder/collection_association.rb +12 -20
  16. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +22 -15
  17. data/lib/active_record/associations/builder/has_many.rb +4 -4
  18. data/lib/active_record/associations/builder/has_one.rb +11 -6
  19. data/lib/active_record/associations/builder/singular_association.rb +3 -10
  20. data/lib/active_record/associations/collection_association.rb +61 -33
  21. data/lib/active_record/associations/collection_proxy.rb +81 -35
  22. data/lib/active_record/associations/foreign_association.rb +11 -0
  23. data/lib/active_record/associations/has_many_association.rb +21 -57
  24. data/lib/active_record/associations/has_many_through_association.rb +15 -45
  25. data/lib/active_record/associations/has_one_association.rb +13 -5
  26. data/lib/active_record/associations/join_dependency/join_association.rb +20 -8
  27. data/lib/active_record/associations/join_dependency.rb +37 -21
  28. data/lib/active_record/associations/preloader/association.rb +51 -53
  29. data/lib/active_record/associations/preloader/collection_association.rb +0 -6
  30. data/lib/active_record/associations/preloader/has_many_through.rb +1 -1
  31. data/lib/active_record/associations/preloader/has_one.rb +0 -8
  32. data/lib/active_record/associations/preloader/through_association.rb +27 -14
  33. data/lib/active_record/associations/preloader.rb +18 -8
  34. data/lib/active_record/associations/singular_association.rb +8 -8
  35. data/lib/active_record/associations/through_association.rb +22 -9
  36. data/lib/active_record/associations.rb +321 -212
  37. data/lib/active_record/attribute/user_provided_default.rb +28 -0
  38. data/lib/active_record/attribute.rb +79 -15
  39. data/lib/active_record/attribute_assignment.rb +20 -141
  40. data/lib/active_record/attribute_decorators.rb +6 -5
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +6 -1
  42. data/lib/active_record/attribute_methods/dirty.rb +51 -81
  43. data/lib/active_record/attribute_methods/primary_key.rb +2 -2
  44. data/lib/active_record/attribute_methods/query.rb +2 -2
  45. data/lib/active_record/attribute_methods/read.rb +31 -59
  46. data/lib/active_record/attribute_methods/serialization.rb +13 -16
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +65 -14
  48. data/lib/active_record/attribute_methods/write.rb +14 -38
  49. data/lib/active_record/attribute_methods.rb +70 -45
  50. data/lib/active_record/attribute_mutation_tracker.rb +70 -0
  51. data/lib/active_record/attribute_set/builder.rb +37 -15
  52. data/lib/active_record/attribute_set.rb +34 -3
  53. data/lib/active_record/attributes.rb +199 -73
  54. data/lib/active_record/autosave_association.rb +73 -25
  55. data/lib/active_record/base.rb +35 -27
  56. data/lib/active_record/callbacks.rb +39 -43
  57. data/lib/active_record/coders/json.rb +1 -1
  58. data/lib/active_record/coders/yaml_column.rb +20 -8
  59. data/lib/active_record/collection_cache_key.rb +40 -0
  60. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +457 -181
  61. data/lib/active_record/connection_adapters/abstract/database_limits.rb +3 -3
  62. data/lib/active_record/connection_adapters/abstract/database_statements.rb +83 -59
  63. data/lib/active_record/connection_adapters/abstract/query_cache.rb +3 -3
  64. data/lib/active_record/connection_adapters/abstract/quoting.rb +74 -9
  65. data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -4
  66. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +61 -39
  67. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +246 -185
  68. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +72 -17
  69. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +438 -136
  70. data/lib/active_record/connection_adapters/abstract/transaction.rb +53 -40
  71. data/lib/active_record/connection_adapters/abstract_adapter.rb +166 -66
  72. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +429 -335
  73. data/lib/active_record/connection_adapters/column.rb +28 -43
  74. data/lib/active_record/connection_adapters/connection_specification.rb +15 -27
  75. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +22 -0
  76. data/lib/active_record/connection_adapters/mysql/column.rb +50 -0
  77. data/lib/active_record/connection_adapters/mysql/database_statements.rb +125 -0
  78. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +70 -0
  79. data/lib/active_record/connection_adapters/mysql/quoting.rb +51 -0
  80. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +67 -0
  81. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +93 -0
  82. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +54 -0
  83. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +32 -0
  84. data/lib/active_record/connection_adapters/mysql2_adapter.rb +26 -177
  85. data/lib/active_record/connection_adapters/postgresql/column.rb +5 -10
  86. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +11 -73
  87. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +42 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +27 -56
  89. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +2 -2
  90. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -1
  91. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
  92. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +7 -13
  93. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +3 -1
  94. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +3 -3
  95. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +1 -26
  96. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +2 -2
  97. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +0 -4
  98. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +4 -4
  99. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +50 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +31 -17
  101. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +17 -5
  102. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +2 -2
  103. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +1 -1
  104. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +1 -1
  105. data/lib/active_record/connection_adapters/postgresql/oid.rb +1 -6
  106. data/lib/active_record/connection_adapters/postgresql/quoting.rb +26 -18
  107. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +29 -10
  108. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -79
  109. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +47 -0
  110. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +248 -154
  111. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +35 -0
  112. data/lib/active_record/connection_adapters/postgresql_adapter.rb +258 -170
  113. data/lib/active_record/connection_adapters/schema_cache.rb +36 -23
  114. data/lib/active_record/connection_adapters/sql_type_metadata.rb +32 -0
  115. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +19 -0
  116. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +48 -0
  117. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +22 -0
  118. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +150 -209
  119. data/lib/active_record/connection_adapters/statement_pool.rb +31 -12
  120. data/lib/active_record/connection_handling.rb +38 -15
  121. data/lib/active_record/core.rb +109 -114
  122. data/lib/active_record/counter_cache.rb +14 -25
  123. data/lib/active_record/dynamic_matchers.rb +1 -20
  124. data/lib/active_record/enum.rb +115 -79
  125. data/lib/active_record/errors.rb +88 -48
  126. data/lib/active_record/explain_registry.rb +1 -1
  127. data/lib/active_record/explain_subscriber.rb +2 -2
  128. data/lib/active_record/fixture_set/file.rb +26 -5
  129. data/lib/active_record/fixtures.rb +84 -46
  130. data/lib/active_record/gem_version.rb +2 -2
  131. data/lib/active_record/inheritance.rb +32 -40
  132. data/lib/active_record/integration.rb +4 -4
  133. data/lib/active_record/internal_metadata.rb +56 -0
  134. data/lib/active_record/legacy_yaml_adapter.rb +46 -0
  135. data/lib/active_record/locale/en.yml +3 -2
  136. data/lib/active_record/locking/optimistic.rb +27 -25
  137. data/lib/active_record/locking/pessimistic.rb +1 -1
  138. data/lib/active_record/log_subscriber.rb +43 -21
  139. data/lib/active_record/migration/command_recorder.rb +59 -18
  140. data/lib/active_record/migration/compatibility.rb +126 -0
  141. data/lib/active_record/migration.rb +372 -114
  142. data/lib/active_record/model_schema.rb +128 -38
  143. data/lib/active_record/nested_attributes.rb +71 -32
  144. data/lib/active_record/no_touching.rb +1 -1
  145. data/lib/active_record/null_relation.rb +16 -8
  146. data/lib/active_record/persistence.rb +124 -80
  147. data/lib/active_record/query_cache.rb +15 -18
  148. data/lib/active_record/querying.rb +10 -9
  149. data/lib/active_record/railtie.rb +28 -19
  150. data/lib/active_record/railties/controller_runtime.rb +1 -1
  151. data/lib/active_record/railties/databases.rake +67 -51
  152. data/lib/active_record/readonly_attributes.rb +1 -1
  153. data/lib/active_record/reflection.rb +318 -139
  154. data/lib/active_record/relation/batches/batch_enumerator.rb +67 -0
  155. data/lib/active_record/relation/batches.rb +139 -34
  156. data/lib/active_record/relation/calculations.rb +80 -102
  157. data/lib/active_record/relation/delegation.rb +7 -20
  158. data/lib/active_record/relation/finder_methods.rb +167 -97
  159. data/lib/active_record/relation/from_clause.rb +32 -0
  160. data/lib/active_record/relation/merger.rb +38 -41
  161. data/lib/active_record/relation/predicate_builder/array_handler.rb +12 -16
  162. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +88 -0
  163. data/lib/active_record/relation/predicate_builder/base_handler.rb +17 -0
  164. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +17 -0
  165. data/lib/active_record/relation/predicate_builder/class_handler.rb +27 -0
  166. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +57 -0
  167. data/lib/active_record/relation/predicate_builder/range_handler.rb +33 -0
  168. data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
  169. data/lib/active_record/relation/predicate_builder.rb +124 -82
  170. data/lib/active_record/relation/query_attribute.rb +19 -0
  171. data/lib/active_record/relation/query_methods.rb +323 -257
  172. data/lib/active_record/relation/record_fetch_warning.rb +49 -0
  173. data/lib/active_record/relation/spawn_methods.rb +11 -10
  174. data/lib/active_record/relation/where_clause.rb +174 -0
  175. data/lib/active_record/relation/where_clause_factory.rb +38 -0
  176. data/lib/active_record/relation.rb +176 -115
  177. data/lib/active_record/result.rb +4 -3
  178. data/lib/active_record/runtime_registry.rb +1 -1
  179. data/lib/active_record/sanitization.rb +95 -66
  180. data/lib/active_record/schema.rb +26 -22
  181. data/lib/active_record/schema_dumper.rb +62 -38
  182. data/lib/active_record/schema_migration.rb +11 -17
  183. data/lib/active_record/scoping/default.rb +24 -9
  184. data/lib/active_record/scoping/named.rb +49 -28
  185. data/lib/active_record/scoping.rb +32 -15
  186. data/lib/active_record/secure_token.rb +38 -0
  187. data/lib/active_record/serialization.rb +2 -4
  188. data/lib/active_record/statement_cache.rb +16 -14
  189. data/lib/active_record/store.rb +8 -3
  190. data/lib/active_record/suppressor.rb +58 -0
  191. data/lib/active_record/table_metadata.rb +68 -0
  192. data/lib/active_record/tasks/database_tasks.rb +59 -42
  193. data/lib/active_record/tasks/mysql_database_tasks.rb +32 -26
  194. data/lib/active_record/tasks/postgresql_database_tasks.rb +29 -9
  195. data/lib/active_record/tasks/sqlite_database_tasks.rb +5 -1
  196. data/lib/active_record/timestamp.rb +20 -9
  197. data/lib/active_record/touch_later.rb +58 -0
  198. data/lib/active_record/transactions.rb +159 -67
  199. data/lib/active_record/type/adapter_specific_registry.rb +130 -0
  200. data/lib/active_record/type/date.rb +2 -41
  201. data/lib/active_record/type/date_time.rb +2 -38
  202. data/lib/active_record/type/hash_lookup_type_map.rb +8 -2
  203. data/lib/active_record/type/internal/abstract_json.rb +29 -0
  204. data/lib/active_record/type/internal/timezone.rb +15 -0
  205. data/lib/active_record/type/serialized.rb +21 -14
  206. data/lib/active_record/type/time.rb +10 -16
  207. data/lib/active_record/type/type_map.rb +4 -4
  208. data/lib/active_record/type.rb +66 -17
  209. data/lib/active_record/type_caster/connection.rb +29 -0
  210. data/lib/active_record/type_caster/map.rb +19 -0
  211. data/lib/active_record/type_caster.rb +7 -0
  212. data/lib/active_record/validations/absence.rb +23 -0
  213. data/lib/active_record/validations/associated.rb +10 -3
  214. data/lib/active_record/validations/length.rb +24 -0
  215. data/lib/active_record/validations/presence.rb +11 -12
  216. data/lib/active_record/validations/uniqueness.rb +29 -18
  217. data/lib/active_record/validations.rb +33 -32
  218. data/lib/active_record.rb +9 -2
  219. data/lib/rails/generators/active_record/migration/migration_generator.rb +7 -4
  220. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +8 -6
  221. data/lib/rails/generators/active_record/migration/templates/migration.rb +8 -7
  222. data/lib/rails/generators/active_record/migration.rb +7 -0
  223. data/lib/rails/generators/active_record/model/model_generator.rb +32 -15
  224. data/lib/rails/generators/active_record/model/templates/application_record.rb +5 -0
  225. data/lib/rails/generators/active_record/model/templates/model.rb +3 -0
  226. metadata +60 -34
  227. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -491
  228. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  229. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +0 -11
  230. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  231. data/lib/active_record/connection_adapters/postgresql/oid/infinity.rb +0 -13
  232. data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
  233. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  234. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  235. data/lib/active_record/type/big_integer.rb +0 -13
  236. data/lib/active_record/type/binary.rb +0 -50
  237. data/lib/active_record/type/boolean.rb +0 -30
  238. data/lib/active_record/type/decimal.rb +0 -40
  239. data/lib/active_record/type/decimal_without_scale.rb +0 -11
  240. data/lib/active_record/type/decorator.rb +0 -14
  241. data/lib/active_record/type/float.rb +0 -19
  242. data/lib/active_record/type/integer.rb +0 -55
  243. data/lib/active_record/type/mutable.rb +0 -16
  244. data/lib/active_record/type/numeric.rb +0 -36
  245. data/lib/active_record/type/string.rb +0 -36
  246. data/lib/active_record/type/text.rb +0 -11
  247. data/lib/active_record/type/time_value.rb +0 -38
  248. data/lib/active_record/type/unsigned_integer.rb +0 -15
  249. data/lib/active_record/type/value.rb +0 -101
@@ -1,6 +1,16 @@
1
1
  require 'active_record'
2
2
 
3
3
  db_namespace = namespace :db do
4
+ desc "Set the environment value for the database"
5
+ task "environment:set" => [:environment, :load_config] do
6
+ ActiveRecord::InternalMetadata.create_table
7
+ ActiveRecord::InternalMetadata[:environment] = ActiveRecord::Migrator.current_environment
8
+ end
9
+
10
+ task :check_protected_environments => [:environment, :load_config] do
11
+ ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
12
+ end
13
+
4
14
  task :load_config do
5
15
  ActiveRecord::Base.configurations = ActiveRecord::Tasks::DatabaseTasks.database_configuration || {}
6
16
  ActiveRecord::Migrator.migrations_paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
@@ -12,45 +22,52 @@ db_namespace = namespace :db do
12
22
  end
13
23
  end
14
24
 
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.'
25
+ desc 'Creates the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:create:all to create all databases in the config). Without RAILS_ENV or when RAILS_ENV is development, it defaults to creating the development and test databases.'
16
26
  task :create => [:load_config] do
17
27
  ActiveRecord::Tasks::DatabaseTasks.create_current
18
28
  end
19
29
 
20
30
  namespace :drop do
21
- task :all => :load_config do
31
+ task :all => [:load_config, :check_protected_environments] do
22
32
  ActiveRecord::Tasks::DatabaseTasks.drop_all
23
33
  end
24
34
  end
25
35
 
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
36
+ desc 'Drops the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV or when RAILS_ENV is development, it defaults to dropping the development and test databases.'
37
+ task :drop => [:load_config, :check_protected_environments] do
38
+ db_namespace["drop:_unsafe"].invoke
39
+ end
40
+
41
+ task "drop:_unsafe" => [:load_config] do
28
42
  ActiveRecord::Tasks::DatabaseTasks.drop_current
29
43
  end
30
44
 
31
45
  namespace :purge do
32
- task :all => :load_config do
46
+ task :all => [:load_config, :check_protected_environments] do
33
47
  ActiveRecord::Tasks::DatabaseTasks.purge_all
34
48
  end
35
49
  end
36
50
 
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
51
+ # desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:purge:all to purge all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases."
52
+ task :purge => [:load_config, :check_protected_environments] do
39
53
  ActiveRecord::Tasks::DatabaseTasks.purge_current
40
54
  end
41
55
 
42
56
  desc "Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)."
43
57
  task :migrate => [:environment, :load_config] do
44
58
  ActiveRecord::Tasks::DatabaseTasks.migrate
45
- db_namespace['_dump'].invoke if ActiveRecord::Base.dump_schema_after_migration
59
+ db_namespace['_dump'].invoke
46
60
  end
47
61
 
62
+ # IMPORTANT: This task won't dump the schema if ActiveRecord::Base.dump_schema_after_migration is set to false
48
63
  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}"
64
+ if ActiveRecord::Base.dump_schema_after_migration
65
+ case ActiveRecord::Base.schema_format
66
+ when :ruby then db_namespace["schema:dump"].invoke
67
+ when :sql then db_namespace["structure:dump"].invoke
68
+ else
69
+ raise "unknown schema format #{ActiveRecord::Base.schema_format}"
70
+ end
54
71
  end
55
72
  # Allow this task to be called as many times as required. An example is the
56
73
  # migrate:redo task, which calls other two internally that depend on this one.
@@ -76,7 +93,7 @@ db_namespace = namespace :db do
76
93
  task :up => [:environment, :load_config] do
77
94
  version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
78
95
  raise 'VERSION is required' unless version
79
- ActiveRecord::Migrator.run(:up, ActiveRecord::Migrator.migrations_paths, version)
96
+ ActiveRecord::Migrator.run(:up, ActiveRecord::Tasks::DatabaseTasks.migrations_paths, version)
80
97
  db_namespace['_dump'].invoke
81
98
  end
82
99
 
@@ -84,7 +101,7 @@ db_namespace = namespace :db do
84
101
  task :down => [:environment, :load_config] do
85
102
  version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
86
103
  raise 'VERSION is required - To go down one migration, run db:rollback' unless version
87
- ActiveRecord::Migrator.run(:down, ActiveRecord::Migrator.migrations_paths, version)
104
+ ActiveRecord::Migrator.run(:down, ActiveRecord::Tasks::DatabaseTasks.migrations_paths, version)
88
105
  db_namespace['_dump'].invoke
89
106
  end
90
107
 
@@ -96,13 +113,15 @@ db_namespace = namespace :db do
96
113
  db_list = ActiveRecord::SchemaMigration.normalized_versions
97
114
 
98
115
  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)
116
+ ActiveRecord::Tasks::DatabaseTasks.migrations_paths.flat_map do |path|
117
+ Dir.foreach(path).map do |file|
118
+ next unless ActiveRecord::Migrator.match_to_migration_filename?(file)
119
+
120
+ version, name, scope = ActiveRecord::Migrator.parse_migration_filename(file)
121
+ version = ActiveRecord::SchemaMigration.normalize_migration_number(version)
103
122
  status = db_list.delete(version) ? 'up' : 'down'
104
- [status, version, $2.humanize]
105
- end
123
+ [status, version, (name + scope).humanize]
124
+ end.compact
106
125
  end
107
126
 
108
127
  db_list.map! do |version|
@@ -122,22 +141,19 @@ db_namespace = namespace :db do
122
141
  desc 'Rolls the schema back to the previous version (specify steps w/ STEP=n).'
123
142
  task :rollback => [:environment, :load_config] do
124
143
  step = ENV['STEP'] ? ENV['STEP'].to_i : 1
125
- ActiveRecord::Migrator.rollback(ActiveRecord::Migrator.migrations_paths, step)
144
+ ActiveRecord::Migrator.rollback(ActiveRecord::Tasks::DatabaseTasks.migrations_paths, step)
126
145
  db_namespace['_dump'].invoke
127
146
  end
128
147
 
129
148
  # desc 'Pushes the schema to the next version (specify steps w/ STEP=n).'
130
149
  task :forward => [:environment, :load_config] do
131
150
  step = ENV['STEP'] ? ENV['STEP'].to_i : 1
132
- ActiveRecord::Migrator.forward(ActiveRecord::Migrator.migrations_paths, step)
151
+ ActiveRecord::Migrator.forward(ActiveRecord::Tasks::DatabaseTasks.migrations_paths, step)
133
152
  db_namespace['_dump'].invoke
134
153
  end
135
154
 
136
155
  # 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
156
+ task :reset => [ 'db:drop', 'db:setup' ]
141
157
 
142
158
  # desc "Retrieves the charset for the current environment's database"
143
159
  task :charset => [:environment, :load_config] do
@@ -159,29 +175,29 @@ db_namespace = namespace :db do
159
175
  end
160
176
 
161
177
  # 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
178
+ task :abort_if_pending_migrations => [:environment, :load_config] do
179
+ pending_migrations = ActiveRecord::Migrator.open(ActiveRecord::Tasks::DatabaseTasks.migrations_paths).pending_migrations
164
180
 
165
181
  if pending_migrations.any?
166
182
  puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
167
183
  pending_migrations.each do |pending_migration|
168
184
  puts ' %4d %s' % [pending_migration.version, pending_migration.name]
169
185
  end
170
- abort %{Run `rake db:migrate` to update your database then try again.}
186
+ abort %{Run `rails db:migrate` to update your database then try again.}
171
187
  end
172
188
  end
173
189
 
174
- desc 'Create the database, load the schema, and initialize with the seed data (use db:reset to also drop the database first)'
190
+ desc 'Creates the database, loads the schema, and initializes with the seed data (use db:reset to also drop the database first)'
175
191
  task :setup => ['db:schema:load_if_ruby', 'db:structure:load_if_sql', :seed]
176
192
 
177
- desc 'Load the seed data from db/seeds.rb'
193
+ desc 'Loads the seed data from db/seeds.rb'
178
194
  task :seed do
179
195
  db_namespace['abort_if_pending_migrations'].invoke
180
196
  ActiveRecord::Tasks::DatabaseTasks.load_seed
181
197
  end
182
198
 
183
199
  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."
200
+ 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."
185
201
  task :load => [:environment, :load_config] do
186
202
  require 'active_record/fixtures'
187
203
 
@@ -229,7 +245,7 @@ db_namespace = namespace :db do
229
245
  end
230
246
 
231
247
  namespace :schema do
232
- desc 'Create a db/schema.rb file that is portable against any DB supported by AR'
248
+ desc 'Creates a db/schema.rb file that is portable against any DB supported by Active Record'
233
249
  task :dump => [:environment, :load_config] do
234
250
  require 'active_record/schema_dumper'
235
251
  filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
@@ -239,8 +255,8 @@ db_namespace = namespace :db do
239
255
  db_namespace['schema:dump'].reenable
240
256
  end
241
257
 
242
- desc 'Load a schema.rb file into the database'
243
- task :load => [:environment, :load_config] do
258
+ desc 'Loads a schema.rb file into the database'
259
+ task :load => [:environment, :load_config, :check_protected_environments] do
244
260
  ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
245
261
  end
246
262
 
@@ -249,29 +265,29 @@ db_namespace = namespace :db do
249
265
  end
250
266
 
251
267
  namespace :cache do
252
- desc 'Create a db/schema_cache.dump file.'
268
+ desc 'Creates a db/schema_cache.dump file.'
253
269
  task :dump => [:environment, :load_config] do
254
270
  con = ActiveRecord::Base.connection
255
271
  filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.dump")
256
272
 
257
273
  con.schema_cache.clear!
258
- con.tables.each { |table| con.schema_cache.add(table) }
274
+ con.data_sources.each { |table| con.schema_cache.add(table) }
259
275
  open(filename, 'wb') { |f| f.write(Marshal.dump(con.schema_cache)) }
260
276
  end
261
277
 
262
- desc 'Clear a db/schema_cache.dump file.'
278
+ desc 'Clears a db/schema_cache.dump file.'
263
279
  task :clear => [:environment, :load_config] do
264
280
  filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.dump")
265
- FileUtils.rm(filename) if File.exist?(filename)
281
+ rm_f filename, verbose: false
266
282
  end
267
283
  end
268
284
 
269
285
  end
270
286
 
271
287
  namespace :structure do
272
- desc 'Dump the database structure to db/structure.sql. Specify another file with DB_STRUCTURE=db/my_structure.sql'
288
+ desc 'Dumps the database structure to db/structure.sql. Specify another file with SCHEMA=db/my_structure.sql'
273
289
  task :dump => [:environment, :load_config] do
274
- filename = ENV['DB_STRUCTURE'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "structure.sql")
290
+ filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "structure.sql")
275
291
  current_config = ActiveRecord::Tasks::DatabaseTasks.current_config
276
292
  ActiveRecord::Tasks::DatabaseTasks.structure_dump(current_config, filename)
277
293
 
@@ -285,9 +301,9 @@ db_namespace = namespace :db do
285
301
  db_namespace['structure:dump'].reenable
286
302
  end
287
303
 
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'])
304
+ desc "Recreates the databases from the structure.sql file"
305
+ task :load => [:environment, :load_config, :check_protected_environments] do
306
+ ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:sql, ENV['SCHEMA'])
291
307
  end
292
308
 
293
309
  task :load_if_sql => ['db:create', :environment] do
@@ -319,7 +335,7 @@ db_namespace = namespace :db do
319
335
  begin
320
336
  should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
321
337
  ActiveRecord::Schema.verbose = false
322
- ActiveRecord::Tasks::DatabaseTasks.load_schema_for ActiveRecord::Base.configurations['test'], :ruby, ENV['SCHEMA']
338
+ ActiveRecord::Tasks::DatabaseTasks.load_schema ActiveRecord::Base.configurations['test'], :ruby, ENV['SCHEMA']
323
339
  ensure
324
340
  if should_reconnect
325
341
  ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[ActiveRecord::Tasks::DatabaseTasks.env])
@@ -329,7 +345,7 @@ db_namespace = namespace :db do
329
345
 
330
346
  # desc "Recreate the test database from an existent structure.sql file"
331
347
  task :load_structure => %w(db:test:purge) do
332
- ActiveRecord::Tasks::DatabaseTasks.load_schema_for ActiveRecord::Base.configurations['test'], :sql, ENV['SCHEMA']
348
+ ActiveRecord::Tasks::DatabaseTasks.load_schema ActiveRecord::Base.configurations['test'], :sql, ENV['SCHEMA']
333
349
  end
334
350
 
335
351
  # desc "Recreate the test database from a fresh schema"
@@ -349,11 +365,11 @@ db_namespace = namespace :db do
349
365
  task :clone_structure => %w(db:test:deprecated db:structure:dump db:test:load_structure)
350
366
 
351
367
  # desc "Empty the test database"
352
- task :purge => %w(environment load_config) do
368
+ task :purge => %w(environment load_config check_protected_environments) do
353
369
  ActiveRecord::Tasks::DatabaseTasks.purge ActiveRecord::Base.configurations['test']
354
370
  end
355
371
 
356
- # desc 'Check for pending migrations and load the test schema'
372
+ # desc 'Load the test schema'
357
373
  task :prepare => %w(environment load_config) do
358
374
  unless ActiveRecord::Base.configurations.blank?
359
375
  db_namespace['test:load'].invoke
@@ -366,7 +382,7 @@ namespace :railties do
366
382
  namespace :install do
367
383
  # desc "Copies missing migrations from Railties (e.g. engines). You can specify Railties to use with FROM=railtie1,railtie2"
368
384
  task :migrations => :'db:load_config' do
369
- to_load = ENV['FROM'].blank? ? :all : ENV['FROM'].split(",").map {|n| n.strip }
385
+ to_load = ENV['FROM'].blank? ? :all : ENV['FROM'].split(",").map(&:strip)
370
386
  railties = {}
371
387
  Rails.application.migration_railties.each do |railtie|
372
388
  next unless to_load == :all || to_load.include?(railtie.railtie_name)
@@ -384,7 +400,7 @@ namespace :railties do
384
400
  puts "Copied migration #{migration.basename} from #{name}"
385
401
  end
386
402
 
387
- ActiveRecord::Migration.copy(ActiveRecord::Migrator.migrations_paths.first, railties,
403
+ ActiveRecord::Migration.copy(ActiveRecord::Tasks::DatabaseTasks.migrations_paths.first, railties,
388
404
  :on_skip => on_skip, :on_copy => on_copy)
389
405
  end
390
406
  end
@@ -11,7 +11,7 @@ module ActiveRecord
11
11
  # Attributes listed as readonly will be used to create a new record but update operations will
12
12
  # ignore these fields.
13
13
  def attr_readonly(*attributes)
14
- self._attr_readonly = Set.new(attributes.map { |a| a.to_s }) + (self._attr_readonly || [])
14
+ self._attr_readonly = Set.new(attributes.map(&:to_s)) + (self._attr_readonly || [])
15
15
  end
16
16
 
17
17
  # Returns an array of all the attributes that have been specified as readonly.