validate 1.1 → 1.2

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.
@@ -0,0 +1,21 @@
1
+
2
+ require 'validate'
3
+
4
+ class Hash
5
+
6
+ # Validates the hash using either a pre-compiled validation, or by parsing
7
+ # the block passed.
8
+ #
9
+ def validates?(validations=nil, &block)
10
+ validations = ::Validate::Parser.parse(&block) unless validations
11
+ @validator = ::Validate::Validator.new(validations)
12
+ @validator.validates?(self)
13
+ end
14
+
15
+ # Returns any failures from the last run validations.
16
+ #
17
+ def failures
18
+ return [] unless @validator
19
+ @validator.failures
20
+ end
21
+ end
@@ -15,7 +15,7 @@ module Validate
15
15
  # validates_type_of :tier, is: Numeric
16
16
  # end
17
17
  #
18
- class BlockParsingContext
18
+ class Parser
19
19
 
20
20
  def self.parse(&block)
21
21
  # execute block, return array of validation methods called
@@ -23,6 +23,10 @@ module Validate
23
23
  context.instance_exec(&block)
24
24
  context.validations
25
25
  end
26
+ end
27
+
28
+
29
+ class BlockParsingContext
26
30
 
27
31
  def initialize
28
32
  @validations = []
@@ -35,7 +39,7 @@ module Validate
35
39
  raise NoMethodError.new("Undefined validation method: #{method}...") unless ValidationMethods.new.respond_to?(method)
36
40
  opts = args.pop if args.last.is_a?(::Hash)
37
41
  children = if block
38
- BlockParsingContext.parse(&block)
42
+ Parser.parse(&block)
39
43
  end
40
44
  @validations << {
41
45
  name: method,
@@ -52,7 +56,7 @@ module Validate
52
56
  # end
53
57
  #
54
58
  def run_when(condition, &block)
55
- validations = BlockParsingContext.parse(&block)
59
+ validations = Parser.parse(&block)
56
60
  validations.map do |v|
57
61
  v[:opts] ||= {}
58
62
  v[:opts][:when] = condition
@@ -46,6 +46,7 @@ module Validate
46
46
  #
47
47
  # validates_inclusion_of :type, in: %w(paid free)
48
48
  #
49
+ fails_because_key { "was not of in #{opts[:in].inspect}." }
49
50
  def validates_inclusion_of(obj, field, opts, validator)
50
51
  opts[:in].include?(obj[field])
51
52
  end
@@ -54,6 +55,7 @@ module Validate
54
55
  #
55
56
  # validates_numericality_of :amount
56
57
  #
58
+ fails_because_key 'was not Numeric.'
57
59
  def validates_numericality_of(obj, field, opts, validator)
58
60
  obj[field].is_a?(Numeric)
59
61
  end
@@ -62,6 +64,7 @@ module Validate
62
64
  #
63
65
  # validates_value_of :field, is: 'something'
64
66
  #
67
+ fails_because_key { "was not of in #{opts[:is].inspect}." }
65
68
  def validates_value_of(obj, field, opts, validator)
66
69
  obj.include?(field) && obj[field] == opts[:is]
67
70
  end
@@ -73,6 +76,7 @@ module Validate
73
76
  # validates_numericality_of :amount
74
77
  # end
75
78
  #
79
+ fails_because_key { ['failed validation with errors:', validator.failures] }
76
80
  def validates_child_hash(obj, field, opts, validator)
77
81
  return false unless obj[field].respond_to?(:to_hash)
78
82
  hash = obj[field].to_hash
@@ -89,6 +93,7 @@ module Validate
89
93
  # validates_type_of :self, is: String
90
94
  # end
91
95
  #
96
+ fails_because_key 'contained at least one element which failed validation.'
92
97
  def validates_array(obj, field, opts, validator)
93
98
  return false unless obj[field].respond_to?(:to_a)
94
99
  array = obj[field].to_a
@@ -101,6 +106,7 @@ module Validate
101
106
  #
102
107
  # validates_regex :field, matches: /^hello/
103
108
  #
109
+ fails_because_key { "did not match regex #{opts[:matches].inspect}." }
104
110
  def validates_regex(obj, field, opts, validator)
105
111
  return false unless obj[field].respond_to?(:=~)
106
112
  0 == (obj[field] =~ opts[:matches])
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Validate
3
- VERSION = '1.1'
3
+ VERSION = '1.2'
4
4
  end
data/lib/validate.rb CHANGED
@@ -12,7 +12,7 @@ module Validate
12
12
  #
13
13
  def validations(&block)
14
14
  return @validator unless block
15
- validations = BlockParsingContext.parse(&block)
15
+ validations = Parser.parse(&block)
16
16
  @validator = Validator.new(validations)
17
17
  end
18
18
  end
@@ -513,6 +513,37 @@ describe Validate do
513
513
  test.validates?.should == false
514
514
  end
515
515
  end
516
+
517
+
518
+ context Hash do
519
+
520
+ before do
521
+ require 'validate/hash'
522
+ @compiled_validation = Validate::Parser.parse do
523
+ validates_presence_of 'name', when: -> { true }
524
+ end
525
+ end
526
+
527
+ it 'should validate a valid object' do
528
+ hash = {"name" => :hello}
529
+ hash.validates?(@compiled_validation).should == true
530
+ hash.failures.should == []
531
+ end
532
+
533
+ it 'should fail to validate an invalid object' do
534
+ hash = {"not_name" => :hello}
535
+ hash.validates?(@compiled_validation).should == false
536
+ hash.failures.should == [{"name"=>"was not present."}]
537
+ end
538
+
539
+ it 'should validate a valid object, when compiling on the fly' do
540
+ hash = {"name" => :hello}
541
+ hash.validates? do
542
+ validates_presence_of 'name', when: -> { true }
543
+ end.should == true
544
+ hash.failures.should == []
545
+ end
546
+ end
516
547
  end
517
548
 
518
549
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validate
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.1'
4
+ version: '1.2'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-17 00:00:00.000000000 Z
12
+ date: 2013-04-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -40,6 +40,7 @@ files:
40
40
  - README.md
41
41
  - Rakefile
42
42
  - lib/validate.rb
43
+ - lib/validate/hash.rb
43
44
  - lib/validate/kongo.rb
44
45
  - lib/validate/parser.rb
45
46
  - lib/validate/validations.rb