class SchemaMonkey::Client

Public Class Methods

new(mod) click to toggle source
# File lib/schema_monkey/client.rb, line 4
def initialize(mod)
  @root = mod
  @inserted = {}
end

Public Instance Methods

insert(dbm: nil) click to toggle source
# File lib/schema_monkey/client.rb, line 9
def insert(dbm: nil)
  insert_active_record(dbm: dbm)
  insert_middleware(dbm: dbm)
end

Private Instance Methods

canonicalize_path(mod, base, dbm) click to toggle source
# File lib/schema_monkey/client.rb, line 34
def canonicalize_path(mod, base, dbm)
  path = mod.to_s.sub(/^#{@root}::#{base}::/, '')
  if dbm
    path = path.split('::')
    if (i = path.find_index { |it| it =~ /\b#{dbm}\b/i }) # delete first occurence
      path.delete_at i
    end
    path = path.join('::').gsub(/#{dbm}/i, dbm.to_s) # canonicalize case for things like PostgreSQLAdapter
  end
  path
end
find_modules(container, dbm: nil) click to toggle source
# File lib/schema_monkey/client.rb, line 46
def find_modules(container, dbm: nil)
  return [] unless (container = Module.const_lookup @root, container)

  if dbm
    accept = /#{dbm}/i
    reject = nil
  else
    accept = nil
    reject = /\b(#{DBMS.join('|')})/i
  end

  modules = []
  modules += Module.descendants(container, can_load: accept)
  modules.select! { |it| it.to_s =~ accept } if accept
  modules.reject! { |it| it.to_s =~ reject } if reject
  modules
end
insert_active_record(dbm: nil) click to toggle source
# File lib/schema_monkey/client.rb, line 16
def insert_active_record(dbm: nil)
  # Kernel.warn "--- inserting active_record for #{@root}, dbm=#{dbm.inspect}"
  find_modules(:ActiveRecord, dbm: dbm).each do |mod|
    next if @inserted[mod]
    relative_path = canonicalize_path(mod, :ActiveRecord, dbm)
    ActiveRecord.insert(relative_path, mod)
  end
end
insert_middleware(dbm: nil) click to toggle source
# File lib/schema_monkey/client.rb, line 25
def insert_middleware(dbm: nil)
  find_modules(:Middleware, dbm: dbm).each do |mod|
    next if @inserted[mod]
    relative_path = canonicalize_path(mod, :Middleware, dbm)
    Stack.insert(relative_path, mod) unless relative_path.empty?
    @inserted[mod] = true
  end
end