simple_range_validator 0.1.0 → 0.2.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.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Simple Range validator
2
2
 
3
- Validate fields of type `Range`
3
+ Validate fields of type `Range`. Also contains simple validators for Array values and types respectively ;)
4
4
 
5
5
  ## Install
6
6
 
@@ -26,10 +26,10 @@ And here using `factory_girl` gem:
26
26
 
27
27
  ```ruby
28
28
  FactoryGirl.define do
29
- sequence(:cost_range) { [ (0..2000), (2000..4000), (4000..8000) ].sample }
29
+ sequence(:cost_range) { [ (0..2000), (2000..4000), (4000..8000) ].sample }
30
30
 
31
31
  factory :search do
32
- cost { FactoryGirl.generate(:cost_range) }
32
+ cost { FactoryGirl.generate(:cost_range) }
33
33
  end
34
34
  end
35
35
  ```
@@ -44,6 +44,34 @@ Also check out https://github.com/chrisb87/range_validator
44
44
 
45
45
  Could make sense to integrate both of these gems ;)
46
46
 
47
+ ## Array Validator
48
+
49
+ ```ruby
50
+ class Search
51
+ include Mongoid::Document
52
+
53
+ field :color, type: Array
54
+
55
+ # you can also use only: as the option
56
+ validates :color, array: {in: ['red', 'blue', 'green'] }
57
+ end
58
+ ```
59
+
60
+ ## Array Type Validator
61
+
62
+ ```ruby
63
+ class Search
64
+ include Mongoid::Document
65
+
66
+ field :color, type: Array
67
+
68
+ # you can also use in: as the option
69
+ validates :color, array_types: {only: [String, Fixnum] }
70
+ end
71
+ ```
72
+
73
+ Simple as pie ;)
74
+
47
75
  ## Contributing to range_validator
48
76
 
49
77
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -0,0 +1,29 @@
1
+ class ArrayTypesValidator < ActiveModel::EachValidator
2
+ def validate_each(record, attribute, value)
3
+ record.errors[attribute] << "must contain instances of only: #{show_allowed_types}, was: #{types_for(value)}" unless allowed_type? value
4
+ end
5
+
6
+ protected
7
+
8
+ def allowed_type? value
9
+ raise ArgumentError, "Must be an Array, was: #{value}" unless value.kind_of?(Array)
10
+ return true if !allowed_types || allowed_types.empty?
11
+ (types_for(value) - allowed_types).empty?
12
+ end
13
+
14
+ def types_for value
15
+ value.map(&:class).uniq
16
+ end
17
+
18
+ def show_allowed_types
19
+ allowed_types.join(", ")
20
+ end
21
+
22
+ def allowed_types
23
+ [only].flatten
24
+ end
25
+
26
+ def only
27
+ options[:only] || options[:in]
28
+ end
29
+ end
@@ -0,0 +1,27 @@
1
+ require 'array_types_validator'
2
+
3
+ class ArrayValidator < ActiveModel::EachValidator
4
+ def validate_each(record, attribute, value)
5
+ record.errors[attribute] << "must be in: #{show_list}" unless contains? value
6
+ end
7
+
8
+ protected
9
+
10
+ def contains? value
11
+ raise ArgumentError, "Must be an Array, was: #{value}" unless value.kind_of?(Array)
12
+ (value - list).empty?
13
+ end
14
+
15
+ # also works with range
16
+ def list
17
+ only.to_a
18
+ end
19
+
20
+ def only
21
+ options[:in] || options[:only]
22
+ end
23
+
24
+ def show_list
25
+ list.join(", ")
26
+ end
27
+ end
@@ -1,3 +1,5 @@
1
+ require 'array_validator'
2
+
1
3
  class RangeValidator < ActiveModel::EachValidator
2
4
  def validate_each(record, attribute, value)
3
5
  record.errors[attribute] << "must be within: #{show_range}" unless within? value
