Skip to content

Repository files navigation

TypedEctoSchema

Build Status Coverage Status Hex.pm Documentation

TypedEctoSchema provides a DSL on top of Ecto.Schema to define schemas with typespecs without all the boilerplate code.

To add type information to an Ecto.Schema, you normally have to keep the fields, the @enforce_keys and a hand-written @type t() in sync, repeating every field name three times:

defmodule Person do
  use Ecto.Schema

  @enforce_keys [:name]

  schema "people" do
    field(:name, :string)
    field(:age, :integer)
    field(:happy, :boolean, default: true)
    field(:phone, :string)
    belongs_to(:company, Company)
    timestamps(type: :naive_datetime_usec)
  end

  @type t() :: %__MODULE__{
          __meta__: Ecto.Schema.Metadata.t(),
          id: integer() | nil,
          name: String.t(),
          age: non_neg_integer() | nil,
          happy: boolean(),
          phone: String.t() | nil,
          company_id: integer() | nil,
          company: Company.t() | Ecto.Association.NotLoaded.t() | nil,
          inserted_at: NaiveDateTime.t() | nil,
          updated_at: NaiveDateTime.t() | nil
        }
end

With typed_ecto_schema the same schema — typespec, enforced keys and all — is just:

defmodule Person do
  use TypedEctoSchema

  typed_schema "people" do
    field(:name, :string, enforce: true, null: false)
    field(:age, :integer) :: non_neg_integer() | nil
    field(:happy, :boolean, default: true, null: false)
    field(:phone, :string)
    belongs_to(:company, Company)
    timestamps(type: :naive_datetime_usec)
  end
end

Installation

Add it to your deps:

{:typed_ecto_schema, "~> 0.5.0", runtime: false}

Then replace use Ecto.Schema with use TypedEctoSchema, and the calls to schema with typed_schema and embedded_schema with typed_embedded_schema.

Features

The full documentation lives on hexdocs. At a glance:

There is also a cheatsheet with every option at a glance, and a changelog.

Credits

This project started as a fork of the awesome typed_struct.

That being said, I'd like to give some special thanks to

About

A library to define Ecto schemas with typespecs without all the boilerplate code.

Resources

Stars

301 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages