Skip to content

Commit

Permalink
Allow to run migrations with given scope, with SCOPE=<scope>
Browse files Browse the repository at this point in the history
Scope in migrations can be defined by adding suffix in filename,
like: 01_a_migration.blog.rb. Such migration have blog scope.

Scope is automatically added while copying migrations from engine,
so if you want to revert all of the migrations from given engine,
you can just run db:migrate with SCOPE, like:

    rake db:migrate SCOPE=blog
  • Loading branch information
drogus committed Dec 9, 2011
1 parent f0b782d commit 35a1744
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 1 deletion.
12 changes: 12 additions & 0 deletions activerecord/CHANGELOG.md
@@ -1,5 +1,17 @@
## Rails 3.2.0 (unreleased) ## ## Rails 3.2.0 (unreleased) ##


* Added ability to run migrations only for given scope, which allows
to run migrations only from one engine (for example to revert changes
from engine that you want to remove).

Example:
rake db:migrate SCOPE=blog

*Piotr Sarnacki*

* Migrations copied from engines are now scoped with engine's name,
for example 01_create_posts.blog.rb. *Piotr Sarnacki*

* Implements `AR::Base.silence_auto_explain`. This method allows the user to * Implements `AR::Base.silence_auto_explain`. This method allows the user to
selectively disable automatic EXPLAINs within a block. *fxn* selectively disable automatic EXPLAINs within a block. *fxn*


Expand Down
4 changes: 3 additions & 1 deletion activerecord/lib/active_record/railties/databases.rake
Expand Up @@ -149,7 +149,9 @@ db_namespace = namespace :db do
desc "Migrate the database (options: VERSION=x, VERBOSE=false)." desc "Migrate the database (options: VERSION=x, VERBOSE=false)."
task :migrate => [:environment, :load_config] do task :migrate => [:environment, :load_config] do
ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
ActiveRecord::Migrator.migrate(ActiveRecord::Migrator.migrations_paths, ENV["VERSION"] ? ENV["VERSION"].to_i : nil) ActiveRecord::Migrator.migrate(ActiveRecord::Migrator.migrations_paths, ENV["VERSION"] ? ENV["VERSION"].to_i : nil) do |migration|
ENV["SCOPE"].blank? || (ENV["SCOPE"] == migration.scope)
end
db_namespace['_dump'].invoke db_namespace['_dump'].invoke
end end


Expand Down
24 changes: 24 additions & 0 deletions railties/test/application/rake/migrations_test.rb
Expand Up @@ -12,6 +12,30 @@ def setup
def teardown def teardown
teardown_app teardown_app
end end

test 'running migrations with given scope' do
Dir.chdir(app_path) do
`rails generate model user username:string password:string`
end
app_file "db/migrate/01_a_migration.bukkits.rb", <<-MIGRATION
class AMigration < ActiveRecord::Migration
end
MIGRATION

output = Dir.chdir(app_path) { `rake db:migrate SCOPE=bukkits` }
assert_no_match(/create_table\(:users\)/, output)
assert_no_match(/CreateUsers/, output)
assert_no_match(/add_column\(:users, :email, :string\)/, output)

assert_match(/AMigration: migrated/, output)

output = Dir.chdir(app_path) { `rake db:migrate SCOPE=bukkits VERSION=0` }
assert_no_match(/drop_table\(:users\)/, output)
assert_no_match(/CreateUsers/, output)
assert_no_match(/remove_column\(:users, :email\)/, output)

assert_match(/AMigration: reverted/, output)
end


test 'model and migration generator with change syntax' do test 'model and migration generator with change syntax' do
Dir.chdir(app_path) do Dir.chdir(app_path) do
Expand Down

0 comments on commit 35a1744

Please sign in to comment.