mechanize 2.7.6 → 2.8.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of mechanize might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/.github/dependabot.yml +11 -0
- data/.github/workflows/ci-test.yml +53 -0
- data/.yardopts +8 -0
- data/{CHANGELOG.rdoc → CHANGELOG.md} +136 -87
- data/EXAMPLES.rdoc +1 -24
- data/Gemfile +1 -4
- data/{LICENSE.rdoc → LICENSE.txt} +4 -0
- data/README.md +77 -0
- data/Rakefile +18 -3
- data/examples/rubygems.rb +2 -2
- data/lib/mechanize.rb +3 -2
- data/lib/mechanize/chunked_termination_error.rb +1 -0
- data/lib/mechanize/content_type_error.rb +1 -0
- data/lib/mechanize/cookie.rb +1 -13
- data/lib/mechanize/cookie_jar.rb +4 -12
- data/lib/mechanize/directory_saver.rb +1 -0
- data/lib/mechanize/download.rb +2 -1
- data/lib/mechanize/element_matcher.rb +1 -0
- data/lib/mechanize/element_not_found_error.rb +1 -0
- data/lib/mechanize/file.rb +2 -1
- data/lib/mechanize/file_connection.rb +5 -3
- data/lib/mechanize/file_request.rb +1 -0
- data/lib/mechanize/file_response.rb +4 -1
- data/lib/mechanize/file_saver.rb +1 -0
- data/lib/mechanize/form.rb +2 -10
- data/lib/mechanize/form/button.rb +1 -0
- data/lib/mechanize/form/check_box.rb +1 -0
- data/lib/mechanize/form/field.rb +1 -0
- data/lib/mechanize/form/file_upload.rb +1 -0
- data/lib/mechanize/form/hidden.rb +1 -0
- data/lib/mechanize/form/image_button.rb +1 -0
- data/lib/mechanize/form/keygen.rb +1 -0
- data/lib/mechanize/form/multi_select_list.rb +1 -0
- data/lib/mechanize/form/option.rb +1 -0
- data/lib/mechanize/form/radio_button.rb +1 -0
- data/lib/mechanize/form/reset.rb +1 -0
- data/lib/mechanize/form/select_list.rb +1 -0
- data/lib/mechanize/form/submit.rb +1 -0
- data/lib/mechanize/form/text.rb +1 -0
- data/lib/mechanize/form/textarea.rb +1 -0
- data/lib/mechanize/headers.rb +1 -0
- data/lib/mechanize/history.rb +1 -0
- data/lib/mechanize/http.rb +1 -0
- data/lib/mechanize/http/agent.rb +16 -8
- data/lib/mechanize/http/auth_challenge.rb +1 -0
- data/lib/mechanize/http/auth_realm.rb +1 -0
- data/lib/mechanize/http/auth_store.rb +1 -0
- data/lib/mechanize/http/content_disposition_parser.rb +14 -2
- data/lib/mechanize/http/www_authenticate_parser.rb +3 -3
- data/lib/mechanize/image.rb +1 -0
- data/lib/mechanize/page.rb +4 -3
- data/lib/mechanize/page/base.rb +1 -0
- data/lib/mechanize/page/frame.rb +1 -0
- data/lib/mechanize/page/image.rb +1 -0
- data/lib/mechanize/page/label.rb +1 -0
- data/lib/mechanize/page/link.rb +8 -1
- data/lib/mechanize/page/meta_refresh.rb +1 -0
- data/lib/mechanize/parser.rb +1 -0
- data/lib/mechanize/pluggable_parsers.rb +1 -0
- data/lib/mechanize/prependable.rb +1 -0
- data/lib/mechanize/redirect_limit_reached_error.rb +1 -0
- data/lib/mechanize/redirect_not_get_or_head_error.rb +1 -0
- data/lib/mechanize/response_code_error.rb +2 -1
- data/lib/mechanize/response_read_error.rb +1 -0
- data/lib/mechanize/robots_disallowed_error.rb +1 -0
- data/lib/mechanize/test_case.rb +34 -29
- data/lib/mechanize/test_case/bad_chunking_servlet.rb +1 -0
- data/lib/mechanize/test_case/basic_auth_servlet.rb +1 -0
- data/lib/mechanize/test_case/content_type_servlet.rb +1 -0
- data/lib/mechanize/test_case/digest_auth_servlet.rb +1 -0
- data/lib/mechanize/test_case/file_upload_servlet.rb +1 -0
- data/lib/mechanize/test_case/form_servlet.rb +1 -0
- data/lib/mechanize/test_case/gzip_servlet.rb +4 -3
- data/lib/mechanize/test_case/header_servlet.rb +1 -0
- data/lib/mechanize/test_case/http_refresh_servlet.rb +1 -0
- data/lib/mechanize/test_case/infinite_redirect_servlet.rb +1 -0
- data/lib/mechanize/test_case/infinite_refresh_servlet.rb +1 -0
- data/lib/mechanize/test_case/many_cookies_as_string_servlet.rb +1 -0
- data/lib/mechanize/test_case/many_cookies_servlet.rb +1 -0
- data/lib/mechanize/test_case/modified_since_servlet.rb +1 -0
- data/lib/mechanize/test_case/ntlm_servlet.rb +1 -0
- data/lib/mechanize/test_case/one_cookie_no_spaces_servlet.rb +1 -0
- data/lib/mechanize/test_case/one_cookie_servlet.rb +1 -0
- data/lib/mechanize/test_case/quoted_value_cookie_servlet.rb +1 -0
- data/lib/mechanize/test_case/redirect_servlet.rb +1 -0
- data/lib/mechanize/test_case/referer_servlet.rb +1 -0
- data/lib/mechanize/test_case/refresh_with_empty_url.rb +1 -0
- data/lib/mechanize/test_case/refresh_without_url.rb +1 -0
- data/lib/mechanize/test_case/response_code_servlet.rb +1 -0
- data/lib/mechanize/test_case/robots_txt_servlet.rb +1 -0
- data/lib/mechanize/test_case/send_cookies_servlet.rb +1 -0
- data/lib/mechanize/test_case/server.rb +1 -0
- data/lib/mechanize/test_case/servlets.rb +1 -0
- data/lib/mechanize/test_case/verb_servlet.rb +5 -6
- data/lib/mechanize/unauthorized_error.rb +1 -0
- data/lib/mechanize/unsupported_scheme_error.rb +1 -0
- data/lib/mechanize/util.rb +2 -1
- data/lib/mechanize/version.rb +2 -1
- data/lib/mechanize/xml_file.rb +1 -0
- data/mechanize.gemspec +45 -35
- data/test/htdocs/dir with spaces/foo.html +1 -0
- data/test/htdocs/tc_links.html +1 -1
- data/test/test_mechanize.rb +19 -7
- data/test/test_mechanize_cookie.rb +19 -19
- data/test/test_mechanize_cookie_jar.rb +85 -53
- data/test/test_mechanize_download.rb +13 -1
- data/test/test_mechanize_file.rb +10 -0
- data/test/test_mechanize_file_connection.rb +21 -3
- data/test/test_mechanize_file_response.rb +25 -1
- data/test/test_mechanize_form.rb +12 -0
- data/test/test_mechanize_form_keygen.rb +1 -0
- data/test/test_mechanize_http_agent.rb +53 -8
- data/test/test_mechanize_http_content_disposition_parser.rb +27 -0
- data/test/test_mechanize_link.rb +24 -0
- data/test/test_mechanize_page_encoding.rb +28 -1
- metadata +117 -71
- data/.travis.yml +0 -36
- data/README.rdoc +0 -77
@@ -1,6 +1,10 @@
|
|
1
1
|
require 'mechanize/test_case'
|
2
2
|
|
3
3
|
class TestMechanizeFileResponse < Mechanize::TestCase
|
4
|
+
def test_file_path
|
5
|
+
res = Mechanize::FileResponse.new("/path/to/foo.html")
|
6
|
+
assert_equal("/path/to/foo.html", res.file_path)
|
7
|
+
end
|
4
8
|
|
5
9
|
def test_content_type
|
6
10
|
Tempfile.open %w[pi .nothtml] do |tempfile|
|
@@ -19,5 +23,25 @@ class TestMechanizeFileResponse < Mechanize::TestCase
|
|
19
23
|
end
|
20
24
|
end
|
21
25
|
|
22
|
-
|
26
|
+
def test_read_body
|
27
|
+
Tempfile.open %w[pi .html] do |tempfile|
|
28
|
+
tempfile.write("asdfasdfasdf")
|
29
|
+
tempfile.close
|
23
30
|
|
31
|
+
res = Mechanize::FileResponse.new(tempfile.path)
|
32
|
+
res.read_body do |input|
|
33
|
+
assert_equal("asdfasdfasdf", input)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_read_body_does_not_allow_command_injection
|
39
|
+
skip if windows?
|
40
|
+
in_tmpdir do
|
41
|
+
FileUtils.touch('| ruby -rfileutils -e \'FileUtils.touch("vul.txt")\'')
|
42
|
+
res = Mechanize::FileResponse.new('| ruby -rfileutils -e \'FileUtils.touch("vul.txt")\'')
|
43
|
+
res.read_body { |_| }
|
44
|
+
refute_operator(File, :exist?, "vul.txt")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/test/test_mechanize_form.rb
CHANGED
@@ -65,6 +65,18 @@ class TestMechanizeForm < Mechanize::TestCase
|
|
65
65
|
assert query.all? { |x| x[1] == '' }
|
66
66
|
end
|
67
67
|
|
68
|
+
def test_build_query_blank_input_name
|
69
|
+
html = Nokogiri::HTML <<-HTML
|
70
|
+
<form>
|
71
|
+
<input type="text" name="" value="foo" />
|
72
|
+
</form>
|
73
|
+
HTML
|
74
|
+
|
75
|
+
form = Mechanize::Form.new html.at('form'), @mech, @page
|
76
|
+
|
77
|
+
assert_equal [], form.build_query
|
78
|
+
end
|
79
|
+
|
68
80
|
def test_build_query_radio_button_duplicate
|
69
81
|
html = Nokogiri::HTML <<-HTML
|
70
82
|
<form>
|
@@ -22,6 +22,7 @@ class TestMechanizeFormKeygen < Mechanize::TestCase
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def test_spki_signature
|
25
|
+
skip("JRuby PKI doesn't handle this for reasons I've been unable to understand") if RUBY_ENGINE=~/jruby/
|
25
26
|
spki = OpenSSL::Netscape::SPKI.new @keygen.value
|
26
27
|
assert_equal @keygen.challenge, spki.challenge
|
27
28
|
assert_equal @keygen.key.public_key.to_pem, spki.public_key.to_pem
|
@@ -16,11 +16,7 @@ class TestMechanizeHttpAgent < Mechanize::TestCase
|
|
16
16
|
@res.instance_variable_set :@code, 200
|
17
17
|
@res.instance_variable_set :@header, {}
|
18
18
|
|
19
|
-
@headers =
|
20
|
-
%w[accept accept-encoding user-agent]
|
21
|
-
else
|
22
|
-
%w[accept user-agent]
|
23
|
-
end
|
19
|
+
@headers = %w[accept accept-encoding user-agent]
|
24
20
|
end
|
25
21
|
|
26
22
|
def auth_realm uri, scheme, type
|
@@ -205,7 +201,7 @@ class TestMechanizeHttpAgent < Mechanize::TestCase
|
|
205
201
|
|
206
202
|
page = @agent.fetch uri
|
207
203
|
|
208
|
-
assert_equal File.read(foo), page.body
|
204
|
+
assert_equal File.read(foo), page.body.gsub(/\r\n/, "\n")
|
209
205
|
assert_kind_of Mechanize::Page, page
|
210
206
|
end
|
211
207
|
|
@@ -935,7 +931,7 @@ class TestMechanizeHttpAgent < Mechanize::TestCase
|
|
935
931
|
body_io = StringIO.new \
|
936
932
|
"\037\213\b\0002\002\225M\000\003+H,*\001"
|
937
933
|
|
938
|
-
|
934
|
+
skip if jruby_zlib?
|
939
935
|
|
940
936
|
e = assert_raises Mechanize::Error do
|
941
937
|
@agent.response_content_encoding @res, body_io
|
@@ -1508,7 +1504,8 @@ class TestMechanizeHttpAgent < Mechanize::TestCase
|
|
1508
1504
|
headers = {
|
1509
1505
|
'Range' => 'bytes=0-9999',
|
1510
1506
|
'Content-Type' => 'application/x-www-form-urlencoded',
|
1511
|
-
'
|
1507
|
+
'CONTENT-LENGTH' => '9999',
|
1508
|
+
'content-md5' => '14758f1afd44c09b7992073ccf00b43d',
|
1512
1509
|
}
|
1513
1510
|
|
1514
1511
|
page = fake_page
|
@@ -1520,6 +1517,7 @@ class TestMechanizeHttpAgent < Mechanize::TestCase
|
|
1520
1517
|
assert_match 'range|bytes=0-9999', page.body
|
1521
1518
|
refute_match 'content-type|application/x-www-form-urlencoded', page.body
|
1522
1519
|
refute_match 'content-length|9999', page.body
|
1520
|
+
refute_match 'content-md5|14758f1afd44c09b7992073ccf00b43d', page.body
|
1523
1521
|
end
|
1524
1522
|
|
1525
1523
|
def test_response_redirect_malformed
|
@@ -1555,6 +1553,48 @@ class TestMechanizeHttpAgent < Mechanize::TestCase
|
|
1555
1553
|
end
|
1556
1554
|
end
|
1557
1555
|
|
1556
|
+
def test_response_redirect_to_cross_site_with_credential
|
1557
|
+
@agent.redirect_ok = true
|
1558
|
+
|
1559
|
+
headers = {
|
1560
|
+
'Range' => 'bytes=0-9999',
|
1561
|
+
'AUTHORIZATION' => 'Basic xxx',
|
1562
|
+
'cookie' => 'name=value',
|
1563
|
+
}
|
1564
|
+
|
1565
|
+
page = html_page ''
|
1566
|
+
page = @agent.response_redirect({ 'Location' => 'http://trap/http_headers' }, :get,
|
1567
|
+
page, 0, headers)
|
1568
|
+
|
1569
|
+
refute_includes(headers.keys, "AUTHORIZATION")
|
1570
|
+
refute_includes(headers.keys, "cookie")
|
1571
|
+
|
1572
|
+
assert_match 'range|bytes=0-9999', page.body
|
1573
|
+
refute_match("authorization|Basic xxx", page.body)
|
1574
|
+
refute_match("cookie|name=value", page.body)
|
1575
|
+
end
|
1576
|
+
|
1577
|
+
def test_response_redirect_to_same_site_with_credential
|
1578
|
+
@agent.redirect_ok = true
|
1579
|
+
|
1580
|
+
headers = {
|
1581
|
+
'Range' => 'bytes=0-9999',
|
1582
|
+
'AUTHORIZATION' => 'Basic xxx',
|
1583
|
+
'cookie' => 'name=value',
|
1584
|
+
}
|
1585
|
+
|
1586
|
+
page = html_page ''
|
1587
|
+
page = @agent.response_redirect({ 'Location' => '/http_headers' }, :get,
|
1588
|
+
page, 0, headers)
|
1589
|
+
|
1590
|
+
assert_includes(headers.keys, "AUTHORIZATION")
|
1591
|
+
assert_includes(headers.keys, "cookie")
|
1592
|
+
|
1593
|
+
assert_match 'range|bytes=0-9999', page.body
|
1594
|
+
assert_match("authorization|Basic xxx", page.body)
|
1595
|
+
assert_match("cookie|name=value", page.body)
|
1596
|
+
end
|
1597
|
+
|
1558
1598
|
def test_response_redirect_not_ok
|
1559
1599
|
@agent.redirect_ok = false
|
1560
1600
|
|
@@ -1590,6 +1630,11 @@ class TestMechanizeHttpAgent < Mechanize::TestCase
|
|
1590
1630
|
end
|
1591
1631
|
|
1592
1632
|
def test_retry_change_request_equals
|
1633
|
+
unless Gem::Requirement.new("< 4.0.0").satisfied_by?(Gem::Version.new(Net::HTTP::Persistent::VERSION))
|
1634
|
+
# see https://github.com/drbrain/net-http-persistent/pull/100
|
1635
|
+
skip("net-http-persistent 4.0.0 and later does not support retry_change_requests")
|
1636
|
+
end
|
1637
|
+
|
1593
1638
|
refute @agent.http.retry_change_requests
|
1594
1639
|
|
1595
1640
|
@agent.retry_change_requests = true
|
@@ -30,6 +30,33 @@ class TestMechanizeHttpContentDispositionParser < Mechanize::TestCase
|
|
30
30
|
assert_equal expected, content_disposition.parameters
|
31
31
|
end
|
32
32
|
|
33
|
+
def test_parse_date_iso8601_fallback
|
34
|
+
now = Time.at Time.now.to_i
|
35
|
+
|
36
|
+
content_disposition = @parser.parse \
|
37
|
+
'attachment;' \
|
38
|
+
'filename=value;' \
|
39
|
+
"creation-date=\"#{now.iso8601}\";" \
|
40
|
+
"modification-date=\"#{(now + 1).iso8601}\""
|
41
|
+
|
42
|
+
assert_equal 'attachment', content_disposition.type
|
43
|
+
assert_equal 'value', content_disposition.filename
|
44
|
+
assert_equal now, content_disposition.creation_date
|
45
|
+
assert_equal((now + 1), content_disposition.modification_date)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_parse_date_invalid
|
49
|
+
now = Time.at Time.now.to_i
|
50
|
+
|
51
|
+
content_disposition = @parser.parse \
|
52
|
+
'attachment;' \
|
53
|
+
'filename=value;' \
|
54
|
+
"creation-date=\"#{now.to_s}\";" \
|
55
|
+
"modification-date=\"#{(now + 1).to_s}\""
|
56
|
+
|
57
|
+
assert_nil content_disposition
|
58
|
+
end
|
59
|
+
|
33
60
|
def test_parse_header
|
34
61
|
content_disposition = @parser.parse \
|
35
62
|
'content-disposition: attachment;filename=value', true
|
data/test/test_mechanize_link.rb
CHANGED
@@ -135,6 +135,30 @@ class TestMechanizeLink < Mechanize::TestCase
|
|
135
135
|
assert_equal 'http://foo.bar/%20baz', link.uri.to_s
|
136
136
|
end
|
137
137
|
|
138
|
+
def test_uri_weird_with_fragment
|
139
|
+
doc = Nokogiri::HTML::Document.new
|
140
|
+
|
141
|
+
node = Nokogiri::XML::Node.new('foo', doc)
|
142
|
+
node['href'] = 'http://foo.bar/ baz#уважение'
|
143
|
+
|
144
|
+
link = Mechanize::Page::Link.new(node, nil, nil)
|
145
|
+
|
146
|
+
assert_equal '%D1%83%D0%B2%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5', link.uri.fragment
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_bad_uri_raise_compatible_exception
|
150
|
+
doc = Nokogiri::HTML::Document.new
|
151
|
+
|
152
|
+
node = Nokogiri::XML::Node.new('foo', doc)
|
153
|
+
node['href'] = 'http://http:foo.bar/ baz'
|
154
|
+
|
155
|
+
link = Mechanize::Page::Link.new(node, nil, nil)
|
156
|
+
|
157
|
+
assert_raises URI::InvalidURIError do
|
158
|
+
link.uri
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
138
162
|
def test_resolving_full_uri
|
139
163
|
page = @mech.get("http://localhost/frame_test.html")
|
140
164
|
link = page.link_with(:text => "Form Test")
|
@@ -183,5 +183,32 @@ class TestMechanizePageEncoding < Mechanize::TestCase
|
|
183
183
|
assert_equal Encoding::UTF_8, result.text.encoding
|
184
184
|
end
|
185
185
|
|
186
|
-
|
186
|
+
def test_parser_error_message_containing_encoding_errors
|
187
|
+
skip if RUBY_ENGINE == 'jruby' # this is a libxml2-specific condition
|
188
|
+
|
189
|
+
# https://github.com/sparklemotion/mechanize/issues/553
|
190
|
+
body = <<~EOF
|
191
|
+
<html>
|
192
|
+
<body>
|
193
|
+
<!--
|
194
|
+
## メモ
|
195
|
+
処理の一般化, 二重ループ, 多重ループ
|
196
|
+
wzxhzdk:25
|
197
|
+
-->
|
198
|
+
EOF
|
199
|
+
page = util_page body
|
200
|
+
|
201
|
+
# this should not raise an "invalid byte sequence in UTF-8" error while processing parsing errors
|
202
|
+
page.search("body")
|
187
203
|
|
204
|
+
# let's assert on the setup: a libxml2-returned parsing error itself contains an invalid character
|
205
|
+
# note that this problem only appears in libxml <= 2.9.10
|
206
|
+
error = page.parser.errors.find { |e| e.message.include?("Comment not terminated") }
|
207
|
+
if error
|
208
|
+
exception = assert_raises(ArgumentError) do
|
209
|
+
error.message =~ /any regex just to trigger encoding error/
|
210
|
+
end
|
211
|
+
assert_includes(exception.message, "invalid byte sequence in UTF-8")
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mechanize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.8.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Hodel
|
@@ -12,200 +12,240 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date:
|
15
|
+
date: 2021-08-06 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
|
-
name:
|
18
|
+
name: addressable
|
19
19
|
requirement: !ruby/object:Gem::Requirement
|
20
20
|
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 1.1.1
|
24
21
|
- - "~>"
|
25
22
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
23
|
+
version: '2.8'
|
27
24
|
type: :runtime
|
28
25
|
prerelease: false
|
29
26
|
version_requirements: !ruby/object:Gem::Requirement
|
30
27
|
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 1.1.1
|
34
28
|
- - "~>"
|
35
29
|
- !ruby/object:Gem::Version
|
36
|
-
version: '
|
30
|
+
version: '2.8'
|
37
31
|
- !ruby/object:Gem::Dependency
|
38
|
-
name:
|
32
|
+
name: domain_name
|
39
33
|
requirement: !ruby/object:Gem::Requirement
|
40
34
|
requirements:
|
41
35
|
- - ">="
|
42
36
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
37
|
+
version: 0.5.20190701
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.5'
|
44
41
|
type: :runtime
|
45
42
|
prerelease: false
|
46
43
|
version_requirements: !ruby/object:Gem::Requirement
|
47
44
|
requirements:
|
48
45
|
- - ">="
|
49
46
|
- !ruby/object:Gem::Version
|
50
|
-
version:
|
47
|
+
version: 0.5.20190701
|
48
|
+
- - "~>"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0.5'
|
51
51
|
- !ruby/object:Gem::Dependency
|
52
|
-
name:
|
52
|
+
name: http-cookie
|
53
53
|
requirement: !ruby/object:Gem::Requirement
|
54
54
|
requirements:
|
55
55
|
- - ">="
|
56
56
|
- !ruby/object:Gem::Version
|
57
|
-
version:
|
57
|
+
version: 1.0.3
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '1.0'
|
58
61
|
type: :runtime
|
59
62
|
prerelease: false
|
60
63
|
version_requirements: !ruby/object:Gem::Requirement
|
61
64
|
requirements:
|
62
65
|
- - ">="
|
63
66
|
- !ruby/object:Gem::Version
|
64
|
-
version:
|
67
|
+
version: 1.0.3
|
68
|
+
- - "~>"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '1.0'
|
65
71
|
- !ruby/object:Gem::Dependency
|
66
|
-
name:
|
72
|
+
name: mime-types
|
67
73
|
requirement: !ruby/object:Gem::Requirement
|
68
74
|
requirements:
|
69
75
|
- - "~>"
|
70
76
|
- !ruby/object:Gem::Version
|
71
|
-
version: '
|
77
|
+
version: '3.0'
|
72
78
|
type: :runtime
|
73
79
|
prerelease: false
|
74
80
|
version_requirements: !ruby/object:Gem::Requirement
|
75
81
|
requirements:
|
76
82
|
- - "~>"
|
77
83
|
- !ruby/object:Gem::Version
|
78
|
-
version: '
|
84
|
+
version: '3.0'
|
79
85
|
- !ruby/object:Gem::Dependency
|
80
|
-
name:
|
86
|
+
name: net-http-digest_auth
|
81
87
|
requirement: !ruby/object:Gem::Requirement
|
82
88
|
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: 1.4.1
|
83
92
|
- - "~>"
|
84
93
|
- !ruby/object:Gem::Version
|
85
|
-
version: '1.
|
94
|
+
version: '1.4'
|
86
95
|
type: :runtime
|
87
96
|
prerelease: false
|
88
97
|
version_requirements: !ruby/object:Gem::Requirement
|
89
98
|
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 1.4.1
|
90
102
|
- - "~>"
|
91
103
|
- !ruby/object:Gem::Version
|
92
|
-
version: '1.
|
104
|
+
version: '1.4'
|
93
105
|
- !ruby/object:Gem::Dependency
|
94
|
-
name:
|
106
|
+
name: net-http-persistent
|
95
107
|
requirement: !ruby/object:Gem::Requirement
|
96
108
|
requirements:
|
97
109
|
- - ">="
|
98
110
|
- !ruby/object:Gem::Version
|
99
|
-
version:
|
100
|
-
- - "
|
111
|
+
version: 2.5.2
|
112
|
+
- - "<"
|
101
113
|
- !ruby/object:Gem::Version
|
102
|
-
version:
|
114
|
+
version: 5.0.dev
|
103
115
|
type: :runtime
|
104
116
|
prerelease: false
|
105
117
|
version_requirements: !ruby/object:Gem::Requirement
|
106
118
|
requirements:
|
107
119
|
- - ">="
|
108
120
|
- !ruby/object:Gem::Version
|
109
|
-
version:
|
110
|
-
- - "
|
121
|
+
version: 2.5.2
|
122
|
+
- - "<"
|
111
123
|
- !ruby/object:Gem::Version
|
112
|
-
version:
|
124
|
+
version: 5.0.dev
|
113
125
|
- !ruby/object:Gem::Dependency
|
114
|
-
name:
|
126
|
+
name: nokogiri
|
115
127
|
requirement: !ruby/object:Gem::Requirement
|
116
128
|
requirements:
|
117
|
-
- - "<"
|
118
|
-
- !ruby/object:Gem::Version
|
119
|
-
version: '0.2'
|
120
129
|
- - ">="
|
121
130
|
- !ruby/object:Gem::Version
|
122
|
-
version:
|
131
|
+
version: 1.11.2
|
132
|
+
- - "~>"
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '1.11'
|
123
135
|
type: :runtime
|
124
136
|
prerelease: false
|
125
137
|
version_requirements: !ruby/object:Gem::Requirement
|
126
138
|
requirements:
|
127
|
-
- - "<"
|
128
|
-
- !ruby/object:Gem::Version
|
129
|
-
version: '0.2'
|
130
139
|
- - ">="
|
131
140
|
- !ruby/object:Gem::Version
|
132
|
-
version:
|
141
|
+
version: 1.11.2
|
142
|
+
- - "~>"
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '1.11'
|
133
145
|
- !ruby/object:Gem::Dependency
|
134
|
-
name:
|
146
|
+
name: rubyntlm
|
135
147
|
requirement: !ruby/object:Gem::Requirement
|
136
148
|
requirements:
|
137
149
|
- - ">="
|
138
150
|
- !ruby/object:Gem::Version
|
139
|
-
version: 0.
|
151
|
+
version: 0.6.3
|
140
152
|
- - "~>"
|
141
153
|
- !ruby/object:Gem::Version
|
142
|
-
version: '0.
|
154
|
+
version: '0.6'
|
143
155
|
type: :runtime
|
144
156
|
prerelease: false
|
145
157
|
version_requirements: !ruby/object:Gem::Requirement
|
146
158
|
requirements:
|
147
159
|
- - ">="
|
148
160
|
- !ruby/object:Gem::Version
|
149
|
-
version: 0.
|
161
|
+
version: 0.6.3
|
150
162
|
- - "~>"
|
151
163
|
- !ruby/object:Gem::Version
|
152
|
-
version: '0.
|
164
|
+
version: '0.6'
|
153
165
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
166
|
+
name: webrick
|
155
167
|
requirement: !ruby/object:Gem::Requirement
|
156
168
|
requirements:
|
157
|
-
- - "
|
169
|
+
- - "~>"
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: '1.7'
|
172
|
+
type: :runtime
|
173
|
+
prerelease: false
|
174
|
+
version_requirements: !ruby/object:Gem::Requirement
|
175
|
+
requirements:
|
176
|
+
- - "~>"
|
177
|
+
- !ruby/object:Gem::Version
|
178
|
+
version: '1.7'
|
179
|
+
- !ruby/object:Gem::Dependency
|
180
|
+
name: webrobots
|
181
|
+
requirement: !ruby/object:Gem::Requirement
|
182
|
+
requirements:
|
183
|
+
- - "~>"
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
version: 0.1.2
|
186
|
+
type: :runtime
|
187
|
+
prerelease: false
|
188
|
+
version_requirements: !ruby/object:Gem::Requirement
|
189
|
+
requirements:
|
190
|
+
- - "~>"
|
158
191
|
- !ruby/object:Gem::Version
|
159
|
-
version:
|
192
|
+
version: 0.1.2
|
193
|
+
- !ruby/object:Gem::Dependency
|
194
|
+
name: minitest
|
195
|
+
requirement: !ruby/object:Gem::Requirement
|
196
|
+
requirements:
|
197
|
+
- - "~>"
|
198
|
+
- !ruby/object:Gem::Version
|
199
|
+
version: '5.14'
|
160
200
|
type: :development
|
161
201
|
prerelease: false
|
162
202
|
version_requirements: !ruby/object:Gem::Requirement
|
163
203
|
requirements:
|
164
|
-
- - "
|
204
|
+
- - "~>"
|
165
205
|
- !ruby/object:Gem::Version
|
166
|
-
version: '
|
206
|
+
version: '5.14'
|
167
207
|
- !ruby/object:Gem::Dependency
|
168
|
-
name:
|
208
|
+
name: rake
|
169
209
|
requirement: !ruby/object:Gem::Requirement
|
170
210
|
requirements:
|
171
211
|
- - "~>"
|
172
212
|
- !ruby/object:Gem::Version
|
173
|
-
version: '
|
213
|
+
version: '13.0'
|
174
214
|
type: :development
|
175
215
|
prerelease: false
|
176
216
|
version_requirements: !ruby/object:Gem::Requirement
|
177
217
|
requirements:
|
178
218
|
- - "~>"
|
179
219
|
- !ruby/object:Gem::Version
|
180
|
-
version: '
|
220
|
+
version: '13.0'
|
181
221
|
- !ruby/object:Gem::Dependency
|
182
222
|
name: rdoc
|
183
223
|
requirement: !ruby/object:Gem::Requirement
|
184
224
|
requirements:
|
185
225
|
- - "~>"
|
186
226
|
- !ruby/object:Gem::Version
|
187
|
-
version: '
|
227
|
+
version: '6.3'
|
188
228
|
type: :development
|
189
229
|
prerelease: false
|
190
230
|
version_requirements: !ruby/object:Gem::Requirement
|
191
231
|
requirements:
|
192
232
|
- - "~>"
|
193
233
|
- !ruby/object:Gem::Version
|
194
|
-
version: '
|
234
|
+
version: '6.3'
|
195
235
|
- !ruby/object:Gem::Dependency
|
196
|
-
name:
|
236
|
+
name: rubocop
|
197
237
|
requirement: !ruby/object:Gem::Requirement
|
198
238
|
requirements:
|
199
239
|
- - "~>"
|
200
240
|
- !ruby/object:Gem::Version
|
201
|
-
version: '
|
241
|
+
version: '1.12'
|
202
242
|
type: :development
|
203
243
|
prerelease: false
|
204
244
|
version_requirements: !ruby/object:Gem::Requirement
|
205
245
|
requirements:
|
206
246
|
- - "~>"
|
207
247
|
- !ruby/object:Gem::Version
|
208
|
-
version: '
|
248
|
+
version: '1.12'
|
209
249
|
description: |-
|
210
250
|
The Mechanize library is used for automating interaction with websites.
|
211
251
|
Mechanize automatically stores and sends cookies, follows redirects,
|
@@ -214,7 +254,7 @@ description: |-
|
|
214
254
|
a history.
|
215
255
|
email:
|
216
256
|
- drbrain@segment7.net
|
217
|
-
-
|
257
|
+
- aaron.patterson@gmail.com
|
218
258
|
- mike.dalessio@gmail.com
|
219
259
|
- knu@idaemons.org
|
220
260
|
- ljjarvis@gmail.com
|
@@ -222,20 +262,21 @@ executables: []
|
|
222
262
|
extensions: []
|
223
263
|
extra_rdoc_files:
|
224
264
|
- EXAMPLES.rdoc
|
225
|
-
- CHANGELOG.rdoc
|
226
265
|
- GUIDE.rdoc
|
227
|
-
-
|
228
|
-
- README.
|
266
|
+
- CHANGELOG.md
|
267
|
+
- README.md
|
229
268
|
files:
|
230
269
|
- ".autotest"
|
270
|
+
- ".github/dependabot.yml"
|
271
|
+
- ".github/workflows/ci-test.yml"
|
231
272
|
- ".gitignore"
|
232
|
-
- ".
|
233
|
-
- CHANGELOG.
|
273
|
+
- ".yardopts"
|
274
|
+
- CHANGELOG.md
|
234
275
|
- EXAMPLES.rdoc
|
235
276
|
- GUIDE.rdoc
|
236
277
|
- Gemfile
|
237
|
-
- LICENSE.
|
238
|
-
- README.
|
278
|
+
- LICENSE.txt
|
279
|
+
- README.md
|
239
280
|
- Rakefile
|
240
281
|
- examples/flickr_upload.rb
|
241
282
|
- examples/mech-dump.rb
|
@@ -434,29 +475,34 @@ files:
|
|
434
475
|
- test/test_mechanize_util.rb
|
435
476
|
- test/test_mechanize_xml_file.rb
|
436
477
|
- test/test_multi_select.rb
|
437
|
-
homepage:
|
478
|
+
homepage: https://github.com/sparklemotion/mechanize
|
438
479
|
licenses:
|
439
480
|
- MIT
|
440
|
-
metadata:
|
481
|
+
metadata:
|
482
|
+
yard.run: yard
|
483
|
+
bug_tracker_uri: https://github.com/sparklemotion/mechanize/issues
|
484
|
+
changelog_uri: https://github.com/sparklemotion/mechanize/blob/main/CHANGELOG.md
|
485
|
+
documentation_uri: https://www.rubydoc.info/gems/mechanize
|
486
|
+
homepage_uri: https://github.com/sparklemotion/mechanize
|
487
|
+
source_code_uri: https://github.com/sparklemotion/mechanize
|
441
488
|
post_install_message:
|
442
489
|
rdoc_options:
|
443
490
|
- "--main"
|
444
|
-
- README.
|
491
|
+
- README.md
|
445
492
|
require_paths:
|
446
493
|
- lib
|
447
494
|
required_ruby_version: !ruby/object:Gem::Requirement
|
448
495
|
requirements:
|
449
496
|
- - ">="
|
450
497
|
- !ruby/object:Gem::Version
|
451
|
-
version:
|
498
|
+
version: 2.5.0
|
452
499
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
453
500
|
requirements:
|
454
501
|
- - ">="
|
455
502
|
- !ruby/object:Gem::Version
|
456
503
|
version: '0'
|
457
504
|
requirements: []
|
458
|
-
|
459
|
-
rubygems_version: 2.6.14.1
|
505
|
+
rubygems_version: 3.2.15
|
460
506
|
signing_key:
|
461
507
|
specification_version: 4
|
462
508
|
summary: The Mechanize library is used for automating interaction with websites
|