Module: Protobuf::ActiveRecord::Serialization::ClassMethods

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

Defined Under Namespace

Classes: CollectionAssociationCaller, DateCaller, DateTimeCaller, FieldSymbolTransformerCaller, NilMethodCaller, NoConversionCaller

Instance Method Summary collapse

Instance Method Details

#_protobuf_collection_association_object(field) ⇒ Object



149
150
151
# File 'lib/protobuf/active_record/serialization.rb', line 149

def _protobuf_collection_association_object(field)
  CollectionAssociationCaller.new(field)
end

#_protobuf_convert_to_fields_object(field) ⇒ Object



195
196
197
198
199
200
201
202
203
204
205
206
207
208
# File 'lib/protobuf/active_record/serialization.rb', line 195

def _protobuf_convert_to_fields_object(field)
  is_datetime_time_or_timestamp_column = _protobuf_date_datetime_time_or_timestamp_column?(field)
  is_date_column = _protobuf_date_column?(field)

  if is_datetime_time_or_timestamp_column
    if is_date_column
      DateCaller.new(field)
    else
      DateTimeCaller.new(field)
    end
  else
    NoConversionCaller.new(field)
  end
end

#_protobuf_field_objectsObject



18
19
20
# File 'lib/protobuf/active_record/serialization.rb', line 18

def _protobuf_field_objects
  @_protobuf_field_objects ||= {}
end

#_protobuf_field_optionsObject



22
23
24
# File 'lib/protobuf/active_record/serialization.rb', line 22

def _protobuf_field_options
  @_protobuf_field_options ||= {}
end

#_protobuf_field_symbol_transformersObject



26
27
28
# File 'lib/protobuf/active_record/serialization.rb', line 26

def _protobuf_field_symbol_transformers
  @_protobuf_field_symbol_transformers ||= {}
end

#_protobuf_field_transformer_object(field) ⇒ Object



210
211
212
# File 'lib/protobuf/active_record/serialization.rb', line 210

def _protobuf_field_transformer_object(field)
  _protobuf_field_transformers[field]
end

#_protobuf_field_transformersObject



30
31
32
# File 'lib/protobuf/active_record/serialization.rb', line 30

def _protobuf_field_transformers
  @_protobuf_field_transformers ||= {}
end

#_protobuf_message_deprecated_fieldsObject



34
35
36
37
38
39
40
41
# File 'lib/protobuf/active_record/serialization.rb', line 34

def _protobuf_message_deprecated_fields
  @_protobuf_message_deprecated_fields ||= protobuf_message.all_fields.map do |field|
    next if field.nil?
    next unless field.deprecated?

    field.name.to_sym
  end
end

#_protobuf_message_non_deprecated_fieldsObject



43
44
45
46
47
48
49
50
# File 'lib/protobuf/active_record/serialization.rb', line 43

def _protobuf_message_non_deprecated_fields
  @_protobuf_message_non_deprecated_fields ||= protobuf_message.all_fields.map do |field|
    next if field.nil?
    next if field.deprecated?

    field.name.to_sym
  end
end

#_protobuf_nil_object(_field) ⇒ Object



223
224
225
# File 'lib/protobuf/active_record/serialization.rb', line 223

def _protobuf_nil_object(_field)
  NilMethodCaller.new
end

#_protobuf_symbol_transformer_object(field) ⇒ Object



238
239
240
# File 'lib/protobuf/active_record/serialization.rb', line 238

def _protobuf_symbol_transformer_object(field)
  FieldSymbolTransformerCaller.new(self, _protobuf_field_symbol_transformers[field])
end

#field_from_record(field, transformer = nil, &block) ⇒ Object

Define a field transformation from a record. Accepts a Symbol, callable, or block that is called with the record being serialized.

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:

field_from_record :public_key, :convert_public_key_to_proto
field_from_record :status, lambda { |record| # Do some stuff... }
field_from_record :status do |record|
  # Do some blocky stuff...
end


69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/protobuf/active_record/serialization.rb', line 69

def field_from_record(field, transformer = nil, &block)
  if transformer.is_a?(Symbol)
    _protobuf_field_symbol_transformers[field] = transformer
    return
  end

  transformer ||= block
  callable = transformer
  unless callable.respond_to?(:call)
    raise FieldTransformerError
  end

  _protobuf_field_transformers[field.to_sym] = callable
end

#protobuf_fields(*fields) ⇒ Object

Define the protobuf fields that will be automatically serialized (by default, all fields will be serialized). Accepts any number of field names and is equivalent to passing the :only option to ‘protobuf_message`.

If :except is specified, all fields except the specified fields will be serialized.

By default, deprecated fields will be serialized. To exclude deprecated fields, pass :deprecated => false in the options hash.

Examples:

protobuf_fields :guid, :name
protobuf_fields :except => :email_domain
protobuf_fields :except => :email_domain, :deprecated => false


98
99
100
101
102
103
# File 'lib/protobuf/active_record/serialization.rb', line 98

def protobuf_fields(*fields)
  options = fields.extract_options!
  options[:only] = fields if fields.present?

  self._protobuf_field_options = options
end

#protobuf_message(message = nil, options = {}) ⇒ Object

Define the protobuf message class that should be used to serialize the object to protobuf. Accepts a string or symbol and an options hash.

When protobuf_message is declared, Protoable automatically extracts the fields from the message and automatically adds a to_proto method that serializes the object to protobuf.

The fields that will be automatically serialized can be configured by passing :only or :except in the options hash. If :only is specified, only the specified fields will be serialized. If :except is specified, all field except the specified fields will be serialized.

By default, deprecated fields will be serialized. To exclude deprecated fields, pass :deprecated => false in the options hash.

Examples:

protobuf_message :user_message
protobuf_message "UserMessage"
protobuf_message "Namespaced::UserMessage"
protobuf_message :user_message, :only => [ :guid, :name ]
protobuf_message :user_message, :except => :email_domain
protobuf_message :user_message, :except => :email_domain, :deprecated => false


128
129
130
131
132
133
134
135
# File 'lib/protobuf/active_record/serialization.rb', line 128

def protobuf_message(message = nil, options = {})
  unless message.nil?
    @protobuf_message = message.to_s.classify.constantize
    self._protobuf_field_options = options
  end

  @protobuf_message
end