DeeplyValid

There are times when you just can't fake it. Maybe you're implementing an API, or interacting with a legacy system. But for whatever reason, you have complex data structures that absolutely have to be valid.

DeeplyValid lets you define a "schema" for your data structures in a nice, declarative, way.

The Simplest Example:

class MyValidations < DeeplyValid::Base
define :name, "bob"
end

# true
MyValidations[:name].valid?("bob") 

# false
MyValidations[:name].valid?("joe") 

A more realistic example

class MyValidations < DeeplyValid::Base
define :person, {
  :id => token(32),
  :age => integer(1..100),
  :name => string(1..100),
  :department => {
    :name => any('sales', 'accounting', 'engineering'),
    :building => integer
  },
  :performace_reviews => array( structure(:review) )
}

# This structure is referenced in the "person" structure
define :review, {
  :author => string(1..100),
  :body => string(1..1024)
}
end

# true
MyValidations[:person].valid?({
:id => "x"*32,
:age => 22,
:name => "Bob Jones",
:department => {
  :name => "sales",
  :building => 33
},
:performace_reviews  => [
  { :author => "joe", :body => "a review" }, 
  { :author => "bill", :body => "another review" } 
]
})

Note on Patches/Pull Requests

  • Fork the project.
  • Make your feature addition or bug fix.
  • Add tests for it. This is important so I don't break it in a future version unintentionally.
  • Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
  • Send me a pull request. Bonus points for topic branches.

Copyright (c) 2010 Starr Horne. See LICENSE for details.