diff --git a/lib/generators/post_deployment_migration/USAGE b/lib/generators/post_deployment_migration/USAGE new file mode 100644 index 0000000000..57f3c6aa1c --- /dev/null +++ b/lib/generators/post_deployment_migration/USAGE @@ -0,0 +1,10 @@ +Description: + Generate a Rails migration in the db/post_migrate/ dir. + + Interacts with the post_deployment_migrations initializer. + +Example: + bin/rails generate post_deployment_migration IsolateChanges + + Creates a migration in db/post_migrate/_isolate_changes.rb + which will have `disable_ddl_transaction!` and a `change` method included. diff --git a/lib/generators/post_deployment_migration/post_deployment_migration_generator.rb b/lib/generators/post_deployment_migration/post_deployment_migration_generator.rb new file mode 100644 index 0000000000..adb34a2896 --- /dev/null +++ b/lib/generators/post_deployment_migration/post_deployment_migration_generator.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +require 'rails/generators/active_record' + +class PostDeploymentMigrationGenerator < Rails::Generators::NamedBase + source_root File.expand_path('templates', __dir__) + + include Rails::Generators::Migration + + def create_post_deployment_migration + migration_template 'migration.erb', "db/post_migrate/#{file_name}.rb" + end + + def self.next_migration_number(path) + ActiveRecord::Generators::Base.next_migration_number(path) + end +end diff --git a/lib/generators/post_deployment_migration/templates/migration.erb b/lib/generators/post_deployment_migration/templates/migration.erb new file mode 100644 index 0000000000..fd6a02a0f7 --- /dev/null +++ b/lib/generators/post_deployment_migration/templates/migration.erb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>] + disable_ddl_transaction! + + def change + end +end diff --git a/lib/generators/post_deployment_migration_generator.rb b/lib/generators/post_deployment_migration_generator.rb deleted file mode 100644 index 798c01b883..0000000000 --- a/lib/generators/post_deployment_migration_generator.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -require 'rails/generators' - -module Rails - class PostDeploymentMigrationGenerator < Rails::Generators::NamedBase - def create_migration_file - timestamp = Time.zone.now.strftime('%Y%m%d%H%M%S') - - template 'migration.rb', "db/post_migrate/#{timestamp}_#{file_name}.rb" - end - - def migration_class_name - file_name.camelize - end - end -end diff --git a/lib/templates/rails/post_deployment_migration/migration.rb b/lib/templates/rails/post_deployment_migration/migration.rb deleted file mode 100644 index 503205b841..0000000000 --- a/lib/templates/rails/post_deployment_migration/migration.rb +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -class <%= migration_class_name %> < ActiveRecord::Migration[5.2] - disable_ddl_transaction! - - def change - end -end diff --git a/spec/generators/post_deployment_migration_generator_spec.rb b/spec/generators/post_deployment_migration_generator_spec.rb new file mode 100644 index 0000000000..d552880e3b --- /dev/null +++ b/spec/generators/post_deployment_migration_generator_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require 'rails_helper' +require 'rails/generators/testing/behaviour' +require 'rails/generators/testing/assertions' + +require 'generators/post_deployment_migration/post_deployment_migration_generator' + +describe PostDeploymentMigrationGenerator, type: :generator do + include Rails::Generators::Testing::Behaviour + include Rails::Generators::Testing::Assertions + include FileUtils + + tests described_class + destination File.expand_path('../../tmp', __dir__) + before { prepare_destination } + after { rm_rf(destination_root) } + + describe 'the migration' do + it 'generates expected file' do + run_generator %w(Changes) + + assert_migration('db/post_migrate/changes.rb', /disable_ddl/) + assert_migration('db/post_migrate/changes.rb', /change/) + end + end +end