class FakeData::Structure

Constants

FAKER_MATCHER

Public Class Methods

object_to_lambda(object) click to toggle source

Makes lambda from object

# File lib/fake_data/structure.rb, line 7
def object_to_lambda(object)
  source_to_lambda(
    object_to_source(
      object
    )
  )
end
object_to_source(object) click to toggle source

For debug

# File lib/fake_data/structure.rb, line 21
def object_to_source(object)
  result = ""

  result << "lambda do\n"
  result << build_faker_element(object)
  result << "\nend"

  result
end
source_to_lambda(string) click to toggle source

For debug

# File lib/fake_data/structure.rb, line 16
def source_to_lambda(string)
  eval(string)
end

Private Class Methods

build_faker_array(element) click to toggle source
# File lib/fake_data/structure.rb, line 68
def build_faker_array(element)
  result = ""

  result << "["

  result << element.map do |value|
    build_faker_element(value)
  end.join(",")

  result << "]"

  result
end
build_faker_element(element) click to toggle source
# File lib/fake_data/structure.rb, line 33
def build_faker_element(element)
  case element
  when Hash
    build_faker_hash(element)
  when Array
    build_faker_array(element)
  when String
    build_faker_string(element)
  else
    element
  end
end
build_faker_hash(element) click to toggle source
# File lib/fake_data/structure.rb, line 46
def build_faker_hash(element)
  keys = element.keys

  result = ""

  if keys.length == 1 && match = keys.first.to_s.match(FAKER_MATCHER)
    method = FakeData::Method::Control.new(match["content"]) do build_faker_element(element[keys.first]) end

    result << "#{method}"
  else
    result << "{"

    result << element.map do |key, value|
      "\"#{key.to_s}\" => #{build_faker_element(value)}"
    end.join(",")

    result << "}"
  end

  result
end
build_faker_string(source) click to toggle source
# File lib/fake_data/structure.rb, line 82
def build_faker_string(source)
  partitions = partition_by_faker_matcher(source)

  if partitions.length == 1 && faker = partitions.first[:faker]
    return faker.to_s
  end

  result = partitions.map do |partition|
    if faker = partition[:faker]
      "\#\{#{faker}\}"
    else
      partition[:text]
    end
  end.join

  if partitions.length == 1 && partitions[0][:faker]
    result
  else
    "\"#{result}\""
  end
end
partition_by_faker_matcher(string = "") click to toggle source

Split faker string into partitions input < “some text %{number.number(10)} another %{name.name} end” output > [

 { text:  "some text " },
 { faker: "Faker::Number.number(10)" },
 { text:  " another " },
 { faker: "Faker::Name.name" },
 { text:  " end" }
]
# File lib/fake_data/structure.rb, line 113
def partition_by_faker_matcher string = ""
  result = []

  while true
    text, faker_placer, string = string.partition(FAKER_MATCHER)

    if text.length > 0
      result.push({ text: text })
    end

    if faker_placer.length > 0
      match = faker_placer.match(FAKER_MATCHER)
      result.push({ faker: Method::Faker.new(match[1]) })
    end

    break if string.length == 0
  end

  result
end