0.0
No commit activity in last 3 years
No release in over 3 years
Struct definition with type safety
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies
 Project Readme

Fried::Schema Build Status

Struct definition with type safety

Installation

Add this line to your application's Gemfile:

gem "fried-schema"

And then execute:

$ bundle

Or install it yourself as:

$ gem install fried-schema

Usage

Two modules are exposed:

  • Fried::Schema::Struct
  • Fried::Schema::DataEntity

You shouldn't write an initialize method when you use any of the above modules. If you do, please make sure to call super or super().

All type-checking is performed using Fried::Typings::Is, which uses just #is_a? under the hood.

API

Struct

class Person
  include Fried::Schema::Struct

  # attribute_name, type_checking, default_value (optional)
  # default value could be anything. However if it's a Proc, it will be
  # evaluated at initialization
  attribute :name, String, default: ""
  attribute :born_at, Time, default: -> { Time.now }
  attribute :age, Numeric
end

person = Person.new
person.name = "John"

person.name # => "John"
person.born_at # => 2017-11-24 00:55:50 -0800
person.age # => nil

person.name = 123 # raises TypeError

Structs are Comparable. Compare them with <=> which will just run <=> on each attribute and stop if any is different from 0

DataEntity

Has all the same functionality as Fried::Schema::Struct, in addition to #to_h and .build

class Person
  include Fried::Schema::DataEntity

  attribute :name, String, default: ""
  attribute :born_at, Time, default: -> { Time.now }
  attribute :age, Numeric
end

person = Person.build(name: "John", age: 123, not_present_key: "test")

person.name # => "John"
person.age # => 123

person.to_h # => { name: "John", born_at: 2017-11-24 00:55:50 -0800, age: 123 }

to_h works with nested DataEntities. So if a field is of a DataEntity type, to_h will be called on it.

Fried::Typings integration

The gem integrates with fried-typings, you can use those type as checks:

class Person
  include Fried::Typings
  include Fried::Schema::DataEntity

  attribute :hobbies, ArrayOf[String], default: []
  attribute :something, OneOf[String, Numeric]
end

person = Person.build(hobbies: ["foo", "bar"])

person.hobbies # => ["foo", "bar"]
person.hobbies = [123, "foo"] # => raises TypeError
person.hobbies = []
person.hobbies # => []
person.hobbies = ["test"]
person.hobbies # => ["test"]

person.something = "foo"
person.something # => "foo"
person.something = 123
person.something # => 123
person.something = nil # => raises TypeError

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake 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 tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/Fire-Dragon-DoL/fried-schema.