module ProtoRecord

Constants

VERSION

Public Class Methods

proto_message(message = nil, options = {}) click to toggle source
# File lib/proto_record/proto_record.rb, line 12
def proto_message(message = nil, options = {})
  unless message.nil?
    @proto_message = message.to_s.classify.constantize
    @proto_options = options
  end

  @proto_message ||= superclass.proto_message if @proto_message.nil? && superclass.respond_to?(:proto_message)

  @proto_message
end
proto_message_fields() click to toggle source
# File lib/proto_record/proto_record.rb, line 27
def proto_message_fields
  @proto_message_fields = @proto_message.new.to_h.keys.map(&:to_s)
end
proto_options() click to toggle source
# File lib/proto_record/proto_record.rb, line 23
def proto_options
  @proto_options ||= {}
end

Public Instance Methods

to_proto() click to toggle source
# File lib/proto_record/proto_record.rb, line 33
def to_proto
  raise MissingProtoMessage, self.class.name if proto_message.nil?

  message_args = is_a?(ActiveRecord::Base) ? resolve_active_record_object : resolve_class_object

  proto_message.new(message_args)
end

Private Instance Methods

collection?(field) click to toggle source
# File lib/proto_record/proto_record.rb, line 83
def collection?(field)
  self.class.reflect_on_association(field).collection?
end
collection_association?(field) click to toggle source
# File lib/proto_record/proto_record.rb, line 94
def collection_association?(field)
  self.class.reflect_on_association(field).try(:collection?)
end
handle_special_fields(value) click to toggle source
# File lib/proto_record/proto_record.rb, line 87
def handle_special_fields(value)
  return value.to_proto if value.respond_to?(:to_proto)
  return value.to_time if value.respond_to?(:strftime)

  value
end
proto_fields() click to toggle source
# File lib/proto_record/proto_record.rb, line 51
def proto_fields
  self.class.proto_message_fields
end
proto_message() click to toggle source
# File lib/proto_record/proto_record.rb, line 47
def proto_message
  self.class.proto_message
end
proto_options() click to toggle source
# File lib/proto_record/proto_record.rb, line 43
def proto_options
  self.class.proto_options
end
reflection?(field) click to toggle source
# File lib/proto_record/proto_record.rb, line 79
def reflection?(field)
  self.class.reflections.keys.include?(field)
end
resolve_active_record_object() click to toggle source
# File lib/proto_record/proto_record.rb, line 63
def resolve_active_record_object
  proto_fields.map { |field| [field, resolve_field(field)] }.to_h
end
resolve_class_object() click to toggle source
# File lib/proto_record/proto_record.rb, line 55
def resolve_class_object
  resolver = self.class.proto_options[:fields_resolver]

  raise MissingFieldsResolver, self.class if resolver.nil?

  send(resolver)
end
resolve_field(field) click to toggle source
# File lib/proto_record/proto_record.rb, line 67
def resolve_field(field)
  value = try(field) || self[field]

  return value if value.nil?

  if reflection?(field)
    collection?(field) ? value.map(&:to_proto) : value.to_proto
  else
    handle_special_fields(value)
  end
end