Class: Deimos::SchemaBackends::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/deimos/schema_backends/base.rb

Overview

Base class for encoding / decoding.

Direct Known Subclasses

AvroBase, Mock, Plain

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(schema:, namespace: nil) ⇒ Base

Returns a new instance of Base.

Parameters:

  • schema (String, Symbol)
  • namespace (String) (defaults to: nil)


39
40
41
42
# File 'lib/deimos/schema_backends/base.rb', line 39

def initialize(schema:, namespace: nil)
  @schema = schema
  @namespace = namespace
end

Instance Attribute Details

#key_schemaString

Returns:

  • (String)


35
36
37
# File 'lib/deimos/schema_backends/base.rb', line 35

def key_schema
  @key_schema
end

#namespaceString

Returns:

  • (String)


33
34
35
# File 'lib/deimos/schema_backends/base.rb', line 33

def namespace
  @namespace
end

#schemaString

Returns:

  • (String)


31
32
33
# File 'lib/deimos/schema_backends/base.rb', line 31

def schema
  @schema
end

Class Method Details

.content_typeString

The content type to use when encoding / decoding requests over HTTP via ActionController.

Returns:

  • (String)

Raises:



92
93
94
# File 'lib/deimos/schema_backends/base.rb', line 92

def self.content_type
  raise MissingImplementationError
end

.field_type(schema) ⇒ String

Converts your schema to String form for generated YARD docs. To be defined by subclass.

Parameters:

  • schema (Object)

Returns:

  • (String)

    A string representation of the Type

Raises:



100
101
102
# File 'lib/deimos/schema_backends/base.rb', line 100

def self.field_type(schema)
  raise MissingImplementationError
end

.mock_backendSymbol

Indicate a class which should act as a mocked version of this backend. This class should perform all validations but not actually do any encoding. Note that the “mock” version should return its own symbol when this is called, since it may be called multiple times depending on the order of RSpec helpers.

Returns:

  • (Symbol)


86
87
88
# File 'lib/deimos/schema_backends/base.rb', line 86

def self.mock_backend
  :mock
end

Instance Method Details

#coerce(payload) ⇒ Hash

Given a hash, coerce its types to our schema. To be defined by subclass.

Parameters:

  • payload (Hash)

Returns:

  • (Hash)


67
68
69
70
71
72
73
74
75
76
77
# File 'lib/deimos/schema_backends/base.rb', line 67

def coerce(payload)
  result = {}
  self.schema_fields.each do |field|
    name = field.name
    next unless payload.key?(name)

    val = payload[name]
    result[name] = coerce_field(field, val)
  end
  result.with_indifferent_access
end

#coerce_field(field, value) ⇒ Object

Given a value and a field definition (as defined by whatever the underlying schema library is), coerce the given value to the given field type.

Parameters:

Returns:

  • (Object)

Raises:



141
142
143
# File 'lib/deimos/schema_backends/base.rb', line 141

def coerce_field(field, value)
  raise MissingImplementationError
end

#decode(payload, schema: nil) ⇒ Hash?

Decode a payload with a schema. Public method.

Parameters:

  • payload (String)
  • schema (String, Symbol) (defaults to: nil)

Returns:

  • (Hash, nil)


58
59
60
61
62
# File 'lib/deimos/schema_backends/base.rb', line 58

def decode(payload, schema: nil)
  return nil if payload.nil?

  decode_payload(payload, schema: schema || @schema)
end

#decode_key(payload, key_id) ⇒ String

Decode a message key. To be defined by subclass.

Parameters:

  • payload (Hash)

    the message itself.

  • key_id (String, Symbol)

    the field in the message to decode.

Returns:

  • (String)

Raises:



176
177
178
# File 'lib/deimos/schema_backends/base.rb', line 176

def decode_key(payload, key_id)
  raise MissingImplementationError
end

#decode_payload(payload, schema:) ⇒ Hash

Decode a payload. To be defined by subclass.

Parameters:

  • payload (String)
  • schema (String, Symbol)

Returns:

  • (Hash)

Raises:



117
118
119
# File 'lib/deimos/schema_backends/base.rb', line 117

def decode_payload(payload, schema:)
  raise MissingImplementationError
end

#encode(payload, schema: nil, topic: nil) ⇒ String

Encode a payload with a schema. Public method.

Parameters:

  • payload (Hash)
  • schema (String, Symbol) (defaults to: nil)
  • topic (String) (defaults to: nil)

Returns:

  • (String)


49
50
51
52
# File 'lib/deimos/schema_backends/base.rb', line 49

def encode(payload, schema: nil, topic: nil)
  validate(payload, schema: schema || @schema)
  encode_payload(payload, schema: schema || @schema, topic: topic)
end

#encode_key(key, key_id, topic: nil) ⇒ String

Encode a message key. To be defined by subclass.

Parameters:

  • key (String, Hash)

    the value to use as the key.

  • key_id (String, Symbol)

    the field name of the key.

  • topic (String) (defaults to: nil)

Returns:

  • (String)

Raises:



168
169
170
# File 'lib/deimos/schema_backends/base.rb', line 168

def encode_key(key, key_id, topic: nil)
  raise MissingImplementationError
end

#encode_payload(payload, schema:, topic: nil) ⇒ String

Encode a payload. To be defined by subclass.

Parameters:

  • payload (Hash)
  • schema (String, Symbol)
  • topic (String) (defaults to: nil)

Returns:

  • (String)

Raises:



109
110
111
# File 'lib/deimos/schema_backends/base.rb', line 109

def encode_payload(payload, schema:, topic: nil)
  raise MissingImplementationError
end

#generate_key_schema(field_name) ⇒ Object

Generate a key schema from the given value schema and key ID. This is used when encoding or decoding keys from an existing value schema.

Parameters:

  • field_name (Symbol)

Raises:



159
160
161
# File 'lib/deimos/schema_backends/base.rb', line 159

def generate_key_schema(field_name)
  raise MissingImplementationError
end

#load_schemaObject

Forcefully loads the schema into memory.

Returns:

  • (Object)

    The schema that is of use.

Raises:



182
183
184
# File 'lib/deimos/schema_backends/base.rb', line 182

def load_schema
  raise MissingImplementationError
end

#schema_fieldsArray<SchemaField>

List of field names belonging to the schema. To be defined by subclass.

Returns:

Raises:



131
132
133
# File 'lib/deimos/schema_backends/base.rb', line 131

def schema_fields
  raise MissingImplementationError
end

#sql_type(field) ⇒ Symbol

Given a field definition, return the SQL type that might be used in ActiveRecord table creation - e.g. for Avro, a ‘long` type would return `:bigint`. There are also special values that need to be returned: `:array`, `:map` and `:record`, for types representing those structures. `:enum` is also recognized.

Parameters:

Returns:

  • (Symbol)

Raises:



152
153
154
# File 'lib/deimos/schema_backends/base.rb', line 152

def sql_type(field)
  raise MissingImplementationError
end

#validate(payload, schema:) ⇒ void

This method returns an undefined value.

Validate that a payload matches the schema. To be defined by subclass.

Parameters:

  • payload (Hash)
  • schema (String, Symbol)

Raises:



125
126
127
# File 'lib/deimos/schema_backends/base.rb', line 125

def validate(payload, schema:)
  raise MissingImplementationError
end