valid 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,88 @@
1
+ # Validator
2
+
3
+ Validator is a simple ruby validation class. You don't use it directly inside your classes like just about every other ruby validation class out there. I chose to implement it in this way so I didn't automatically pollute the namespace of the objects I wanted to validate.
4
+
5
+ This also solves the problem of validating forms very nicely. Frequently you will have a form that represents many different data objects in your system, and you can pre-validate everything before doing any saving.
6
+
7
+ ## Usage
8
+
9
+ Validator is useful for validating the state of any existing ruby object.
10
+
11
+ ```ruby
12
+ object = OpenStruct.new(:email => 'foo@bar.com', :password => 'foobar')
13
+ validator = Validation::Validator.new(object)
14
+ validator.rule(:email, [:email, :not_empty]) # multiple rules in one line
15
+ validator.rule(:password, :not_empty) # a single rule on a line
16
+ validator.rule(:password, :length => {:minimum => 3}) # a rule that takes parameters
17
+
18
+ if validator.valid?
19
+ # save the data somewhere
20
+ else
21
+ @errors = validator.errors
22
+ end
23
+ ```
24
+
25
+ The first paramater can be any message that the object responds to.
26
+
27
+ ### Writing your own rules
28
+
29
+ If you have a custom rule you need to write, just put it inside the `Validation::Rule` namespace:
30
+
31
+ ```ruby
32
+ module Validation
33
+ module Rule
34
+ class MyCustomRule
35
+ def error_key
36
+ :my_custom_rule
37
+ end
38
+
39
+ def valid_value?(value)
40
+ # Logic for determining the validity of the value
41
+ end
42
+
43
+ def params
44
+ {}
45
+ end
46
+ end
47
+ end
48
+ end
49
+ ```
50
+
51
+ A rule class should have the following methods on it:
52
+
53
+ - `error_key` a symbol to represent the error. This shows up in the errors hash
54
+ - `valid_values?(value)` the beef of the rule. This is where you determine if the value is valid or not
55
+ - `params` the params hash that was passed into the constructor
56
+
57
+ ### Writing self-contained validators
58
+
59
+ You can also create self-contained validation classes if you don't like the dynamic creation approach:
60
+
61
+ ```ruby
62
+ require 'validation'
63
+ require 'validation/rule/not_empty'
64
+
65
+ class MyFormValidator < Validation::Validator
66
+ include Validation
67
+
68
+ rule :email, :not_empty
69
+ end
70
+ ```
71
+
72
+ Now you can use this anywhere in your code:
73
+
74
+ ```ruby
75
+ form_validator = MyFormValidator.new(OpenStruct.new(params))
76
+ form_validator.valid?
77
+ ```
78
+
79
+ # Contributing
80
+
81
+ Have an improvement? Have an awesome rule you want included? Simple!
82
+
83
+ 1. Fork the repository
84
+ 2. Write specs for the change
85
+ 3. Add your change
86
+ 4. Submit a pull request
87
+
88
+ Don't change any version files or gemspec files in your change.
@@ -1,8 +1,8 @@
1
1
  module Validation
2
2
  module Rule
3
- class Email
3
+ # Email rule class. This rule was adapted from https://github.com/emmanuel/aequitas/blob/master/lib/aequitas/rule/format/email_address.rb
4
4
 
5
- # taken from: https://github.com/emmanuel/aequitas/blob/master/lib/aequitas/rule/format/email_address.rb
5
+ class Email
6
6
  EMAIL_ADDRESS = begin
7
7
  letter = 'a-zA-Z'
8
8
  digit = '0-9'
@@ -28,15 +28,17 @@ module Validation
28
28
  pattern = /\A#{addr_spec}\z/u
29
29
  end
30
30
 
31
+ # Determines if value is a valid email
31
32
  def valid_value?(value)
32
33
  !!EMAIL_ADDRESS.match(value)
33
34
  end
34
35
 
35
-
36
+ # The error key for this rule
36
37
  def error_key
37
38
  :email
38
39
  end
39
40
 
41
+ # This rule has no params
40
42
  def params
41
43
  {}
42
44
  end
@@ -1,14 +1,27 @@
1
1
  module Validation
2
2
  module Rule
3
+ # Length rule
3
4
  class Length
5
+ # params can be any of the following:
6
+ #
7
+ # - :minimum - at least this many chars
8
+ # - :maximum - at most this many chars
9
+ # - :exact - exactly this many chars
10
+ #
11
+ # Example:
12
+ #
13
+ # {:minimum => 3, :maximum => 10}
14
+ # {:exact => 10}
4
15
  def initialize(params)
5
16
  @params = params
6
17
  end
7
18
 
19
+ # returns the params given in the constructor
8
20
  def params
9
21
  @params
10
22
  end
11
23
 
24
+ # determines if value is valid according to the constructor params
12
25
  def valid_value?(value)
13
26
  valid = true
14
27
 
@@ -1,20 +1,29 @@
1
1
  module Validation
2
2
  module Rule
3
+ # Matches rule
3
4
  class Matches
4
5
  attr_writer :obj
5
6
 
7
+ # This class should take the field to match with in the constructor:
8
+ #
9
+ # rule = Validation::Rule::Matches(:password)
10
+ # rule.obj = OpenStruct.new(:password => 'foo')
11
+ # rule.valid_value?('foo')
6
12
  def initialize(matcher_field)
7
13
  @matcher_field = matcher_field
8
14
  end
9
15
 
16
+ # The error key for this rule
10
17
  def error_key
11
18
  :matches
12
19
  end
13
20
 
21
+ # Params is the matcher_field given in the constructor
14
22
  def params
15
23
  @matcher_field
16
24
  end
17
25
 
26
+ # Determines if value matches the field given in the constructor
18
27
  def valid_value?(value)
