pure_validator 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b2eaaaed1d01fb6d73c7caecc66ad7b97422502b
4
- data.tar.gz: febaaa1df0a19e771ea4246253ccf6592a46d429
3
+ metadata.gz: 77569240246f2ea1f784cab102071acb50716095
4
+ data.tar.gz: b247e8889706590ed2aee0a4f3ad2ae0d2d34d8d
5
5
  SHA512:
6
- metadata.gz: fdebd2254d6696cfec46bc455893d9622721a0f70a63efc63364847ce7b500ba55c06e4f7891076d89965e6ff076e98ae3549e36153982bc9b7394cf051f26ac
7
- data.tar.gz: 1d881ee39ddc16f215dbe39be4450ef49ec84e2ad6ae0bdc94c9bc3bf4dc2b9030aa943fbec50f97c86be8a1fb2eda342b4f5603ea0f9a756f03e18e69b90856
6
+ metadata.gz: ede8f6afabc19468a541b78bf6c372d387827ac65f30df2a7f5fc9e351d5039b7959e228cf6ef99935afb1aa891e9877a636ab8f66601c0b2a1db30509316f54
7
+ data.tar.gz: be8130b200ea9b5777d9057f21a4ab7afcb2b3281c7b46f1e95a4f8e11275c3bcb44ae839aec2972c1760deaca392e04d8c425e16e3c4707d29ac03366047b3c
@@ -0,0 +1,27 @@
1
+ engines:
2
+ rubocop:
3
+ enabled: true
4
+ exclude_fingerprints:
5
+ - 1deadbbb4a858ae5aeeff38fc78ad557
6
+ - 10973ead6ddf385b4d4d7ec0f75236ae
7
+
8
+ bundler-audit:
9
+ enabled: true
10
+
11
+ fixme:
12
+ enabled: true
13
+
14
+ duplication:
15
+ enabled: true
16
+ config:
17
+ languages:
18
+ - ruby
19
+
20
+ ratings:
21
+ paths:
22
+ - Gemfile.lock
23
+ - "**.rb"
24
+
25
+ exclude_paths:
26
+ - spec/**/*
27
+ - lib/pure_validator/core_extensions/**/*
@@ -0,0 +1,3 @@
1
+ v0.4 (2017-06-19)
2
+ - it is now possible to validate hashes with pure validator
3
+
@@ -1,35 +1,40 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pure_validator (0.3.0)
4
+ pure_validator (0.4.0)
5
5
  i18n
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
10
  byebug (9.0.6)
11
- codecov (0.1.9)
11
+ codecov (0.1.10)
12
12
  json
13
13
  simplecov
14
14
  url
15
- diff-lcs (1.2.5)
15
+ diff-lcs (1.3)
16
16
  docile (1.1.5)
17
- i18n (0.6.9)
18
- json (2.0.2)
19
- rake (10.1.1)
20
- rspec (2.14.1)
21
- rspec-core (~> 2.14.0)
22
- rspec-expectations (~> 2.14.0)
23
- rspec-mocks (~> 2.14.0)
24
- rspec-core (2.14.7)
25
- rspec-expectations (2.14.4)
26
- diff-lcs (>= 1.1.3, < 2.0)
27
- rspec-mocks (2.14.4)
28
- simplecov (0.12.0)
17
+ i18n (0.8.4)
18
+ json (2.1.0)
19
+ rake (12.0.0)
20
+ rspec (3.6.0)
21
+ rspec-core (~> 3.6.0)
22
+ rspec-expectations (~> 3.6.0)
23
+ rspec-mocks (~> 3.6.0)
24
+ rspec-core (3.6.0)
25
+ rspec-support (~> 3.6.0)
26
+ rspec-expectations (3.6.0)
27
+ diff-lcs (>= 1.2.0, < 2.0)
28
+ rspec-support (~> 3.6.0)
29
+ rspec-mocks (3.6.0)
30
+ diff-lcs (>= 1.2.0, < 2.0)
31
+ rspec-support (~> 3.6.0)
32
+ rspec-support (3.6.0)
33
+ simplecov (0.14.1)
29
34
  docile (~> 1.1.0)
30
35
  json (>= 1.8, < 3)
31
36
  simplecov-html (~> 0.10.0)
32
- simplecov-html (0.10.0)
37
+ simplecov-html (0.10.1)
33
38
  url (0.3.2)
34
39
 
35
40
  PLATFORMS
@@ -44,4 +49,4 @@ DEPENDENCIES
44
49
  rspec
45
50
 
46
51
  BUNDLED WITH
