tasks/database.rb in pact_broker-2.0.0.beta.1 vs tasks/database.rb in pact_broker-2.0.0.beta.2

- old
+ new

@@ -1,14 +1,17 @@ require 'pact_broker/project_root' require 'sequel' +require 'yaml' require 'db' Sequel.extension :migration module PactBroker module Database + TABLES = [:pacts, :pact_version_contents, :tags, :verifications, :pact_publications, :pact_versions, :webhook_headers, :webhooks, :versions, :pacticipants].freeze + extend self def migrate target = nil opts = target ? {target: target} : {} Sequel::Migrator.run(database, migrations_dir, opts) @@ -30,25 +33,98 @@ def ensure_database_dir_exists ensure_not_production FileUtils.mkdir_p File.dirname(database_file_path) end + def drop_objects + drop_views + drop_tables + end + + def drop_tables + (TABLES + [:schema_info]).each do | table_name | + if database.table_exists?(table_name) + database.drop_table(table_name, cascade: psql?) + end + end + end + + def drop_views + database.views.each do | view_name | + begin + # checking for existance using table_exists? doesn't work in sqlite + database.drop_view(view_name, cascade: psql?) + rescue Sequel::DatabaseError => e + # Cascade will have deleted some views already with pg + raise e unless e.cause.class.name == 'PG::UndefinedTable' + end + end + end + + def create + puts adapter + if psql? + system('psql postgres -c "create database pact_broker"') + system('psql postgres -c "CREATE USER pact_broker WITH PASSWORD \'pact_broker\'"') + system('psql postgres -c "GRANT ALL PRIVILEGES ON DATABASE pact_broker to pact_broker"') + elsif sqlite? + ensure_database_dir_exists + else + raise "Unknown database adapter #{adapter}" + end + end + + def recreate + drop_tables + create + end + + def truncate + TABLES.each do | table_name | + if database.table_exists?(table_name) + database[table_name].delete + end + end + end + + def database= database + @@database = database + end + + def database + @@database ||= ::DB.connection_for_env env + end + private def ensure_not_production raise "Cannot delete production database using this task" if env == 'production' end - def database - ::DB.connection_for_env env + def psql? + adapter == 'postgres' end + def sqlite? + adapter == 'sqlite' + end + def migrations_dir PactBroker.project_root.join('db','migrations') end def database_file_path - ::DB.configuration_for_env(env)['database'] + configuration_for_env(env)['database'] + end + + def adapter + configuration_for_env(env)['adapter'] + end + + def configuration_for_env env + database_yml = PactBroker.project_root.join('config','database.yml') + config = YAML.load(ERB.new(File.read(database_yml)).result) + config.fetch(env) end def env ENV.fetch('RACK_ENV') end