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.

Files changed (119) hide show
  1. checksums.yaml +5 -5
  2. data/.github/dependabot.yml +11 -0
  3. data/.github/workflows/ci-test.yml +53 -0
  4. data/.yardopts +8 -0
  5. data/{CHANGELOG.rdoc → CHANGELOG.md} +136 -87
  6. data/EXAMPLES.rdoc +1 -24
  7. data/Gemfile +1 -4
  8. data/{LICENSE.rdoc → LICENSE.txt} +4 -0
  9. data/README.md +77 -0
  10. data/Rakefile +18 -3
  11. data/examples/rubygems.rb +2 -2
  12. data/lib/mechanize.rb +3 -2
  13. data/lib/mechanize/chunked_termination_error.rb +1 -0
  14. data/lib/mechanize/content_type_error.rb +1 -0
  15. data/lib/mechanize/cookie.rb +1 -13
  16. data/lib/mechanize/cookie_jar.rb +4 -12
  17. data/lib/mechanize/directory_saver.rb +1 -0
  18. data/lib/mechanize/download.rb +2 -1
  19. data/lib/mechanize/element_matcher.rb +1 -0
  20. data/lib/mechanize/element_not_found_error.rb +1 -0
  21. data/lib/mechanize/file.rb +2 -1
  22. data/lib/mechanize/file_connection.rb +5 -3
  23. data/lib/mechanize/file_request.rb +1 -0
  24. data/lib/mechanize/file_response.rb +4 -1
  25. data/lib/mechanize/file_saver.rb +1 -0
  26. data/lib/mechanize/form.rb +2 -10
  27. data/lib/mechanize/form/button.rb +1 -0
  28. data/lib/mechanize/form/check_box.rb +1 -0
  29. data/lib/mechanize/form/field.rb +1 -0
  30. data/lib/mechanize/form/file_upload.rb +1 -0
  31. data/lib/mechanize/form/hidden.rb +1 -0
  32. data/lib/mechanize/form/image_button.rb +1 -0
  33. data/lib/mechanize/form/keygen.rb +1 -0
  34. data/lib/mechanize/form/multi_select_list.rb +1 -0
  35. data/lib/mechanize/form/option.rb +1 -0
  36. data/lib/mechanize/form/radio_button.rb +1 -0
  37. data/lib/mechanize/form/reset.rb +1 -0
  38. data/lib/mechanize/form/select_list.rb +1 -0
  39. data/lib/mechanize/form/submit.rb +1 -0
  40. data/lib/mechanize/form/text.rb +1 -0
  41. data/lib/mechanize/form/textarea.rb +1 -0
  42. data/lib/mechanize/headers.rb +1 -0
  43. data/lib/mechanize/history.rb +1 -0
  44. data/lib/mechanize/http.rb +1 -0
  45. data/lib/mechanize/http/agent.rb +16 -8
  46. data/lib/mechanize/http/auth_challenge.rb +1 -0
  47. data/lib/mechanize/http/auth_realm.rb +1 -0
  48. data/lib/mechanize/http/auth_store.rb +1 -0
  49. data/lib/mechanize/http/content_disposition_parser.rb +14 -2
  50. data/lib/mechanize/http/www_authenticate_parser.rb +3 -3
  51. data/lib/mechanize/image.rb +1 -0
  52. data/lib/mechanize/page.rb +4 -3
  53. data/lib/mechanize/page/base.rb +1 -0
  54. data/lib/mechanize/page/frame.rb +1 -0
  55. data/lib/mechanize/page/image.rb +1 -0
  56. data/lib/mechanize/page/label.rb +1 -0
  57. data/lib/mechanize/page/link.rb +8 -1
  58. data/lib/mechanize/page/meta_refresh.rb +1 -0
  59. data/lib/mechanize/parser.rb +1 -0
  60. data/lib/mechanize/pluggable_parsers.rb +1 -0
  61. data/lib/mechanize/prependable.rb +1 -0
  62. data/lib/mechanize/redirect_limit_reached_error.rb +1 -0
  63. data/lib/mechanize/redirect_not_get_or_head_error.rb +1 -0
  64. data/lib/mechanize/response_code_error.rb +2 -1
  65. data/lib/mechanize/response_read_error.rb +1 -0
  66. data/lib/mechanize/robots_disallowed_error.rb +1 -0
  67. data/lib/mechanize/test_case.rb +34 -29
  68. data/lib/mechanize/test_case/bad_chunking_servlet.rb +1 -0
  69. data/lib/mechanize/test_case/basic_auth_servlet.rb +1 -0
  70. data/lib/mechanize/test_case/content_type_servlet.rb +1 -0
  71. data/lib/mechanize/test_case/digest_auth_servlet.rb +1 -0
  72. data/lib/mechanize/test_case/file_upload_servlet.rb +1 -0
  73. data/lib/mechanize/test_case/form_servlet.rb +1 -0
  74. data/lib/mechanize/test_case/gzip_servlet.rb +4 -3
  75. data/lib/mechanize/test_case/header_servlet.rb +1 -0
  76. data/lib/mechanize/test_case/http_refresh_servlet.rb +1 -0
  77. data/lib/mechanize/test_case/infinite_redirect_servlet.rb +1 -0
  78. data/lib/mechanize/test_case/infinite_refresh_servlet.rb +1 -0
  79. data/lib/mechanize/test_case/many_cookies_as_string_servlet.rb +1 -0
  80. data/lib/mechanize/test_case/many_cookies_servlet.rb +1 -0
  81. data/lib/mechanize/test_case/modified_since_servlet.rb +1 -0
  82. data/lib/mechanize/test_case/ntlm_servlet.rb +1 -0
  83. data/lib/mechanize/test_case/one_cookie_no_spaces_servlet.rb +1 -0
  84. data/lib/mechanize/test_case/one_cookie_servlet.rb +1 -0
  85. data/lib/mechanize/test_case/quoted_value_cookie_servlet.rb +1 -0
  86. data/lib/mechanize/test_case/redirect_servlet.rb +1 -0
  87. data/lib/mechanize/test_case/referer_servlet.rb +1 -0
  88. data/lib/mechanize/test_case/refresh_with_empty_url.rb +1 -0
  89. data/lib/mechanize/test_case/refresh_without_url.rb +1 -0
  90. data/lib/mechanize/test_case/response_code_servlet.rb +1 -0
  91. data/lib/mechanize/test_case/robots_txt_servlet.rb +1 -0
  92. data/lib/mechanize/test_case/send_cookies_servlet.rb +1 -0
  93. data/lib/mechanize/test_case/server.rb +1 -0
  94. data/lib/mechanize/test_case/servlets.rb +1 -0
  95. data/lib/mechanize/test_case/verb_servlet.rb +5 -6
  96. data/lib/mechanize/unauthorized_error.rb +1 -0
  97. data/lib/mechanize/unsupported_scheme_error.rb +1 -0
  98. data/lib/mechanize/util.rb +2 -1
  99. data/lib/mechanize/version.rb +2 -1
  100. data/lib/mechanize/xml_file.rb +1 -0
  101. data/mechanize.gemspec +45 -35
  102. data/test/htdocs/dir with spaces/foo.html +1 -0
  103. data/test/htdocs/tc_links.html +1 -1
  104. data/test/test_mechanize.rb +19 -7
  105. data/test/test_mechanize_cookie.rb +19 -19
  106. data/test/test_mechanize_cookie_jar.rb +85 -53
  107. data/test/test_mechanize_download.rb +13 -1
  108. data/test/test_mechanize_file.rb +10 -0
  109. data/test/test_mechanize_file_connection.rb +21 -3
  110. data/test/test_mechanize_file_response.rb +25 -1
  111. data/test/test_mechanize_form.rb +12 -0
  112. data/test/test_mechanize_form_keygen.rb +1 -0
  113. data/test/test_mechanize_http_agent.rb +53 -8
  114. data/test/test_mechanize_http_content_disposition_parser.rb +27 -0
  115. data/test/test_mechanize_link.rb +24 -0
  116. data/test/test_mechanize_page_encoding.rb +28 -1
  117. metadata +117 -71
  118. data/.travis.yml +0 -36
  119. 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
