class DomainNeutral::Seeder::Descriptors

Attributes

master[R]

Public Class Methods

new(context) click to toggle source
# File lib/domain_neutral/seeder/descriptors.rb, line 16
def initialize(context)
  @context = context
end
seed(context) click to toggle source
# File lib/domain_neutral/seeder/descriptors.rb, line 5
def self.seed(context)
  seeder = new(context)
  seeder.setup
  seeder.load_master_data
  seeder.validate_master
  seeder.validate_locale_alternatives
  seeder.create_fixtures_file
  seeder.seed_parents
  seeder.seed_everything_else
end

Public Instance Methods

create_fixtures_file() click to toggle source
# File lib/domain_neutral/seeder/descriptors.rb, line 109
def create_fixtures_file
  return unless create_fixtures
  fixtures = {}
  master.each do |descriptor_set, descriptors|
    base = {type: descriptor_set.classify}
    if parent = descriptors[:parent]
      abort "Parent for fixtures not yet implemented.", descriptors.inspect
      base[:parent] = parent
    end
    descriptors.reject { |k,v| k == 'parent'  }.each do |symbol, descriptor|
      fixtures["#{descriptor_set}_#{symbol}"] = descriptor.merge(base.merge(symbol: symbol)).to_hash
    end
  end
  path = fixtures_path.join('domain_neutral', 'descriptors.yml')
  FileUtils.mkdir_p path.dirname
  File.open(path, 'w') do |f|
    f.write fixtures.to_yaml
  end
  log "Seeders file created (#{path}):"
end
load_master_data() click to toggle source

Load master descriptors from yaml file

# File lib/domain_neutral/seeder/descriptors.rb, line 36
def load_master_data
  #@master = load_yaml(DomainNeutral.master_locale, :master)
  @master = load_yaml(master_locale, :master)
end
seed_everything_else() click to toggle source
# File lib/domain_neutral/seeder/descriptors.rb, line 61
def seed_everything_else
  # seed rest
  master.each do |descriptor_set, descriptors|
    seed_descriptor_set descriptor_set, descriptors
  end
end
seed_options() click to toggle source
# File lib/domain_neutral/seeder/descriptors.rb, line 20
def seed_options
  DomainNeutral.seed_options
end
seed_parents() click to toggle source
# File lib/domain_neutral/seeder/descriptors.rb, line 41
def seed_parents
  # Collect parents
  log "Collect parents"
  parents = []
  master.each do |descriptor_set, descriptors|
    parents << descriptors[:parent] if descriptors[:parent]
  end
  log "Parents collected: #{parents.inspect}"
  # Seed parents
  return if parents.empty?
  log "Seed parents"
  parents.map { |p| p.split('.')[0].underscore }.uniq.each do |parent|
    klass = parent.classify.constantize
    # Create only objects of Descriptor class
    if klass.new.is_a?( Descriptor) && section = master.delete(parent)
      seed_descriptor_set parent, section
    end
  end
end
setup() click to toggle source
# File lib/domain_neutral/seeder/descriptors.rb, line 26
def setup
  if DomainNeutral.rails_generation < 4
    Descriptor.attr_accessible :name, :description, :index, :externalid, :parent, :value
  end
  Descriptor.enable_caching false
end
validate_locale_alternatives() click to toggle source
# File lib/domain_neutral/seeder/descriptors.rb, line 82
def validate_locale_alternatives
  undefined = []
  #DomainNeutral.locale_alternatives.each do |locale|
  locale_alternatives.each do |locale|
    log "Validating alternative locale file: #{locale}"
    loc_descriptors = load_yaml(locale, 'locale_alternative')
    master.each do |descriptor_set, descriptors|
      unless loc_descriptors[descriptor_set]
        undefined << "Locale: #{locale}. Keys not defined for '#{descriptor_set}'"
        next      
      end
      descriptors.keys.reject{ |k| k == 'parent' }.each do |descriptor|
        unless loc_descriptors[descriptor_set][descriptor]
          undefined << "Locale: #{locale}. Key not defined for '#{descriptor}' in '#{descriptor_set}'" 
          next      
        end
        %w(name description).each do |key|
          if descriptors[descriptor][key] && !loc_descriptors[descriptor_set][descriptor][key]
            undefined << "Locale: #{locale}. Attribute '#{key}' not defined for '#{descriptor}' in '#{descriptor_set}'"
          end
        end
      end
    end
  end
  abort undefined if undefined.size > 0
