From 68fb69726eef3d3f6f963f7196655d281ff56fbd Mon Sep 17 00:00:00 2001 From: Jason Harrelson Date: Sun, 24 Mar 2013 11:03:52 -0500 Subject: [PATCH] Make Genesis a Railtie. - Load rake tasks using Railtie. - Load ActiveRecordExtensions using Railtie. --- .../genesis/install/install_generator.rb | 1 - lib/genesis.rb | 9 +- lib/genesis/railtie.rb | 16 ++++ .../templates => genesis/tasks}/genesis.rake | 32 +++++-- lib/tasks/genesis.rake | 88 ------------------- 5 files changed, 46 insertions(+), 100 deletions(-) create mode 100644 lib/genesis/railtie.rb rename lib/{generators/genesis/install/templates => genesis/tasks}/genesis.rake (72%) delete mode 100644 lib/tasks/genesis.rake diff --git a/lib/generators/genesis/install/install_generator.rb b/lib/generators/genesis/install/install_generator.rb index 05bebd4..d5863ee 100644 --- a/lib/generators/genesis/install/install_generator.rb +++ b/lib/generators/genesis/install/install_generator.rb @@ -15,7 +15,6 @@ def self.source_root def install_seeding envs.each { |env| empty_directory "db/seeds/#{env}" } - copy_file 'genesis.rake', 'lib/tasks/genesis.rake' copy_file 'genesis_callbacks.rb', 'db/seeds/genesis_callbacks.rb' end diff --git a/lib/genesis.rb b/lib/genesis.rb index d367845..b39aeb5 100644 --- a/lib/genesis.rb +++ b/lib/genesis.rb @@ -1,12 +1,13 @@ -$:.unshift(File.dirname(__FILE__)) unless - $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__))) +#$:.unshift(File.dirname(__FILE__)) unless + #$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__))) require 'genesis/active_record_extensions' -require 'genesis/seeder' +require 'genesis/railtie' require 'genesis/schema_seed' +require 'genesis/seeder' module Genesis SEEDS_ROOT = 'db/seeds' end -ActiveRecord::Base.send :include, Genesis::ActiveRecordExtensions if defined? ActiveRecord::Base +#ActiveRecord::Base.send :include, Genesis::ActiveRecordExtensions if defined? ActiveRecord::Base diff --git a/lib/genesis/railtie.rb b/lib/genesis/railtie.rb new file mode 100644 index 0000000..c9da915 --- /dev/null +++ b/lib/genesis/railtie.rb @@ -0,0 +1,16 @@ +require 'genesis' +require 'rails' + +class Railtie < Rails::Railtie + + initializer 'genesis.insert_into_active_record' do |app| + ActiveSupport.on_load :active_record do + ActiveRecord::Base.send :include, Genesis::ActiveRecordExtensions + end + end + + rake_tasks do + Dir[File.join(File.dirname(__FILE__),'tasks/*.rake')].each { |f| load f } + end + +end diff --git a/lib/generators/genesis/install/templates/genesis.rake b/lib/genesis/tasks/genesis.rake similarity index 72% rename from lib/generators/genesis/install/templates/genesis.rake rename to lib/genesis/tasks/genesis.rake index e39688e..df9e25f 100644 --- a/lib/generators/genesis/install/templates/genesis.rake +++ b/lib/genesis/tasks/genesis.rake @@ -1,4 +1,5 @@ namespace :db do + desc "Loads seed data for the current environment." task :genesis => :environment do Genesis::Seeder.verify_or_create_version_table @@ -22,12 +23,31 @@ namespace :db do puts message( contexts, :using_contexts => using_contexts ), "", "" end - desc "Drops and recreates all tables along with seeding the database" + desc "Recreates the databse by migrating down to VERSION=0 and then db:migrate and db:seed" task :mulligan => :environment do - Rake::Task['db:migrate:reset'].invoke + raise 'Cannot seed production' if ENV['RAILS_ENV'] == 'production' || Rails.env.production? + + ENV['VERSION']= '0' + Rake::Task['db:migrate'].invoke + Rake::Task['db:migrate'].reenable + ENV.delete 'VERSION' + Rake::Task["db:migrate"].invoke + Genesis::SchemaSeed.delete_all Rake::Task['db:genesis'].invoke end + namespace :mulligan do + + desc 'Recreates database using db:migrate:reset and db:seed (helpful when an irreversible migration is blocking db:mulligan)' + task :reset => :environment do + raise 'Cannot seed production' if ENV['RAILS_ENV'] == 'production' || Rails.env.production? + + Rake::Task['db:migrate:reset'].invoke + Rake::Task['db:genesis'].invoke + end + + end + desc "An alias for the db:genesis task" task :seed => :environment do Rake::Task['db:genesis'].invoke @@ -38,8 +58,10 @@ namespace :db do Rake::Task['db:regenesis'].invoke end - desc "Removes all data, runs migrations and then seeds the database" + desc "Removes all data and then seeds the database" task :regenesis => :environment do + raise 'Cannot seed production' if ENV['RAILS_ENV'] == 'production' || Rails.env.production? + ActiveRecord::Base.connection.tables.select { |t| !['schema_migrations', 'schema_seeds', 'versions', 'sessions'].include?( t ) }.each do |table| puts "Emptying the #{table} table" klass = table.classify.to_s.constantize @@ -49,11 +71,7 @@ namespace :db do puts '' Genesis::SchemaSeed.delete_all - ActiveRecord::Base.connection.execute( 'DELETE FROM `versions`' ) - ActiveRecord::Base.connection.execute( 'DELETE FROM `sessions`' ) - Rake::Task['db:migrate'].invoke - Rake::Task['db:test:prepare'].invoke Rake::Task['db:genesis'].invoke end diff --git a/lib/tasks/genesis.rake b/lib/tasks/genesis.rake deleted file mode 100644 index e39688e..0000000 --- a/lib/tasks/genesis.rake +++ /dev/null @@ -1,88 +0,0 @@ -namespace :db do - desc "Loads seed data for the current environment." - task :genesis => :environment do - Genesis::Seeder.verify_or_create_version_table - ignores = %w(genesis_common.rb) - seeds = Dir[File.join( Rails.root, 'db', 'seeds', '*.rb' )] + - Dir[File.join( Rails.root, 'db', 'seeds', Rails.env, '*.rb') ] - - contexts = ENV['CONTEXTS'] - unless contexts.nil? || contexts.empty? - using_contexts = true - contexts = expand_contexts if contexts == 'all' - contexts.split( ',' ).each do |context| - seeds += Dir[File.join( Rails.root, 'db', 'seeds', 'contexts', context, '*.rb' )] - end - end - - - - puts "", message( contexts, :using_contexts => using_contexts, :start => true ), "" - Genesis::Seeder.run( seeds, ENV['VERSION'] || nil, ignores ) - puts message( contexts, :using_contexts => using_contexts ), "", "" - end - - desc "Drops and recreates all tables along with seeding the database" - task :mulligan => :environment do - Rake::Task['db:migrate:reset'].invoke - Rake::Task['db:genesis'].invoke - end - - desc "An alias for the db:genesis task" - task :seed => :environment do - Rake::Task['db:genesis'].invoke - end - - desc "An alias for the db:regenesis task" - task :reseed => :environment do - Rake::Task['db:regenesis'].invoke - end - - desc "Removes all data, runs migrations and then seeds the database" - task :regenesis => :environment do - ActiveRecord::Base.connection.tables.select { |t| !['schema_migrations', 'schema_seeds', 'versions', 'sessions'].include?( t ) }.each do |table| - puts "Emptying the #{table} table" - klass = table.classify.to_s.constantize - klass.delete_all - end - - puts '' - - Genesis::SchemaSeed.delete_all - ActiveRecord::Base.connection.execute( 'DELETE FROM `versions`' ) - ActiveRecord::Base.connection.execute( 'DELETE FROM `sessions`' ) - - Rake::Task['db:migrate'].invoke - Rake::Task['db:test:prepare'].invoke - Rake::Task['db:genesis'].invoke - end - - namespace :genesis do - desc "Returns the current seed version from teh schema_seeds table" - task :version => :environment do - puts "[Genesis Seed Version] #{Genesis::Seeder.get_current_version}" - end - end -end - -def seeds_root - File.join( Rails.root, 'db', 'seeds' ) -end - -def contexts_root - File.join( seeds_root, 'contexts' ) -end - -def expand_contexts - Dir[File.join( contexts_root, '*' )].map { |d| d.split( '/' ).last }.join ',' -end - -def message( contexts, options={} ) - msg = options[:using_contexts] ? - "*** #{start_or_end_word( options )} seeding (contexts: #{contexts.split(',').join(', ')})" : - "*** #{start_or_end_word( options )} seeding" -end - -def start_or_end_word( options ) - return options[:start] ? 'Start' : 'End' -end