Module: DataMagic

Extended by:
DateTranslation, StandardTranslation, YmlReader
Defined in:
lib/data_magic.rb,
lib/data_magic/version.rb,
lib/data_magic/translation.rb,
lib/data_magic/date_translation.rb,
lib/data_magic/standard_translation.rb

Defined Under Namespace

Modules: DateTranslation, StandardTranslation Classes: Translation

Constant Summary collapse

VERSION =
'1.2'

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from StandardTranslation

catch_phrase, cell_phone, characters, city, color_hex, color_name, company_name, country, credit_card_number, credit_card_type, decimal, domain_name, email_address, first_name, full_name, job_title, last_name, mask, merge, name_prefix, name_suffix, number, paragraphs, phone_number, randomize, secondary_address, sentence, sentences, sequential, state, state_abbr, street_address, url, user_name, words, zip_code

Methods included from DateTranslation

date_between, day_of_week, day_of_week_abbr, month, month_abbr, today, tomorrow, yesterday

Class Attribute Details

.ymlObject

Returns the value of attribute yml.



100
101
102
# File 'lib/data_magic.rb', line 100

def yml
  @yml
end

Instance Attribute Details

#parentObject (readonly)

Returns the value of attribute parent.



19
20
21
# File 'lib/data_magic.rb', line 19

def parent
  @parent
end

Class Method Details

.add_translator(translator) ⇒ Object



106
107
108
# File 'lib/data_magic.rb', line 106

def add_translator(translator)
  translators << translator
end

.default_directoryObject



102
103
104
# File 'lib/data_magic.rb', line 102

def default_directory
  'config/data'
end

.fixture_files_on(scenario) ⇒ Object



93
94
95
96
97
# 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

.included(cls) ⇒ Object



27
28
29
30
31
32
# File 'lib/data_magic.rb', line 27

def self.included(cls)
  @parent = cls
  translators.each do |translator|
    Translation.send :include, translator
  end
end

.load_fixture_and_merge_with(fixture_name, base_hash, fixture_folder = DEFAULT_FIXTURE_FOLDER) ⇒ Object

Load a fixture and merge it with an existing hash



88
89
90
91
# 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

.load_for_scenario(scenario, fixture_folder = DataMagic.yml_directory) ⇒ Object

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



50
51
52
53
54
55
56
57
# 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) ⇒ Object



23
24
25
# File 'lib/data_magic.rb', line 23

def self.locale=(value)
  Faker::Config.locale = value
end

.translatorsObject



110
111
112
# File 'lib/data_magic.rb', line 110

def translators
  @translators ||= []
end

Instance Method Details

#data_for(key, additional = {}) ⇒ Object

Raises:

  • (ArgumentError)


34
35
36
37
38
39
40
41
42
43
44
45
46
# 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

#prep_data(data) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
# 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_fileObject



61
62
63
# File 'lib/data_magic.rb', line 61

def the_file
  ENV['DATA_MAGIC_FILE'] || 'default.yml'
end

#translate(value) ⇒ Object



77
78
79
80
81
# 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

#translationObject



83
84
85
# File 'lib/data_magic.rb', line 83

def translation
  @translation ||= Translation.new parent
end