end
validate_master() click to toggle source

Validate descriptors in master yaml file

# File lib/domain_neutral/seeder/descriptors.rb, line 69
def validate_master
  log 'Validating master locale file'
  undefined = []
  master.each do |descriptor_set, descriptors|
    descriptors.reject { |k,v| k == 'parent'  }.each do |symbol, descriptor|
      unless descriptor[:name]
        undefined << "Name not defined for #{descriptor_set}"
      end    
    end
  end
  abort undefined if undefined.size > 0
end

Private Instance Methods

abort(*messages) click to toggle source
# File lib/domain_neutral/seeder/descriptors.rb, line 181
def abort(*messages)
  raise "#{self.class.name}: #{messages.join("\n")}"
end
fixtures_path() click to toggle source
# File lib/domain_neutral/seeder/descriptors.rb, line 174
def fixtures_path
  if ENV['FIXTURES_PATH']
    Rails.root.join(ENV['FIXTURES_PATH'])
  else
    Rails.root.join('test', 'fixtures')
  end
end
load_yaml(locale, type) click to toggle source
# File lib/domain_neutral/seeder/descriptors.rb, line 131
def load_yaml(locale, type)
  file = locate_locale_file(locale, type)
  yml = HashWithIndifferentAccess.new YAML.load_file(file.to_s)
  yml[locale.to_sym][:descriptors]
end
locate_locale_file(locale, type) click to toggle source
# File lib/domain_neutral/seeder/descriptors.rb, line 137
def locate_locale_file(locale, type)
  alternative_locations = [
    Rails.root.join('config', 'locales', locale.to_s, "descriptors.yml"),
    Rails.root.join('config', 'locales', "#{locale}.descriptors.yml"),
    Rails.root.join('config', 'locales', "#{locale}.yml"),
    Rails.root.join('config', 'locales', "descriptors.yml")
  ]
  unless file = alternative_locations.select { |fname| fname.exist? }.first
    abort "Could not load #{type} file for descriptors. Expected to find any of the following files:\n" + 
      alternative_locations.map { |fname| "\t'#{fname}'" }.join("\n")
  end
  file
end
log(message) click to toggle source
# File lib/domain_neutral/seeder/descriptors.rb, line 185
def log(message)
  # @context.say message if DomainNeutral.verbose_seed
  if verbose
    @messenger ||= @context.is_a?( ActiveRecord::Migration) ? :say : :puts
    @context.send @messenger,  message
  end
end
seed_descriptor_set(descriptor_set, descriptors, default_parent = nil) click to toggle source
# File lib/domain_neutral/seeder/descriptors.rb, line 151
def seed_descriptor_set(descriptor_set, descriptors, default_parent = nil)
  log "seed_descriptor_set: #{descriptor_set.inspect}, descriptors: #{descriptors.inspect}"
  klass = descriptor_set.classify.constantize
  default_parent = descriptors.delete('parent')
  descriptors.each do |descriptor, keypairs|
    log "descriptor: #{descriptor.inspect}, keypairs: #{keypairs.inspect}"
    parent = keypairs['parent'] || default_parent || 'nil'
    unless object = klass[descriptor]
      if DomainNeutral.rails_generation < 4
        klass.create! keypairs.merge(symbol: descriptor, parent: eval(parent)), without_protection: true
      else
        klass.create! keypairs.merge(symbol: descriptor, parent: eval(parent))
      end
    else
      if DomainNeutral.rails_generation < 4
        object.update_attributes(keypairs.merge(parent: eval(parent)), without_protection: true)
      else
        object.update_attributes(keypairs.merge(parent: eval(parent)))
      end
    end
  end
end