validatable 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README ADDED
@@ -0,0 +1,117 @@
1
+ = Validatable
2
+
3
+ Validatable is a library for adding validations.
4
+
5
+ by Jay[http://jayfields.blogspot.com] Fields[http://jayfields.blogspot.com]
6
+
7
+ == Download and Installation
8
+
9
+ You can download Validatable from here[http://rubyforge.org/projects/validatable] or install it with the following command.
10
+
11
+ $ gem install validatable
12
+
13
+ == License
14
+
15
+ You may use, copy and redistribute this library under the same terms as Ruby itself (see http://www.ruby-lang.org/en/LICENSE.txt).
16
+
17
+ == Examples
18
+
19
+ See the tests for more examples
20
+
21
+ === Test Helper
22
+
23
+ require 'test/unit'
24
+ require 'rubygems'
25
+ require 'mocha'
26
+ require File.dirname(__FILE__) + '/../lib/validatable'
27
+
28
+ class << Test::Unit::TestCase
29
+ def test(name, &block)
30
+ test_name = :"test_#{name.gsub(' ','_')}"
31
+ raise ArgumentError, "#{test_name} is already defined" if self.instance_methods.include? test_name.to_s
32
+ define_method test_name, &block
33
+ end
34
+ end
35
+
36
+ === Functional Tests
37
+
38
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
39
+
40
+ class FunctionalTest < Test::Unit::TestCase
41
+ test "given no name, when validated, then error is in the objects error collection" do
42
+ klass = Class.new do
43
+ include Validatable
44
+ attr_accessor :name
45
+ validates_presence_of :name
46
+ end
47
+ instance = klass.new
48
+ instance.valid?
49
+ assert_equal "can't be empty", instance.errors.on(:name)
50
+ end
51
+
52
+ test "given invalid name format, when validated, then error is in the objects error collection" do
53
+ klass = Class.new do
54
+ include Validatable
55
+ attr_accessor :name
56
+ validates_format_of :name, :with => /.+/
57
+ end
58
+ instance = klass.new
59
+ instance.valid?
60
+ assert_equal "is invalid", instance.errors.on(:name)
61
+ end
62
+
63
+ test "given no acceptance, when validated, then error is in the objects error collection" do
64
+ klass = Class.new do
65
+ include Validatable
66
+ attr_accessor :name
67
+ validates_acceptance_of :name
68
+ end
69
+ instance = klass.new
70
+ instance.valid?
71
+ assert_equal "must be accepted", instance.errors.on(:name)
72
+ end
73
+
74
+ test "given non matching attributes, when validated, then error is in the objects error collection" do
75
+ klass = Class.new do
76
+ include Validatable
77
+ attr_accessor :name, :name_confirmation
78
+ validates_confirmation_of :name
79
+ end
80
+ instance = klass.new
81
+ instance.name = "foo"
82
+ instance.name_confirmation = "bar"
83
+ instance.valid?
84
+ assert_equal "doesn't match confirmation", instance.errors.on(:name)
85
+ end
86
+
87
+ test "given short value, when validated, then error is in the objects error collection" do
88
+ klass = Class.new do
89
+ include Validatable
90
+ attr_accessor :name
91
+ validates_length_of :name, :minimum => 2
92
+ end
93
+ instance = klass.new
94
+ instance.valid?
95
+ assert_equal "is invalid", instance.errors.on(:name)
96
+ end
97
+
98
+ test "given a child class with validations, when parent class is validated, then the error is in the parent objects error collection" do
99
+ child_class = Class.new do
100
+ include Validatable
101
+ attr_accessor :name, :address
102
+ validates_presence_of :name
103
+ validates_format_of :address, :with => /.+/
104
+ end
105
+ klass = Class.new do
106
+ include Validatable
107
+ include_validations_for :child
108
+ define_method :child do
109
+ child_class.new
110
+ end
111
+ end
112
+ instance = klass.new
113
+ instance.valid?
114
+ assert_equal "is invalid", instance.errors.on(:address)
115
+ assert_equal "can't be empty", instance.errors.on(:name)
116
+ end
117
+ end
@@ -0,0 +1,125 @@
1
+ module Validatable
2
+ module ClassMethods
3
+ # call-seq: validates_format_of(*args)
4
+ #
5
+ # Validates whether the value of the specified attribute is of the correct form by matching it against the regular expression provided.
6
+ #
7
+ # class Person < ActiveRecord::Base
8
+ # validates_format_of :first_name, :with => /[ A-Za-z]/
9
+ # end
10
+ #
11
+ # A regular expression must be provided or else an exception will be raised.
12
+ def validates_format_of(*args)
13
+ validate_all(args) do |attribute, message, options|
14
+ self.validations << ValidatesFormatOf.new(attribute, options[:with], message || "is invalid")
15
+ end
16
+ end
17
+
18
+ def validates_length_of(*args)
19
+ validate_all(args) do |attribute, message, options|
20
+ self.validations << ValidatesLengthOf.new(attribute, options[:minimum], options[:maximum], message || "is invalid")
21
+ end
22
+ end
23
+
24
+ def validates_acceptance_of(*args)
25
+ validate_all(args) do |attribute, message, options|
26
+ self.validations << ValidatesAcceptanceOf.new(attribute, message || "must be accepted")
27
+ end
28
+ end
29
+
30
+ def validates_confirmation_of(*args)
31
+ validate_all(args) do |attribute, message, options|
32
+ self.validations << ValidatesConfirmationOf.new(attribute, message || "doesn't match confirmation")
33
+ end
34
+ end
35
+
36
+
37
+ # call-seq: validates_presence_of(*args)
38
+ #
39
+ # Validates that the specified attributes are not nil or an empty string
40
+ #
41
+ # class Person
42
+ # include Validatable
43
+ # validates_presence_of :first_name
44
+ # end
45
+ #
46
+ # The first_name attribute must be in the object and it cannot be nil or empty.
47
+ def validates_presence_of(*args)
48
+ validate_all(args) do |attribute, message, options|
49
+ self.validations << ValidatesPresenceOf.new(attribute, message || "can't be empty")
50
+ end
51
+ end
52
+
53
+ # call-seq: include_validations_for(*args)
54
+ #
55
+ # Validates the specified attributes.
56
+ #
57
+ # class PersonPresenter
58
+ # include Validatable
59
+ # include_validations_for :person
60
+ # attr_accessor :person
61
+ #
62
+ # def initialize(person)
63
+ # @person = person
64
+ # end
65
+ # end
66
+ #
67
+ # The person attribute will be validated. If person is invalid the errors will be added to the PersonPresenter errors collection.
68
+ def include_validations_for(*args)
69
+ children_to_validate.concat args
70
+ end
71
+
72
+ def validate(instance) #:nodoc:
73
+ self.validations.each do |validation|
74
+ instance.errors.add(validation.attribute, validation.message) unless validation.valid?(instance)
75
+ end
76
+ end
77
+
78
+ def validate_children(instance) #:nodoc:
79
+ self.children_to_validate.each do |child_name|
80
+ child = instance.send child_name
81
+ child.valid?
82
+ child.errors.each do |attribute, message|
83
+ instance.errors.add(attribute, message)
84
+ end
85
+ end
86
+ end
87
+
88
+ protected
89
+ def validate_all(args, &block) #:nodoc:
90
+ options = args.last.is_a?(Hash) ? args.pop : {}
91
+ args.each do |attribute|
92
+ yield attribute, options[:message], options
93
+ end
94
+ end
95
+
96
+ def children_to_validate #:nodoc:
97
+ @children_to_validate ||= []
98
+ end
99
+
100
+ def validations #:nodoc:
101
+ @validations ||= []
102
+ end
103
+ end
104
+
105
+ def self.included(klass) #:nodoc:
106
+ klass.extend Validatable::ClassMethods
107
+ end
108
+
109
+ # call-seq: valid?
110
+ #
111
+ # Returns true if no errors were added otherwise false.
112
+ def valid?
113
+ errors.clear
114
+ self.class.validate(self)
115
+ self.class.validate_children(self)
116
+ errors.empty?
117
+ end
118
+
119
+ # call-seq: errors
120
+ #
121
+ # Returns the Errors object that holds all information about attribute error messages.
122
+ def errors
123
+ @errors ||= Validatable::Errors.new
124
+ end
125
+ end
@@ -0,0 +1,23 @@
1
+ module Validatable
2
+ class Errors
3
+ extend Forwardable
4
+
5
+ def_delegators :errors, :empty?, :clear, :each
6
+
7
+ # call-seq: on(attribute)
8
+ #
9
+ # Returns nil, if no errors are associated with the specified attribute.
10
+ # Returns the error message, if one error is associated with the specified attribute.
11
+ def on(attribute)
12
+ errors[attribute.to_sym]
13
+ end
14
+
15
+ def add(attribute, message) #:nodoc:
16
+ errors[attribute.to_sym] = message
17
+ end
18
+
19
+ def errors #:nodoc:
20
+ @errors ||= {}
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,9 @@
1
+ require 'forwardable'
2
+ require File.expand_path(File.dirname(__FILE__) + '/errors')
3
+ require File.expand_path(File.dirname(__FILE__) + '/base')
4
+ require File.expand_path(File.dirname(__FILE__) + '/validation_base')
5
+ require File.expand_path(File.dirname(__FILE__) + '/validates_format_of')
6
+ require File.expand_path(File.dirname(__FILE__) + '/validates_presence_of')
7
+ require File.expand_path(File.dirname(__FILE__) + '/validates_acceptance_of')
8
+ require File.expand_path(File.dirname(__FILE__) + '/validates_confirmation_of')
9
+ require File.expand_path(File.dirname(__FILE__) + '/validates_length_of')
@@ -0,0 +1,7 @@
1
+ module Validatable
2
+ class ValidatesAcceptanceOf < ValidationBase #:nodoc:
3
+ def valid?(instance)
4
+ instance.send(self.attribute) == "true"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Validatable
2
+ class ValidatesConfirmationOf < ValidationBase #:nodoc:
3
+ def valid?(instance)
4
+ instance.send(self.attribute) == instance.send("#{self.attribute}_confirmation".to_sym)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ module Validatable
2
+ class ValidatesFormatOf < ValidationBase #:nodoc:
3
+ attr_accessor :regex
4
+ def initialize(attribute, regex, message)
5
+ self.regex = regex
6
+ super attribute, message
7
+ end
8
+
9
+ def valid?(instance)
10
+ instance.send(self.attribute) =~ self.regex && true
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ module Validatable
2
+ class ValidatesLengthOf < ValidationBase #:nodoc:
3
+ attr_accessor :attribute, :minimum, :maximum
4
+ def initialize(attribute, minimum, maximum, message)
5
+ self.minimum = minimum
6
+ self.maximum = maximum
7
+ super attribute, message
8
+ end
9
+
10
+ def valid?(instance)
11
+ valid = true
12
+ value = instance.send(self.attribute) || ""
13
+ valid &&= value.length <= maximum unless maximum.nil?
14
+ valid &&= value.length >= minimum unless minimum.nil?
15
+ valid
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,7 @@
1
+ module Validatable
2
+ class ValidatesPresenceOf < ValidationBase #:nodoc:
3
+ def valid?(instance)
4
+ (!instance.send(self.attribute).nil? && instance.send(self.attribute).strip.length != 0)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ module Validatable
2
+ class ValidationBase #:nodoc:
3
+ attr_accessor :attribute, :message
4
+
5
+ def initialize(attribute, message)
6
+ @attribute, @message = attribute, message
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,51 @@
1
+ require 'rubygems'
2
+ require 'rake/gempackagetask'
3
+ require 'rake/rdoctask'
4
+ require 'rake/contrib/sshpublisher'
5
+
6
+ task :default => :test
7
+
8
+ task :test do
9
+ require File.dirname(__FILE__) + '/test/all_tests.rb'
10
+ end
11
+
12
+ desc 'Generate RDoc'
13
+ Rake::RDocTask.new do |task|
14
+ task.main = 'README'
15
+ task.title = 'Validatable'
16
+ task.rdoc_dir = 'doc'
17
+ task.options << "--line-numbers" << "--inline-source"
18
+ task.rdoc_files.include('README', 'lib/**/*.rb')
19
+ %x[erb README_TEMPLATE > README]
20
+ end
21
+
22
+ desc "Upload RDoc to RubyForge"
23
+ task :publish_rdoc => [:rdoc] do
24
+ Rake::SshDirPublisher.new("jaycfields@rubyforge.org", "/var/www/gforge-projects/validatable", "doc").upload
25
+ end
26
+
27
+ Gem::manage_gems
28
+
29
+ specification = Gem::Specification.new do |s|
30
+ s.name = "validatable"
31
+ s.summary = "Validatable is a library for adding validations."
32
+ s.version = "1.0.0"
33
+ s.author = 'Jay Fields'
34
+ s.description = "Validatable is a library for adding validations."
35
+ s.email = 'validatable-developer@rubyforge.org'
36
+ s.homepage = 'http://validatable.rubyforge.org'
37
+ s.rubyforge_project = 'validatable'
38
+
39
+ s.has_rdoc = true
40
+ s.extra_rdoc_files = ['README']
41
+ s.rdoc_options << '--title' << 'SQL DSL' << '--main' << 'README' << '--line-numbers'
42
+
43
+ s.autorequire = 'validatable'
44
+ s.files = FileList['{lib,test}/**/*.rb', '[A-Z]*$', 'rakefile.rb'].to_a
45
+ s.test_file = "test/all_tests.rb"
46
+ end
47
+
48
+ Rake::GemPackageTask.new(specification) do |package|
49
+ package.need_zip = true
50
+ package.need_tar = true
51
+ end
@@ -0,0 +1 @@
1
+ Dir['**/*_test.rb'].each { |test_case| require test_case }
@@ -0,0 +1,9 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
+
3
+ class ErrorsTest < Test::Unit::TestCase
4
+ test "when an error is added, then it can be returned from on" do
5
+ errors = Validatable::Errors.new
6
+ errors.add(:attribute, "message")
7
+ assert_equal "message", errors.on(:attribute)
8
+ end
9
+ end
@@ -0,0 +1,80 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
+
3
+ class FunctionalTest < Test::Unit::TestCase
4
+ test "given no name, when validated, then error is in the objects error collection" do
5
+ klass = Class.new do
6
+ include Validatable
7
+ attr_accessor :name
8
+ validates_presence_of :name
9
+ end
10
+ instance = klass.new
11
+ instance.valid?
12
+ assert_equal "can't be empty", instance.errors.on(:name)
13
+ end
14
+
15
+ test "given invalid name format, when validated, then error is in the objects error collection" do
16
+ klass = Class.new do
17
+ include Validatable
18
+ attr_accessor :name
19
+ validates_format_of :name, :with => /.+/
20
+ end
21
+ instance = klass.new
22
+ instance.valid?
23
+ assert_equal "is invalid", instance.errors.on(:name)
24
+ end
25
+
26
+ test "given no acceptance, when validated, then error is in the objects error collection" do
27
+ klass = Class.new do
28
+ include Validatable
29
+ attr_accessor :name
30
+ validates_acceptance_of :name
31
+ end
32
+ instance = klass.new
33
+ instance.valid?
34
+ assert_equal "must be accepted", instance.errors.on(:name)
35
+ end
36
+
37
+ test "given non matching attributes, when validated, then error is in the objects error collection" do
38
+ klass = Class.new do
39
+ include Validatable
40
+ attr_accessor :name, :name_confirmation
41
+ validates_confirmation_of :name
42
+ end
43
+ instance = klass.new
44
+ instance.name = "foo"
45
+ instance.name_confirmation = "bar"
46
+ instance.valid?
47
+ assert_equal "doesn't match confirmation", instance.errors.on(:name)
48
+ end
49
+
50
+ test "given short value, when validated, then error is in the objects error collection" do
51
+ klass = Class.new do
52
+ include Validatable
53
+ attr_accessor :name
54
+ validates_length_of :name, :minimum => 2
55
+ end
56
+ instance = klass.new
57
+ instance.valid?
58
+ assert_equal "is invalid", instance.errors.on(:name)
59
+ end
60
+
61
+ test "given a child class with validations, when parent class is validated, then the error is in the parent objects error collection" do
62
+ child_class = Class.new do
63
+ include Validatable
64
+ attr_accessor :name, :address
65
+ validates_presence_of :name
66
+ validates_format_of :address, :with => /.+/
67
+ end
68
+ klass = Class.new do
69
+ include Validatable
70
+ include_validations_for :child
71
+ define_method :child do
72
+ child_class.new
73
+ end
74
+ end
75
+ instance = klass.new
76
+ instance.valid?
77
+ assert_equal "is invalid", instance.errors.on(:address)
78
+ assert_equal "can't be empty", instance.errors.on(:name)
79
+ end
80
+ end
@@ -0,0 +1,12 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require 'mocha'
4
+ require File.dirname(__FILE__) + '/../lib/validatable'
5
+
6
+ class << Test::Unit::TestCase
7
+ def test(name, &block)
8
+ test_name = :"test_#{name.gsub(' ','_')}"
9
+ raise ArgumentError, "#{test_name} is already defined" if self.instance_methods.include? test_name.to_s
10
+ define_method test_name, &block
11
+ end
12
+ end
@@ -0,0 +1,44 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
+
3
+ class ValidatableTest < Test::Unit::TestCase
4
+ test "given a validation that returns false when object is validated then valid returns false" do
5
+ validation = stub(:valid? => false, :attribute => "attribute", :message => "message")
6
+ klass = Class.new do
7
+ include Validatable
8
+ validations << validation
9
+ end
10
+ assert_equal false, klass.new.valid?
11
+ end
12
+
13
+ test "when validations are included for a child, then the list is maintained as an array of args" do
14
+ klass = Class.new do
15
+ include Validatable
16
+ include_validations_for :anything, :else
17
+ end
18
+ assert_equal [:anything, :else], klass.send(:children_to_validate)
19
+ end
20
+
21
+ test "when validate is executed, then messages are added for each validation that fails" do
22
+ klass = Class.new do
23
+ include Validatable
24
+ end
25
+ klass.send(:validations) << stub(:valid? => false, :attribute => 'attribute', :message => 'message')
26
+ klass.send(:validations) << stub(:valid? => false, :attribute => 'attribute2', :message => 'message2')
27
+ instance=mock
28
+ instance.expects(:errors).returns(errors=mock).times 2
29
+ errors.expects(:add).with('attribute', 'message')
30
+ errors.expects(:add).with('attribute2', 'message2')
31
+ klass.validate(instance)
32
+ end
33
+
34
+ test "when valid is called, then the errors collection is cleared and reinitialized" do
35
+ klass = Class.new do
36
+ include Validatable
37
+ end
38
+ instance = klass.new
39
+ instance.errors.add(:attribute, "message")
40
+ instance.valid?
41
+ assert_equal true, instance.errors.empty?
42
+ end
43
+
44
+ end
@@ -0,0 +1,15 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
+
3
+ class ValidatesAcceptanceOfTest < Test::Unit::TestCase
4
+ test "valid acceptance" do
5
+ validation = Validatable::ValidatesAcceptanceOf.new(:acceptance, :message)
6
+ instance = stub(:acceptance=>'true')
7
+ assert_equal true, validation.valid?(instance)
8
+ end
9
+
10
+ test "invalid acceptance" do
11
+ validation = Validatable::ValidatesAcceptanceOf.new(:acceptance, :message)
12
+ instance = stub(:acceptance=>'false')
13
+ assert_equal false, validation.valid?(instance)
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
+
3
+ class ValidatesConfirmationOfTest < Test::Unit::TestCase
4
+ test "valid confirmation" do
5
+ validation = Validatable::ValidatesConfirmationOf.new(:username, :message)
6
+ instance = stub(:username=>"username", :username_confirmation=>"username")
7
+ assert_equal true, validation.valid?(instance)
8
+ end
9
+
10
+ test "invalid confirmation" do
11
+ validation = Validatable::ValidatesConfirmationOf.new(:username, :message)
12
+ instance = stub(:username=>"username", :username_confirmation=>"usessrname")
13
+ assert_equal false, validation.valid?(instance)
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
+
3
+ class ValidatesFormatOfTest < Test::Unit::TestCase
4
+ test "when attribute value does not match the given regex, then valid is false" do
5
+ validation = Validatable::ValidatesFormatOf.new(:name, /book/, "message")
6
+ assert_equal false, validation.valid?(stub_everything)
7
+ end
8
+
9
+ test "when attribute value does match the given regex, then valid is true" do
10
+ validation = Validatable::ValidatesFormatOf.new(:name, /book/, "message")
11
+ assert_equal true, validation.valid?(stub(:name=>"book"))
12
+ end
13
+ end
@@ -0,0 +1,23 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
+
3
+ class ValidatesLengthOfTest < Test::Unit::TestCase
4
+
5
+ test "max length" do
6
+ validation = Validatable::ValidatesLengthOf.new(:username, nil, 8, :message)
7
+ instance = stub(:username=>"usernamefdfd")
8
+ assert_equal false, validation.valid?(instance)
9
+ end
10
+
11
+ test "min length" do
12
+ validation = Validatable::ValidatesLengthOf.new(:username, 2, nil, :message)
13
+ instance = stub(:username=>"u")
14
+ assert_equal false, validation.valid?(instance)
15
+ end
16
+
17
+ test "valid length" do
18
+ validation = Validatable::ValidatesLengthOf.new(:username, 2, 8, :message)
19
+ instance = stub(:username=>"udfgdf")
20
+ assert_equal true, validation.valid?(instance)
21
+ end
22
+ end
23
+
@@ -0,0 +1,13 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
+
3
+ class ValidatesPresenceOfTest < Test::Unit::TestCase
4
+ test "when attribute value does not match the given regex, then valid is false" do
5
+ validation = Validatable::ValidatesPresenceOf.new(:name, "message")
6
+ assert_equal false, validation.valid?(stub_everything)
7
+ end
8
+
9
+ test "when attribute value does match the given regex, then valid is true" do
10
+ validation = Validatable::ValidatesPresenceOf.new(:name, "message")
11
+ assert_equal true, validation.valid?(stub(:name=>"book"))
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.8.11
3
+ specification_version: 1
4
+ name: validatable
5
+ version: !ruby/object:Gem::Version
6
+ version: 1.0.0
7
+ date: 2007-02-03 00:00:00 -05:00
8
+ summary: Validatable is a library for adding validations.
9
+ require_paths:
10
+ - lib
11
+ email: validatable-developer@rubyforge.org
12
+ homepage: http://validatable.rubyforge.org
13
+ rubyforge_project: validatable
14
+ description: Validatable is a library for adding validations.
15
+ autorequire: validatable
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ authors:
29
+ - Jay Fields
30
+ files:
31
+ - lib/base.rb
32
+ - lib/errors.rb
33
+ - lib/validatable.rb
34
+ - lib/validates_acceptance_of.rb
35
+ - lib/validates_confirmation_of.rb
36
+ - lib/validates_format_of.rb
37
+ - lib/validates_length_of.rb
38
+ - lib/validates_presence_of.rb
39
+ - lib/validation_base.rb
40
+ - test/all_tests.rb
41
+ - test/errors_test.rb
42
+ - test/functional_test.rb
43
+ - test/test_helper.rb
44
+ - test/validatable_test.rb
45
+ - test/validates_acceptance_of_test.rb
46
+ - test/validates_confirmation_of_test.rb
47
+ - test/validates_format_of_test.rb
48
+ - test/validates_length_of_test.rb
49
+ - test/validates_presence_of_test.rb
50
+ - rakefile.rb
51
+ - README
52
+ test_files:
53
+ - test/all_tests.rb
54
+ rdoc_options:
55
+ - --title
56
+ - SQL DSL
57
+ - --main
58
+ - README
59
+ - --line-numbers
60
+ extra_rdoc_files:
61
+ - README
62
+ executables: []
63
+
64
+ extensions: []
65
+
66
+ requirements: []
67
+
68
+ dependencies: []
69
+