0.0
No commit activity in last 3 years
No release in over 3 years
Simple type validation for plain ruby object attributes that perform conversions whenever possible.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

>= 1.2
>= 0
~> 2.2
~> 2.13
~> 0.7
~> 0.8

Runtime

 Project Readme

StronglyTyped

Gem Version Build Status Code Climate Coverage Status githalytics.com alpha

Warning

I highly recommend using virtus or maybe active_attr to create plain old ruby models without reinventing the wheel.

Consider this proof-of-concept gem DEPRECATED

Description

This gem provides similar functionality as ruby core Struct but instead of inheritance i used mixins and even wrote something about my reasons to do so.

Same as Struct, it is a convenient way to bundle a number of attributes together using accessor methods with added features like basic type validation and type conversions when possible.

Similar Tools

From ruby core you have Struct and from stdlib OpenStruct.

Check virtus if you are looking for a full featured attributes settings for your Ruby Objects that requires complex automatic coercions among other things.

If you are looking for a nestable, coercible, Hash-like data structure take a look at structure gem.

Reasons

I took some ideas from others gems like virtus and structure but since none of them provided exactly what i needed then decided to create this gem for a now DEPRECATED twitter_anonymous_client gem and the blog post i wrote about it.

Installation

Add gem 'strongly_typed' to your Gemfile then run bundle install or simply $ gem install strongly_typed

Usage

Include StronglyTyped::Model on you ruby objects then call attribute() to define them.

require 'strongly_typed'

class Person
  include StronglyTyped::Model

  attribute :id, Integer
  attribute :slug, String
end

Instance initialization with a hash, a.k.a named parameters

leo = Person.new(id: 1, slug: 'elgalu')
#=> #<Person:0x00c98 @id=1, @slug="elgalu">
leo.id   #=> 1
leo.slug #=> "elgalu"

Can also trust in the parameters order

leo = Person.new(1, 'elgalu')
#=> #<Person:0x00c99 @id=1, @slug="elgalu">
leo.id   #=> 1
leo.slug #=> "elgalu"

Hash Order doesn't matter

ana = Person.new(slug: 'anapau', id: 2)
#=> #<Person:0x00d33 @id=2, @slug="anapau">
ana.id   #=> 2
ana.slug #=> "anapau"

TypeError is raised when improper type

ted = Person.new(id: nil, slug: 'teddy')
#=> TypeError: can't convert nil into Integer

Check the full API here

Contributing

  1. Fork it.
  2. Make your feature addition or bug fix and create your feature branch.
  3. Update the Change Log.
  4. Add specs/tests for it. This is important so I don't break it in a future version unintentionally.
  5. Commit, create a new Pull Request.
  6. Check that your pull request passes the build.

TODO for StronglyTyped::Model

  • Add :default => 'value' to attribute() to support defaults
  • Add :required => true/false to attribute() so an ArgumentError is raised when not provided

TODO for StronglyTyped::Coercible

  • Extract coercer to another gem or use already existing coercion gem
  • Improve generic TypeError to also show attribute name, expected type and value received instead
  • On coercible.rb require gem 'double' to avoid requiring 'date' when user doesn't need that
  • Add support for BigDecimal

License

Released under the MIT License. See the LICENSE file for further details.

Links

RubyGems | Documentation | Source | Bugtracker | Build Status | Dependency Status | Code Climate