WhyValidationsSuckIn96
Description
WhyValidationsSuckIn96 is a library for adding validation support to objects. It aims to have a very minimal ‘surface area’, API-wise, and to be as easily testable as possible. It has no external dependencies unless you wish to use the ActiveRecord integration, in which case you clearly need ActiveRecord installed.
Documentation
See ‘doc/index.html’ for details, or check the GitHub Pages site for the project.
Install
gem install ‘whyvalidationssuckin96’
Basic Usage
Require ‘whyvalidationssuckin96’ and include the WhyValidationsSuckIn96::ValidationSupport module into your class:
require 'whyvalidationssuckin96' class Song attr_accessor :title, :artist include WhyValidationsSuckIn96::ValidationSupport end
Define your validations or call pre-existing validation macros inside a validation setup block:
require 'whyvalidationssuckin96' class Song attr_accessor :title, :artist, :year include WhyValidationsSuckIn96::ValidationSupport setup_validations do validate :no_eighties_crap do if %w[BonJovi Dokken].include?(validatable.artist) fail else pass end end validates_presence_of :title, :artist validates_numericality_of :year, :only_integer => true end end
Check instances of your class for validity and inspect the failed validations:
song = Song.new song.valid? song.invalid? song.failed_validations song.passed_validations song.all_validations
Easily inspect and test for the presence of validations on your class:
Song.validation_collection.detect do |(klass, opts)| klass == WhyValidationsSuckIn96::ValidatesPresence end Song.validation_collection.detect do |(klass, opts)| klass == WhyValidationsSuckIn96::ValidatesNumericality && opts[:only_integer] end
Create your own reusable and testable validations:
require 'whyvalidationssuckin96/skippable_validation' require 'whyvalidationssuckin96/attribute_based_validation' class ValidatesPrimaryColour < WhyValidationsSuckIn96::Validation include WhyValidationsSuckIn96::SkippableValidation include WhyValidationsSuckIn96::AttributeBasedValidation DefaultOptions = {:message => "is not a valid color"} ValidColours = %w[red green blue] def validate super if ValidColours.include?(attribute_value) pass else fail end end end # ValidatesPrimaryColour WhyValidationsSuckIn96::ValidationBuilder.register_macro :validates_primary_colour_of, ValidatesPrimaryColour
ActiveRecord Integration
WhyValidationsSuckIn96 features ActiveRecord support. The caveat is that it violently tears out the existing validation API so anything that uses that will break. The good news is that what it replaces the existing validation code with works as expected with features such as callbacks and preventing saves to the database when objects are invalid. All the standard ActiveRecord validation macros are available, and most have the same API to use when setting them up.
To use the ActiveRecord support:
require 'whyvalidationssuckin96/rails/active_record'
Then you can define validations as expected in your model classes:
class Song < ActiveRecord::Base setup_validations do validates_uniqueness_of :title, :scope => :artist end end
Contributing
- 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 or VERSION. (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.
Todo
- Investigate moving to a model where single instances of validations are created and passed the object to validate, rather than the per-object validation scheme right now which may be a bottleneck.
Copying
Copyright (c) 2009 gabrielg/thumblemonks. See LICENSE for details.