Class: Gemika::Database

Inherits:
Object
  • Object
show all
Defined in:
lib/gemika/database.rb

Overview

Helpers for creating a test database.

Defined Under Namespace

Classes: Error, UnknownAdapter

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Database

Returns a new instance of Database.



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/gemika/database.rb', line 15

def initialize(options = {})
  yaml_config_folder = options.fetch(:config_folder, 'spec/support')
  yaml_config_filename = if Env.travis?
    'database.travis.yml'
  elsif Env.github?
    'database.github.yml'
  else
    'database.yml'
  end
  yaml_config_path = File.join(yaml_config_folder, yaml_config_filename)
  if File.exists?(yaml_config_path)
    @yaml_config = YAML.load_file(yaml_config_path)
  else
    @yaml_config = {}
    warn "No database configuration in #{yaml_config_path}, using defaults: #{adapter_config.inspect}"
  end
  @connected = false
end

Instance Method Details

#adapter_configObject

Returns a hash of ActiveRecord adapter options for the currently activated database gem.



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/gemika/database.rb', line 91

def adapter_config
  default_config = {}
  default_config['database'] = guess_database_name
  if Env.gem?('pg')
    default_config['adapter'] = 'postgresql'
    default_config['username'] = 'postgres' if Env.travis?
    default_config['password'] = ''
    user_config = @yaml_config['postgresql'] || @yaml_config['postgres'] || @yaml_config['pg'] || {}
  elsif Env.gem?('mysql2')
    default_config['adapter'] = 'mysql2'
    default_config['username'] = 'travis' if Env.travis?
    default_config['encoding'] = 'utf8'
    user_config = (@yaml_config['mysql'] || @yaml_config['mysql2']) || {}
  elsif Env.gem?('sqlite3')
    default_config['adapter'] = 'sqlite3'
    default_config['database'] = ':memory:'
    user_config = (@yaml_config['sqlite'] || @yaml_config['sqlite3']) || {}
  else
    raise UnknownAdapter, "Unknown database type. Either 'pg', 'mysql2', or 'sqlite3' gem should be in your current bundle."
  end
  default_config.merge(user_config).symbolize_keys
end

#connectObject

Connects ActiveRecord to the database configured in spec/support/database.yml.



37
38
39
40
41
42
# File 'lib/gemika/database.rb', line 37

def connect
  unless @connected
    ActiveRecord::Base.establish_connection(**adapter_config)
    @connected = true
  end
end

#drop_tables!Object

Drops all tables from the current database.



47
48
49
50
51
52
# File 'lib/gemika/database.rb', line 47

def drop_tables!
  connect
  connection.tables.each do |table|
    connection.drop_table table
  end
end

#migrate(&block) ⇒ Object

Runs the ActiveRecord database migration described in block.

end

Examples:

Gemika::Database.new.migrate do
  create_table :users do |t|
    t.string :name
    t.string :email
    t.string :city
  end


65
66
67
68
# File 'lib/gemika/database.rb', line 65

def migrate(&block)
  connect
  ActiveRecord::Migration.class_eval(&block)
end

#rewrite_schema!(&block) ⇒ Object

Drops all tables, then runs the ActiveRecord database migration described in block.

end

Examples:

Gemika::Database.new.rewrite_schema! do
  create_table :users do |t|
    t.string :name
    t.string :email
    t.string :city
  end


82
83
84
85
86
# File 'lib/gemika/database.rb', line 82

def rewrite_schema!(&block)
  connect
  drop_tables!
  migrate(&block)
end