activevalidators 4.0.2 → 4.0.3

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
- SHA1:
3
- metadata.gz: bd023a35373d383c1b1fb97e202e8d1d21a23b1a
4
- data.tar.gz: 98da67873560c378d040d18025524eb8182b4c4b
2
+ SHA256:
3
+ metadata.gz: d79bea4382e56e4bf80508436b9f06c66a005a2b4a6ab609ac002ecdfc9a5dc6
4
+ data.tar.gz: 830a533ecac989ea80ad219372c02b5566b0b590d74fae108e8b30a873bc1e7f
5
5
  SHA512:
6
- metadata.gz: c398449cecb367ce3af5bb06169d3fc3bb4c9a994ea9cf6bffaf2245f6ec3ac6b79c3e380e96f07fd31b3a11918b7b40be6e8aa0dec866bd165bdcadda96baa3
7
- data.tar.gz: 7fabb25274d29f5e0dace47ce2a1cb45b5fc227085e46d7494985dfe1182617dfb4d9a5ad376757ee69f92eca12957fd8a172f8d4de0804faa7211be5f712486
6
+ metadata.gz: 981eeeb402816fb4f723f21e2e96376b1f36978567fabb625c1ec4c3ecc33e3fdcb655b69657600a96ca669dcf26057ca7a2f488cbeec3a35fe33c38435e0660
7
+ data.tar.gz: 25c1cc1548e7a7a114f2871248602dcb7e75671abe49cdd264ce47632fa06b05a8eda289dfa2e14f26e4ebca5b8e19e95f90e14aadb4aed7f9e9fed6b6b25ae7
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -1,8 +1,13 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.2
3
+ - 2.2.8
4
+ - 2.3.5
5
+ - 2.4.2
4
6
  - ruby-head
5
7
  - jruby-head
6
- - rbx-3.20
8
+ - rubinius-3.86
9
+ matrix:
10
+ allow_failures:
11
+ - rvm: rubinius-3.86
7
12
  before_install:
8
13
  - gem install bundler
@@ -8,6 +8,14 @@
8
8
 
9
9
  ## CHANGES
10
10
 
11
+
12
+ # 4.0.3
13
+
14
+ ## CHANGES
15
+
16
+ * UrlValidator: add feature to support TLD validation
17
+
18
+
11
19
  # 4.0.2
12
20
 
13
21
  ## CHANGES
data/Rakefile CHANGED
@@ -12,10 +12,6 @@ Rake::TestTask.new do |t|
12
12
  t.warning = true
13
13
  end
14
14
 
15
- # -*- encoding: utf-8 -*-
16
- $:.unshift File.expand_path("../lib", __FILE__)
17
- require 'activevalidators'
18
-
19
15
  def gemspec
20
16
  @gemspec ||= begin
21
17
  file = File.expand_path('../activevalidators.gemspec', __FILE__)
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |s|
3
3
  s.name = 'activevalidators'
4
- s.version = '4.0.2'
4
+ s.version = '4.0.3'
5
5
  s.platform = Gem::Platform::RUBY
6
6
  s.authors = ['Franck Verrot', 'Paco Guzmán', 'Oriol Gual', 'Garrett Bjerkhoel', 'Renato Riccieri Santos Zannon', 'Brian Moseley', 'Serj L aka Loremaster']
7
7
  s.email = ['franck@verrot.fr']
