missing_validators 0.3.0 → 0.4.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 +23 -0
- data/lib/missing_validators/validators/email_validator.rb +9 -22
- data/lib/missing_validators/validators/inequality_validator.rb +1 -1
- data/lib/missing_validators/validators/url_validator.rb +9 -11
- data/lib/missing_validators/version.rb +1 -1
- data/missing_validators.gemspec +2 -1
- data/spec/validators/email_validator_spec.rb +5 -17
- data/spec/validators/url_validator_spec.rb +65 -28
- metadata +20 -10
data/README.md
CHANGED
@@ -50,6 +50,29 @@ RSpec matcher is also available for your convenience:
|
|
50
50
|
it { should ensure_valid_email_format_of(:email) }
|
51
51
|
end
|
52
52
|
|
53
|
+
### UrlValidator
|
54
|
+
|
55
|
+
With an ActiveRecord model:
|
56
|
+
|
57
|
+
class User < ActiveRecord::Base
|
58
|
+
attr_accessor :blog, :name
|
59
|
+
validates :blog, url: true
|
60
|
+
end
|
61
|
+
|
62
|
+
Or any ruby class:
|
63
|
+
|
64
|
+
class User
|
65
|
+
include ActiveModel::Validations
|
66
|
+
attr_accessor :blog, :name
|
67
|
+
validates :blog, url: true
|
68
|
+
end
|
69
|
+
|
70
|
+
RSpec matcher is also available for your convenience:
|
71
|
+
|
72
|
+
describe User do
|
73
|
+
it { should ensure_valid_url_format_of(:url) }
|
74
|
+
end
|
75
|
+
|
53
76
|
### InequalityValidator
|
54
77
|
|
55
78
|
With an ActiveRecord model:
|
@@ -10,32 +10,19 @@ class EmailValidator < ActiveModel::EachValidator
|
|
10
10
|
#
|
11
11
|
# @param [Object] record object to validate
|
12
12
|
# @param [String] attribute name of the object attribute to validate
|
13
|
-
# @param [Object]
|
13
|
+
# @param [Object] value attribute value
|
14
14
|
def validate_each(record, attribute, value)
|
15
|
-
domains = Array.wrap options[:domain]
|
16
|
-
|
17
15
|
allow_blank = options[:allow_blank] || false
|
16
|
+
return if allow_blank && value.blank?
|
18
17
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
message = options[:message] || I18n.t('errors.messages.email')
|
23
|
-
record.errors[attribute] << message
|
24
|
-
return
|
25
|
-
end
|
18
|
+
domains = Array.wrap(options[:domain])
|
19
|
+
email = value && value.downcase
|
20
|
+
in_valid_domain = domains.empty? ? true : domains.any? { |domain| email.end_with?(".#{domain.downcase}") }
|
26
21
|
|
27
|
-
|
28
|
-
|
29
|
-
valid_format = !!(value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i)
|
30
|
-
if domains.any?
|
31
|
-
valid_domain = domains.inject (false) do |acc, domain|
|
32
|
-
acc || value.end_with?(".#{domain}")
|
33
|
-
end
|
34
|
-
end
|
22
|
+
has_valid_format = !!(value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i)
|
35
23
|
|
36
|
-
unless
|
37
|
-
|
38
|
-
record.errors[attribute] << message
|
24
|
+
unless in_valid_domain && has_valid_format
|
25
|
+
record.errors[attribute] << (options[:message] || I18n.t('errors.messages.email'))
|
39
26
|
end
|
40
27
|
end
|
41
|
-
end
|
28
|
+
end
|
@@ -11,7 +11,7 @@ class InequalityValidator < ActiveModel::EachValidator
|
|
11
11
|
#
|
12
12
|
# @param [Object] record object to validate
|
13
13
|
# @param [String] attribute name of the object attribute to validate
|
14
|
-
# @param [Object]
|
14
|
+
# @param [Object] value attribute value
|
15
15
|
def validate_each(record, attribute, value)
|
16
16
|
unequal_to_attr = options[:to]
|
17
17
|
|
@@ -11,18 +11,16 @@ class UrlValidator < ActiveModel::EachValidator
|
|
11
11
|
#
|
12
12
|
# @param [Object] record object to validate
|
13
13
|
# @param [String] attribute name of the object attribute to validate
|
14
|
-
# @param [Object]
|
14
|
+
# @param [Object] value attribute value
|
15
15
|
def validate_each(record, attribute, value)
|
16
|
-
|
17
|
-
|
18
|
-
valid_format = uri.kind_of? URI::HTTP
|
19
|
-
rescue
|
20
|
-
valid_format = false
|
21
|
-
end
|
16
|
+
uri = URI.parse(value)
|
17
|
+
raise URI::InvalidURIError unless uri.kind_of?(URI::HTTP)
|
22
18
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
19
|
+
domains = Array.wrap(options[:domain])
|
20
|
+
host = uri.host.downcase
|
21
|
+
in_valid_domain = domains.empty? || domains.any? { |domain| host.end_with?(".#{domain.downcase}") }
|
22
|
+
raise URI::InvalidURIError unless in_valid_domain
|
23
|
+
rescue URI::InvalidURIError
|
24
|
+
record.errors[attribute] << (options[:message] || I18n.t('errors.messages.url'))
|
27
25
|
end
|
28
26
|
end
|
data/missing_validators.gemspec
CHANGED
@@ -18,5 +18,6 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.add_development_dependency 'rspec'
|
19
19
|
gem.add_development_dependency 'shoulda-matchers'
|
20
20
|
|
21
|
-
gem.add_dependency 'activemodel', '
|
21
|
+
gem.add_dependency 'activemodel', '~> 3.0.0'
|
22
|
+
gem.add_dependency 'activesupport', '~> 3.0.0'
|
22
23
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe EmailValidator do
|
4
|
-
subject
|
4
|
+
subject { klass.new }
|
5
5
|
|
6
6
|
context "email has valid format" do
|
7
7
|
let(:klass) do
|
@@ -16,12 +16,11 @@ describe EmailValidator do
|
|
16
16
|
it { should allow_value("super+user@example.com").for(:email) }
|
17
17
|
it { should_not allow_value("user_example.com").for(:email) }
|
18
18
|
|
19
|
-
|
20
19
|
it { should ensure_valid_email_format_of(:email) }
|
21
20
|
it { should_not ensure_valid_email_format_of(:name) }
|
22
21
|
end
|
23
22
|
|
24
|
-
context "email is in
|
23
|
+
context "email is in the specific domain" do
|
25
24
|
context "email domain specified as string" do
|
26
25
|
let(:klass) do
|
27
26
|
Class.new do
|
@@ -35,30 +34,19 @@ describe EmailValidator do
|
|
35
34
|
it { should_not allow_value("user@example.com").for(:email) }
|
36
35
|
end
|
37
36
|
|
38
|
-
context "email domain specified as symbol" do
|
39
|
-
let(:klass) do
|
40
|
-
Class.new do
|
41
|
-
include ActiveModel::Validations
|
42
|
-
attr_accessor :email
|
43
|
-
validates :email, email: { domain: :edu }
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
it { should allow_value("user@example.edu").for(:email) }
|
48
|
-
it { should_not allow_value("user@example.com").for(:email) }
|
49
|
-
end
|
50
|
-
|
51
37
|
context "email set as an array of strings and symbols" do
|
52
38
|
let(:klass) do
|
53
39
|
Class.new do
|
54
40
|
include ActiveModel::Validations
|
55
41
|
attr_accessor :email
|
56
|
-
validates :email, email: { domain: ['com', :edu] }
|
42
|
+
validates :email, email: { domain: ['com', :edu, 'Com.Au'] }
|
57
43
|
end
|
58
44
|
end
|
59
45
|
|
60
46
|
it { should allow_value("user@example.com").for(:email) }
|
61
47
|
it { should allow_value("user@example.edu").for(:email) }
|
48
|
+
it { should allow_value("user@example.com.au").for(:email) }
|
49
|
+
it { should allow_value("user@example.Com.Au").for(:email) }
|
62
50
|
it { should_not allow_value("user@example.org").for(:email) }
|
63
51
|
end
|
64
52
|
end
|
@@ -1,35 +1,72 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe UrlValidator do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
context "url has valid format" do
|
5
|
+
let(:klass) do
|
6
|
+
Class.new do
|
7
|
+
include ActiveModel::Validations
|
8
|
+
attr_accessor :url, :name
|
9
|
+
validates :url, url: true
|
10
|
+
end
|
9
11
|
end
|
12
|
+
|
13
|
+
subject { klass.new }
|
14
|
+
|
15
|
+
it { should ensure_valid_url_format_of(:url) }
|
16
|
+
it { should_not ensure_valid_url_format_of(:name) }
|
17
|
+
|
18
|
+
it { should allow_value("http://example.com").for(:url) }
|
19
|
+
it { should allow_value("http://FooBar.cOm").for(:url) }
|
20
|
+
it { should allow_value("http://foo.bar.baz.com").for(:url) }
|
21
|
+
it { should allow_value("http://123.com").for(:url) }
|
22
|
+
it { should allow_value("http://www.example.ru").for(:url) }
|
23
|
+
it { should allow_value("http://user-example.co.uk").for(:url) }
|
24
|
+
it { should allow_value("https://example.com").for(:url) }
|
25
|
+
it { should allow_value("http://example.org/").for(:url) }
|
26
|
+
it { should allow_value("https://example.net/index.html").for(:url) }
|
27
|
+
it { should allow_value("http://example.net/login.php").for(:url) }
|
28
|
+
it { should allow_value("https://example.travel/").for(:url) }
|
29
|
+
it { should allow_value("http://example.aero").for(:url) }
|
30
|
+
it { should allow_value("http://example.aero?foo=bar").for(:url) }
|
31
|
+
|
32
|
+
it { should_not allow_value("example").for(:url) }
|
33
|
+
it { should_not allow_value("http://user_examplecom").for(:url) }
|
34
|
+
it { should_not allow_value("http://user_example.com").for(:url) }
|
35
|
+
it { should_not allow_value("http://user_example.a").for(:url) }
|
10
36
|
end
|
11
37
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
38
|
+
context "url is in the specified domain" do
|
39
|
+
let(:klass) do
|
40
|
+
Class.new do
|
41
|
+
include ActiveModel::Validations
|
42
|
+
attr_accessor :url, :name
|
43
|
+
validates :url, url: { domain: :org }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
subject { klass.new }
|
48
|
+
|
49
|
+
it { should ensure_valid_url_format_of(:url) }
|
50
|
+
it { should allow_value("http://example.org").for(:url) }
|
51
|
+
it { should_not allow_value("http://example.com").for(:url) }
|
52
|
+
end
|
53
|
+
|
54
|
+
context "email set as an array of strings and symbols" do
|
55
|
+
let(:klass) do
|
56
|
+
Class.new do
|
57
|
+
include ActiveModel::Validations
|
58
|
+
attr_accessor :url, :name
|
59
|
+
validates :url, url: { domain: [:org, 'edu', 'Com.Au'] }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
subject { klass.new }
|
64
|
+
|
65
|
+
it { should ensure_valid_url_format_of(:url) }
|
66
|
+
it { should allow_value("http://example.org").for(:url) }
|
67
|
+
it { should allow_value("http://example.edu").for(:url) }
|
68
|
+
it { should allow_value("http://example.com.au").for(:url) }
|
69
|
+
it { should allow_value("http://example.Com.Au").for(:url) }
|
70
|
+
it { should_not allow_value("http://example.com").for(:url) }
|
71
|
+
end
|
35
72
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: missing_validators
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-09-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70241132959780 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70241132959780
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: shoulda-matchers
|
27
|
-
requirement: &
|
27
|
+
requirement: &70241132957560 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,18 +32,29 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70241132957560
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: activemodel
|
38
|
-
requirement: &
|
38
|
+
requirement: &70241132955500 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
|
-
- -
|
41
|
+
- - ~>
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: 3.0.0
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70241132955500
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: activesupport
|
49
|
+
requirement: &70241132954740 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.0.0
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70241132954740
|
47
58
|
description: Adds some handy validators.
|
48
59
|
email:
|
49
60
|
- andrew.gridnev@gmail.com
|
@@ -101,4 +112,3 @@ test_files:
|
|
101
112
|
- spec/validators/email_validator_spec.rb
|
102
113
|
- spec/validators/inequality_validator_spec.rb
|
103
114
|
- spec/validators/url_validator_spec.rb
|
104
|
-
has_rdoc:
|