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::StructFried::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 TypeErrorStructs 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 TypeErrorDevelopment
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.