activevalidators 4.0.2 → 4.0.3

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.
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