url_validation 1.1.0 → 1.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.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/Gemfile +9 -4
- data/Gemfile.lock +71 -61
- data/README.md +40 -0
- data/Rakefile +17 -17
- data/VERSION +1 -1
- data/lib/url_validation.rb +111 -99
- data/spec/url_validator_spec.rb +117 -113
- data/url_validation.gemspec +41 -41
- metadata +9 -9
- data/README.textile +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0fae744847fddf375172f64d9e40a200982b3d8c
|
4
|
+
data.tar.gz: fab400c0e41670a2ffeefa1fcb03a398f3712792
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e15971f514c8b53fb1af82b1bc751cc4bc1dd8da092e68e27984eff755494be750edfda5e2d88c2ab7584ce59433bf05aed115f06b2d5cc6dbfa58b0a488605f
|
7
|
+
data.tar.gz: b98920d33b63e3792b63f8bc8bfbeb1798478f09c97d47a6e451fc62921904eb0d5887959d5dc8943149626bb381205670752b2d827a2e0b97bbf67a3bf61cde
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.1
|
1
|
+
2.4.1
|
data/Gemfile
CHANGED
@@ -1,13 +1,18 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
gem 'addressable', :
|
3
|
+
gem 'addressable', require: 'addressable/uri' # for unicode URIs
|
4
4
|
gem 'activesupport'
|
5
5
|
gem 'activerecord'
|
6
6
|
gem 'httpi'
|
7
7
|
|
8
8
|
group :development do
|
9
|
-
|
10
|
-
gem '
|
11
|
-
|
9
|
+
# PUBLISHING
|
10
|
+
gem 'juwelier'
|
11
|
+
|
12
|
+
# DOCS
|
13
|
+
gem 'yard', require: nil
|
14
|
+
gem 'redcarpet', require: nil
|
15
|
+
|
16
|
+
# SPECS
|
12
17
|
gem 'rspec'
|
13
18
|
end
|
data/Gemfile.lock
CHANGED
@@ -1,96 +1,106 @@
|
|
1
1
|
GEM
|
2
2
|
remote: https://rubygems.org/
|
3
3
|
specs:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
i18n (~> 0.6, >= 0.6.9)
|
14
|
-
json (~> 1.7, >= 1.7.7)
|
4
|
+
activemodel (5.1.1)
|
5
|
+
activesupport (= 5.1.1)
|
6
|
+
activerecord (5.1.1)
|
7
|
+
activemodel (= 5.1.1)
|
8
|
+
activesupport (= 5.1.1)
|
9
|
+
arel (~> 8.0)
|
10
|
+
activesupport (5.1.1)
|
11
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
12
|
+
i18n (~> 0.7)
|
15
13
|
minitest (~> 5.1)
|
16
|
-
thread_safe (~> 0.1)
|
17
14
|
tzinfo (~> 1.1)
|
18
|
-
addressable (2.
|
19
|
-
arel (
|
20
|
-
builder (3.2.
|
15
|
+
addressable (2.4.0)
|
16
|
+
arel (8.0.0)
|
17
|
+
builder (3.2.3)
|
18
|
+
concurrent-ruby (1.0.5)
|
21
19
|
descendants_tracker (0.0.4)
|
22
20
|
thread_safe (~> 0.3, >= 0.3.1)
|
23
|
-
diff-lcs (1.
|
24
|
-
faraday (0.9.
|
21
|
+
diff-lcs (1.3)
|
22
|
+
faraday (0.9.2)
|
25
23
|
multipart-post (>= 1.2, < 3)
|
26
|
-
git (1.
|
27
|
-
github_api (0.
|
28
|
-
addressable (~> 2.
|
24
|
+
git (1.3.0)
|
25
|
+
github_api (0.17.0)
|
26
|
+
addressable (~> 2.4.0)
|
29
27
|
descendants_tracker (~> 0.0.4)
|
30
28
|
faraday (~> 0.8, < 0.10)
|
31
|
-
hashie (>= 3.
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
httpi (2.2.7)
|
29
|
+
hashie (>= 3.4)
|
30
|
+
mime-types (>= 1.16, < 3.0)
|
31
|
+
oauth2 (~> 1.0)
|
32
|
+
hashie (3.5.5)
|
33
|
+
highline (1.7.8)
|
34
|
+
httpi (2.4.2)
|
38
35
|
rack
|
39
|
-
|
40
|
-
|
36
|
+
socksify
|
37
|
+
i18n (0.8.4)
|
38
|
+
juwelier (2.4.5)
|
41
39
|
builder
|
42
|
-
bundler (>= 1.
|
40
|
+
bundler (>= 1.13)
|
43
41
|
git (>= 1.2.5)
|
44
42
|
github_api
|
45
43
|
highline (>= 1.6.15)
|
44
|
+
kamelcase (~> 0)
|
46
45
|
nokogiri (>= 1.5.10)
|
46
|
+
psych (~> 2.2)
|
47
47
|
rake
|
48
48
|
rdoc
|
49
|
-
|
50
|
-
jwt (1.
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
49
|
+
semver2
|
50
|
+
jwt (1.5.6)
|
51
|
+
kamelcase (0.0.0)
|
52
|
+
semver2 (~> 3)
|
53
|
+
mime-types (2.99.3)
|
54
|
+
mini_portile2 (2.1.0)
|
55
|
+
minitest (5.10.2)
|
56
|
+
multi_json (1.12.1)
|
57
|
+
multi_xml (0.6.0)
|
55
58
|
multipart-post (2.0.0)
|
56
|
-
nokogiri (1.
|
57
|
-
|
58
|
-
oauth2 (1.
|
59
|
-
faraday (>= 0.8, < 0.
|
59
|
+
nokogiri (1.7.2)
|
60
|
+
mini_portile2 (~> 2.1.0)
|
61
|
+
oauth2 (1.3.1)
|
62
|
+
faraday (>= 0.8, < 0.12)
|
60
63
|
jwt (~> 1.0)
|
61
64
|
multi_json (~> 1.3)
|
62
65
|
multi_xml (~> 0.5)
|
63
|
-
rack (
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
rspec-
|
71
|
-
rspec-
|
72
|
-
|
73
|
-
|
74
|
-
|
66
|
+
rack (>= 1.2, < 3)
|
67
|
+
psych (2.2.4)
|
68
|
+
rack (2.0.3)
|
69
|
+
rake (12.0.0)
|
70
|
+
rdoc (5.1.0)
|
71
|
+
redcarpet (3.4.0)
|
72
|
+
rspec (3.6.0)
|
73
|
+
rspec-core (~> 3.6.0)
|
74
|
+
rspec-expectations (~> 3.6.0)
|
75
|
+
rspec-mocks (~> 3.6.0)
|
76
|
+
rspec-core (3.6.0)
|
77
|
+
rspec-support (~> 3.6.0)
|
78
|
+
rspec-expectations (3.6.0)
|
79
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
80
|
+
rspec-support (~> 3.6.0)
|
81
|
+
rspec-mocks (3.6.0)
|
75
82
|
diff-lcs (>= 1.2.0, < 2.0)
|
76
|
-
rspec-support (~> 3.
|
77
|
-
rspec-
|
78
|
-
|
79
|
-
|
80
|
-
thread_safe (0.3.
|
81
|
-
tzinfo (1.2.
|
83
|
+
rspec-support (~> 3.6.0)
|
84
|
+
rspec-support (3.6.0)
|
85
|
+
semver2 (3.4.2)
|
86
|
+
socksify (1.7.1)
|
87
|
+
thread_safe (0.3.6)
|
88
|
+
tzinfo (1.2.3)
|
82
89
|
thread_safe (~> 0.1)
|
83
|
-
yard (0.
|
90
|
+
yard (0.9.9)
|
84
91
|
|
85
92
|
PLATFORMS
|
86
93
|
ruby
|
87
94
|
|
88
95
|
DEPENDENCIES
|
89
|
-
RedCloth
|
90
96
|
activerecord
|
91
97
|
activesupport
|
92
98
|
addressable
|
93
99
|
httpi
|
94
|
-
|
100
|
+
juwelier
|
101
|
+
redcarpet
|
95
102
|
rspec
|
96
103
|
yard
|
104
|
+
|
105
|
+
BUNDLED WITH
|
106
|
+
1.15.0
|
data/README.md
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# url_validation
|
2
|
+
|
3
|
+
Simple URL validator for Rails 3.
|
4
|
+
|
5
|
+
| | |
|
6
|
+
|:------------|:--------------------------------|
|
7
|
+
| **Author** | Tim Morgan |
|
8
|
+
| **Version** | 1.0 (May 9, 2011) |
|
9
|
+
| **License** | Released under the MIT license. |
|
10
|
+
|
11
|
+
## About
|
12
|
+
|
13
|
+
This gem adds a very simple URL format validator to be used with Active Record
|
14
|
+
models in Rails 3.0. It supports localized error messages. It can validate many
|
15
|
+
different kinds of URLs, including HTTP and HTTPS. It supports advanced
|
16
|
+
validation features like sending `HEAD` requests to URLS to verify that they are
|
17
|
+
valid endpoints.
|
18
|
+
|
19
|
+
## Installation
|
20
|
+
|
21
|
+
Add the gem to your project's Gemfile:
|
22
|
+
|
23
|
+
``` ruby
|
24
|
+
gem 'url_validation'
|
25
|
+
```
|
26
|
+
|
27
|
+
## Usage
|
28
|
+
|
29
|
+
This gem is an `EachValidator`, and thus is used with the `validates` method:
|
30
|
+
|
31
|
+
``` ruby
|
32
|
+
class User < ActiveRecord::Base
|
33
|
+
validates :terms_of_service_link,
|
34
|
+
presence: true,
|
35
|
+
url: true
|
36
|
+
end
|
37
|
+
```
|
38
|
+
|
39
|
+
There are other options to fine-tune your validation; see the {UrlValidator}
|
40
|
+
class for more, and for a list of error message localization keys.
|
data/Rakefile
CHANGED
@@ -9,30 +9,30 @@ rescue Bundler::BundlerError => e
|
|
9
9
|
end
|
10
10
|
require 'rake'
|
11
11
|
|
12
|
-
require '
|
13
|
-
|
14
|
-
gem.name =
|
15
|
-
gem.summary = %Q{Simple URL validation in Rails 3}
|
12
|
+
require 'juwelier'
|
13
|
+
Juwelier::Tasks.new do |gem|
|
14
|
+
gem.name = 'url_validation'
|
15
|
+
gem.summary = %Q{Simple URL validation in Rails 3+}
|
16
16
|
gem.description = %Q{A simple, localizable EachValidator for URL fields in ActiveRecord 3.0.}
|
17
|
-
gem.email =
|
18
|
-
gem.homepage =
|
19
|
-
gem.authors = [
|
20
|
-
gem.required_ruby_version = '>=
|
17
|
+
gem.email = 'git@timothymorgan.info'
|
18
|
+
gem.homepage = 'http://github.com/riscfuture/url_validation'
|
19
|
+
gem.authors = ['Tim Morgan']
|
20
|
+
gem.required_ruby_version = '>= 2.0.0'
|
21
21
|
end
|
22
|
-
|
22
|
+
Juwelier::RubygemsDotOrgTasks.new
|
23
23
|
|
24
24
|
require 'yard'
|
25
25
|
YARD::Rake::YardocTask.new('doc') do |doc|
|
26
|
-
doc.options <<
|
27
|
-
doc.options <<
|
28
|
-
doc.options <<
|
29
|
-
doc.options <<
|
30
|
-
doc.options <<
|
31
|
-
|
32
|
-
doc.files =
|
26
|
+
doc.options << '-m' << 'markdown' << '-M' << 'redcarpet'
|
27
|
+
doc.options << '--protected' << '--no-private'
|
28
|
+
doc.options << '-r' << 'README.md'
|
29
|
+
doc.options << '-o' << 'doc'
|
30
|
+
doc.options << '--title' << 'url_validation Documentation'.inspect
|
31
|
+
|
32
|
+
doc.files = %w(lib/**/*.rb README.md)
|
33
33
|
end
|
34
34
|
|
35
35
|
require 'rspec/core/rake_task'
|
36
36
|
RSpec::Core::RakeTask.new
|
37
37
|
|
38
|
-
task :
|
38
|
+
task default: :spec
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0
|
data/lib/url_validation.rb
CHANGED
@@ -6,142 +6,154 @@ require 'active_support/core_ext/array/wrap'
|
|
6
6
|
|
7
7
|
# Validates URLs. Uses the following I18n error message keys:
|
8
8
|
#
|
9
|
-
# |
|
10
|
-
#
|
11
|
-
# |
|
9
|
+
# | | |
|
10
|
+
# |:-----------------------|:----------------------------------------------------------------|
|
11
|
+
# | `invalid_url` | URL is improperly formatted. |
|
12
|
+
# | `url_not_accessible` | Couldn't connect to the URL. |
|
13
|
+
# | `url_invalid_response` | Got a bad HTTP response (not of an acceptable type, e.g., 2xx). |
|
12
14
|
#
|
13
15
|
# @example Checks the syntax only
|
14
|
-
# validates :link, :
|
16
|
+
# validates :link, url: true
|
15
17
|
#
|
16
18
|
# @example Ensures the host is available but does not check the path
|
17
|
-
# validates :link, :
|
19
|
+
# validates :link, url: {check_host: true}
|
18
20
|
#
|
19
21
|
# @example Ensures that the host is available and that a request for the path does not return a 4xx or 5xx response
|
20
|
-
# validates :link, :
|
22
|
+
# validates :link, url: {check_path: true}
|
21
23
|
#
|
22
24
|
# @example Ensures that the host is available and that a request for the path does not return a 3xx, 4xx, or 5xx response
|
23
|
-
# validates :link, :
|
25
|
+
# validates :link, url: {check_path: [300..399, 400..499, 500..599]}
|
24
26
|
#
|
25
27
|
# @example Checks for host accessibility with a custom timeout
|
26
|
-
# validates :link, :
|
27
|
-
# :
|
28
|
-
# :
|
28
|
+
# validates :link, url: {
|
29
|
+
# check_host: true,
|
30
|
+
# request_callback: ->(request) { request.timeout = 30 }
|
29
31
|
# }
|
30
32
|
#
|
31
|
-
#
|
33
|
+
# ## Options
|
32
34
|
#
|
33
|
-
#
|
35
|
+
# ### Basic options
|
34
36
|
#
|
35
|
-
# |
|
36
|
-
#
|
37
|
+
# | | |
|
38
|
+
# |:---------------|:----------------------------------------------|
|
39
|
+
# | `:allow_nil` | If `true`, `nil` values are allowed. |
|
40
|
+
# | `:allow_blank` | If `true`, `nil` or empty values are allowed. |
|
37
41
|
#
|
38
|
-
#
|
42
|
+
# ### Error messages
|
39
43
|
#
|
40
|
-
# |
|
41
|
-
#
|
42
|
-
# |
|
43
|
-
# |
|
44
|
+
# | | |
|
45
|
+
# |:--------------------------------|:-------------------------------------------------------------|
|
46
|
+
# | `:invalid_url_message` | A custom message to use in place of `:invalid_url`. |
|
47
|
+
# | `:incorrect_url_type_message` | A custom message to use in place of `:incorrect_url_type`. |
|
48
|
+
# | `:url_not_accessible_message` | A custom message to use in place of `:url_not_accessible`. |
|
49
|
+
# | `:url_invalid_response_message` | A custom message to use in place of `:url_invalid_response`. |
|
44
50
|
#
|
45
|
-
#
|
51
|
+
# ### Networkless URL validation
|
46
52
|
#
|
47
|
-
# |
|
48
|
-
#
|
53
|
+
# | | |
|
54
|
+
# |:------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
55
|
+
# | `:scheme` | A string or array of strings, such as "http" or "ftp", indicating which URL schemes are valid. By default only HTTP(S) URLs are accepted. |
|
56
|
+
# | `:default_scheme` | A default URL scheme to try for improper URLs. If this is set to, e.g., "http", then when a URL like "whoops.com" is given (which would otherwise fail due to an improper format), "http://whoops.com" will be tried instead. |
|
49
57
|
#
|
50
|
-
#
|
58
|
+
# ### Over-the-network URL validation
|
51
59
|
#
|
52
60
|
# The HTTPI gem is used to provide a generic interface to whatever HTTP client
|
53
61
|
# you wish to use. This allows you to drop in, e.g., a Curl client if you want.
|
54
|
-
# You can set the HTTPI adapter with the
|
62
|
+
# You can set the HTTPI adapter with the `:httpi_adapter` option.
|
55
63
|
#
|
56
|
-
# |
|
57
|
-
#
|
58
|
-
# |
|
64
|
+
# | | |
|
65
|
+
# |:-----------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
66
|
+
# | `:check_host` | If `true`, the validator will perform a network test to verify that it can connect to the server and access the host (at the "/" path). This check will only be performed for HTTP(S) URLs. |
|
67
|
+
# | `:check_path` | An integer or symbol (or array of integers or symbols), such as 301 or `:moved_permanently`, indicating what response codes are unacceptable. You can also use ranges, and include them in an array, such as `[:moved_permanently, 400..404, 500..599]`. By default, this is `nil`, and therefore only host accessibility is checked. If `true` is given, uses a default set of invalid error codes (4xx and 5xx). Implies `:check_host` is also true. |
|
68
|
+
# | `:httpi_adapter` | The HTTPI adapter to use for checking HTTP and HTTPS URLs (default set by the HTTPI gem). |
|
59
69
|
#
|
60
|
-
#
|
70
|
+
# ### Other options
|
61
71
|
#
|
62
|
-
# |
|
72
|
+
# | | |
|
73
|
+
# |:--------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
74
|
+
# | `:request_callback` | A proc that receives the request object (for HTTP(S) requests, the `HTTPI::Request` object) before it is executed. You can use this proc to set, e.g., custom headers or timeouts on the request. |
|
63
75
|
|
64
76
|
class UrlValidator < ActiveModel::EachValidator
|
65
77
|
# @private
|
66
78
|
CODES = {
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
79
|
+
continue: 100,
|
80
|
+
switching_protocols: 101,
|
81
|
+
processing: 102,
|
82
|
+
ok: 200,
|
83
|
+
created: 201,
|
84
|
+
accepted: 202,
|
85
|
+
non_authoritative_information: 203,
|
86
|
+
no_content: 204,
|
87
|
+
reset_content: 205,
|
88
|
+
partial_content: 206,
|
89
|
+
multi_status: 207,
|
90
|
+
im_used: 226,
|
91
|
+
multiple_choices: 300,
|
92
|
+
moved_permanently: 301,
|
93
|
+
found: 302,
|
94
|
+
see_other: 303,
|
95
|
+
not_modified: 304,
|
96
|
+
use_proxy: 305,
|
97
|
+
reserved: 306,
|
98
|
+
temporary_redirect: 307,
|
99
|
+
bad_request: 400,
|
100
|
+
unauthorized: 401,
|
101
|
+
payment_required: 402,
|
102
|
+
forbidden: 403,
|
103
|
+
not_found: 404,
|
104
|
+
method_not_allowed: 405,
|
105
|
+
not_acceptable: 406,
|
106
|
+
proxy_authentication_required: 407,
|
107
|
+
request_timeout: 408,
|
108
|
+
conflict: 409,
|
109
|
+
gone: 410,
|
110
|
+
length_required: 411,
|
111
|
+
precondition_failed: 412,
|
112
|
+
request_entity_too_large: 413,
|
113
|
+
request_uri_too_long: 414,
|
114
|
+
unsupported_media_type: 415,
|
115
|
+
requested_range_not_satisfiable: 416,
|
116
|
+
expectation_failed: 417,
|
117
|
+
unprocessable_entity: 422,
|
118
|
+
locked: 423,
|
119
|
+
failed_dependency: 424,
|
120
|
+
upgrade_required: 426,
|
121
|
+
internal_server_error: 500,
|
122
|
+
not_implemented: 501,
|
123
|
+
bad_gateway: 502,
|
124
|
+
service_unavailable: 503,
|
125
|
+
gateway_timeout: 504,
|
126
|
+
http_version_not_supported: 505,
|
127
|
+
variant_also_negotiates: 506,
|
128
|
+
insufficient_storage: 507,
|
129
|
+
not_extended: 510
|
118
130
|
}
|
119
|
-
|
120
|
-
|
131
|
+
|
121
132
|
# @private
|
122
133
|
def validate_each(record, attribute, value)
|
123
134
|
return if value.blank?
|
124
135
|
|
125
136
|
begin
|
126
137
|
uri = Addressable::URI.parse(value)
|
127
|
-
|
138
|
+
|
139
|
+
if uri.scheme.nil? and options[:default_scheme]
|
128
140
|
uri = Addressable::URI.parse("#{options[:default_scheme]}://#{value}")
|
129
141
|
end
|
130
142
|
rescue Addressable::URI::InvalidURIError
|
131
|
-
record.errors.add(attribute, options[:invalid_url_message]
|
143
|
+
record.errors.add(attribute, options[:invalid_url_message] || :invalid_url) if uri.nil? || !url_format_valid?(uri, options)
|
132
144
|
return
|
133
145
|
end
|
134
|
-
|
135
|
-
record.errors.add(attribute, options[:invalid_url_message]
|
136
|
-
record.errors.add(attribute, options[:url_not_accessible_message]
|
146
|
+
|
147
|
+
record.errors.add(attribute, options[:invalid_url_message] || :invalid_url) unless url_format_valid?(uri, options)
|
148
|
+
record.errors.add(attribute, options[:url_not_accessible_message] || :url_not_accessible) unless response = url_accessible?(uri, options)
|
137
149
|
record.errors.add(attribute, options[:url_invalid_response_message] || :url_invalid_response) unless url_response_valid?(response, options)
|
138
150
|
end
|
139
|
-
|
151
|
+
|
140
152
|
private
|
141
|
-
|
153
|
+
|
142
154
|
def url_format_valid?(uri, options)
|
143
|
-
return false unless Array.wrap(options[:scheme] || %w(
|
144
|
-
|
155
|
+
return false unless Array.wrap(options[:scheme] || %w(http https)).include?(uri.scheme)
|
156
|
+
|
145
157
|
case uri.scheme
|
146
158
|
when 'http', 'https'
|
147
159
|
return http_url_format_valid?(uri)
|
@@ -149,20 +161,20 @@ class UrlValidator < ActiveModel::EachValidator
|
|
149
161
|
return true
|
150
162
|
end
|
151
163
|
end
|
152
|
-
|
164
|
+
|
153
165
|
def http_url_format_valid?(uri)
|
154
166
|
uri.host.present? and not uri.path.nil?
|
155
167
|
end
|
156
|
-
|
168
|
+
|
157
169
|
def url_accessible?(uri, options)
|
158
170
|
return true unless options[:check_host] or options[:check_path]
|
159
|
-
|
171
|
+
|
160
172
|
check_host = options[:check_host]
|
161
|
-
check_host ||= %w(
|
162
|
-
if (schemes = Array.wrap(check_host)) and schemes.all? { |scheme| scheme.kind_of?(String) }
|
173
|
+
check_host ||= %w(http https) if options[:check_path]
|
174
|
+
if (schemes = Array.wrap(check_host)) and schemes.all? { |scheme| scheme.kind_of?(String) }
|
163
175
|
return true unless schemes.include?(uri.scheme)
|
164
176
|
end
|
165
|
-
|
177
|
+
|
166
178
|
case uri.scheme
|
167
179
|
when 'http', 'https'
|
168
180
|
return http_url_accessible?(uri, options)
|
@@ -178,7 +190,7 @@ class UrlValidator < ActiveModel::EachValidator
|
|
178
190
|
rescue
|
179
191
|
return false
|
180
192
|
end
|
181
|
-
|
193
|
+
|
182
194
|
def url_response_valid?(response, options)
|
183
195
|
return true unless response.kind_of?(HTTPI::Response) and options[:check_path]
|
184
196
|
response_codes = options[:check_path] == true ? [400..499, 500..599] : Array.wrap(options[:check_path]).flatten
|
@@ -186,7 +198,7 @@ class UrlValidator < ActiveModel::EachValidator
|
|
186
198
|
case code # and it's a bad response if...
|
187
199
|
when Range
|
188
200
|
code.include? response.code
|
189
|
-
when
|
201
|
+
when Integer
|
190
202
|
code == response.code
|
191
203
|
when Symbol
|
192
204
|
CODES.include?(code) && CODES[code] == response.code
|
data/spec/url_validator_spec.rb
CHANGED
@@ -11,219 +11,223 @@ describe UrlValidator do
|
|
11
11
|
@record = Record.new
|
12
12
|
end
|
13
13
|
|
14
|
-
context
|
14
|
+
context '[basic]' do
|
15
15
|
it "should allow nil if :allow_nil is set" do
|
16
|
-
@validator = UrlValidator.new(:
|
16
|
+
@validator = UrlValidator.new(attributes: %i(field), allow_nil: true)
|
17
17
|
@validator.validate_each(@record, :field, nil)
|
18
18
|
expect(@record.errors).to be_empty
|
19
19
|
end
|
20
20
|
|
21
21
|
it "should allow \"\" if :allow_blank is set" do
|
22
|
-
@validator = UrlValidator.new(:
|
22
|
+
@validator = UrlValidator.new(attributes: %i(field), allow_blank: true)
|
23
23
|
@validator.validate_each(@record, :field, "")
|
24
24
|
expect(@record.errors).to be_empty
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
28
|
-
context
|
27
|
+
|
28
|
+
context '[format]' do
|
29
29
|
it "should only allow HTTP URLs if :scheme is set to 'http'" do
|
30
|
-
@validator = UrlValidator.new(:
|
31
|
-
@validator.validate_each(@record, :field,
|
30
|
+
@validator = UrlValidator.new(attributes: %i(field), scheme: 'http')
|
31
|
+
@validator.validate_each(@record, :field, 'http://www.apple.com')
|
32
32
|
expect(@record.errors).to be_empty
|
33
33
|
|
34
|
-
@validator.validate_each(@record, :field,
|
34
|
+
@validator.validate_each(@record, :field, 'https://www.apple.com')
|
35
35
|
expect(@record.errors[:field].first).to include('invalid_url')
|
36
36
|
end
|
37
37
|
|
38
|
-
it "should only allow HTTP and HTTPS URLs if :scheme is set to %w(
|
39
|
-
@validator = UrlValidator.new(:
|
40
|
-
@validator.validate_each(@record, :field,
|
38
|
+
it "should only allow HTTP and HTTPS URLs if :scheme is set to %w(http https)" do
|
39
|
+
@validator = UrlValidator.new(attributes: %i(field), scheme: %w(http https))
|
40
|
+
@validator.validate_each(@record, :field, 'http://www.apple.com')
|
41
41
|
expect(@record.errors).to be_empty
|
42
|
-
@validator.validate_each(@record, :field,
|
42
|
+
@validator.validate_each(@record, :field, 'https://www.apple.com')
|
43
43
|
expect(@record.errors).to be_empty
|
44
44
|
|
45
|
-
@validator.validate_each(@record, :field,
|
45
|
+
@validator.validate_each(@record, :field, 'ftp://www.apple.com')
|
46
46
|
expect(@record.errors[:field].first).to include('invalid_url')
|
47
47
|
end
|
48
48
|
|
49
49
|
it "should try a default scheme if :default_scheme is set" do
|
50
|
-
@validator = UrlValidator.new(:
|
51
|
-
@validator.validate_each(@record, :field,
|
50
|
+
@validator = UrlValidator.new(attributes: %i(field), scheme: 'http', default_scheme: 'http')
|
51
|
+
@validator.validate_each(@record, :field, 'www.apple.com')
|
52
52
|
expect(@record.errors).to be_empty
|
53
53
|
end
|
54
|
-
|
55
|
-
context
|
54
|
+
|
55
|
+
context '[HTTP(S)]' do
|
56
56
|
it "should not allow garbage URLs that still somehow pass the ridiculously open-ended RFC" do
|
57
|
-
@validator = UrlValidator.new(:
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
'http://dsaf.com://sdg.com'
|
66
|
-
].each do |uri|
|
57
|
+
@validator = UrlValidator.new(attributes: %i(field))
|
58
|
+
|
59
|
+
%w(
|
60
|
+
http:sdg.sdfg/
|
61
|
+
http/sdg.d
|
62
|
+
http:://dsfg.dsfg/
|
63
|
+
http//sdg..g
|
64
|
+
http://://sdfg.f).each do |uri|
|
67
65
|
@record.errors.clear
|
68
|
-
@validator.validate_each(@record, :field,
|
66
|
+
@validator.validate_each(@record, :field, uri)
|
69
67
|
expect(@record.errors[:field].first).to include('invalid_url')
|
70
68
|
end
|
71
69
|
end
|
70
|
+
|
71
|
+
it "should not allow invalid scheme formats" do
|
72
|
+
@validator = UrlValidator.new(attributes: %i(field))
|
73
|
+
@validator.validate_each(@record, :field, ' https://www.apple.com')
|
74
|
+
expect(@record.errors[:field].first).to include('invalid_url')
|
75
|
+
end
|
72
76
|
end
|
73
77
|
end
|
74
|
-
|
75
|
-
context
|
76
|
-
context
|
78
|
+
|
79
|
+
context '[accessibility]' do
|
80
|
+
context '[:check_host]' do
|
77
81
|
it "should only validate if the host is accessible when :check_host is set" do
|
78
|
-
@validator = UrlValidator.new(:
|
79
|
-
@validator.validate_each(@record, :field,
|
82
|
+
@validator = UrlValidator.new(attributes: %i(field))
|
83
|
+
@validator.validate_each(@record, :field, 'http://www.invalid.tld')
|
80
84
|
expect(@record.errors).to be_empty
|
81
85
|
|
82
|
-
@validator = UrlValidator.new(:
|
83
|
-
@validator.validate_each(@record, :field,
|
86
|
+
@validator = UrlValidator.new(attributes: %i(field), check_host: true)
|
87
|
+
@validator.validate_each(@record, :field, 'http://www.invalid.tld')
|
84
88
|
expect(@record.errors[:field].first).to include('url_not_accessible')
|
85
89
|
end
|
86
90
|
|
87
91
|
it "should not perform the accessibility check if :check_host is set to 'http' and the URL scheme is not HTTP" do
|
88
|
-
@validator = UrlValidator.new(:
|
89
|
-
@validator.validate_each(@record, :field,
|
92
|
+
@validator = UrlValidator.new(attributes: %i(field), check_host: 'http')
|
93
|
+
@validator.validate_each(@record, :field, 'https://www.invalid.tld')
|
90
94
|
expect(@record.errors).to be_empty
|
91
95
|
end
|
92
96
|
|
93
97
|
it "should only validate if the host is accessible when :check_host is set to 'http' and the URL scheme is HTTP" do
|
94
|
-
@validator = UrlValidator.new(:
|
95
|
-
@validator.validate_each(@record, :field,
|
98
|
+
@validator = UrlValidator.new(attributes: %i(field), check_host: 'http')
|
99
|
+
@validator.validate_each(@record, :field, 'http://www.invalid.tld')
|
96
100
|
expect(@record.errors[:field].first).to include('url_not_accessible')
|
97
101
|
end
|
98
102
|
|
99
|
-
it "should not perform the accessibility check if :check_host is set to %w(
|
100
|
-
@validator = UrlValidator.new(:
|
101
|
-
@validator.validate_each(@record, :field,
|
103
|
+
it "should not perform the accessibility check if :check_host is set to %w(http https) and the URL scheme is not HTTP(S)" do
|
104
|
+
@validator = UrlValidator.new(attributes: %i(field), check_host: %w(http https), scheme: %w(ftp http https))
|
105
|
+
@validator.validate_each(@record, :field, 'ftp://www.invalid.tld')
|
102
106
|
expect(@record.errors).to be_empty
|
103
107
|
end
|
104
|
-
|
105
|
-
it "should only validate if the host is accessible when :check_host is set to %w(
|
106
|
-
@validator = UrlValidator.new(:
|
107
|
-
@validator.validate_each(@record, :field,
|
108
|
+
|
109
|
+
it "should only validate if the host is accessible when :check_host is set to %w(http https) and the URL scheme is HTTP(S)" do
|
110
|
+
@validator = UrlValidator.new(attributes: %i(field), check_host: %w(http https))
|
111
|
+
@validator.validate_each(@record, :field, 'http://www.invalid.tld')
|
108
112
|
expect(@record.errors[:field].first).to include('url_not_accessible')
|
109
113
|
|
110
|
-
@validator = UrlValidator.new(:
|
111
|
-
@validator.validate_each(@record, :field,
|
114
|
+
@validator = UrlValidator.new(attributes: %i(field), check_host: %w(http https))
|
115
|
+
@validator.validate_each(@record, :field, 'https://www.invalid.tld')
|
112
116
|
expect(@record.errors[:field].first).to include('url_not_accessible')
|
113
117
|
end
|
114
118
|
|
115
119
|
it "should only validate the host" do
|
116
|
-
@validator = UrlValidator.new(:
|
117
|
-
@validator.validate_each(@record, :field,
|
120
|
+
@validator = UrlValidator.new(attributes: %i(field), check_host: true)
|
121
|
+
@validator.validate_each(@record, :field, 'http://www.google.com/sdgsdgf')
|
118
122
|
expect(@record.errors).to be_empty
|
119
123
|
end
|
120
124
|
end
|
121
|
-
|
122
|
-
context
|
123
|
-
it "should not validate if the response code is equal to the
|
124
|
-
@validator = UrlValidator.new(:
|
125
|
-
@validator.validate_each(@record, :field,
|
125
|
+
|
126
|
+
context '[:check_path]' do
|
127
|
+
it "should not validate if the response code is equal to the Integer value of this option" do
|
128
|
+
@validator = UrlValidator.new(attributes: %i(field), check_path: 404)
|
129
|
+
@validator.validate_each(@record, :field, 'http://www.google.com/sdgsdgf')
|
126
130
|
expect(@record.errors[:field].first).to include('url_invalid_response')
|
127
|
-
|
131
|
+
|
128
132
|
@record.errors.clear
|
129
|
-
|
130
|
-
@validator = UrlValidator.new(:
|
131
|
-
@validator.validate_each(@record, :field,
|
133
|
+
|
134
|
+
@validator = UrlValidator.new(attributes: %i(field), check_path: 405)
|
135
|
+
@validator.validate_each(@record, :field, 'http://www.google.com/sdgsdgf')
|
132
136
|
expect(@record.errors[:field]).to be_empty
|
133
137
|
end
|
134
|
-
|
138
|
+
|
135
139
|
it "should not validate if the response code is equal to the Symbol value of this option" do
|
136
|
-
@validator = UrlValidator.new(:
|
137
|
-
@validator.validate_each(@record, :field,
|
140
|
+
@validator = UrlValidator.new(attributes: %i(field), check_path: :not_found)
|
141
|
+
@validator.validate_each(@record, :field, 'http://www.google.com/sdgsdgf')
|
138
142
|
expect(@record.errors[:field].first).to include('url_invalid_response')
|
139
|
-
|
143
|
+
|
140
144
|
@record.errors.clear
|
141
|
-
|
142
|
-
@validator = UrlValidator.new(:
|
143
|
-
@validator.validate_each(@record, :field,
|
145
|
+
|
146
|
+
@validator = UrlValidator.new(attributes: %i(field), check_path: :unauthorized)
|
147
|
+
@validator.validate_each(@record, :field, 'http://www.google.com/sdgsdgf')
|
144
148
|
expect(@record.errors[:field]).to be_empty
|
145
149
|
end
|
146
|
-
|
150
|
+
|
147
151
|
it "should not validate if the response code is within the Range value of this option" do
|
148
|
-
@validator = UrlValidator.new(:
|
149
|
-
@validator.validate_each(@record, :field,
|
152
|
+
@validator = UrlValidator.new(attributes: %i(field), check_path: 400..499)
|
153
|
+
@validator.validate_each(@record, :field, 'http://www.google.com/sdgsdgf')
|
150
154
|
expect(@record.errors[:field].first).to include('url_invalid_response')
|
151
|
-
|
155
|
+
|
152
156
|
@record.errors.clear
|
153
|
-
|
154
|
-
@validator = UrlValidator.new(:
|
155
|
-
@validator.validate_each(@record, :field,
|
157
|
+
|
158
|
+
@validator = UrlValidator.new(attributes: %i(field), check_path: 500..599)
|
159
|
+
@validator.validate_each(@record, :field, 'http://www.google.com/sdgsdgf')
|
156
160
|
expect(@record.errors[:field]).to be_empty
|
157
161
|
end
|
158
|
-
|
159
|
-
it "should not validate if the response code is equal to the
|
160
|
-
@validator = UrlValidator.new(:
|
161
|
-
@validator.validate_each(@record, :field,
|
162
|
+
|
163
|
+
it "should not validate if the response code is equal to the Integer value contained in the Array value of this option" do
|
164
|
+
@validator = UrlValidator.new(attributes: %i(field), check_path: [404, 405])
|
165
|
+
@validator.validate_each(@record, :field, 'http://www.google.com/sdgsdgf')
|
162
166
|
expect(@record.errors[:field].first).to include('url_invalid_response')
|
163
|
-
|
167
|
+
|
164
168
|
@record.errors.clear
|
165
|
-
|
166
|
-
@validator = UrlValidator.new(:
|
167
|
-
@validator.validate_each(@record, :field,
|
169
|
+
|
170
|
+
@validator = UrlValidator.new(attributes: %i(field), check_path: [405, 406])
|
171
|
+
@validator.validate_each(@record, :field, 'http://www.google.com/sdgsdgf')
|
168
172
|
expect(@record.errors[:field]).to be_empty
|
169
173
|
end
|
170
|
-
|
174
|
+
|
171
175
|
it "should not validate if the response code is equal to the Symbol value contained in the Array value of this option" do
|
172
|
-
@validator = UrlValidator.new(:
|
173
|
-
@validator.validate_each(@record, :field,
|
176
|
+
@validator = UrlValidator.new(attributes: %i(field), check_path: %i(not_found unauthorized))
|
177
|
+
@validator.validate_each(@record, :field, 'http://www.google.com/sdgsdgf')
|
174
178
|
expect(@record.errors[:field].first).to include('url_invalid_response')
|
175
|
-
|
179
|
+
|
176
180
|
@record.errors.clear
|
177
|
-
|
178
|
-
@validator = UrlValidator.new(:
|
179
|
-
@validator.validate_each(@record, :field,
|
181
|
+
|
182
|
+
@validator = UrlValidator.new(attributes: %i(field), check_path: %i(unauthorized moved_permanently))
|
183
|
+
@validator.validate_each(@record, :field, 'http://www.google.com/sdgsdgf')
|
180
184
|
expect(@record.errors[:field]).to be_empty
|
181
185
|
end
|
182
|
-
|
186
|
+
|
183
187
|
it "should not validate if the response code is equal to the Range value contained in the Array value of this option" do
|
184
|
-
@validator = UrlValidator.new(:
|
185
|
-
@validator.validate_each(@record, :field,
|
188
|
+
@validator = UrlValidator.new(attributes: %i(field), check_path: [400..499, 500..599])
|
189
|
+
@validator.validate_each(@record, :field, 'http://www.google.com/sdgsdgf')
|
186
190
|
expect(@record.errors[:field].first).to include('url_invalid_response')
|
187
|
-
|
191
|
+
|
188
192
|
@record.errors.clear
|
189
|
-
|
190
|
-
@validator = UrlValidator.new(:
|
191
|
-
@validator.validate_each(@record, :field,
|
193
|
+
|
194
|
+
@validator = UrlValidator.new(attributes: %i(field), check_path: [500..599, 300..399])
|
195
|
+
@validator.validate_each(@record, :field, 'http://www.google.com/sdgsdgf')
|
192
196
|
expect(@record.errors[:field]).to be_empty
|
193
197
|
end
|
194
|
-
|
198
|
+
|
195
199
|
it "should skip validation by default" do
|
196
|
-
@validator = UrlValidator.new(:
|
197
|
-
@validator.validate_each(@record, :field,
|
200
|
+
@validator = UrlValidator.new(attributes: %i(field), check_path: nil)
|
201
|
+
@validator.validate_each(@record, :field, 'http://www.google.com/sdgsdgf')
|
198
202
|
expect(@record.errors[:field]).to be_empty
|
199
203
|
end
|
200
|
-
|
204
|
+
|
201
205
|
it "should not validate 4xx and 5xx response codes if the value is true" do
|
202
|
-
@validator = UrlValidator.new(:
|
203
|
-
@validator.validate_each(@record, :field,
|
206
|
+
@validator = UrlValidator.new(attributes: %i(field), check_path: true)
|
207
|
+
@validator.validate_each(@record, :field, 'http://www.google.com/sdgsdgf')
|
204
208
|
expect(@record.errors[:field].first).to include('url_invalid_response')
|
205
209
|
end
|
206
|
-
|
210
|
+
|
207
211
|
it "should skip validation for non-HTTP URLs" do
|
208
|
-
@validator = UrlValidator.new(:
|
209
|
-
@validator.validate_each(@record, :field,
|
212
|
+
@validator = UrlValidator.new(attributes: %i(field), check_path: true, scheme: %w(ftp http https))
|
213
|
+
@validator.validate_each(@record, :field, 'ftp://ftp.sdgasdgohaodgh.com/sdgjsdg')
|
210
214
|
expect(@record.errors[:field]).to be_empty
|
211
215
|
end
|
212
216
|
end
|
213
|
-
|
214
|
-
context
|
217
|
+
|
218
|
+
context '[:httpi_adapter]' do
|
215
219
|
it "should use the specified HTTPI adapter" do
|
216
|
-
@validator = UrlValidator.new(:
|
220
|
+
@validator = UrlValidator.new(attributes: %i(field), httpi_adapter: :curl, check_host: true)
|
217
221
|
expect(HTTPI).to receive(:get).once.with(an_instance_of(HTTPI::Request), :curl).and_return(false)
|
218
|
-
@validator.validate_each(@record, :field,
|
222
|
+
@validator.validate_each(@record, :field, 'http://www.google.com/sdgsdgf')
|
219
223
|
end
|
220
224
|
end
|
221
|
-
|
222
|
-
context
|
225
|
+
|
226
|
+
context '[:request_callback]' do
|
223
227
|
it "should be yielded the HTTPI request" do
|
224
|
-
called
|
225
|
-
@validator = UrlValidator.new(:
|
226
|
-
@validator.validate_each(@record, :field,
|
228
|
+
called = false
|
229
|
+
@validator = UrlValidator.new(attributes: %i(field), check_host: true, request_callback: ->(request) { called = true; expect(request).to be_kind_of(HTTPI::Request) })
|
230
|
+
@validator.validate_each(@record, :field, 'http://www.google.com/sdgsdgf')
|
227
231
|
expect(called).to eql(true)
|
228
232
|
end
|
229
233
|
end
|
data/url_validation.gemspec
CHANGED
@@ -1,22 +1,22 @@
|
|
1
|
-
# Generated by
|
1
|
+
# Generated by juwelier
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit
|
3
|
+
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: url_validation 1.
|
5
|
+
# stub: url_validation 1.2.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
|
-
s.name = "url_validation"
|
9
|
-
s.version = "1.
|
8
|
+
s.name = "url_validation".freeze
|
9
|
+
s.version = "1.2.0"
|
10
10
|
|
11
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
-
s.require_paths = ["lib"]
|
13
|
-
s.authors = ["Tim Morgan"]
|
14
|
-
s.date = "
|
15
|
-
s.description = "A simple, localizable EachValidator for URL fields in ActiveRecord 3.0."
|
16
|
-
s.email = "git@timothymorgan.info"
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib".freeze]
|
13
|
+
s.authors = ["Tim Morgan".freeze]
|
14
|
+
s.date = "2017-05-31"
|
15
|
+
s.description = "A simple, localizable EachValidator for URL fields in ActiveRecord 3.0.".freeze
|
16
|
+
s.email = "git@timothymorgan.info".freeze
|
17
17
|
s.extra_rdoc_files = [
|
18
18
|
"LICENSE",
|
19
|
-
"README.
|
19
|
+
"README.md"
|
20
20
|
]
|
21
21
|
s.files = [
|
22
22
|
".document",
|
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
"Gemfile",
|
27
27
|
"Gemfile.lock",
|
28
28
|
"LICENSE",
|
29
|
-
"README.
|
29
|
+
"README.md",
|
30
30
|
"Rakefile",
|
31
31
|
"VERSION",
|
32
32
|
"lib/url_validation.rb",
|
@@ -34,42 +34,42 @@ Gem::Specification.new do |s|
|
|
34
34
|
"spec/url_validator_spec.rb",
|
35
35
|
"url_validation.gemspec"
|
36
36
|
]
|
37
|
-
s.homepage = "http://github.com/riscfuture/url_validation"
|
38
|
-
s.required_ruby_version = Gem::Requirement.new(">=
|
39
|
-
s.rubygems_version = "2.
|
40
|
-
s.summary = "Simple URL validation in Rails 3"
|
37
|
+
s.homepage = "http://github.com/riscfuture/url_validation".freeze
|
38
|
+
s.required_ruby_version = Gem::Requirement.new(">= 2.0.0".freeze)
|
39
|
+
s.rubygems_version = "2.6.12".freeze
|
40
|
+
s.summary = "Simple URL validation in Rails 3+".freeze
|
41
41
|
|
42
42
|
if s.respond_to? :specification_version then
|
43
43
|
s.specification_version = 4
|
44
44
|
|
45
45
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
46
|
-
s.add_runtime_dependency(%q<addressable
|
47
|
-
s.add_runtime_dependency(%q<activesupport
|
48
|
-
s.add_runtime_dependency(%q<activerecord
|
49
|
-
s.add_runtime_dependency(%q<httpi
|
50
|
-
s.add_development_dependency(%q<
|
51
|
-
s.add_development_dependency(%q<yard
|
52
|
-
s.add_development_dependency(%q<
|
53
|
-
s.add_development_dependency(%q<rspec
|
46
|
+
s.add_runtime_dependency(%q<addressable>.freeze, [">= 0"])
|
47
|
+
s.add_runtime_dependency(%q<activesupport>.freeze, [">= 0"])
|
48
|
+
s.add_runtime_dependency(%q<activerecord>.freeze, [">= 0"])
|
49
|
+
s.add_runtime_dependency(%q<httpi>.freeze, [">= 0"])
|
50
|
+
s.add_development_dependency(%q<juwelier>.freeze, [">= 0"])
|
51
|
+
s.add_development_dependency(%q<yard>.freeze, [">= 0"])
|
52
|
+
s.add_development_dependency(%q<redcarpet>.freeze, [">= 0"])
|
53
|
+
s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
|
54
54
|
else
|
55
|
-
s.add_dependency(%q<addressable
|
56
|
-
s.add_dependency(%q<activesupport
|
57
|
-
s.add_dependency(%q<activerecord
|
58
|
-
s.add_dependency(%q<httpi
|
59
|
-
s.add_dependency(%q<
|
60
|
-
s.add_dependency(%q<yard
|
61
|
-
s.add_dependency(%q<
|
62
|
-
s.add_dependency(%q<rspec
|
55
|
+
s.add_dependency(%q<addressable>.freeze, [">= 0"])
|
56
|
+
s.add_dependency(%q<activesupport>.freeze, [">= 0"])
|
57
|
+
s.add_dependency(%q<activerecord>.freeze, [">= 0"])
|
58
|
+
s.add_dependency(%q<httpi>.freeze, [">= 0"])
|
59
|
+
s.add_dependency(%q<juwelier>.freeze, [">= 0"])
|
60
|
+
s.add_dependency(%q<yard>.freeze, [">= 0"])
|
61
|
+
s.add_dependency(%q<redcarpet>.freeze, [">= 0"])
|
62
|
+
s.add_dependency(%q<rspec>.freeze, [">= 0"])
|
63
63
|
end
|
64
64
|
else
|
65
|
-
s.add_dependency(%q<addressable
|
66
|
-
s.add_dependency(%q<activesupport
|
67
|
-
s.add_dependency(%q<activerecord
|
68
|
-
s.add_dependency(%q<httpi
|
69
|
-
s.add_dependency(%q<
|
70
|
-
s.add_dependency(%q<yard
|
71
|
-
s.add_dependency(%q<
|
72
|
-
s.add_dependency(%q<rspec
|
65
|
+
s.add_dependency(%q<addressable>.freeze, [">= 0"])
|
66
|
+
s.add_dependency(%q<activesupport>.freeze, [">= 0"])
|
67
|
+
s.add_dependency(%q<activerecord>.freeze, [">= 0"])
|
68
|
+
s.add_dependency(%q<httpi>.freeze, [">= 0"])
|
69
|
+
s.add_dependency(%q<juwelier>.freeze, [">= 0"])
|
70
|
+
s.add_dependency(%q<yard>.freeze, [">= 0"])
|
71
|
+
s.add_dependency(%q<redcarpet>.freeze, [">= 0"])
|
72
|
+
s.add_dependency(%q<rspec>.freeze, [">= 0"])
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: url_validation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Morgan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|
@@ -67,7 +67,7 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: juwelier
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
@@ -95,7 +95,7 @@ dependencies:
|
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: redcarpet
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - ">="
|
@@ -128,7 +128,7 @@ executables: []
|
|
128
128
|
extensions: []
|
129
129
|
extra_rdoc_files:
|
130
130
|
- LICENSE
|
131
|
-
- README.
|
131
|
+
- README.md
|
132
132
|
files:
|
133
133
|
- ".document"
|
134
134
|
- ".rspec"
|
@@ -137,7 +137,7 @@ files:
|
|
137
137
|
- Gemfile
|
138
138
|
- Gemfile.lock
|
139
139
|
- LICENSE
|
140
|
-
- README.
|
140
|
+
- README.md
|
141
141
|
- Rakefile
|
142
142
|
- VERSION
|
143
143
|
- lib/url_validation.rb
|
@@ -155,7 +155,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
155
155
|
requirements:
|
156
156
|
- - ">="
|
157
157
|
- !ruby/object:Gem::Version
|
158
|
-
version:
|
158
|
+
version: 2.0.0
|
159
159
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
160
160
|
requirements:
|
161
161
|
- - ">="
|
@@ -163,8 +163,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
163
163
|
version: '0'
|
164
164
|
requirements: []
|
165
165
|
rubyforge_project:
|
166
|
-
rubygems_version: 2.
|
166
|
+
rubygems_version: 2.6.12
|
167
167
|
signing_key:
|
168
168
|
specification_version: 4
|
169
|
-
summary: Simple URL validation in Rails 3
|
169
|
+
summary: Simple URL validation in Rails 3+
|
170
170
|
test_files: []
|
data/README.textile
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
h1. url_validation -- Simple URL validator for Rails 3
|
2
|
-
|
3
|
-
| *Author* | Tim Morgan |
|
4
|
-
| *Version* | 1.0 (May 9, 2011) |
|
5
|
-
| *License* | Released under the MIT license. |
|
6
|
-
|
7
|
-
h2. About
|
8
|
-
|
9
|
-
This gem adds a very simple URL format validator to be used with ActiveRecord
|
10
|
-
models in Rails 3.0. It supports localized error messages. It can validate many
|
11
|
-
different kinds of URLs, including HTTP and HTTPS. It supports advanced
|
12
|
-
validation features like sending @HEAD@ requests to URLS to verify that they are
|
13
|
-
valid endpoints.
|
14
|
-
|
15
|
-
h2. Installation
|
16
|
-
|
17
|
-
Add the gem to your project's @Gemfile@:
|
18
|
-
|
19
|
-
<pre><code>
|
20
|
-
gem 'url_validation'
|
21
|
-
</code></pre>
|
22
|
-
|
23
|
-
h2. Usage
|
24
|
-
|
25
|
-
This gem is an @EachValidator@, and thus is used with the @validates@ method:
|
26
|
-
|
27
|
-
<pre><code>
|
28
|
-
class User < ActiveRecord::Base
|
29
|
-
validates :terms_of_service_link,
|
30
|
-
:presence => true,
|
31
|
-
:url => true
|
32
|
-
end
|
33
|
-
</code></pre>
|
34
|
-
|
35
|
-
There are other options to fine-tune your validation; see the {UrlValidator}
|
36
|
-
class for more, and for a list of error message localization keys.
|