class SchemaDev::Config

Constants

DB_VERSION_DEFAULTS
Tuple

Attributes

activerecord[RW]
db[RW]
dbversions[RW]
exclude[RW]
quick[RW]
ruby[RW]

Public Class Methods

_reset() click to toggle source

for use by rspec

# File lib/schema_dev/config.rb, line 15
def self._reset
  @load = nil
end
load() click to toggle source
# File lib/schema_dev/config.rb, line 27
def self.load
  @load ||= read
end
new(ruby:, activerecord:, db:, dbversions: nil, exclude: nil, notify: nil, quick: nil) click to toggle source
# File lib/schema_dev/config.rb, line 31
def initialize(ruby:, activerecord:, db:, dbversions: nil, exclude: nil, notify: nil, quick: nil)
  @ruby = Array.wrap(ruby).map(&:to_s)
  @activerecord = Array.wrap(activerecord).map(&:to_s)
  @db = Array.wrap(db)
  @dbversions = (dbversions || {}).symbolize_keys
  @exclude = Array.wrap(exclude).map(&:symbolize_keys).map { |tuple| Tuple.new(**tuple.transform_values(&:to_s)) }
  @activerecord.each do |ar_version|
    ar_check = ::Gem::Version.new(ar_version)

    if ar_check < ::Gem::Version.new('6.0')
      ruby3 = ::Gem::Version.new('3.0')

      @ruby.select { |e| ::Gem::Version.new(e) >= ruby3 }.each do |v|
        @exclude << Tuple.new(ruby: v, activerecord: ar_version)
      end
    elsif ar_check >= ::Gem::Version.new('7.0')
      ruby27 = ::Gem::Version.new('2.7')

      @ruby.select { |e| ::Gem::Version.new(e) < ruby27 }.each do |v|
        @exclude << Tuple.new(ruby: v, activerecord: ar_version)
      end
    end
  end
  unless notify.nil?
    warn 'Notify is no longer supported'
  end
  @quick = Array.wrap(quick || { ruby: @ruby.last, activerecord: @activerecord.last, db: @db.last })
end
read() click to toggle source
# File lib/schema_dev/config.rb, line 19
def self.read
  if ::Gem::Version.new(RUBY_VERSION) >= ::Gem::Version.new('3.1')
    new(**YAML.safe_load(Pathname.new(CONFIG_FILE).read, permitted_classes: [Symbol], symbolize_names: true))
  else
    new(**YAML.safe_load(Pathname.new(CONFIG_FILE).read, [Symbol], symbolize_names: true))
  end
end

Public Instance Methods

db_versions_for(db) click to toggle source
# File lib/schema_dev/config.rb, line 68
def db_versions_for(db)
  @dbversions.fetch(db.to_sym, DB_VERSION_DEFAULTS.fetch(db.to_sym, [])).map(&:to_s)
end
dbms() click to toggle source
# File lib/schema_dev/config.rb, line 60
def dbms
  @dbms ||= %i[postgresql mysql].select { |dbm| @db.grep(/^#{dbm}/).any? }
end
matrix(quick: false, ruby: nil, activerecord: nil, db: nil, excluded: nil, with_dbversion: false) click to toggle source
# File lib/schema_dev/config.rb, line 72
def matrix(quick: false, ruby: nil, activerecord: nil, db: nil, excluded: nil, with_dbversion: false)
  use_ruby = @ruby
  use_activerecord = @activerecord
  use_db = @db
  if quick
    use_ruby = @quick.map { |q| q[:ruby] }
    use_activerecord = @quick.map { |q| q[:activerecord] }
    use_db = @quick.map { |q| q[:db] }
  end
  use_ruby = Array.wrap(ruby) if ruby
  use_activerecord = Array.wrap(activerecord) if activerecord
  use_db = Array.wrap(db) if db

  use_ruby = [nil] unless use_ruby.any?
  use_activerecord = [nil] unless use_activerecord.any?
  use_db = [nil] unless use_db.any?

  m = use_ruby.product(use_activerecord, use_db)
  m = m.flat_map do |loop_ruby, loop_activerecord, loop_db|
    if with_dbversion && !(dbversions = db_versions_for(loop_db)).empty?
      dbversions.map { |v| Tuple.new(ruby: loop_ruby, activerecord: loop_activerecord, db: loop_db, dbversion: v) }
    else
      [Tuple.new(ruby: loop_ruby, activerecord: loop_activerecord, db: loop_db)]
    end
  end.compact
  m = m.reject { |r| r.match_any?(@exclude) } unless excluded == :none
  m = m.map(&:to_hash)

  if excluded == :only
    matrix(quick: quick, ruby: ruby, activerecord: activerecord, db: db, with_dbversion: with_dbversion, excluded: :none) - m
  else
    m
  end
end