- end
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
@@ -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 = if RUBY_VERSION >= '2.0.0' then
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
- return if jruby_zlib?
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
- 'Content-Length' => '9999',
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
@@ -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
- end
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.7.6
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: 2018-06-02 00:00:00.000000000 Z
15
+ date: 2021-08-06 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
- name: net-http-digest_auth
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: '1.1'
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: '1.1'
30
+ version: '2.8'
37
31
  - !ruby/object:Gem::Dependency
38
- name: mime-types
32
+ name: domain_name
39
33
  requirement: !ruby/object:Gem::Requirement
40
34
  requirements:
41
35
  - - ">="
42
36
  - !ruby/object:Gem::Version
43
- version: 1.17.2
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: 1.17.2
47
+ version: 0.5.20190701
48
+ - - "~>"
49
+ - !ruby/object:Gem::Version
50
+ version: '0.5'
51
51
  - !ruby/object:Gem::Dependency
52
- name: net-http-persistent
52
+ name: http-cookie
53
53
  requirement: !ruby/object:Gem::Requirement
54
54
  requirements:
55
55
  - - ">="
56
56
  - !ruby/object:Gem::Version
57
- version: 2.5.2
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: 2.5.2
67
+ version: 1.0.3
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '1.0'
65
71
  - !ruby/object:Gem::Dependency