19
28
  matcher_value = @obj.send(@matcher_field)
20
29
  matcher_value == value
@@ -1,14 +1,18 @@
1
1
  module Validation
2
2
  module Rule
3
+ # Rule for not empty
3
4
  class NotEmpty
5
+ # This rule has no params
4
6
  def params
5
7
  {}
6
8
  end
7
9
 
10
+ # Determines if value is empty or not. In this rule, nil is empty
8
11
  def valid_value?(value)
9
12
  ! (value.nil? || value.empty?)
10
13
  end
11
14
 
15
+ # The error key for this field
12
16
  def error_key
13
17
  :not_empty
14
18
  end
@@ -1,14 +1,18 @@
1
1
  module Validation
2
2
  module Rule
3
+ # rule for numeric values
3
4
  class Numeric
5
+ # Determines if value is numeric. It can only contain whole numbers
4
6
  def valid_value?(value)
5
7
  !!/^[0-9]+$/.match(value.to_s)
6
8
  end
7
9
 
10
+ # The error key for this rule
8
11
  def error_key
9
12
  :numeric
10
13
  end
11
14
 
15
+ # this rule has no params
12
16
  def params
13
17
  {}
14
18
  end
@@ -1,13 +1,24 @@
1
1
  module Validation
2
2
  module Rules
3
+ # A hash of rules for this object
3
4
  def rules
4
5
  @rules ||= {}
5
6
  end
6
7
 
8
+ # A hash of errors for this object
7
9
  def errors
8
10
  @errors ||= {}
9
11
  end
10
12
 
13
+ # Define a rule for this object
14
+ #
15
+ # The rule parameter can be one of the following:
16
+ #
17
+ # * a symbol that matches to a class in the Validation::Rule namespace
18
+ # * e.g. rule(:field, :not_empty)
19
+ # * a hash containing the rule as the key and it's parameters as the values
20
+ # * e.g. rule(:field, :length => {:minimum => 3, :maximum => 5})
21
+ # * an array combining the two previous types
11
22
  def rule(field, rule)
12
23
  field = field.to_sym
13
24
  if rules[field].nil?
@@ -37,6 +48,9 @@ module Validation
37
48
  end
38
49
  end
39
50
 
51
+ # Determines if this object is valid. When a rule fails for a field,
52
+ # this will stop processing further rules. In this way, you'll only get
53
+ # one error per field
40
54
  def valid?
41
55
  valid = true
42
56
 
@@ -59,6 +73,7 @@ module Validation
59
73
 
60
74
  protected
61
75
 
76
+ # Adds a parameterized rule to this object
62
77
  def add_parameterized_rule(field, rule)
63
78
  rule.each_pair do |key, value|
64
79
  r = Validation::Rule.const_get(camelize(key)).new(value)
@@ -67,12 +82,14 @@ module Validation
67
82
  end
68
83
  end
69
84
 
85
+ # Adds this validation object to a rule if it can accept it
70
86
  def add_object_to_rule(rule)
71
87
  if rule.respond_to?(:obj=)
72
88
  rule.obj = @obj
73
89
  end
74
90
  end
75
91
 
92
+ # Converts a symbol to a class name, taken from rails
76
93
  def camelize(term)
77
94
  string = term.to_s
78
95
  string = string.sub(/^[a-z\d]*/) { $&.capitalize }
@@ -80,6 +97,14 @@ module Validation
80
97
  end
81
98
  end
82
99
 
100
+ # Validator is a simple ruby validation class. You don't use it directly
101
+ # inside your classes like just about every other ruby validation class out
102
+ # there. I chose to implement it in this way so I didn't automatically
103
+ # pollute the namespace of the objects I wanted to validate.
104
+ #
105
+ # This also solves the problem of validating forms very nicely. Frequently
106
+ # you will have a form that represents many different data objects in your
107
+ # system, and you can pre-validate everything before doing any saving.
83
108
  class Validator
84
109
  include Validation::Rules
85
110
 
@@ -88,9 +113,11 @@ module Validation
88
113
  end
89
114
  end
90
115
 
116
+ # InvalidKey is raised if a rule is added to a field that doesn't exist
91
117
  class InvalidKey < RuntimeError
92
118
  end
93
119
 
120
+ # InvalidRule is raised if a rule is added that doesn't exist
94
121
  class InvalidRule < RuntimeError
95
122
  end
96
123
  end
@@ -1,3 +1,3 @@
1
1
  module Validation
2
- VERSION = '0.2.0'
2
+ VERSION = '0.2.1'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: valid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -18,15 +18,16 @@ executables: []
18
18
  extensions: []
19
19
  extra_rdoc_files: []
20
20
  files:
21
- - lib/validation.rb
22
21
  - lib/validation/rule/email.rb
23
- - lib/validation/rule/not_empty.rb
22
+ - lib/validation/rule/length.rb
24
23
  - lib/validation/rule/matches.rb
24
+ - lib/validation/rule/not_empty.rb
25
25
  - lib/validation/rule/numeric.rb
26
- - lib/validation/rule/length.rb
27
26
  - lib/validation/validator.rb
28
27
  - lib/validation/version.rb
29
- homepage: https://github.com/zombor/validation
28
+ - lib/validation.rb
29
+ - README.md
30
+ homepage: https://github.com/zombor/Validator
30
31
  licenses: []
31
32
  post_install_message:
32
33
  rdoc_options: []
@@ -46,7 +47,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
46
47
  version: '0'
47
48
  requirements: []
48
49
  rubyforge_project:
49
- rubygems_version: 1.8.17
50
+ rubygems_version: 1.8.24
50
51
  signing_key:
51
52
  specification_version: 3
52
53
  summary: A standalone, generic object validator for ruby