47
- 1.13.6
52
+ 1.14.6
data/README.md CHANGED
@@ -1,4 +1,9 @@
1
- # PureValidator [![Build Status](https://travis-ci.org/ddd-ruby/pure_validator.png)](https://travis-ci.org/ddd-ruby/pure_validator) [![Code Climate](https://codeclimate.com/github/ddd-ruby/pure_validator/badges/gpa.svg)](https://codeclimate.com/github/ddd-ruby/pure_validator) [![codecov](https://codecov.io/gh/ddd-ruby/pure_validator/branch/master/graph/badge.svg)](https://codecov.io/gh/ddd-ruby/pure_validator)
1
+ # PureValidator
2
+ [![Build Status](https://travis-ci.org/ddd-ruby/pure_validator.svg)](https://travis-ci.org/ddd-ruby/pure_validator)
3
+ [![Gem Version](https://badge.fury.io/rb/pure_validator.svg)](http://badge.fury.io/rb/pure_validator)
4
+ [![Code Climate](https://codeclimate.com/github/ddd-ruby/pure_validator/badges/gpa.svg)](https://codeclimate.com/github/ddd-ruby/pure_validator)
5
+ [![codecov](https://codecov.io/gh/ddd-ruby/pure_validator/branch/master/graph/badge.svg)](https://codecov.io/gh/ddd-ruby/pure_validator)
6
+ [![Dependency Status](https://gemnasium.com/ddd-ruby/pure_validator.svg)](https://gemnasium.com/ddd-ruby/pure_validator)
2
7
 
3
8
  PureValidator is a simple, mostly dependency-free (except `i18n`) library to validate your domain Ruby objects.
4
9
 
@@ -10,6 +15,14 @@ It is a simple step to separate those concerns, but it will give you unlimited f
10
15
 
11
16
  Do yourself a favor and start using PureValidator today, you will never look back!
12
17
 
18
+ ## Installation
19
+
20
+ Add this line to your application's Gemfile:
21
+
22
+ ```ruby
23
+ gem 'pure_validator'
24
+ ```
25
+
13
26
  ## Usage
14
27
  Let's say you have the following class and you want to validate its instances:
15
28
 
@@ -137,3 +150,4 @@ Or install it yourself as:
137
150
 
138
151
  - Albert Gazizov, [@deeper4k](https://twitter.com/deeper4k)
139
152
  - Roman Heinrich, [@mindreframer](https://twitter.com/mindreframer)
153
+
@@ -0,0 +1 @@
1
+ theme: jekyll-theme-minimal
@@ -0,0 +1,139 @@
1
+ # PureValidator [![Build Status](https://travis-ci.org/ddd-ruby/pure_validator.png)](https://travis-ci.org/ddd-ruby/pure_validator) [![Code Climate](https://codeclimate.com/github/ddd-ruby/pure_validator/badges/gpa.svg)](https://codeclimate.com/github/ddd-ruby/pure_validator) [![codecov](https://codecov.io/gh/ddd-ruby/pure_validator/branch/master/graph/badge.svg)](https://codecov.io/gh/ddd-ruby/pure_validator)
2
+
3
+ PureValidator is a simple, mostly dependency-free (except `i18n`) library to validate your domain Ruby objects.
4
+
5
+ It keeps the concerns of validation separate from the Entity / Value object itself.
6
+
7
+ This gives you the option to have different validations rules for different ocasions for the same object in a very clean and unit-testable way.
8
+
9
+ It is a simple step to separate those concerns, but it will give you unlimited flexibility and save your *SS from debugging entangled and conflicting validations for non-trivial requirements.
10
+
11
+ Do yourself a favor and start using PureValidator today, you will never look back!
12
+
13
+ ## Usage
14
+ Let's say you have the following class and you want to validate its instances:
15
+
16
+ ```ruby
17
+ class Contact
18
+ attr_accessor :first_name, :last_name, :position, :age, :type, :email, :color, :status, :stage, :description, :companies
19
+ end
20
+ ```
21
+
22
+ To validate objects of the Contact class define following validator:
23
+
24
+ ```ruby
25
+ class ContactValidator
26
+ include PureValidator::Validator
27
+
28
+ validates :first_name, presence: true, length: { min: 4, max: 7 }
29
+ validates :last_name, length: { equal_to: 5 }
30
+ validates :position, length: { not_equal_to: 5 }
31
+ validates :age, numericality: { greater_than: 0, less_than: 150 }
32
+ validates :type, numericality: { greater_than_or_equal_to: 1, less_than_or_equal_to: 5 }
33
+ validates :email, email: true
34
+ validates :color, regexp: /#\w{6}/
35
+ validates :status, inclusion: { in: [:new, :lead] }
36
+ validates :stage, exclusion: { in: [:wrong, :bad] }
37
+
38
+ validate_associated :companies, validator: CompanyValidator
39
+
40
+ validate :check_description
41
+
42
+ def check_description(entity, errors)
43
+ if entity.description.nil?
44
+ errors.add(:description, "can't be empty")
45
+ end
46
+ end
47
+ end
48
+ ```
49
+
50
+ Instantiate the validator and call `validate` with a contact object:
51
+
52
+ ```ruby
53
+ errors = ContactValidator.new.validate(contact)
54
+ ```
55
+
56
+ `errors` is a Hash that contains all validation errors.
57
+ If the object is valid then errors will be an empty Hash.
58
+
59
+ ### Adding own validators
60
+
61
+ PureValidator can be extended by adding your own validators.
62
+ To add a validator define a class with 2 static methods: `validate` and `validate_options`:
63
+
64
+ The following example shows the built-in inclusion validator, it validates that specified value is one of the defined values.
65
+
66
+ ```ruby
67
+ class PureValidator::Validators::InclusionValidator
68
+
69
+ # Validates that given value inscluded in the specified list
70
+ # @param value [Object] object to validate
71
+ # @parm options [Hash] validation options, e.g. { in: [:small, :medium, :large], message: "not included in the list of allowed items" }
72
+ # where :in - list of allowed values,
73
+ # message - is a message to return if value is not included in the list
74
+ # @return [Array] empty array if object is valid, list of errors otherwise
75
+ def self.validate(value, options)
76
+ return [] if value.nil?
77
+
78
+ errors = []
79
+ if options[:in]
80
+ unless options[:in].include?(value)
81
+ errors << (options[:message] || PureValidator::I18n.t('errors.should_be_included_in_list', list: options[:in]))
82
+ end
83
+ end
84
+ errors
85
+ end
86
+
87
+ # Validates that options specified in
88
+ # :inclusion are valid
89
+ def self.validate_options(options)
90
+ raise ArgumentError, "validation options should be a Hash" unless options.is_a?(Hash)
91
+ raise ArgumentError, "validation options should have :in option and it should be an array of allowed values" unless options[:in].is_a?(Array)
92
+ end
93
+
94
+ end
95
+ ```
96
+
97
+ And register it in PureValidator:
98
+
99
+ ```ruby
100
+ PureValidator.add_validator(:inclusion, PureValidator::Validators::InclusionValidator)
101
+ ```
102
+
103
+ Now you can use it:
104
+
105
+ ```ruby
106
+ class SomeValidator
107
+ include PureValidator::Validator
108
+
109
+ validates :size, inclusion: { in: [:small, :medium, :large] }
110
+ end
111
+ ```
112
+
113
+ ## Installation
114
+
115
+ Add this line to your application's Gemfile:
116
+
117
+ gem 'pure_validator'
118
+
119
+ And then execute:
120
+
121
+ $ bundle
122
+
123
+ Or install it yourself as:
124
+
125
+ $ gem install pure_validator
126
+
127
+ ## Contributing
128
+
129
+ 1. Fork it
130
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
131
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
132
+ 4. Push to the branch (`git push origin my-new-feature`)
133
+ 5. Create new Pull Request
134
+
135
+
136
+ ## Authors
137
+
138
+ - Albert Gazizov, [@deeper4k](https://twitter.com/deeper4k)
139
+ - Roman Heinrich, [@mindreframer](https://twitter.com/mindreframer)
@@ -66,7 +66,7 @@ module PureValidator::Validator
66
66
  self.associated_validations.each do |association_name, options|
67
67
  next if skip_validation?(options)
68
68
  validator = options[:validator].is_a?(Class) ? options[:validator].new : self.send(options[:validator])
69
- children = entity.send(association_name)
69
+ children = get_attribute_value(entity, association_name)
70
70
  if children.is_a?(Array)
71
71
  validate_children(association_name, validator, children, errors)
72
72
  elsif children
@@ -93,7 +93,7 @@ module PureValidator::Validator
93
93
  private
94
94
 
95
95
  def validate_attr(attr_name, entity, validators)
96
- attr_value = entity.send(attr_name)
96
+ attr_value = get_attribute_value(entity, attr_name)
97
97
  error_messages = []
98
98
  validators.each do |validator, validation_rule|
99
99
  error_messages = validator.validate(attr_value, validation_rule)
@@ -102,6 +102,11 @@ module PureValidator::Validator
102
102
  error_messages
103
103
  end
104
104
 
105
+ def get_attribute_value(entity, attr_name)
106
+ return entity[attr_name] if entity.is_a?(Hash)
107
+ return entity.send(attr_name)
108
+ end
109
+
105
110
  def skip_validation?(options)
106
111
  return unless options[:if] || options[:unless]
107
112
  return handle_if_skip_validation(options) if options[:if]
@@ -5,23 +5,7 @@ class PureValidator::Validators::LengthValidator
5
5
  # @param options [Hash] validation options, e.g. { min: 2, max: 4, equal_to: 3, not_equal_to: 6 }
6
6
  # @return [Array] empty array if object is valid, array of error messages otherwise
7
7
  def self.validate(object, options)
8
- return [] if object.nil?
9
-
10
- errors = []
11
- if options[:min]
12
- errors << PureValidator::I18n.t('errors.can_not_be_less_than', length: options[:min]) if object.length < options[:min]
13
- end
14
- if options[:max]
15
- errors << PureValidator::I18n.t('errors.can_not_be_more_than', length: options[:max]) if object.length > options[:max]
16
- end
17
- if options[:equal_to]
18
- errors << PureValidator::I18n.t('errors.should_be_equal_to', length: options[:equal_to]) if object.length != options[:equal_to]
19
- end
20
- if options[:not_equal_to]
21
- errors << PureValidator::I18n.t('errors.should_not_be_equal_to', length: options[:not_equal_to]) if object.length == options[:not_equal_to]
22
- end
23
-
24
- errors
8
+ self.new(object, options).validate
25
9
  end
26
10
 
27
11
  def self.validate_options(options)
@@ -29,4 +13,31 @@ class PureValidator::Validators::LengthValidator
29
13
  PureValidator::ArgsValidator.has_only_allowed_keys!(options, [:min, :max, :equal_to, :not_equal_to], :validation_rule)
30
14
  end
31
15
 
16
+ attr_accessor :object, :options, :errors
17
+ def initialize(object, options)
18
+ @object, @options = object, options
19
+ @errors = []
20
+ end
21
+
22
+ def validate
23
+ return errors if object.nil?
24
+
25
+ handle(:min, :<, 'errors.can_not_be_less_than')
26
+ handle(:max, :>, 'errors.can_not_be_more_than')
27
+ handle(:equal_to, :!=, 'errors.should_be_equal_to')
28
+ handle(:not_equal_to, :==, 'errors.should_not_be_equal_to')
29
+
30
+ errors
31
+ end
32
+
33
+ def handle(key, condition, error_key)
34
+ return unless options[key]
35
+ if object.length.send(condition, options[key])
36
+ add_error!(error_key, options[key])
37
+ end
38
+ end
39
+
40
+ def add_error!(key, length)
41
+ errors << PureValidator::I18n.t(key, length: length)
42
+ end
32
43
  end
@@ -5,28 +5,7 @@ class PureValidator::Validators::NumericalityValidator
5
5
  # @param options [Hash] validation rules
6
6
  # @return [Array] empty array if number is valid, array of error messages otherwise
7
7
  def self.validate(number, options)
8
- return [] if number.nil?
9
-
10
- errors = []
11
- if options[:greater_than]
12
- errors << PureValidator::I18n.t('errors.should_be_greater_than', number: options[:greater_than]) if number <= options[:greater_than]
13
- end
14
- if options[:greater_than_or_equal_to]
15
- errors << PureValidator::I18n.t('errors.should_be_greater_than_or_equal_to', number: options[:greater_than_or_equal_to]) if number < options[:greater_than_or_equal_to]
16
- end
17
- if options[:less_than]
18
- errors << PureValidator::I18n.t('errors.should_be_less_than', number: options[:less_than]) if number >= options[:less_than]
19
- end
20
- if options[:less_than_or_equal_to]
21
- errors << PureValidator::I18n.t('errors.should_be_less_than_or_equal_to', number: options[:less_than_or_equal_to]) if number > options[:less_than_or_equal_to]
22
- end
23
- if options[:even]
24
- errors << PureValidator::I18n.t('errors.should_be_even') unless number.even?
25
- end
26
- if options[:odd]
27
- errors << PureValidator::I18n.t('errors.should_be_odd') unless number.odd?
28
- end
29
- errors
8
+ self.new(number, options).validate
30
9
  end
31
10
 
32
11
  def self.validate_options(options)
@@ -36,4 +15,44 @@ class PureValidator::Validators::NumericalityValidator
36
15
  ], :validation_rule)
37
16
  end
38
17
 
18
+ attr_accessor :object, :options, :errors
19
+ def initialize(object, options)
20
+ @object, @options = object, options
21
+ @errors = []
22
+ end
23
+
24
+ def validate
25
+ return errors if object.nil?
26
+
27
+ handle_compare(:greater_than, :<=, 'errors.should_be_greater_than')
28
+ handle_compare(:greater_than_or_equal_to, :<, 'errors.should_be_greater_than_or_equal_to')
29
+ handle_compare(:less_than, :>=, 'errors.should_be_less_than')
30
+ handle_compare(:less_than_or_equal_to, :>, 'errors.should_be_less_than_or_equal_to')
31
+ handle_condition(:even, :even?, 'errors.should_be_even')
32
+ handle_condition(:odd, :odd?, 'errors.should_be_odd')
33
+
34
+ errors
35
+ end
36
+
37
+ def handle_compare(key, condition, error_key)
38
+ return unless options[key]
39
+ if object.send(condition, options[key])
40
+ add_error!(error_key, options[key])
41
+ end
42
+ end
43
+
44
+ def handle_condition(key, condition, error_key)
45
+ return unless options[key]
46
+ unless object.send(condition)
47
+ add_error!(error_key)
48
+ end
49
+ end
50
+
51
+ def add_error!(key, number=nil)
52
+ if number
53
+ errors << PureValidator::I18n.t(key, number: number)
54
+ else
55
+ errors << PureValidator::I18n.t(key)
56
+ end
57
+ end
39
58
  end
@@ -1,3 +1,3 @@
1
1
  module PureValidator
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -0,0 +1,153 @@
1
+ require 'spec_helper'
2
+
3
+ describe PureValidator::Validator do
4
+ describe "#validate" do
5
+ class ContactH
6
+ attr_accessor :first_name, :last_name, :position, :age, :type,
7
+ :email, :color, :status, :stage, :description,
8
+ :companies, :address
9
+
10
+ def to_h
11
+ {
12
+ first_name: first_name,
13
+ last_name: last_name,
14
+ position: position,
15
+ age: age,
16
+ type: type,
17
+ email: email,
18
+ color: color,
19
+ status: status,
20
+ stage: stage,
21
+ description: description,
22
+ companies: (companies||[]).map(&:to_h),
23
+ address: (address && address.to_h),
24
+ }
25
+ end
26
+ end
27
+
28
+ class CompanyH
29
+ attr_accessor :name
30
+
31
+ def to_h
32
+ {name: name}
33
+ end
34
+ end
35
+
36
+ class AddressH
37
+ attr_accessor :city, :street
38
+ def to_h
39
+ {
40
+ city: city,
41
+ street: street,
42
+ }
43
+ end
44
+ end
45
+
46
+ class CompanyValidatorH
47
+ include PureValidator::Validator
48
+
49
+ validates :name, presence: true, length: { min: 3, max: 9 }
50
+ end
51
+
52
+ class AddressValidatorH
53
+ include PureValidator::Validator
54
+
55
+ validates :city, presence: true, length: { min: 3, max: 33 }
56
+ validates :street, presence: true, length: { min: 3, max: 33 }
57
+ end
58
+
59
+ class ContactValidatorH
60
+ include PureValidator::Validator
61
+
62
+ validates :first_name, presence: true, length: { min: 4, max: 7 }
63
+ validates :last_name, length: { equal_to: 5 }
64
+ validates :position, length: { not_equal_to: 5 }
65
+ validates :age, numericality: { greater_than: 0, less_than: 150 }
66
+ validates :type, numericality: { greater_than_or_equal_to: 1, less_than_or_equal_to: 5 }
67
+ validates :email, email: true
68
+ validates :color, regexp: /#\w{6}/
69
+ validates :status, inclusion: { in: [:new, :lead] }
70
+ validates :stage, exclusion: { in: [:wrong, :bad] }
71
+
72
+ validate_associated :companies, validator: CompanyValidatorH
73
+
74
+ validates :address, presence: true
75
+ validate_associated :address, validator: AddressValidatorH
76
+
77
+
78
+ validate :check_description
79
+
80
+ def check_description(entity, errors)
81
+ if entity[:description].nil?
82
+ errors.add(:description, "can't be empty")
83
+ end
84
+ end
85
+ end
86
+
87
+ it "should return empty errors if object is valid" do
88
+ contact = ContactH.new
89
+ contact.first_name = "John"
90
+ contact.last_name = "Smith"
91
+ contact.position = "Team Lead"
92
+ contact.age = 35
93
+ contact.type = 2
94
+ contact.email = "johh.smith@example.com"
95
+ contact.color = "#DDD333"
96
+ contact.status = :lead
97
+ contact.stage = :good
98
+ contact.description = "good guy"
99
+
100
+ company1 = CompanyH.new
101
+ company1.name = 'DroidLabs'
102
+ company2 = CompanyH.new
103
+ company2.name = 'ICL'
104
+
105
+ contact.companies = [company1, company2]
106
+
107
+ address = AddressH.new.tap do |a| a.city = "New York" ; a.street = "Wall Street" end
108
+ contact.address = address
109
+
110
+ errors = ContactValidatorH.new.validate(contact.to_h)
111
+ expect(errors).to be_empty
112
+ end
113
+
114
+ it "should return validation errors if object is invalid" do
115
+ contact = ContactH.new
116
+ contact.first_name = nil
117
+ contact.last_name = "Sm"
118
+ contact.position = "develp"
119
+ contact.age = -1
120
+ contact.type = 7
121
+ contact.email = "johh.com"
122
+ contact.color = "DDD333"
123
+ contact.status = :left
124
+ contact.stage = :bad
125
+
126
+ company1 = CompanyH.new
127
+ company1.name = 'DroidLabs Wrong'
128
+ company2 = CompanyH.new
129
+ company2.name = 'IC'
130
+
131
+ contact.companies = [company1, company2]
132
+ errors = ContactValidatorH.new.validate(contact.to_h)
133
+ expect(errors).to eq(
134
+ {
135
+ first_name: ["can not be blank"],
136
+ last_name: ["should be equal to 5"],
137
+ age: ["should be greater than 0"],
138
+ type: ["should be less than or equal to 5"],
139
+ email: ["invalid email"],
140
+ color: ["does not match defined format"],
141
+ status: ["should be included in [:new, :lead]"],
142
+ stage: ["should not be included in [:wrong, :bad]"],
143
+ description: ["can't be empty"],
144
+ companies_errors: [
145
+ { name: ["can not be more than 9"] },
146
+ { name: ["can not be less than 3"] },
147
+ ],
148
+ address: ["can not be blank"],
149
+ }
150
+ )
151
+ end
152
+ end
153
+ end
@@ -79,7 +79,7 @@ describe PureValidator::Validator do
79
79
  contact.address = address
80
80
 
81
81
  errors = ContactValidator.new.validate(contact)
82
- errors.should be_empty
82
+ expect(errors).to be_empty
83
83
  end
84
84
 
85
85
  it "should return validation errors if object is invalid" do
@@ -102,22 +102,24 @@ describe PureValidator::Validator do
102
102
  contact.companies = [company1, company2]
103
103
 
104
104
  errors = ContactValidator.new.validate(contact)
105
- errors.should == {
106
- first_name: ["can not be blank"],
107
- last_name: ["should be equal to 5"],
108
- age: ["should be greater than 0"],
109
- type: ["should be less than or equal to 5"],
110
- email: ["invalid email"],
111
- color: ["does not match defined format"],
112
- status: ["should be included in [:new, :lead]"],
113
- stage: ["should not be included in [:wrong, :bad]"],
114
- description: ["can't be empty"],
115
- companies_errors: [
116
- { name: ["can not be more than 9"] },
117
- { name: ["can not be less than 3"] },
118
- ],
119
- address: ["can not be blank"],
120
- }
105
+ expect(errors).to eq(
106
+ {
107
+ first_name: ["can not be blank"],
108
+ last_name: ["should be equal to 5"],
109
+ age: ["should be greater than 0"],
110
+ type: ["should be less than or equal to 5"],
111
+ email: ["invalid email"],
112
+ color: ["does not match defined format"],
113
+ status: ["should be included in [:new, :lead]"],
114
+ stage: ["should not be included in [:wrong, :bad]"],
115
+ description: ["can't be empty"],
116
+ companies_errors: [
117
+ { name: ["can not be more than 9"] },
118
+ { name: ["can not be less than 3"] },
119
+ ],
120
+ address: ["can not be blank"],
121
+ }
122
+ )
121
123
  end
122
124
  end
123
125
 
@@ -4,12 +4,12 @@ describe PureValidator::Validators::EmailValidator do
4
4
  describe ".validate" do
5
5
  it "should return empty errors if email is valid" do
6
6
  errors = PureValidator::Validators::EmailValidator.validate('test@example.com', true)
7
- errors.should be_empty
7
+ expect(errors).to be_empty
8
8
  end
9
9
 
10
10
  it "should return errors if value is invalid" do
11
11
  errors = PureValidator::Validators::EmailValidator.validate('test@asdffd', true)
12
- errors.should == ["invalid email"]
12
+ expect(errors).to eq(["invalid email"])
13
13
  end
14
14
 
15
15
  context "false as email_flag" do
@@ -27,9 +27,9 @@ describe PureValidator::Validators::EmailValidator do
27
27
 
28
28
  describe ".validate_options" do
29
29
  it "should raise error if validation attributes are invalid" do
30
- lambda do
30
+ expect{
31
31
  PureValidator::Validators::EmailValidator.validate_options("asdf")
32
- end.should raise_error("validation_rule should be a Boolean")
32
+ }.to raise_error("validation_rule should be a Boolean")
33
33
  end
34
34
  end
35
35
  end
@@ -4,20 +4,20 @@ describe PureValidator::Validators::ExclusionValidator do
4
4
  describe ".validate" do
5
5
  it "should return empty errors if value is valid" do
6
6
  errors = PureValidator::Validators::ExclusionValidator.validate(:wrong_type, in: [:new, :old, :medium])
7
- errors.should be_empty
7
+ expect(errors).to be_empty
8
8
  end
9
9
 
10
10
  it "should return errors if value is invalid" do
11
11
  errors = PureValidator::Validators::ExclusionValidator.validate(:new, in: [:new, :old, :medium])
12
- errors.should == ["should not be included in [:new, :old, :medium]"]
12
+ expect(errors).to eq(["should not be included in [:new, :old, :medium]"])
13
13
  end
14
14
  end
15
15
 
16
16
  describe ".validate_options" do
17
17
  it "should raise error if validation attributes are invalid" do
18
- lambda do
18
+ expect{
19
19
  PureValidator::Validators::ExclusionValidator.validate_options(wrong_option: false, in: [])
20
- end.should raise_error("validation_rule has unacceptable options [:wrong_option]")
20
+ }.to raise_error("validation_rule has unacceptable options [:wrong_option]")
21
21
  end
22
22
  end
23
23
  end
@@ -4,20 +4,20 @@ describe PureValidator::Validators::InclusionValidator do
4
4
  describe ".validate" do
5
5
  it "should return empty errors if value is valid" do
6
6
  errors = PureValidator::Validators::InclusionValidator.validate(:old, in: [:new, :old, :medium])
7
- errors.should be_empty
7
+ expect(errors).to be_empty
8
8
  end
9
9
 
10
10
  it "should return errors if value is invalid" do
11
11
  errors = PureValidator::Validators::InclusionValidator.validate(:wrong_type, in: [:new, :old, :medium])
12
- errors.should == ["should be included in [:new, :old, :medium]"]
12
+ expect(errors).to eq(["should be included in [:new, :old, :medium]"])
13
13
  end
14
14
  end
15
15
 
16
16
  describe ".validate_options" do
17
17
  it "should raise error if validation attributes are invalid" do
18
- lambda do
18
+ expect{
19
19
  PureValidator::Validators::InclusionValidator.validate_options(wrong_option: false, in: [])
20
- end.should raise_error("validation options has unacceptable options [:wrong_option]")
20
+ }.to raise_error("validation options has unacceptable options [:wrong_option]")
21
21
  end
22
22
  end
23
23
  end
@@ -4,35 +4,35 @@ describe PureValidator::Validators::LengthValidator do
4
4
  describe ".validate" do
5
5
  it "should return empty errors if text has valid length" do
6
6
  errors = PureValidator::Validators::LengthValidator.validate('home', max: 5, min: 3)
7
- errors.should be_empty
7
+ expect(errors).to be_empty
8
8
  end
9
9
 
10
10
  it "should return errors if value has invalid max length" do
11
11
  errors = PureValidator::Validators::LengthValidator.validate('long title', max: 5)
12
- errors.should == ["can not be more than 5"]
12
+ expect(errors).to eq(["can not be more than 5"])
13
13
  end
14
14
 
15
15
  it "should return errors if value has invalid min length" do
16
16
  errors = PureValidator::Validators::LengthValidator.validate('ya', min: 3)
17
- errors.should == ["can not be less than 3"]
17
+ expect(errors).to eq(["can not be less than 3"])
18
18
  end
19
19
 
20
20
  it "should return errors if value has invalid equal_to length" do
21
21
  errors = PureValidator::Validators::LengthValidator.validate('ya', equal_to: 3)
22
- errors.should == ["should be equal to 3"]
22
+ expect(errors).to eq(["should be equal to 3"])
23
23
  end
24
24
 
25
25
  it "should return errors if value has invalid not_equal_to length" do
26
26
  errors = PureValidator::Validators::LengthValidator.validate('yad', not_equal_to: 3)
27
- errors.should == ["should not be equal to 3"]
27
+ expect(errors).to eq(["should not be equal to 3"])
28
28
  end
29
29
  end
30
30
 
31
31
  describe ".validate_options" do
32
32
  it "should raise error if validation attributes are invalid" do
33
- lambda do
33
+ expect {
34
34
  PureValidator::Validators::LengthValidator.validate_options(max: 5, wrong_attr: 3)
35
- end.should raise_error("validation_rule has unacceptable options [:wrong_attr]")
35
+ }.to raise_error("validation_rule has unacceptable options [:wrong_attr]")
36
36
  end
37
37
  end
38
38
  end
@@ -35,9 +35,9 @@ describe PureValidator::Validators::NotNilValidator do
35
35
 
36
36
  describe ".validate_options" do
37
37
  it "should raise error if validation attributes are invalid" do
38
- lambda do
38
+ expect{
39
39
  PureValidator::Validators::NotNilValidator.validate_options("asdf")
40
- end.should raise_error("validation_rule should be a Boolean")
40
+ }.to raise_error("validation_rule should be a Boolean")
41
41
  end
42
42
  end
43
43
 
@@ -1,49 +1,53 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe PureValidator::Validators::NumericalityValidator do
4
+ def validate(*args)
5
+ PureValidator::Validators::NumericalityValidator.validate(*args)
6
+ end
7
+
8
+ def passes(v)
9
+ expect(v).to be_empty
10
+ end
11
+
12
+ def fails(v, errors)
13
+ expect(v).to eq(errors)
14
+ end
15
+
4
16
  describe ".validate" do
5
17
  it "should return empty errors if number is valid" do
6
- errors = PureValidator::Validators::NumericalityValidator.validate(4, less_than: 5, greater_than: 3)
7
- errors.should be_empty
18
+ passes(validate(4, less_than: 5, greater_than: 3))
8
19
  end
9
20
 
10
21
  it "should return errors if value is less than needed" do
11
- errors = PureValidator::Validators::NumericalityValidator.validate(5, greater_than: 5)
12
- errors.should == ["should be greater than 5"]
22
+ fails(validate(5, greater_than: 5), ["should be greater than 5"])
13
23
  end
14
24
 
15
25
  it "should return errors if value is less than or equal to what needed" do
16
- errors = PureValidator::Validators::NumericalityValidator.validate(4, greater_than_or_equal_to: 5)
17
- errors.should == ["should be greater than or equal to 5"]
26
+ fails(validate(4, greater_than_or_equal_to: 5), ["should be greater than or equal to 5"])
18
27
  end
19
28
 
20
29
  it "should return errors if value is greater than needed" do
21
- errors = PureValidator::Validators::NumericalityValidator.validate(5, less_than: 5)
22
- errors.should == ["should be less than 5"]
30
+ fails(validate(5, less_than: 5), ["should be less than 5"])
23
31
  end
24
32
 
25
33
  it "should return errors if value is greater than or equal to what needed" do
26
- errors = PureValidator::Validators::NumericalityValidator.validate(6, less_than_or_equal_to: 5)
27
- errors.should == ["should be less than or equal to 5"]
34
+ fails(validate(6, less_than_or_equal_to: 5), ["should be less than or equal to 5"])
28
35
  end
29
36
 
30
37
  it "should return errors if value is not even" do
31
- errors = PureValidator::Validators::NumericalityValidator.validate(7, even: true)
32
- errors.should == ["should be even number"]
38
+ fails(validate(7, even: true), ["should be even number"])
33
39
  end
34
40
 
35
41
  it "should return errors if value is not odd" do
36
- errors = PureValidator::Validators::NumericalityValidator.validate(6, odd: true)
37
- errors.should == ["should be odd number"]
42
+ fails(validate(6, odd: true), ["should be odd number"])
38
43
  end
39
-
40
44
  end
41
45
 
42
46
  describe ".validate_options" do
43
47
  it "should raise error if validation attributes are invalid" do
44
- lambda do
48
+ expect{
45
49
  PureValidator::Validators::NumericalityValidator.validate_options(less_than: 5, wrong_attr: 3)
46
- end.should raise_error("validation_rule has unacceptable options [:wrong_attr]")
50
+ }.to raise_error("validation_rule has unacceptable options [:wrong_attr]")
47
51
  end
48
52
  end
49
53
  end
@@ -29,9 +29,9 @@ describe PureValidator::Validators::PresenceValidator do
29
29
 
30
30
  describe ".validate_options" do
31
31
  it "should raise error if validation attributes are invalid" do
32
- lambda do
32
+ expect {
33
33
  PureValidator::Validators::PresenceValidator.validate_options("asdf")
34
- end.should raise_error("validation_rule should be a Boolean")
34
+ }.to raise_error("validation_rule should be a Boolean")
35
35
  end
36
36
  end
37
37
 
@@ -1,23 +1,33 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe PureValidator::Validators::RegexpValidator do
4
+ def validate(*args)
5
+ PureValidator::Validators::RegexpValidator.validate(*args)
6
+ end
7
+
8
+ def passes(v)
9
+ expect(v).to be_empty
10
+ end
11
+
12
+ def fails(v, errors)
13
+ expect(v).to eq(errors)
14
+ end
15
+
4
16
  describe ".validate" do
5
17
  it "should return empty errors if value is valid" do
6
- errors = PureValidator::Validators::RegexpValidator.validate('#aaa', /#\w{3,6}/)
7
- errors.should be_empty
18
+ passes(validate('#aaa', /#\w{3,6}/))
8
19
  end
9
20
 
10
21
  it "should return errors if value is invalid" do
11
- errors = PureValidator::Validators::RegexpValidator.validate('asdf', /#\w{3,6}/)
12
- errors.should == ["does not match defined format"]
22
+ fails(validate('asdf', /#\w{3,6}/), ["does not match defined format"])
13
23
  end
14
24
  end
15
25
 
16
26
  describe ".validate_options" do
17
27
  it "should raise error if validation attributes are invalid" do
18
- lambda do
28
+ expect {
19
29
  PureValidator::Validators::RegexpValidator.validate_options({})
20
- end.should raise_error("validation_rule should be a String or Regexp")
30
+ }.to raise_error("validation_rule should be a String or Regexp")
21
31
  end
22
32
  end
23
33
  end
@@ -1,35 +1,43 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe PureValidator::Validators::UrlValidator do
4
+ def validate(*args)
5
+ PureValidator::Validators::UrlValidator.validate(*args)
6
+ end
7
+
8
+ def passes(v)
9
+ expect(v).to be_empty
10
+ end
11
+
12
+ def fails(v, errors)
13
+ expect(v).to eq(errors)
14
+ end
15
+
4
16
  describe ".validate" do
5
17
  it "should return empty errors if email is valid" do
6
- errors = PureValidator::Validators::UrlValidator.validate('example-asdf.com', true)
7
- errors.should be_empty
18
+ passes(validate('example-asdf.com', true))
8
19
  end
9
20
 
10
21
  it "should return errors if value is invalid" do
11
- errors = PureValidator::Validators::UrlValidator.validate(':123asdffd.com', true)
12
- errors.should == ["invalid url"]
22
+ fails(validate(':123asdffd.com', true), ["invalid url"])
13
23
  end
14
24
 
15
25
  context "false as url_flag" do
16
26
  it "fails if url is valid" do
17
- errors = PureValidator::Validators::UrlValidator.validate('example-asdf.com', false)
18
- expect(errors).to eq(["can not be a url"])
27
+ fails(validate('example-asdf.com', false), ["can not be a url"])
19
28
  end
20
29
 
21
30
  it "passes if url is invalid" do
22
- errors = PureValidator::Validators::UrlValidator.validate(':123asdffd.com', false)
23
- expect(errors).to eq([])
31
+ passes(validate(':123asdffd.com', false))
24
32
  end
25
33
  end
26
34
  end
27
35
 
28
36
  describe ".validate_options" do
29
37
  it "should raise error if validation attributes are invalid" do
30
- lambda do
38
+ expect{
31
39
  PureValidator::Validators::UrlValidator.validate_options("asdf")
32
- end.should raise_error("validation_rule should be a Boolean")
40
+ }.to raise_error("validation_rule should be a Boolean")
33
41
  end
34
42
  end
35
43
  end
@@ -17,5 +17,4 @@ end
17
17
  require 'pure_validator'
18
18
 
19
19
  RSpec.configure do |config|
20
- config.color_enabled = true
21
20
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pure_validator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Albert Gazizov
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-01-05 00:00:00.000000000 Z
12
+ date: 2017-06-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: i18n
@@ -89,14 +89,18 @@ executables:
89
89
  extensions: []
90
90
  extra_rdoc_files: []
91
91
  files:
92
+ - ".codeclimate.yml"
92
93
  - ".gitignore"
93
94
  - ".travis.yml"
95
+ - CHANGELOG.md
94
96
  - Gemfile
95
97
  - Gemfile.lock
96
98
  - LICENSE.txt
97
99
  - README.md
98
100
  - Rakefile
99
101
  - bin/console
102
+ - docs/_config.yml
103
+ - docs/index.md
100
104
  - lib/pure_validator.rb
101
105
  - lib/pure_validator/args_validator.rb
102
106
  - lib/pure_validator/concern.rb
@@ -123,6 +127,7 @@ files:
123
127
  - spec/pure_validator/args_validator_spec.rb
124
128
  - spec/pure_validator/errors_spec.rb
125
129
  - spec/pure_validator/validation_errors_spec.rb
130
+ - spec/pure_validator/validator_hash_spec.rb
126
131
  - spec/pure_validator/validator_spec.rb
127
132
  - spec/pure_validator/validators/email_validator_spec.rb
128
133
  - spec/pure_validator/validators/exclusion_validator_spec.rb
@@ -154,7 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
154
159
  version: '0'
155
160
  requirements: []
156
161
  rubyforge_project:
157
- rubygems_version: 2.5.1
162
+ rubygems_version: 2.6.11
158
163
  signing_key:
159
164
  specification_version: 4
160
165
  summary: Moves validation logic to validators
@@ -162,6 +167,7 @@ test_files:
162
167
  - spec/pure_validator/args_validator_spec.rb
163
168
  - spec/pure_validator/errors_spec.rb
164
169
  - spec/pure_validator/validation_errors_spec.rb
170
+ - spec/pure_validator/validator_hash_spec.rb
165
171
  - spec/pure_validator/validator_spec.rb
166
172
  - spec/pure_validator/validators/email_validator_spec.rb
167
173
  - spec/pure_validator/validators/exclusion_validator_spec.rb