Class: ConflictFreeSchema::Database::SchemaVersionFiles

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

Constant Summary collapse

SCHEMA_DIRECTORY =
'db/schema_migrations'
MIGRATION_DIRECTORIES =
%w[db/migrate db/post_migrate].freeze
MIGRATION_VERSION_GLOB =
'20[0-9][0-9]*'

Class Method Summary collapse

Class Method Details

.connectionObject



73
74
75
# File 'lib/conflict_free_schema/database/schema_version_files.rb', line 73

def self.connection
  ActiveRecord::Base.connection
end

.find_version_filenamesObject



50
51
52
# File 'lib/conflict_free_schema/database/schema_version_files.rb', line 50

def self.find_version_filenames
  Dir.glob(MIGRATION_VERSION_GLOB, base: schema_directory)
end

.find_versions_from_migration_filesObject



58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/conflict_free_schema/database/schema_version_files.rb', line 58

def self.find_versions_from_migration_files
  migration_directories.each_with_object([]) do |directory, migration_versions|
    directory_migrations = Dir.glob(directory)
    directory_versions = directory_migrations.map do |migration|
      item = Pathname.new(migration)
      next if item.directory?
      next unless item.basename.fnmatch?(MIGRATION_VERSION_GLOB)

      item.basename.to_s.split('_').first
    end.compact

    migration_versions.concat(directory_versions)
  end
end

.init_schema_directoryObject



54
55
56
# File 'lib/conflict_free_schema/database/schema_version_files.rb', line 54

def self.init_schema_directory
  FileUtils.mkdir_p(schema_directory)
end

.load_allObject



29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/conflict_free_schema/database/schema_version_files.rb', line 29

def self.load_all
  init_schema_directory
  version_filenames = find_version_filenames
  return if version_filenames.empty?

  values = version_filenames.map { |vf| "('#{connection.quote_string(vf)}')" }
  connection.execute(<<~SQL)
    INSERT INTO schema_migrations (version)
    VALUES #{values.join(',')}
    ON CONFLICT DO NOTHING
  SQL
end

.migration_directoriesObject



46
47
48
# File 'lib/conflict_free_schema/database/schema_version_files.rb', line 46

def self.migration_directories
  @migration_directories ||= MIGRATION_DIRECTORIES.map { |dir| Rails.root.join(dir, '**', '*') }
end

.schema_directoryObject



42
43
44
# File 'lib/conflict_free_schema/database/schema_version_files.rb', line 42

def self.schema_directory
  @schema_directory ||= Rails.root.join(SCHEMA_DIRECTORY)
end

.touch_all(versions_from_database) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/conflict_free_schema/database/schema_version_files.rb', line 12

def self.touch_all(versions_from_database)
  init_schema_directory
  versions_from_migration_files = find_versions_from_migration_files

  version_filepaths = find_version_filenames.map { |f| schema_directory.join(f) }
  FileUtils.rm(version_filepaths)

  versions_to_create = versions_from_database & versions_from_migration_files
  versions_to_create.each do |version|
    version_filepath = schema_directory.join(version)

    File.open(version_filepath, 'w') do |file|
      file << Digest::SHA256.hexdigest(version)
    end
  end
end