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

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

Instance Method Summary collapse

Instance Method Details

#_protobuf_convert_attributes_to_fields(key, value) ⇒ Object

:nodoc:



25
26
27
28
29
30
31
# File 'lib/protobuf/active_record/serialization.rb', line 25

def _protobuf_convert_attributes_to_fields(key, value)
  return value unless _protobuf_date_datetime_time_or_timestamp_column?(key)
  return nil if value.nil?
  return value.to_i unless _protobuf_date_column?(key)

  value.to_time(:utc).to_i
end

#_protobuf_field_optionsObject



33
34
35
# File 'lib/protobuf/active_record/serialization.rb', line 33

def _protobuf_field_options
  @_protobuf_field_options ||= {}
end

#_protobuf_field_symbol_transformersObject



37
38
39
# File 'lib/protobuf/active_record/serialization.rb', line 37

def _protobuf_field_symbol_transformers
  @_protobuf_field_symbol_transformers ||= {}
end

#_protobuf_field_transformersObject



41
42
43
# File 'lib/protobuf/active_record/serialization.rb', line 41

def _protobuf_field_transformers
  @_protobuf_field_transformers ||= {}
end

#_protobuf_instance_respond_to_from_cache?(key) ⇒ Boolean

Returns:

  • (Boolean)


45
46
47
# File 'lib/protobuf/active_record/serialization.rb', line 45

def _protobuf_instance_respond_to_from_cache?(key)
  _protobuf_respond_to_cache.include?(key)
end

#_protobuf_message_deprecated_fieldsObject



49
50
51
52
53
54
55
56
57
58
# File 'lib/protobuf/active_record/serialization.rb', line 49

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

      field.name.to_sym
    end
  end
end

#_protobuf_message_non_deprecated_fieldsObject



60
61
62
63
64
65
66
67
68
69
# File 'lib/protobuf/active_record/serialization.rb', line 60

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

      field.name.to_sym
    end
  end
end

#_protobuf_respond_to_cacheObject



71
72
73
# File 'lib/protobuf/active_record/serialization.rb', line 71

def _protobuf_respond_to_cache
  @_protobuf_respond_to_cache ||= ::Set.new
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


92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/protobuf/active_record/serialization.rb', line 92

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


121
122
123
124
125
126
# File 'lib/protobuf/active_record/serialization.rb', line 121

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


151
152
153
154
155
156
157
158
# File 'lib/protobuf/active_record/serialization.rb', line 151

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