Esquema

Esquema is a Ruby library for JSON Schema generation from ActiveRecord models.

Esquema was designed with the following assumptions:

  • An ActiveRecord model represents a JSON Schema object.
  • The JSON object properties are a representation of the model’s attributes.
  • The JSON Schema property types are inferred from the model’s attribute types.
  • The model associations (has_many, belongs_to, etc.) are represented as subschemas or nested schema objects.
  • You can customize the generated schema by using the configuration file or the enhance_schema method.

Example Use:

class User < ApplicationRecord
  include Esquema::Model

    # Assuming the User db table has the following columns:
    # column :name, :string
    # column :email, :string

  end
end

Calling User.json_schema will return the JSON Schema for the User model:

{
    "title": "User model",
    "type": "object",
    "properties": {
        "id": {
            "type": "integer"
        },
        "name": {
            "type": "string"
        },
        "email": {
            "type": "string"
        }
    },
    "required:": [
        "name",
        "email"
    ]
}

Installation

install the gem by executing:

$ gem install esquema

Run the following command to install the gem and generate the configuration file:

rails generate esquema:install 

This will generate a configuration file at:

/config/initializer/esquema.rb

Usage

Simply include the Esquema::Model module in your ActiveRecord model and call the json_schema method to generate the JSON Schema for the model.

There are multiple ways to customize the generated schema:

  • You can exclude columns, foreign keys, and associations from the schema. See the /config/initializer/esquema.rb configuration for more details.
  • For more complex customizations, you can use the enhance_schema method to modify the schema directly on the AR model. Here is an example:
class User < ApplicationRecord
  include Esquema::Model

  enhance_schema do
    model_description "A user of the system"
    property :name, description: "The user's name", title: "Full Name"
    property :group, enum: [1, 2, 3], default: 1, description: "The user's group"
    property :email, description: "The user's email", format: "email"
    virtual_property :age, type: "integer", minimum: 18, maximum: 100, description: "The user's age"
  end
end

In the example above, the enhance_schema method is used to add a description to the model, change the title of the name property and add a description. It adds an enum, default value and a description to the group property.

Use the property keyword for the existing model attributes. In other words the symbol passed to the property method must be a column in the table that the model represents. Property does not accept a type argument, as the type is inferred from the column type.

Use the virtual_property keyword for properties that are not columns in the table that the model represents. Virtual properties require a type argument, as the type cannot be inferred.

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/sergiobayona/esquema.

License

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