@@ -1,21 +1,25 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- MIIDaDCCAlCgAwIBAgIBATANBgkqhkiG9w0BAQUFADA9MQ8wDQYDVQQDDAZmcmFu
3
- Y2sxFjAUBgoJkiaJk/IsZAEZFgZ2ZXJyb3QxEjAQBgoJkiaJk/IsZAEZFgJmcjAe
4
- Fw0xNjA1MTMxOTQ3NTlaFw0xNzA1MTMxOTQ3NTlaMD0xDzANBgNVBAMMBmZyYW5j
5
- azEWMBQGCgmSJomT8ixkARkWBnZlcnJvdDESMBAGCgmSJomT8ixkARkWAmZyMIIB
6
- IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA12mvBkBdLx5lIPvd0hJ6Ccer
7
- t5fnF94UNRqE0zTxow9aAAtBb/G4fE/OkOBe69gq/5SSZRgF5m/qQ+//rZHSOUfR
8
- f+a1Qqbho0CfFpAurAtDZQS45L5txhz1pRUnz/8bF6nkeKUF0pdLbNNVS9axE3uc
9
- qBrfjUAP3yYe3K0TANgZym0TYJ3OhSeUV5Y8tuncuILHZI1hShYekjbPk3KLBJG5
10
- 16x3sHS209Y5LbRbzs85+HNBcNaN/Yi42IFl+mgdfyQLmbgSTpMtASPCXfsnAxsl
11
- 6QIiN9pQq9GSvCXA5wH+ZqYtFd6fJqDHVCDAlQ6lYBiCCpC/JV+lZj16c4yDnwID
12
- AQABo3MwcTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU7Ygnr1Sx
13
- 42iryVPwtuJC/acw2TAwGwYDVR0RBBQwEoEQZnJhbmNrQHZlcnJvdC5mcjAbBgNV
14
- HRIEFDASgRBmcmFuY2tAdmVycm90LmZyMA0GCSqGSIb3DQEBBQUAA4IBAQBdZVhZ
15
- dhXujOsiysxAqtixFFXH9wSQNIltYQ8zuRLA/FgwqrNUQq+Qdiib5Kqj5hUK4okl
16
- rTx4uCkHJszIocIZiKE/Ntk6xooQVTC/L95K/yycDCyss2c8JF2wdg/+q38u7rOS
17
- fAbV2IGNLTPYWX+M2B08a6lVVRMD386TGrk0/ROjgZIhuHah4dY+ObAUyUv1oiyb
18
- PEaDVSbqqbtwQAsY87Vam7GUcH/IJnhdLadvNOJlLr8jxW+gm1ZFE9MOlsSmHeGe
19
- Z7BoH/Mfxw3P4yyir173p9JWvVqLiQE13XBeD13NPA8neoWpLJxm6k03PcTElT/E
20
- QrOSgKrHAb/fFJma
2
+ MIIEMDCCApigAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMR8wHQYDVQQDDBZmcmFu
3
+ Y2svREM9dmVycm90L0RDPWZyMB4XDTE3MTExOTIxMTgyNVoXDTE4MTExOTIxMTgy
4
+ NVowITEfMB0GA1UEAwwWZnJhbmNrL0RDPXZlcnJvdC9EQz1mcjCCAaIwDQYJKoZI
5
+ hvcNAQEBBQADggGPADCCAYoCggGBANjZ/7L2ECEQAVOYvMl0JOwyVXKRCsLnVrmP
6
+ mcwpCMFL0ennkpLJcqiDNsm0b/RkJHSLu3FMoYrIU5KoaP7iMIsLGv846aw2wSNI
7
+ G5XWGnRY9dWVu7Gz2OZbsDi18WT94Y/s2yf+orPLAiaJb451decYEpHqLTiaJhhJ
8
+ xHckJixfDVwZGJpow7rrJAJMbU9ZCJFUFAfNpgkOqhbBU4Ehi1umbC/ZBsVDiRVa
9
+ ZjfNhe7kgx6jo3EfPY4izPW2IKkpk7nJKNfZnM2r0cnpPJbhyH1m5fsikBD5tRNe
10
+ YxJpxDPf8UBTTXqoeSSQygiHWWZVbH3zj2jWzi5T0do5PbZcCeoIKR4TyOgbOgBW
11
+ Ra7bm9uVXo6MQWpp0aeC/X+F2Y/dFjXAP/TPL89ownd3XZUaNDdZfS6aKBMG3a5C
12
+ gcRLMt1hOJchslGNtvkq5W4Wq8hw+zNHzTMpRkIsYTbvlJCDxXRKR3jwPDTRvNAl
13
+ aemBW1g3yerHeDQr6GtxKEvhmHdw/wIDAQABo3MwcTAJBgNVHRMEAjAAMAsGA1Ud
14
+ DwQEAwIEsDAdBgNVHQ4EFgQUgG77cLAMzowManymHX63DbvfR5IwGwYDVR0RBBQw
15
+ EoEQZnJhbmNrQHZlcnJvdC5mcjAbBgNVHRIEFDASgRBmcmFuY2tAdmVycm90LmZy
16
+ MA0GCSqGSIb3DQEBCwUAA4IBgQB86Y8WM2ipynprTUdKBmO/i5kPev+pQjLQqPXI
17
+ zzfv57KP8gg2sODWEdmNkSkeIvdx60pTENVsumaTPf6H4GKm0UXoUWkiXxyn1Pw+
18
+ u+LjMqNhsZC/GniX76EwqyfXWr67ycxvNZjx76Kd9NvaHmVpoZMx94I4AkMQ/DLs
19
+ xVOAKKocMUfYSOS9XBRSaBID35ct8IpOS8+AFTf/d1j9ZVRz+8FAwhUOqIJeV2Ze
20
+ CxU5fLhrkxlQYRbXlmJpmR/4ri3vGvBpfx6GbS/vfjIX+FGaPXVdANtQmoChT3y+
21
+ ZDTx0AmIrPp/g89SEoyrrRxy6BbhV7Jl68mwlS7v9EAaHVlQy2rhfB8RAO/ViuAl
22
+ GVIuVSzE95Lb2Q+vxbLgk/fHcdoGDIB7SglNmP9b1d55AgQGnajipEukmy+smZko
23
+ ZRwmWlrt39rxEcCGo4aKqwxpPeewNg7hjiCFkf2fO0XHvk+kyMr0JmF8GbS6oyj5
24
+ cWLdZ4BYV1Mwu0NmUxVnvmrCRV8=
21
25
  -----END CERTIFICATE-----
