Skip to content

shoplineapp/mongoid-avro

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

48 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Mongoid::Avro

The mongoid-avro is a Ruby gem that allows you to convert a Mongoid Model schema into an Avro schema. This can be useful if you want to use Avro serialization with your Mongoid data.


Installation

To install mongoid-avro, add it to your Gemfile:

gem 'mongoid-avro'

Then, execute the following command:

bundle install

Usage

  1. Include Mongoid::Avro in your Mongoid model:
class MyModel
  include Mongoid::Document
  include Mongoid::Avro
  # ...
end
  1. Optionally, you can specify the Avro format for each field using the avro_format option:
class MyModel
  include Mongoid::Document
  include Mongoid::Avro

  field :my_field, type: String, avro_format: 'my_custom_format'
  field :my_field_2, type: String, avro_format: {
      type: 'record',
      name: 'Money',
      fields: [
        { name: 'cents', type: 'int' },
        { name: 'currency_iso', type: 'string' }
      ]
    }
  # ...
end

The avro_format option can be a String, Symbol, or Hash.

  1. Optionally, you can specify the avro_doc option to add a description of the field. It will be used as the doc of the field.
class Person
  include Mongoid::Document
  include Mongoid::Avro

  field :unique_name, type: String, avro_doc: 'The name of the person which is unique.'
end
  1. To generate the Avro schema for your model, call the .generate_avro_schema method :
schema = MyModel.generate_avro_schema(namespace: 'my.namespace')

You can pass an optional namespace parameter to specify the namespace for the Avro schema. The method returns an Avro::Schema object.

The method returns an Avro::Schema.

  1. (Optional) Generate Avro schema as JSON:
schema.to_avro.to_json

Field type transform login

Primitive Types

Mongoid Avro
_id field string
Integer int
Float double
String string
Symbol string
Boolean boolean
BSON::ObjectId string

Complext Types

DateTime, Time

{ "type": "long", "logicalType": "timestamp-millis"}

Date

{ "type": "int", "logicalType": "Date"}

Money

{
  "type": "record",
  "name": "Money",
  "fields": [
    {
      "name": "cents",
      "type": "long"
    },
    {
      "name": "currency_iso",
      "type": "string"
    }
  ]
}

Array: Array of strings

{
  "type": "array",
  "items": "string",
  "default": []
}

Hash: string

{
  "type": "string",
  "logicalType": "json"
}

Embedded document

Embeds One

{
  "name": "unique_address",
  "type": [
    "null",
    {
      "type": "record",
      "name": "unique_address",
      "namespace": "ns1",
      "fields": [
        {
          "name": "_id",
          "type": "string"
        },
        {
          "name": "address",
          "type": "string"
        },
        {
          "name": "number",
          "type": "int"
        }
      ]
    }
  ]
}

Embeds Many

{
  "name": "multiple_address",
  "type": [
    "null",
    {
      "type": "array",
      "items": {
        "type": "record",
        "name": "multiple_address",
        "namespace": "ns1",
        "fields": [
          {
            "name": "_id",
            "type": "string"
          },
          {
            "name": "address",
            "type": "string"
          },
          {
            "name": "number",
            "type": "int"
          }
        ]
      }
    }
  ]
}

Associations

BelongsTo: string as forigen key

HasAndBelongsToMany: same as an Array

{
  "type": "array",
  "items": "string",
  "default": []
}

Validation

require 'mongoid-avro'

MyModel.include(Mongoid::Avro)
schema = MyModel.generate_avro_schema(namespace: 'my.namespace')
model = MyModel.find('id')
test_data = JSON.parse(model.attributes.to_json)
Avro::SchemaValidator.validate!(schema, data)

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/shoplineapp/mongoid-avro.

License

The gem is available as open source under the terms of the MIT License.

About

No description, website, or topics provided.

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published