aryll 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7149f50c4b8078d740e2afd666aadf0f46bf23f2
4
+ data.tar.gz: 550cf05fba224bea0787e8d5b888bc8cfbab4863
5
+ SHA512:
6
+ metadata.gz: e5227678705900c94e75e91291f27900745173d174eae5b2a3d5c11785df0e199198cc9edf983b1f7b94e15c1dbecc3e99f4337dfbd9f5060cd3d7ef62d739e5
7
+ data.tar.gz: a18baced3db9580c7f2f224ea89d9e6b0667d6b040001db0e75960edd7e5a0687e897fc236d7a791ecb4fc2bca24f16768d0ccb11f719c016bf002e4130ae53d
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ Gemfile.lock
2
+ rdoc/
3
+ .rvmrc
4
+ coverage/
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ aryll
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.3.0
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ sudo: false
3
+ rvm:
4
+ - '2.2.2'
5
+ - '2.3.0'
6
+ script: 'bundle exec rake test'
7
+
8
+ notifications:
9
+ email:
10
+ - cz@aegisnet.de
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'simplecov', require: false
data/LICENSE ADDED
@@ -0,0 +1,25 @@
1
+ Copyright (c) 2011, kaupert media gmbh
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+ * Redistributions of source code must retain the above copyright
7
+ notice, this list of conditions and the following disclaimer.
8
+ * Redistributions in binary form must reproduce the above copyright
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
+ * Neither the name of the original author / copyright holder nor the
12
+ names of its contributors may be used to endorse or promote products
13
+ derived from this software without specific prior written permission.
14
+
15
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
19
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
+
data/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # Aryll [![Build Status](https://travis-ci.org/kaupertmedia/kauperts_link_checker.svg?branch=master)](https://travis-ci.org/kaupertmedia/kauperts_link_checker)
2
+
3
+ **Aryll** is a simple library to check for the well-being of URLs. It supports HTTPS and IDN URIs.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+ ```
9
+ gem 'aryll'
10
+ ```
11
+
12
+ And then execute:
13
+ ```
14
+ $ bundle
15
+ ```
16
+
17
+ Or install it yourself as:
18
+ ```
19
+ $ gem install aryll
20
+ ```
21
+
22
+ ## Usage
23
+ It will check any object that responds to `url`:
24
+ ```ruby
25
+ status = Aryll.check!(my_url)
26
+ unless status.ok?
27
+ puts status
28
+ end
29
+ ```
30
+
31
+ You can ignore 301 permanent redirect that only add a trailing slash like this:
32
+ ```ruby
33
+ status = Aryll::LinkChecker.check!(url, ignore_trailing_slash_redirects: true)
34
+ unless status.ok?
35
+ # A redirect from http://example.com/foo to http://example.com/foo/ will be considered ok
36
+ end
37
+ ```
38
+
39
+ ## I18n
40
+ The following keys are used to translate error messages using the I18n gem:
41
+
42
+ * `kauperts.link_checker.errors.timeout`: message when rescueing from Timeout::Error
43
+ * `kauperts.link_checker.errors.generic_network`: message when (currently) rescueing from all other exceptions
44
+
45
+ ## Credits
46
+ **Aryll** is extracted from a maintenance task made for
47
+ [berlin.kauperts.de](https://berlin.kauperts.de) by [kaupert media gmbh](http://kaupertmedia.de).
48
+
49
+ ## License
50
+ **Aryll** is released under a 3-clause BSD-licence. See the LICENSE file for details.
51
+
data/Rakefile ADDED
@@ -0,0 +1,23 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ Bundler::GemHelper.install_tasks
4
+ require 'rake/testtask'
5
+ require 'rdoc/task'
6
+
7
+ desc "Default: run unit tests."
8
+ task :default => :test
9
+
10
+ Rake::TestTask.new(:test) do |t|
11
+ t.libs << 'lib'
12
+ t.libs << 'test'
13
+ t.pattern = 'test/**/*_test.rb'
14
+ t.verbose = true
15
+ end
16
+
17
+ Rake::RDocTask.new(:rdoc) do |rdoc|
18
+ rdoc.rdoc_dir = 'rdoc'
19
+ rdoc.title = 'Aryll'
20
+ rdoc.options << '--line-numbers' << '--inline-source'
21
+ rdoc.rdoc_files.include('README*')
22
+ rdoc.rdoc_files.include('lib/**/*.rb')
23
+ end
data/aryll.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'aryll/version'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "aryll"
8
+ s.version = Aryll::VERSION
9
+ s.platform = Gem::Platform::RUBY
10
+ s.authors = ["Wolfgang Vogl", "Carsten Zimmermann", "Matthias Viehweger"]
11
+ s.email = ["cz@aegisnet.de"]
12
+ s.homepage = ""
13
+ s.summary = "A simple library to check for the well-being of an URL"
14
+ s.description = "A simple library to check for the well-being of an URL"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.require_paths = ["lib"]
19
+ s.required_ruby_version = '>= 2.2'
20
+
21
+ s.add_dependency "i18n"
22
+ s.add_dependency "simpleidn"
23
+
24
+ s.add_development_dependency 'rake'
25
+ s.add_development_dependency 'rdoc'
26
+ s.add_development_dependency 'bundler'
27
+ s.add_development_dependency 'minitest', '>= 5.0'
28
+ s.add_development_dependency 'webmock'
29
+ end
30
+
@@ -0,0 +1,29 @@
1
+ module Aryll
2
+ class LinkChecker
3
+
4
+ class InternationalURI < Struct.new(:url)
5
+ def domain
6
+ @domain ||= url_without_protocol.split('/', 2)[0]
7
+ end
8
+
9
+ def idn_domain
10
+ @idn_domain ||= SimpleIDN.to_ascii domain
11
+ end
12
+
13
+ def to_uri
14
+ URI.parse(url.gsub(domain, idn_domain))
15
+ end
16
+
17
+ private
18
+
19
+ def url_without_protocol
20
+ @url_without_protocol ||= /^http[s]?:\/\/(.+)/.match(url)[1]
21
+ end
22
+ end
23
+
24
+ def InternationalURI(url)
25
+ InternationalURI.new(url).to_uri
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,89 @@
1
+ module Aryll
2
+ # Checks the status of a web address. The returned status can be accessed via
3
+ # +status+. It contains either a string representation of a numeric http
4
+ # status code or an error message.
5
+ #
6
+ # Supports HTTPS and IDN-domains.
7
+ #
8
+ #
9
+ # The following keys are used to translate error messages using the I18n gem:
10
+ # * <tt>kauperts.link_checker.errors.timeout</tt>: rescues from Timeout::Error
11
+ # * <tt>kauperts.link_checker.errors.generic_network</tt>: (currently) rescues from all other exceptions
12
+ # * <tt>kauperts.link_checker.status.redirect_permanently</tt>: translation for 301 permanent redirects
13
+ class LinkChecker
14
+
15
+ class << self
16
+ attr_accessor :ignore_trailing_slash_redirects, :ignore_302_redirects
17
+
18
+ def configure
19
+ yield self
20
+ end
21
+
22
+ end
23
+
24
+ attr_reader :url, :status, :ignore_trailing_slash_redirects, :ignore_302_redirects,
25
+ :open_timeout, :read_timeout, :user_agent
26
+
27
+ # === Parameters
28
+ # * +url+: URL, complete with protocol scheme
29
+ # * +options+: optional configuration parameters, see below.
30
+ #
31
+ # === Available Options
32
+ # * +ignore_trailing_slash_redirects+: ignores redirects to the same URI but only with an added trailing slash (default: false)
33
+ # * +ignore_302_redirects+: ignores temporary redirects (default: false)
34
+ # * +open_timeout+: Passed to Net::HTTP#open_timeout
35
+ # * +read_timeout+: Passed to Net::HTTP#read_timeout
36
+ def initialize(url, ignore_trailing_slash_redirects: false, ignore_302_redirects: false, open_timeout: 5, read_timeout: 10, user_agent: "Aryll Spider v#{Aryll::VERSION} (https://github.com/kaupertmedia/aryll)".freeze)
37
+ @url = url
38
+
39
+ @ignore_trailing_slash_redirects = ignore_trailing_slash_redirects || self.class.ignore_trailing_slash_redirects
40
+ @ignore_302_redirects = ignore_302_redirects || self.class.ignore_302_redirects
41
+ @open_timeout, @read_timeout = open_timeout, read_timeout
42
+ @user_agent = user_agent
43
+ end
44
+
45
+ # Checks the associated url. Sets and returns +status+
46
+ def check!
47
+ @status = begin
48
+ if response.code == '301'
49
+ @redirect_with_trailing_slash_only = "#{uri}/" == response['location']
50
+ StatusMessage.moved_permanently response['location']
51
+ else
52
+ response.code
53
+ end
54
+ rescue Timeout::Error => e
55
+ StatusMessage.timeout e.message
56
+ rescue Exception => e
57
+ StatusMessage.generic e.message
58
+ end
59
+ end
60
+
61
+ # Returns if a check has been run and the return code was '200 OK'
62
+ # or if a 301 permanent redirect only added a trailing slash
63
+ # while +ignore_trailing_slash_redirects+ has been set to true
64
+ def ok?
65
+ (status == '200') ||
66
+ (status == '302' && ignore_302_redirects) ||
67
+ [@redirect_with_trailing_slash_only, ignore_trailing_slash_redirects].all?
68
+ end
69
+
70
+ def uri
71
+ @uri ||= InternationalURI(url)
72
+ end
73
+
74
+ private
75
+
76
+ def response
77
+ @response ||= begin
78
+ https_opts = { use_ssl: uri.scheme == 'https', verify_mode: OpenSSL::SSL::VERIFY_NONE }
79
+ Net::HTTP.start(uri.host, uri.port, https_opts) do |http|
80
+ request = Net::HTTP::Get.new uri, 'User-Agent' => user_agent
81
+ http.open_timeout = open_timeout
82
+ http.read_timeout = read_timeout
83
+ http.request request
84
+ end
85
+ end
86
+ end
87
+
88
+ end
89
+ end
@@ -0,0 +1,36 @@
1
+ require 'i18n'
2
+
3
+ module Aryll
4
+ class LinkChecker
5
+
6
+ class StatusMessage
7
+
8
+ class << self
9
+
10
+ def moved_permanently(message)
11
+ t 'status.redirect_permanently', 'Moved permanently', message
12
+ end
13
+
14
+ def generic(message)
15
+ t 'errors.generic_network', 'Generic network error', message
16
+ end
17
+
18
+ def timeout(message)
19
+ t 'errors.timeout', 'Timeout', message
20
+ end
21
+
22
+ private
23
+
24
+ def t(key, default, message)
25
+ [
26
+ I18n.t("kauperts.link_checker.#{key}", default: default),
27
+ "(#{message})"
28
+ ].join ' '
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,3 @@
1
+ module Aryll
2
+ VERSION = '1.0.0.rc1'
3
+ end
data/lib/aryll.rb ADDED
@@ -0,0 +1,18 @@
1
+ require "net/https"
2
+ require "simpleidn"
3
+ require 'aryll/link_checker'
4
+ require 'aryll/international_uri'
5
+ require 'aryll/status_message'
6
+
7
+ module Aryll
8
+
9
+ # Immediately checks +url+ and returns the LinkChecker instance
10
+ def check!(url, **options)
11
+ checker = LinkChecker.new(url, **options)
12
+ checker.check!
13
+ checker
14
+ end
15
+
16
+ module_function :check!
17
+
18
+ end
@@ -0,0 +1,30 @@
1
+ require 'test_helper'
2
+
3
+ describe Aryll do
4
+
5
+ let(:url) do
6
+ 'http://www.example.com'
7
+ end
8
+
9
+ describe '.check!' do
10
+ it { described_class.method(:check!).arity.must_equal(-2) }
11
+
12
+ let(:request_stub) { stub_net_http! }
13
+
14
+ before { request_stub }
15
+
16
+ it 'returns a link checker instance' do
17
+ subject = described_class.check!(url)
18
+ subject.must_be_instance_of Aryll::LinkChecker
19
+ assert_requested request_stub
20
+ end
21
+ end
22
+
23
+ def described_class
24
+ Aryll
25
+ end
26
+
27
+ def stub_net_http!(return_code = "200", host: 'www.example.com', path: '/', protocol: 'http')
28
+ stub_request(:get, "#{protocol}://#{host}#{path}").to_return(status: return_code.to_i)
29
+ end
30
+ end
@@ -0,0 +1,209 @@
1
+ require 'test_helper'
2
+
3
+ describe Aryll::LinkChecker do
4
+
5
+ let(:url) do
6
+ 'http://www.example.com'
7
+ end
8
+
9
+ subject { described_class.new url }
10
+
11
+ let(:translation) { {} }
12
+
13
+ before do
14
+ I18n.backend.store_translations I18n.locale, translation
15
+ end
16
+
17
+ after { I18n.backend.reload! }
18
+
19
+ describe 'the class-level configuration defaults' do
20
+
21
+ [:ignore_trailing_slash_redirects, :ignore_302_redirects].each do |configuration|
22
+ describe ".#{configuration}" do
23
+ it "has a getter and setter" do
24
+ described_class.must_respond_to configuration
25
+ described_class.must_respond_to "#{configuration}="
26
+ end
27
+ end
28
+ end
29
+
30
+ describe '.configure' do
31
+ [:ignore_trailing_slash_redirects, :ignore_302_redirects].each do |configuration|
32
+ it "changes the value for #{configuration}" do
33
+ config_val = described_class.send configuration
34
+ proc {
35
+ described_class.configure do |config|
36
+ config.send "#{configuration}=", 'foo'
37
+ end
38
+ }.must_change -> { described_class.send(configuration) }
39
+ described_class.send "#{configuration}=", config_val
40
+ end
41
+ end
42
+ end
43
+
44
+ end
45
+
46
+ describe 'its constructor' do
47
+ it 'sets the url object' do
48
+ subject.url.must_equal url
49
+ end
50
+ end
51
+
52
+ describe '#check!' do
53
+ it "returns a '200' status" do
54
+ stub_net_http!
55
+ subject.check!.must_equal '200'
56
+ end
57
+
58
+ it "returns a '404' status" do
59
+ stub_net_http!("404")
60
+ subject.check!.must_equal '404'
61
+ end
62
+
63
+ describe 'with SSL' do
64
+ let(:url) do
65
+ 'https://www.example.com/'
66
+ end
67
+
68
+ it "returns a '200' status" do
69
+ stub_net_http! protocol: 'https'
70
+ subject.check!.must_equal '200'
71
+ end
72
+ end
73
+
74
+ describe 'with configuration options' do
75
+ describe 'for trailing slashes' do
76
+ before { stub_net_http_redirect!("301", location: url + '/') }
77
+
78
+ it 'considers trailing slashes for redirects not ok by default' do
79
+ subject.check!
80
+ subject.ok?.must_equal false
81
+ end
82
+
83
+ it 'ignores permanent redirects with trailing slash' do
84
+ subject = described_class.new(url, ignore_trailing_slash_redirects: true )
85
+ subject.check!
86
+ subject.ok?.must_equal true
87
+ end
88
+ end
89
+
90
+ describe 'for temporary redirects (302)' do
91
+ before do
92
+ stub_net_http_redirect!("302")
93
+ end
94
+
95
+ it 'considers temporary redirects not ok by default' do
96
+ subject.check!
97
+ subject.ok?.must_equal false
98
+ end
99
+
100
+ it 'ignores temporary redirects' do
101
+ subject = described_class.new(url, ignore_302_redirects: true)
102
+ subject.check!
103
+ subject.ok?.must_equal true
104
+ end
105
+ end
106
+ end
107
+
108
+ describe 'with timeout errors' do
109
+ before do
110
+ stub_request(:any, 'www.example.com').to_timeout
111
+ end
112
+
113
+ it 'handles timeouts' do
114
+ subject.check!
115
+ subject.status.must_match(/Timeout .+/)
116
+ end
117
+
118
+ describe 'with I18n' do
119
+ let(:translation) do
120
+ { kauperts: { link_checker: { errors: { timeout: "Zeitüberschreitung" } } } }
121
+ end
122
+
123
+ it 'translates the error message' do
124
+ subject.check!
125
+ subject.status.must_match(/Zeitüberschreitung .+/)
126
+ end
127
+ end
128
+ end
129
+
130
+ describe 'with a unrecognized network error' do
131
+ let(:generic_error) { Class.new(StandardError) }
132
+
133
+ before do
134
+ stub_request(:any, 'www.example.com').to_raise generic_error
135
+ end
136
+
137
+ it 'handles generic network problem' do
138
+ subject.check!
139
+ subject.status.must_match(/Generic network error .+/)
140
+ end
141
+
142
+ describe 'with I18n' do
143
+ let(:translation) do
144
+ { kauperts: { link_checker: { errors: { generic_network: "Netzwerkfehler" } } } }
145
+ end
146
+
147
+ it 'translates the error message' do
148
+ subject.check!
149
+ subject.status.must_match(/Netzwerkfehler .+/)
150
+ end
151
+ end
152
+ end
153
+
154
+ describe 'with IDN domains' do
155
+ let(:url) do
156
+ 'http://www.trotzköpfchen.de'
157
+ end
158
+
159
+ before do
160
+ stub_net_http!(host: 'www.xn--trotzkpfchen-9ib.de')
161
+ end
162
+
163
+ it 'handles domain with umlauts' do
164
+ subject.check!.must_equal '200'
165
+ subject.ok?.must_equal true
166
+ end
167
+ end
168
+
169
+ end
170
+
171
+ describe '#status' do
172
+ describe 'with a permanent redirect' do
173
+ before do
174
+ stub_net_http_redirect!("301")
175
+ subject.check!
176
+ end
177
+
178
+ it 'returns the redirection url' do
179
+ subject.status.must_equal 'Moved permanently (http://auenland.de)'
180
+ end
181
+
182
+ describe 'with I18n' do
183
+ let(:translation) do
184
+ { kauperts: { link_checker: { status: { redirect_permanently: "Umgezogen" } } } }
185
+ end
186
+
187
+ it 'translates the status' do
188
+ subject.status.must_match(/Umgezogen \(http:.+/)
189
+ end
190
+ end
191
+ end
192
+
193
+ end
194
+
195
+ def described_class
196
+ Aryll::LinkChecker
197
+ end
198
+
199
+ def stub_net_http!(return_code = "200", host: 'www.example.com', path: '/', protocol: 'http')
200
+ stub_request(:get, "#{protocol}://#{host}#{path}").to_return(status: return_code.to_i)
201
+ end
202
+
203
+ def stub_net_http_redirect!(return_code = '301', location: "http://auenland.de")
204
+ stub_request(:get, "http://www.example.com").to_return(
205
+ status: return_code.to_i,
206
+ headers: { 'Location' => location }
207
+ )
208
+ end
209
+ end
@@ -0,0 +1,31 @@
1
+ if ENV['COVERAGE']
2
+ require 'simplecov'
3
+ SimpleCov.start
4
+ end
5
+
6
+ require 'bundler/setup'
7
+
8
+ require 'minitest/autorun'
9
+ require 'minitest/pride'
10
+ require 'webmock/minitest'
11
+
12
+ require 'aryll'
13
+
14
+ I18n.available_locales = :en
15
+
16
+ module MiniTest
17
+ module Assertions
18
+
19
+ def assert_change(change_proc)
20
+ before = change_proc.call
21
+ yield
22
+ after = change_proc.call
23
+ refute_equal before, after
24
+ end
25
+
26
+ end
27
+
28
+ module Expectations
29
+ infect_an_assertion :assert_change, :must_change, :block
30
+ end
31
+ end
metadata ADDED
@@ -0,0 +1,163 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aryll
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.rc1
5
+ platform: ruby
6
+ authors:
7
+ - Wolfgang Vogl
8
+ - Carsten Zimmermann
9
+ - Matthias Viehweger
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2016-03-30 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: i18n
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: simpleidn
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: rake
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: rdoc
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ - !ruby/object:Gem::Dependency
72
+ name: bundler
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: minitest
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '5.0'
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '5.0'
99
+ - !ruby/object:Gem::Dependency
100
+ name: webmock
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ description: A simple library to check for the well-being of an URL
114
+ email:
115
+ - cz@aegisnet.de
116
+ executables: []
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - ".gitignore"
121
+ - ".ruby-gemset"
122
+ - ".ruby-version"
123
+ - ".travis.yml"
124
+ - Gemfile
125
+ - LICENSE
126
+ - README.md
127
+ - Rakefile
128
+ - aryll.gemspec
129
+ - lib/aryll.rb
130
+ - lib/aryll/international_uri.rb
131
+ - lib/aryll/link_checker.rb
132
+ - lib/aryll/status_message.rb
133
+ - lib/aryll/version.rb
134
+ - test/aryll_test.rb
135
+ - test/link_checker_test.rb
136
+ - test/test_helper.rb
137
+ homepage: ''
138
+ licenses: []
139
+ metadata: {}
140
+ post_install_message:
141
+ rdoc_options: []
142
+ require_paths:
143
+ - lib
144
+ required_ruby_version: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '2.2'
149
+ required_rubygems_version: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">"
152
+ - !ruby/object:Gem::Version
153
+ version: 1.3.1
154
+ requirements: []
155
+ rubyforge_project:
156
+ rubygems_version: 2.5.1
157
+ signing_key:
158
+ specification_version: 4
159
+ summary: A simple library to check for the well-being of an URL
160
+ test_files:
161
+ - test/aryll_test.rb
162
+ - test/link_checker_test.rb
163
+ - test/test_helper.rb