Module: UffDbLoader

Defined in:
lib/railtie.rb,
lib/configuration.rb,
lib/uff_db_loader.rb,
lib/uff_db_loader/mysql.rb,
lib/uff_db_loader/version.rb,
lib/uff_db_loader/postgresql.rb

Defined Under Namespace

Modules: Mysql, Postgresql Classes: Configuration, ForbiddenEnvironmentError, InstallationDidNotRunError, Railtie, UnknownDatabaseSystem

Constant Summary collapse

TIMESTAMP_FORMAT =
"%Y_%m_%d_%H_%M_%S"
TIMESTAMP_LENGTH =
Time.now.strftime(TIMESTAMP_FORMAT).size
VERSION =
"3.2.0"

Class Method Summary collapse

Class Method Details

.configObject



13
14
15
# File 'lib/uff_db_loader.rb', line 13

def config
  @configuration ||= Configuration.new
end

.configure {|config| ... } ⇒ Object

Yields:



25
26
27
# File 'lib/uff_db_loader.rb', line 25

def configure
  yield(config)
end

.create_database(database_name) ⇒ Object



60
61
62
# File 'lib/uff_db_loader.rb', line 60

def create_database(database_name)
  config.database_system.create_database(database_name)
end

.create_initializerObject



132
133
134
135
136
137
138
139
140
141
142
# File 'lib/uff_db_loader.rb', line 132

def create_initializer
  template = ERB.new(File.read(initializer_template_path))

  File.write(
    initializer_path,
    template.result_with_hash(
      used_database_system: used_database_system,
      environments: environments
    )
  )
end

.current_database_nameObject



93
94
95
96
97
# File 'lib/uff_db_loader.rb', line 93

def current_database_name
  File.read(database_name_file).strip.presence
rescue IOError, Errno::ENOENT
  # We expect this file to be missing in non-dev environments.
end

.databasesObject



68
69
70
71
72
73
# File 'lib/uff_db_loader.rb', line 68

def databases
  config.database_system.list_databases
    .select { |line| line =~ /#{config.app_name}_(#{config.environments.join("|")})_(\d|_)+/ }
    .sort_by { |database| database[-TIMESTAMP_LENGTH..] }
    .reverse
end

.drop_database(database_name) ⇒ Object



64
65
66
# File 'lib/uff_db_loader.rb', line 64

def drop_database(database_name)
  config.database_system.drop_database(database_name)
end

.dump_from(environment) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/uff_db_loader.rb', line 33

def dump_from(environment)
  FileUtils.mkdir_p(config.dumps_directory)

  log "⬇️  Creating dump ..."

  target = dump_file_path(Time.now.strftime("#{config.app_name}_#{environment}_#{TIMESTAMP_FORMAT}"))

  command_successful = system(dump_command(environment, target))
  raise "Command did not run succesful: #{dump_command(environment, target)}" unless command_successful

  log "✅ Succesfully dumped to #{target}"

  target
end

.dumpsObject



75
76
77
78
79
80
81
# File 'lib/uff_db_loader.rb', line 75

def dumps
  Dir
    .glob("#{config.dumps_directory}/#{config.app_name}*")
    .map { |f| File.basename(f, ".*") }
    .sort_by { |dump| dump[-TIMESTAMP_LENGTH..] }
    .reverse
end

.ensure_installation!Object



103
104
105
106
107
# File 'lib/uff_db_loader.rb', line 103

def ensure_installation!
  unless File.read(UffDbLoader.config.database_config_file).include?("UffDbLoader.current_database_name")
    raise InstallationDidNotRunError, "Please run bin/rails uff_db_loader:install"
  end
end

.ensure_valid_environment!(environment) ⇒ Object



48
49
50
51
52
# File 'lib/uff_db_loader.rb', line 48

def ensure_valid_environment!(environment)
  unless config.environments.include?(environment)
    raise ForbiddenEnvironmentError, "Invalid environment: #{environment}."
  end
end

.initializer_pathObject



128
129
130
# File 'lib/uff_db_loader.rb', line 128

def initializer_path
  Rails.root.join("config", "initializers", "uff_db_loader.rb")
end

.load_dump_into_database(database_name) ⇒ Object



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/uff_db_loader.rb', line 109

def load_dump_into_database(database_name)
  UffDbLoader.drop_database(database_name)
  UffDbLoader.create_database(database_name)

  log "🗂  Created database #{database_name}"

  dump_file_path = dump_file_path(database_name)

  command_successful = system(restore_command(database_name, dump_file_path))
  raise "Command did not run succesful: #{restore_command(database_name, dump_file_path)}" unless command_successful

  log "✅ Succesfully loaded #{dump_file_path} into #{database_name}"

  remember_database_name(database_name)
  restart_rails_server

  log "♻️  Restarted rails server with new database."
end

.log(message) ⇒ Object



17
18
19
# File 'lib/uff_db_loader.rb', line 17

def log(message)
  puts "[UffDbLoader] #{message}"
end

.prune_dump_directoryObject



54
55
56
57
58
# File 'lib/uff_db_loader.rb', line 54

def prune_dump_directory
  FileUtils.rm_f(
    FileList["#{config.dumps_directory}/*"].exclude(dump_file_path(current_database_name)).to_a
  )
end

.remember_database_name(database_name) ⇒ Object



99
100
101
# File 'lib/uff_db_loader.rb', line 99

def remember_database_name(database_name)
  File.write(database_name_file, database_name)
end

.resetObject



21
22
23
# File 'lib/uff_db_loader.rb', line 21

def reset
  @configuration = Configuration.new
end

.restart_rails_serverObject



29
30
31
# File 'lib/uff_db_loader.rb', line 29

def restart_rails_server
  system("bin/rails restart")
end

.setup_dynamic_database_name_in_configObject



83
84
85
86
87
88
89
90
91
# File 'lib/uff_db_loader.rb', line 83

def setup_dynamic_database_name_in_config
  old_database_name = Rails.configuration.database_configuration["development"]["database"]

  return false if old_database_name.nil?

  old_config = File.read(UffDbLoader.config.database_config_file)
  new_config = old_config.sub(old_database_name, database_name_template(old_database_name))
  File.write(UffDbLoader.config.database_config_file, new_config)
end