@@ -1,4 +1,9 @@
1
1
  require 'mail'
2
+
3
+ old_w, $-w = $-w, false
4
+ require 'mail/elements/address'
5
+ $-w = old_w
6
+
2
7
  module ActiveModel
3
8
  module Validations
4
9
  class EmailValidator < EachValidator
@@ -40,6 +40,16 @@ module ActiveModel
40
40
  super
41
41
  end
42
42
 
43
+ # Public: Validate URL, if it fails adds an error.
44
+ #
45
+ # Returns nothing.
46
+ def validate_each(record, attribute, value)
47
+ uri = as_uri(value)
48
+ tld_requirement_fullfilled = check_tld_requirement(value)
49
+ record.errors.add(attribute) unless uri && value.to_s =~ uri_regexp && tld_requirement_fullfilled
50
+ end
51
+
52
+ private
43
53
  # Internal: Ensures that at least one protocol is defined. If the protocols
44
54
  # are empty it throws an ArgumentError.
45
55
  #
@@ -66,6 +76,17 @@ module ActiveModel
66
76
  @uri_regexp ||= /\A#{URI::Parser.new.make_regexp(protocols)}\z/
67
77
  end
68
78
 
79
+ # Internal: Checks if the tld requirements are fullfilled
80
+ #
81
+ # When :require_tld option is set to true, the url will be searched for
82
+ # a dot anywhere inside the host except the first or last position
83
+ #
84
+ # Returns a boolean value.
85
+ def check_tld_requirement(value)
86
+ host = URI.parse(value.to_s).host rescue value
87
+ options[:require_tld] === true ? host =~ /.(\.)\w+/ : true
88
+ end
89
+
69
90
  # Internal: Tries to convert supplied string into URI,
70
91
  # if not possible returns nil => invalid URI.
71
92
  #
@@ -73,14 +94,6 @@ module ActiveModel
73
94
  def as_uri(value)
74
95
  URI.parse(value.to_s) rescue nil if value.present?
75
96
  end
76
-
77
- # Public: Validate URL, if it fails adds an error.
78
- #
79
- # Returns nothing.
80
- def validate_each(record, attribute, value)
81
- uri = as_uri(value)
82
- record.errors.add(attribute) unless uri && value.to_s =~ uri_regexp
83
- end
84
97
  end
85
98
  end
86
99
  end
@@ -1,15 +1,10 @@
1
1
  gem 'minitest'
2
2
  require 'minitest/autorun'
3
3
  require 'minitest/mock'
4
- require 'active_support/test_case'
5
-
6
- # silence warnings
7
4
  old_w, $-w = $-w, false
8
-
9
- require 'activevalidators'
10
-
11
- # unsilence warnings
5
+ require 'active_support/test_case'
12
6
  $-w = old_w
7
+ require 'activevalidators'
13
8
 
14
9
  class TestRecord
15
10
  include ActiveModel::Validations
@@ -8,6 +8,12 @@ describe "Url Validation" do
8
8
  TestRecord.new
9
9
  end
10
10
 
11
+ def build_url_record_require_tld
12
+ TestRecord.reset_callbacks(:validate)
13
+ TestRecord.validates :url, :url => { :require_tld => true }
14
+ TestRecord.new
15
+ end
16
+
11
17
  def build_ftp_record
12
18
  TestRecord.reset_callbacks(:validate)
13
19
  TestRecord.validates :url, :url => 'ftp'