@@ -0,0 +1,70 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "simple_range_validator"
8
+ s.version = "0.2.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Kristian Mandrup"]
12
+ s.date = "2012-11-06"
13
+ s.description = "Range validator for any Range model fields"
14
+ s.email = "kmandrup@gmail.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".rspec",
22
+ "Gemfile",
23
+ "Gemfile.lock",
24
+ "LICENSE.txt",
25
+ "README.md",
26
+ "Rakefile",
27
+ "VERSION",
28
+ "lib/array_types_validator.rb",
29
+ "lib/array_validator.rb",
30
+ "lib/simple_range_validator.rb",
31
+ "simple_range_validator.gemspec",
32
+ "spec/array_types_validator_spec.rb",
33
+ "spec/array_validator_spec.rb",
34
+ "spec/range_validator_spec.rb",
35
+ "spec/spec_helper.rb"
36
+ ]
37
+ s.homepage = "http://github.com/kristianmandrup/simple_range_validator"
38
+ s.licenses = ["MIT"]
39
+ s.require_paths = ["lib"]
40
+ s.rubygems_version = "1.8.24"
41
+ s.summary = "Validate Range fields in your models"
42
+
43
+ if s.respond_to? :specification_version then
44
+ s.specification_version = 3
45
+
46
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
47
+ s.add_runtime_dependency(%q<activemodel>, [">= 0"])
48
+ s.add_development_dependency(%q<rspec>, [">= 2.8.0"])
49
+ s.add_development_dependency(%q<rdoc>, [">= 3.12"])
50
+ s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
51
+ s.add_development_dependency(%q<jeweler>, [">= 1.8.4"])
52
+ s.add_development_dependency(%q<simplecov>, [">= 0.5"])
53
+ else
54
+ s.add_dependency(%q<activemodel>, [">= 0"])
55
+ s.add_dependency(%q<rspec>, [">= 2.8.0"])
56
+ s.add_dependency(%q<rdoc>, [">= 3.12"])
57
+ s.add_dependency(%q<bundler>, [">= 1.0.0"])
58
+ s.add_dependency(%q<jeweler>, [">= 1.8.4"])
59
+ s.add_dependency(%q<simplecov>, [">= 0.5"])
60
+ end
61
+ else
62
+ s.add_dependency(%q<activemodel>, [">= 0"])
63
+ s.add_dependency(%q<rspec>, [">= 2.8.0"])
64
+ s.add_dependency(%q<rdoc>, [">= 3.12"])
65
+ s.add_dependency(%q<bundler>, [">= 1.0.0"])
66
+ s.add_dependency(%q<jeweler>, [">= 1.8.4"])
67
+ s.add_dependency(%q<simplecov>, [">= 0.5"])
68
+ end
69
+ end
70
+
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ # http://jeffkreeftmeijer.com/2011/isolated-testing-for-custom-validators-in-rails-3/
4
+
5
+ class ValidatableType
6
+ include ActiveModel::Validations
7
+
8
+ validates :type, array_types: {only: [String, Fixnum]}
9
+ end
10
+
11
+ describe ArrayTypesValidator do
12
+
13
+ subject { ValidatableType.new }
14
+
15
+ context 'with a type with no values' do
16
+ before { subject.stub(:type).and_return [] }
17
+
18
+ it { should be_valid }
19
+ end
20
+
21
+ context 'with a type with a single valid value' do
22
+ before { subject.stub(:type).and_return ['apartment'] }
23
+
24
+ it { should be_valid }
25
+ end
26
+
27
+ context 'with a type with all valid values' do
28
+ before { subject.stub(:type).and_return ['apartment', 27] }
29
+
30
+ it { should be_valid }
31
+ end
32
+
33
+ context 'with a type with some invalid values' do
34
+ before { subject.stub(:type).and_return ['apartment', :boat] }
35
+
36
+ it { should_not be_valid }
37
+ end
38
+
39
+ context 'with a type that is not an Array' do
40
+ before { subject.stub(:type).and_return 'apartment' }
41
+
42
+ specify {
43
+ expect { subject.valid? }.to raise_error(ArgumentError)
44
+ }
45
+ end
46
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ # http://jeffkreeftmeijer.com/2011/isolated-testing-for-custom-validators-in-rails-3/
4
+
5
+ class ValidatableArr
6
+ include ActiveModel::Validations
7
+
8
+ validates :type, array: {in: ['apartment', 'house']}
9
+ end
10
+
11
+ describe ArrayValidator do
12
+
13
+ subject { ValidatableArr.new }
14
+
15
+ context 'with a type with no values' do
16
+ before { subject.stub(:type).and_return [] }
17
+
18
+ it { should be_valid }
19
+ end
20
+
21
+ context 'with a type with a single valid value' do
22
+ before { subject.stub(:type).and_return ['apartment'] }
23
+
24
+ it { should be_valid }
25
+ end
26
+
27
+ context 'with a type with all valid values' do
28
+ before { subject.stub(:type).and_return ['apartment', 'house'] }
29
+
30
+ it { should be_valid }
31
+ end
32
+
33
+ context 'with a type with some invalid values' do
34
+ before { subject.stub(:type).and_return ['apartment', 'boat'] }
35
+
36
+ it { should_not be_valid }
37
+ end
38
+
39
+ context 'with a type that is not an Array' do
40
+ before { subject.stub(:type).and_return 'apartment' }
41
+
42
+ specify {
43
+ expect { subject.valid? }.to raise_error(ArgumentError)
44
+ }
45
+ end
46
+ end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  # http://jeffkreeftmeijer.com/2011/isolated-testing-for-custom-validators-in-rails-3/
4
4
 
5
- class Validatable
5
+ class ValidatableRange
6
6
  include ActiveModel::Validations
7
7
 
8
8
  validates :cost, range: {within: 0..2000}
@@ -10,7 +10,7 @@ end
10
10
 
11
11
  describe RangeValidator do
12
12
 
13
- subject { Validatable.new }
13
+ subject { ValidatableRange.new }
14
14
 
15
15
  context 'with a cost range that is not too expensive' do
16
16
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_range_validator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -123,7 +123,12 @@ files:
123
123
  - README.md
124
124
  - Rakefile
125
125
  - VERSION
126
+ - lib/array_types_validator.rb
127
+ - lib/array_validator.rb
126
128
  - lib/simple_range_validator.rb
129
+ - simple_range_validator.gemspec
130
+ - spec/array_types_validator_spec.rb
131
+ - spec/array_validator_spec.rb
127
132
  - spec/range_validator_spec.rb
128
133
  - spec/spec_helper.rb
129
134
  homepage: http://github.com/kristianmandrup/simple_range_validator
@@ -141,7 +146,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
141
146
  version: '0'
142
147
  segments:
143
148
  - 0
144
- hash: 2377723210536538675
149
+ hash: 2744261256725048417
145
150
  required_rubygems_version: !ruby/object:Gem::Requirement
146
151
  none: false
147
152
  requirements: