Module: Protobuf::ActiveRecord::Transformation::ClassMethods
- Defined in:
- lib/protobuf/active_record/transformation.rb
Instance Method Summary collapse
-
#_filter_attribute_fields(proto) ⇒ Object
Filters accessible attributes that exist in the given protobuf message’s fields or have attribute transformers defined for them.
-
#_filtered_attributes ⇒ Object
Overidden by mass assignment security when protected attributes is loaded.
-
#_protobuf_convert_fields_to_attributes(key, value) ⇒ Object
:nodoc:.
-
#attribute_from_proto(attribute, transformer = nil, &block) ⇒ Object
Define an attribute transformation from protobuf.
-
#attributes_from_proto(proto) ⇒ Object
Creates a hash of attributes from a given protobuf message.
-
#convert_int64_to_date(int64) ⇒ Object
:nodoc:.
-
#convert_int64_to_datetime(int64) ⇒ Object
:nodoc:.
-
#convert_int64_to_time(int64) ⇒ Object
:nodoc:.
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_attributes ⇒ Object
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 (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 |