@@ -49,6 +55,13 @@ describe "Url Validation" do
49
55
  subject.valid?.must_equal true
50
56
  subject.errors.size.must_equal 0
51
57
  end
58
+
59
+ it "accepts urls with tld when tld validation is required" do
60
+ subject = build_url_record_require_tld
61
+ subject.url = 'http://verrot.fr'
62
+ subject.valid?.must_equal true
63
+ subject.errors.size.must_equal 0
64
+ end
52
65
  end
53
66
 
54
67
  describe "for invalid urls" do
@@ -93,5 +106,26 @@ describe "Url Validation" do
93
106
  subject.valid?.must_equal false
94
107
  subject.errors.size.must_equal 1
95
108
  end
109
+
110
+ it "rejects urls that have no tld but required tld validation" do
111
+ subject = build_url_record_require_tld
112
+ subject.url = 'http://verrot'
113
+ subject.valid?.must_equal false
114
+ subject.errors.size.must_equal 1
115
+ end
116
+
117
+ it "will not accept domains that end with a dot as a tld" do
118
+ subject = build_url_record_require_tld
119
+ subject.url = 'http://verrot.'
120
+ subject.valid?.must_equal false
121
+ subject.errors.size.must_equal 1
122
+ end
123
+
124
+ it "will not accept domains that start with a dot as a tld" do
125
+ subject = build_url_record_require_tld
126
+ subject.url = 'http://.verrot'
127
+ subject.valid?.must_equal false
128
+ subject.errors.size.must_equal 1
129
+ end
96
130
  end
97
131
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activevalidators
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.2
4
+ version: 4.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Franck Verrot
@@ -16,27 +16,31 @@ bindir: bin
16
16
  cert_chain:
17
17
  - |
18
18
  -----BEGIN CERTIFICATE-----