66
- name: http-cookie
72
+ name: mime-types
67
73
  requirement: !ruby/object:Gem::Requirement
68
74
  requirements:
69
75
  - - "~>"
70
76
  - !ruby/object:Gem::Version
71
- version: '1.0'
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: '1.0'
84
+ version: '3.0'
79
85
  - !ruby/object:Gem::Dependency
80
- name: nokogiri
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.6'
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.6'
104
+ version: '1.4'
93
105
  - !ruby/object:Gem::Dependency
94
- name: ntlm-http
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: 0.1.1
100
- - - "~>"
111
+ version: 2.5.2
112
+ - - "<"
101
113
  - !ruby/object:Gem::Version
102
- version: '0.1'
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: 0.1.1
110
- - - "~>"
121
+ version: 2.5.2
122
+ - - "<"
111
123
  - !ruby/object:Gem::Version
112
- version: '0.1'
124
+ version: 5.0.dev
113
125
  - !ruby/object:Gem::Dependency
114
- name: webrobots
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: 0.0.9
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: 0.0.9
141
+ version: 1.11.2
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '1.11'
133
145
  - !ruby/object:Gem::Dependency
134
- name: domain_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.5.1
151
+ version: 0.6.3
140
152
  - - "~>"
141
153
  - !ruby/object:Gem::Version
142
- version: '0.5'
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.5.1
161
+ version: 0.6.3
150
162
  - - "~>"
151
163
  - !ruby/object:Gem::Version
152
- version: '0.5'
164
+ version: '0.6'
153
165
  - !ruby/object:Gem::Dependency
154
- name: rake
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: '0'
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: '0'
206
+ version: '5.14'
167
207
  - !ruby/object:Gem::Dependency
168
- name: bundler
208
+ name: rake
169
209
  requirement: !ruby/object:Gem::Requirement
170
210
  requirements:
171
211
  - - "~>"
172
212
  - !ruby/object:Gem::Version
173
- version: '1.3'
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: '1.3'
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: '4.0'
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: '4.0'
234
+ version: '6.3'
195
235
  - !ruby/object:Gem::Dependency
196
- name: minitest
236
+ name: rubocop
197
237
  requirement: !ruby/object:Gem::Requirement
198
238
  requirements:
199
239
  - - "~>"
200
240
  - !ruby/object:Gem::Version
201
- version: '5.0'
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: '5.0'
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
- - aaronp@rubyforge.org
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
- - LICENSE.rdoc
228
- - README.rdoc
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
- - ".travis.yml"
233
- - CHANGELOG.rdoc
273
+ - ".yardopts"
274
+ - CHANGELOG.md
234
275
  - EXAMPLES.rdoc
235
276
  - GUIDE.rdoc
236
277
  - Gemfile
237
- - LICENSE.rdoc
238
- - README.rdoc
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: http://docs.seattlerb.org/mechanize/
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.rdoc
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: 1.9.2
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
- rubyforge_project:
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