module DataMagic

Constants

VERSION

Attributes

yml[RW]
parent[R]

Public Class Methods

included(cls) click to toggle source
# File lib/data_magic.rb, line 27
def self.included(cls)
  @parent = cls
  translators.each do |translator|
    Translation.send :include, translator
  end
end
load_for_scenario(scenario, fixture_folder = DataMagic.yml_directory) click to toggle source

Given a scenario, load any fixture it needs. Fixture tags should be in the form of @datamagic_FIXTUREFILE

# File lib/data_magic.rb, line 50
def self.load_for_scenario(scenario, fixture_folder = DataMagic.yml_directory)
  orig_yml_directory = DataMagic.yml_directory
  DataMagic.yml_directory = fixture_folder
  fixture_files = fixture_files_on(scenario)

  DataMagic.load "#{fixture_files.last}.yml" if fixture_files.count.positive?
  DataMagic.yml_directory = orig_yml_directory
end
locale=(value) click to toggle source
# File lib/data_magic.rb, line 23
def self.locale=(value)
  Faker::Config.locale = value
end

Private Class Methods

add_translator(translator) click to toggle source
# File lib/data_magic.rb, line 106
def add_translator(translator)
  translators << translator
end
default_directory() click to toggle source
# File lib/data_magic.rb, line 102
def default_directory
  'config/data'
end
fixture_files_on(scenario) click to toggle source
# File lib/data_magic.rb, line 93
def self.fixture_files_on(scenario)
  # tags for cuke 2, source_tags for cuke 1
  tags = scenario.send(scenario.respond_to?(:tags) ? :tags : :source_tags)
  tags.map(&:name).select { |t| t =~ /@datamagic_/ }.map { |t| t.gsub('@datamagic_', '').to_sym }
end
load_fixture_and_merge_with(fixture_name, base_hash, fixture_folder = DEFAULT_FIXTURE_FOLDER) click to toggle source

Load a fixture and merge it with an existing hash

# File lib/data_magic.rb, line 88
def self.load_fixture_and_merge_with(fixture_name, base_hash, fixture_folder = DEFAULT_FIXTURE_FOLDER)
  new_hash = load_fixture(fixture_name, fixture_folder)
  base_hash.deep_merge new_hash
end
translators() click to toggle source
# File lib/data_magic.rb, line 110
def translators
  @translators ||= []
end

Public Instance Methods

data_for(key, additional = {}) click to toggle source
# File lib/data_magic.rb, line 34
def data_for(key, additional = {})
  if key.is_a?(String) && key.match(%r{/})
    filename, record = key.split('/')
    DataMagic.load("#{filename}.yml")
  else
    record = key.to_s
    DataMagic.load(the_file) unless DataMagic.yml
  end
  data = DataMagic.yml[record]
  raise ArgumentError, "Undefined key #{key}" unless data

  prep_data(data.merge(additional.key?(record) ? additional[record] : additional).deep_copy)
end

Private Instance Methods

prep_data(data) click to toggle source
# File lib/data_magic.rb, line 65
def prep_data(data)
  case data
  when Hash
    data.each { |key, value| data[key] = prep_data(value) }
  when Array
    data.each_with_index { |value, i|  data[i] = prep_data(value) }
  when String
    return translate(data[1..-1]) if data[0, 1] == '~'
  end
  data
end
the_file() click to toggle source
# File lib/data_magic.rb, line 61
def the_file
  ENV['DATA_MAGIC_FILE'] || 'default.yml'
end
translate(value) click to toggle source
# File lib/data_magic.rb, line 77
def translate(value)
  translation.send :process, value
rescue StandardError => e
  raise "Failed to translate: #{value}\n Reason: #{e.message}\n"
end
translation() click to toggle source
# File lib/data_magic.rb, line 83
def translation
  @translation ||= Translation.new parent
end