19
- MIIDaDCCAlCgAwIBAgIBATANBgkqhkiG9w0BAQUFADA9MQ8wDQYDVQQDDAZmcmFu
20
- Y2sxFjAUBgoJkiaJk/IsZAEZFgZ2ZXJyb3QxEjAQBgoJkiaJk/IsZAEZFgJmcjAe
21
- Fw0xNjA1MTMxOTQ3NTlaFw0xNzA1MTMxOTQ3NTlaMD0xDzANBgNVBAMMBmZyYW5j
22
- azEWMBQGCgmSJomT8ixkARkWBnZlcnJvdDESMBAGCgmSJomT8ixkARkWAmZyMIIB
23
- IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA12mvBkBdLx5lIPvd0hJ6Ccer
24
- t5fnF94UNRqE0zTxow9aAAtBb/G4fE/OkOBe69gq/5SSZRgF5m/qQ+//rZHSOUfR
25
- f+a1Qqbho0CfFpAurAtDZQS45L5txhz1pRUnz/8bF6nkeKUF0pdLbNNVS9axE3uc
26
- qBrfjUAP3yYe3K0TANgZym0TYJ3OhSeUV5Y8tuncuILHZI1hShYekjbPk3KLBJG5
27
- 16x3sHS209Y5LbRbzs85+HNBcNaN/Yi42IFl+mgdfyQLmbgSTpMtASPCXfsnAxsl
28
- 6QIiN9pQq9GSvCXA5wH+ZqYtFd6fJqDHVCDAlQ6lYBiCCpC/JV+lZj16c4yDnwID
29
- AQABo3MwcTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU7Ygnr1Sx
30
- 42iryVPwtuJC/acw2TAwGwYDVR0RBBQwEoEQZnJhbmNrQHZlcnJvdC5mcjAbBgNV
31
- HRIEFDASgRBmcmFuY2tAdmVycm90LmZyMA0GCSqGSIb3DQEBBQUAA4IBAQBdZVhZ
32
- dhXujOsiysxAqtixFFXH9wSQNIltYQ8zuRLA/FgwqrNUQq+Qdiib5Kqj5hUK4okl
33
- rTx4uCkHJszIocIZiKE/Ntk6xooQVTC/L95K/yycDCyss2c8JF2wdg/+q38u7rOS
34
- fAbV2IGNLTPYWX+M2B08a6lVVRMD386TGrk0/ROjgZIhuHah4dY+ObAUyUv1oiyb
35
- PEaDVSbqqbtwQAsY87Vam7GUcH/IJnhdLadvNOJlLr8jxW+gm1ZFE9MOlsSmHeGe
36
- Z7BoH/Mfxw3P4yyir173p9JWvVqLiQE13XBeD13NPA8neoWpLJxm6k03PcTElT/E
37
- QrOSgKrHAb/fFJma
19
+ MIIEMDCCApigAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMR8wHQYDVQQDDBZmcmFu
20
+ Y2svREM9dmVycm90L0RDPWZyMB4XDTE3MTExOTIxMTgyNVoXDTE4MTExOTIxMTgy
21
+ NVowITEfMB0GA1UEAwwWZnJhbmNrL0RDPXZlcnJvdC9EQz1mcjCCAaIwDQYJKoZI
22
+ hvcNAQEBBQADggGPADCCAYoCggGBANjZ/7L2ECEQAVOYvMl0JOwyVXKRCsLnVrmP
23
+ mcwpCMFL0ennkpLJcqiDNsm0b/RkJHSLu3FMoYrIU5KoaP7iMIsLGv846aw2wSNI
24
+ G5XWGnRY9dWVu7Gz2OZbsDi18WT94Y/s2yf+orPLAiaJb451decYEpHqLTiaJhhJ
25
+ xHckJixfDVwZGJpow7rrJAJMbU9ZCJFUFAfNpgkOqhbBU4Ehi1umbC/ZBsVDiRVa
26
+ ZjfNhe7kgx6jo3EfPY4izPW2IKkpk7nJKNfZnM2r0cnpPJbhyH1m5fsikBD5tRNe
27
+ YxJpxDPf8UBTTXqoeSSQygiHWWZVbH3zj2jWzi5T0do5PbZcCeoIKR4TyOgbOgBW
28
+ Ra7bm9uVXo6MQWpp0aeC/X+F2Y/dFjXAP/TPL89ownd3XZUaNDdZfS6aKBMG3a5C
29
+ gcRLMt1hOJchslGNtvkq5W4Wq8hw+zNHzTMpRkIsYTbvlJCDxXRKR3jwPDTRvNAl
30
+ aemBW1g3yerHeDQr6GtxKEvhmHdw/wIDAQABo3MwcTAJBgNVHRMEAjAAMAsGA1Ud
31
+ DwQEAwIEsDAdBgNVHQ4EFgQUgG77cLAMzowManymHX63DbvfR5IwGwYDVR0RBBQw
32
+ EoEQZnJhbmNrQHZlcnJvdC5mcjAbBgNVHRIEFDASgRBmcmFuY2tAdmVycm90LmZy
33
+ MA0GCSqGSIb3DQEBCwUAA4IBgQB86Y8WM2ipynprTUdKBmO/i5kPev+pQjLQqPXI
34
+ zzfv57KP8gg2sODWEdmNkSkeIvdx60pTENVsumaTPf6H4GKm0UXoUWkiXxyn1Pw+
35
+ u+LjMqNhsZC/GniX76EwqyfXWr67ycxvNZjx76Kd9NvaHmVpoZMx94I4AkMQ/DLs
36
+ xVOAKKocMUfYSOS9XBRSaBID35ct8IpOS8+AFTf/d1j9ZVRz+8FAwhUOqIJeV2Ze
37
+ CxU5fLhrkxlQYRbXlmJpmR/4ri3vGvBpfx6GbS/vfjIX+FGaPXVdANtQmoChT3y+
38
+ ZDTx0AmIrPp/g89SEoyrrRxy6BbhV7Jl68mwlS7v9EAaHVlQy2rhfB8RAO/ViuAl
39
+ GVIuVSzE95Lb2Q+vxbLgk/fHcdoGDIB7SglNmP9b1d55AgQGnajipEukmy+smZko
40
+ ZRwmWlrt39rxEcCGo4aKqwxpPeewNg7hjiCFkf2fO0XHvk+kyMr0JmF8GbS6oyj5
41
+ cWLdZ4BYV1Mwu0NmUxVnvmrCRV8=
38
42
  -----END CERTIFICATE-----
39
- date: 2017-04-26 00:00:00.000000000 Z
43
+ date: 2017-11-19 00:00:00.000000000 Z
40
44
  dependencies:
41
45
  - !ruby/object:Gem::Dependency
42
46
  name: bundler
@@ -246,7 +250,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
246
250
  version: '0'
247
251
  requirements: []
248
252
  rubyforge_project:
249
- rubygems_version: 2.6.8
253
+ rubygems_version: 2.6.14
250
254
  signing_key:
251
255
  specification_version: 4
252
256
  summary: Collection of ActiveModel/ActiveRecord validations
metadata.gz.sig CHANGED
Binary file