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, DefaultDatabaseNotFoundError, ForbiddenEnvironmentError, InstallationDidNotRunError, Railtie, UnknownDatabaseSystem

Constant Summary collapse

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

Class Method Summary collapse

Class Method Details

.configObject



15
16
17
# File 'lib/uff_db_loader.rb', line 15

def config
  @configuration ||= Configuration.new
end

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

Yields:



27
28
29
# File 'lib/uff_db_loader.rb', line 27

def configure
  yield(config)
end

.connect_to_default_databaseObject



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

def connect_to_default_database
  database_config = Rails.configuration.database_configuration["development"]

  # Switch away from a selected dump database before drop/create operations.
  remember_database_name("")
  ActiveRecord::Base.remove_connection
  ActiveRecord::Base.establish_connection(database_config)
  ActiveRecord::Base.connection
rescue ActiveRecord::NoDatabaseError
  database_name = database_config["database"].inspect

  raise DefaultDatabaseNotFoundError,
    "Default local database #{database_name} does not exist. Run `bin/rails db:create` before using UffDbLoader."
end

.create_database(database_name) ⇒ Object



77
78
79
# File 'lib/uff_db_loader.rb', line 77

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

.create_initializerObject



149
150
151
152
153
154
155
156
157
158
159
# File 'lib/uff_db_loader.rb', line 149

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



110
111
112
113
114
# File 'lib/uff_db_loader.rb', line 110

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



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

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



81
82
83
# File 'lib/uff_db_loader.rb', line 81

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

.dump_from(environment) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/uff_db_loader.rb', line 50

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



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

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



120
121
122
123
124
# File 'lib/uff_db_loader.rb', line 120

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



65
66
67
68
69
# File 'lib/uff_db_loader.rb', line 65

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

.initializer_pathObject



145
146
147
# File 'lib/uff_db_loader.rb', line 145

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

.load_dump_into_database(database_name) ⇒ Object



126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/uff_db_loader.rb', line 126

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



19
20
21
# File 'lib/uff_db_loader.rb', line 19

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

.prune_dump_directoryObject



71
72
73
74
75
# File 'lib/uff_db_loader.rb', line 71

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



116
117
118
# File 'lib/uff_db_loader.rb', line 116

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

.resetObject



23
24
25
# File 'lib/uff_db_loader.rb', line 23

def reset
  @configuration = Configuration.new
end

.restart_rails_serverObject



31
32
33
# File 'lib/uff_db_loader.rb', line 31

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

.setup_dynamic_database_name_in_configObject



100
101
102
103
104
105
106
107
108
# File 'lib/uff_db_loader.rb', line 100

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