new rakefile

This commit is contained in:
carlad 2016-02-04 21:27:20 +01:00
parent 14ec02da79
commit 4d98ccafd6
2 changed files with 94 additions and 43 deletions

View File

@ -18,10 +18,7 @@ services:
- redis - redis
before_script: before_script:
- RAILS_ENV=test - 'RAILS_ENV=test bundle exec rake db:create db:migrate --trace'
- createdb travis_test
- createdb travis_pro_test
- bundle exec rake db:migrate --trace
script: script:
- bundle exec rspec spec - bundle exec rspec spec

136
Rakefile
View File

@ -1,47 +1,101 @@
require 'bundler/setup'
require 'travis'
require 'travis/engine'
begin
# ENV['SCHEMA'] = File.expand_path('../db/schema.rb', $:.detect { |p| p.include?('travis-core') })
require 'micro_migrations'
rescue LoadError
# we can't load micro migrations on production
end
begin
require 'rspec/core/rake_task' require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new require 'bundler/setup'
task default: :spec require 'micro_migrations'
rescue LoadError require 'travis'
warn "could not load rspec"
ActiveRecord::Base.schema_format = :sql
Rails.application.config.paths["db/migrate"] = ["db/migrate", "#{Gem.loaded_specs['travis-core'].full_gem_path}/db/migrate"]
desc 'Run specs'
RSpec::Core::RakeTask.new do |t|
t.pattern = './spec/**/*_spec.rb'
end end
desc "generate gemspec" module ActiveRecord
task 'travis-api.gemspec' do class Migration
content = File.read 'travis-api.gemspec' class << self
attr_accessor :disable_ddl_transaction
fields = { end
authors: `git shortlog -sn`.scan(/[^\d\s].*/),
email: `git shortlog -sne`.scan(/[^<]+@[^>]+/), # Disable DDL transactions for this migration.
files: `git ls-files`.split("\n").reject { |f| f =~ /^(\.|Gemfile)/ } def self.disable_ddl_transaction!
} @disable_ddl_transaction = true
end
fields.each do |field, values|
updated = " s.#{field} = [" def disable_ddl_transaction # :nodoc:
updated << values.map { |v| "\n %p" % v }.join(',') self.class.disable_ddl_transaction
updated << "\n ]" end
content.sub!(/ s\.#{field} = \[\n( .*\n)* \]/, updated) end
end
class Migrator
File.open('travis-api.gemspec', 'w') { |f| f << content } def use_transaction?(migration)
end !migration.disable_ddl_transaction && Base.connection.supports_ddl_transactions?
end
task default: 'travis-api.gemspec'
def ddl_transaction(migration, &block)
tasks_path = File.expand_path('../lib/tasks/*.rake', __FILE__) if use_transaction?(migration)
Dir.glob(tasks_path).each { |r| import r } Base.transaction { block.call }
else
block.call
end
end
def migrate(&block)
current = migrations.detect { |m| m.version == current_version }
target = migrations.detect { |m| m.version == @target_version }
if target.nil? && @target_version && @target_version > 0
raise UnknownMigrationVersionError.new(@target_version)
end
start = up? ? 0 : (migrations.index(current) || 0)
finish = migrations.index(target) || migrations.size - 1
runnable = migrations[start..finish]
# skip the last migration if we're headed down, but not ALL the way down
runnable.pop if down? && target
ran = []
runnable.each do |migration|
if block && !block.call(migration)
next
end
Base.logger.info "Migrating to #{migration.name} (#{migration.version})" if Base.logger
seen = migrated.include?(migration.version.to_i)
# On our way up, we skip migrating the ones we've already migrated
next if up? && seen
# On our way down, we skip reverting the ones we've never migrated
if down? && !seen
migration.announce 'never migrated, skipping'; migration.write
next
end
begin
ddl_transaction(migration) do
migration.migrate(@direction)
record_version_state_after_migrating(migration.version)
end
ran << migration
rescue => e
canceled_msg = Base.connection.supports_ddl_transactions? ? "this and " : ""
raise StandardError, "An error has occurred, #{canceled_msg}all later migrations canceled:\n\n#{e}", e.backtrace
end
end
ran
end
end
class MigrationProxy
delegate :disable_ddl_transaction, to: :migration
end
end
task :default => :spec
module ActiveRecord module ActiveRecord
class Migration class Migration
class << self class << self