Module: Protobuf::ActiveRecord::Transformation::ClassMethods

Defined in:
lib/protobuf/active_record/transformation.rb

Instance Method Summary collapse

Instance Method Details

#_filter_attribute_fields(proto) ⇒ Object

Filters accessible attributes that exist in the given protobuf message’s fields or have attribute transformers defined for them.

Returns a hash of attribute fields with their respective values.

:nodoc:



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/protobuf/active_record/transformation.rb', line 28

def _filter_attribute_fields(proto)
  fields = proto.to_hash
  fields.select! do |key, value|
    field = proto.class.get_field(key, true)
    proto.has_field?(key) && !field.repeated?
  end

  filtered_attributes = _filtered_attributes + _protobuf_nested_attributes
  filtered_attributes += _protobuf_attribute_transformers.keys

  attribute_fields = filtered_attributes.inject({}) do |hash, column_name|
    symbolized_column = column_name.to_sym

    if fields.has_key?(symbolized_column) ||
      _protobuf_attribute_transformers.has_key?(symbolized_column)
      hash[symbolized_column] = fields[symbolized_column]
    end

    hash
  end

  attribute_fields
end

#_filtered_attributesObject

Overidden by mass assignment security when protected attributes is loaded.

:nodoc:



55
56
57
# File 'lib/protobuf/active_record/transformation.rb', line 55

def _filtered_attributes
  return self.attribute_names
end

#_protobuf_convert_fields_to_attributes(key, value) ⇒ Object

:nodoc:



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/protobuf/active_record/transformation.rb', line 60

def _protobuf_convert_fields_to_attributes(key, value)
  return value if value.nil?

  value = case
          when _protobuf_date_column?(key) then
            convert_int64_to_date(value)
          when _protobuf_datetime_column?(key) then
            convert_int64_to_datetime(value)
          when _protobuf_time_column?(key) then
            convert_int64_to_time(value)
          when _protobuf_timestamp_column?(key) then
            convert_int64_to_time(value)
          else
            value
          end

  return value
end

#attribute_from_proto(attribute, transformer = nil, &block) ⇒ Object

Define an attribute transformation from protobuf. Accepts a Symbol, callable, or block.

When given a callable or block, it is directly used to convert the field.

When a symbol is given, it extracts the method with the same name.

The callable or method must accept a single parameter, which is the proto message.

Examples:

attribute_from_proto :public_key, :extract_public_key_from_proto
attribute_from_proto :status, lambda { |proto| # Do some stuff... }
attribute_from_proto :status do |proto|
  # Do some blocky stuff...
end


96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/protobuf/active_record/transformation.rb', line 96

def attribute_from_proto(attribute, transformer = nil, &block)
  transformer ||= block

  if transformer.is_a?(Symbol)
    callable = lambda { |value| self.__send__(transformer, value) }
  else
    callable = transformer
  end

  unless callable.respond_to?(:call)
    raise AttributeTransformerError
  end

  _protobuf_attribute_transformers[attribute.to_sym] = callable
end

#attributes_from_proto(proto) ⇒ Object

Creates a hash of attributes from a given protobuf message.

It converts and transforms field values using the field converters and attribute transformers, ignoring repeated and nil fields.



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/protobuf/active_record/transformation.rb', line 118

def attributes_from_proto(proto)
  attribute_fields = _filter_attribute_fields(proto)

  attributes = attribute_fields.inject({}) do |hash, (key, value)|
    if _protobuf_attribute_transformers.has_key?(key)
      attribute = _protobuf_attribute_transformers[key].call(proto)
      hash[key] = attribute unless attribute.nil?
    else
      hash[key] = _protobuf_convert_fields_to_attributes(key, value)
    end

    hash
  end

  attributes
end

#convert_int64_to_date(int64) ⇒ Object

:nodoc:



141
142
143
# File 'lib/protobuf/active_record/transformation.rb', line 141

def convert_int64_to_date(int64)
  convert_int64_to_time(int64).utc.to_date
end

#convert_int64_to_datetime(int64) ⇒ Object

:nodoc:



146
147
148
# File 'lib/protobuf/active_record/transformation.rb', line 146

def convert_int64_to_datetime(int64)
  convert_int64_to_time(int64).to_datetime
end

#convert_int64_to_time(int64) ⇒ Object

:nodoc:



136
137
138
# File 'lib/protobuf/active_record/transformation.rb', line 136

def convert_int64_to_time(int64)
  Time.at(int64.to_i)
end