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 © 2010 Starr Horne. See LICENSE for details.