Class: Deimos::SchemaBackends::Base
- Inherits:
-
Object
- Object
- Deimos::SchemaBackends::Base
- Defined in:
- lib/deimos/schema_backends/base.rb
Overview
Base class for encoding / decoding.
Instance Attribute Summary collapse
Class Method Summary collapse
-
.content_type ⇒ String
The content type to use when encoding / decoding requests over HTTP via ActionController.
-
.field_type(schema) ⇒ String
Converts your schema to String form for generated YARD docs.
-
.mock_backend ⇒ Symbol
Indicate a class which should act as a mocked version of this backend.
Instance Method Summary collapse
-
#coerce(payload) ⇒ Hash
Given a hash, coerce its types to our schema.
-
#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.
-
#decode(payload, schema: nil) ⇒ Hash?
Decode a payload with a schema.
-
#decode_key(payload, key_id) ⇒ String
Decode a message key.
-
#decode_payload(payload, schema:) ⇒ Hash
Decode a payload.
-
#encode(payload, schema: nil, topic: nil) ⇒ String
Encode a payload with a schema.
-
#encode_key(key, key_id, topic: nil) ⇒ String
Encode a message key.
-
#encode_payload(payload, schema:, topic: nil) ⇒ String
Encode a payload.
-
#generate_key_schema(field_name) ⇒ Object
Generate a key schema from the given value schema and key ID.
-
#initialize(schema:, namespace: nil) ⇒ Base
constructor
A new instance of Base.
-
#load_schema ⇒ Object
Forcefully loads the schema into memory.
-
#schema_fields ⇒ Array<SchemaField>
List of field names belonging to the schema.
-
#sql_type(field) ⇒ Symbol
Given a field definition, return the SQL type that might be used in ActiveRecord table creation - e.g.
-
#validate(payload, schema:) ⇒ void
Validate that a payload matches the schema.
Constructor Details
#initialize(schema:, namespace: nil) ⇒ Base
Returns a new instance of Base.
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_schema ⇒ String
35 36 37 |
# File 'lib/deimos/schema_backends/base.rb', line 35 def key_schema @key_schema end |
#namespace ⇒ String
33 34 35 |
# File 'lib/deimos/schema_backends/base.rb', line 33 def namespace @namespace end |
#schema ⇒ String
31 32 33 |
# File 'lib/deimos/schema_backends/base.rb', line 31 def schema @schema end |
Class Method Details
.content_type ⇒ String
The content type to use when encoding / decoding requests over HTTP via ActionController.
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.
100 101 102 |
# File 'lib/deimos/schema_backends/base.rb', line 100 def self.field_type(schema) raise MissingImplementationError end |
.mock_backend ⇒ Symbol
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
159 160 161 |
# File 'lib/deimos/schema_backends/base.rb', line 159 def generate_key_schema(field_name) raise MissingImplementationError end |
#load_schema ⇒ Object
Forcefully loads the schema into memory.
182 183 184 |
# File 'lib/deimos/schema_backends/base.rb', line 182 def load_schema raise MissingImplementationError end |
#schema_fields ⇒ Array<SchemaField>
List of field names belonging to the schema. To be defined by subclass.
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.
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.
125 126 127 |
# File 'lib/deimos/schema_backends/base.rb', line 125 def validate(payload, schema:) raise MissingImplementationError end |