class ProtoFactory::Builder

Public Class Methods

build(factory_name) click to toggle source
# File lib/proto_factory/builder.rb, line 7
def build(factory_name)
  factory_class ||= Object.const_get(find(factory_name))
  proto_object = factory_class.new
  metadata = generate_types(factory_class)
  set_data(proto_object, metadata, factory_class)
end
find(factory_name) click to toggle source
# File lib/proto_factory/builder.rb, line 70
def find(factory_name)
  ProtoFactory.configuration.factories[factory_name.to_sym]
end
generate_types(factory_class) click to toggle source
# File lib/proto_factory/builder.rb, line 61
def generate_types(factory_class)
  metadata = {}
  field_desc = factory_class.descriptor.to_a
  field_desc.each do |field|
    metadata["#{field.name}"] = field.type
  end
  metadata
end
set_all_messages(proto_object, factory_class, name) click to toggle source
# File lib/proto_factory/builder.rb, line 46
def set_all_messages(proto_object, factory_class, name)
  message_class = submsg_to_class(factory_class.descriptor.lookup("#{name}").submsg_name)
  nested_collection = generate_types(message_class)
  nested_proto_object = message_class.new
  proto_object["#{name}"] = set_data(nested_proto_object, nested_collection, message_class)
end
set_data(proto_object, metadata, factory_class) click to toggle source
# File lib/proto_factory/builder.rb, line 14
def set_data(proto_object, metadata, factory_class)
  metadata.each do |name, data_type|
    case data_type
    when :message
      set_all_messages(proto_object, factory_class, name)
    when :enum
      set_random_enum(proto_object, factory_class, name)
    when :int32, :int64
      proto_object["#{name}"] = ::Faker::Number.number(4).to_i
    when :string
      proto_object["#{name}"] = ::Faker::Hacker.verb
    when :bool
      proto_object["#{name}"] = ::Faker::Boolean.boolean(0.5)
    else
      proto_object["#{name}"] = "Found a weird #{data_type} data type, yo."
    end
  end
  proto_object
end
set_random_enum(proto_object, factory_class, name) click to toggle source
# File lib/proto_factory/builder.rb, line 53
def set_random_enum(proto_object, factory_class, name)
  enum_class = submsg_to_class(factory_class.descriptor.lookup("#{name}").submsg_name)
  enum_options = enum_class.descriptor.to_h
  size = enum_options.size.to_i
  random_number = rand(1..size)
  proto_object["#{name}"] = random_number
end
submsg_to_class(submsg_name) click to toggle source
# File lib/proto_factory/builder.rb, line 34
def submsg_to_class(submsg_name)
  array_of_words = submsg_name.split('.')
  class_string = array_of_words.map do |word|
    if word.match?(/[A-Z]/)
      word
    else
      word.split('_').collect(&:capitalize).join
    end
  end.join('::') # thanks I hate it
  Object.const_get(class_string)
end