mechanize 2.0.1 → 2.1.pre.1

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 (148) hide show
  1. data.tar.gz.sig +0 -0
  2. data/CHANGELOG.rdoc +82 -0
  3. data/EXAMPLES.rdoc +1 -1
  4. data/FAQ.rdoc +9 -9
  5. data/Manifest.txt +35 -48
  6. data/README.rdoc +2 -1
  7. data/Rakefile +16 -3
  8. data/lib/mechanize.rb +809 -392
  9. data/lib/mechanize/content_type_error.rb +10 -11
  10. data/lib/mechanize/cookie.rb +193 -60
  11. data/lib/mechanize/cookie_jar.rb +39 -86
  12. data/lib/mechanize/download.rb +59 -0
  13. data/lib/mechanize/element_matcher.rb +1 -0
  14. data/lib/mechanize/file.rb +61 -76
  15. data/lib/mechanize/file_saver.rb +37 -35
  16. data/lib/mechanize/form.rb +475 -410
  17. data/lib/mechanize/form/button.rb +4 -7
  18. data/lib/mechanize/form/check_box.rb +10 -9
  19. data/lib/mechanize/form/field.rb +52 -42
  20. data/lib/mechanize/form/file_upload.rb +17 -19
  21. data/lib/mechanize/form/hidden.rb +3 -0
  22. data/lib/mechanize/form/image_button.rb +15 -16
  23. data/lib/mechanize/form/keygen.rb +34 -0
  24. data/lib/mechanize/form/multi_select_list.rb +20 -9
  25. data/lib/mechanize/form/option.rb +48 -47
  26. data/lib/mechanize/form/radio_button.rb +52 -45
  27. data/lib/mechanize/form/reset.rb +3 -0
  28. data/lib/mechanize/form/select_list.rb +10 -6
  29. data/lib/mechanize/form/submit.rb +3 -0
  30. data/lib/mechanize/form/text.rb +3 -0
  31. data/lib/mechanize/form/textarea.rb +3 -0
  32. data/lib/mechanize/headers.rb +17 -19
  33. data/lib/mechanize/history.rb +60 -61
  34. data/lib/mechanize/http.rb +5 -0
  35. data/lib/mechanize/http/agent.rb +485 -218
  36. data/lib/mechanize/http/auth_challenge.rb +59 -0
  37. data/lib/mechanize/http/auth_realm.rb +31 -0
  38. data/lib/mechanize/http/content_disposition_parser.rb +188 -0
  39. data/lib/mechanize/http/www_authenticate_parser.rb +155 -0
  40. data/lib/mechanize/monkey_patch.rb +14 -35
  41. data/lib/mechanize/page.rb +34 -2
  42. data/lib/mechanize/page/base.rb +6 -7
  43. data/lib/mechanize/page/frame.rb +5 -5
  44. data/lib/mechanize/page/image.rb +23 -23
  45. data/lib/mechanize/page/label.rb +16 -16
  46. data/lib/mechanize/page/link.rb +16 -0
  47. data/lib/mechanize/page/meta_refresh.rb +19 -7
  48. data/lib/mechanize/parser.rb +173 -0
  49. data/lib/mechanize/pluggable_parsers.rb +126 -83
  50. data/lib/mechanize/redirect_limit_reached_error.rb +16 -13
  51. data/lib/mechanize/redirect_not_get_or_head_error.rb +18 -16
  52. data/lib/mechanize/response_code_error.rb +16 -17
  53. data/lib/mechanize/robots_disallowed_error.rb +22 -23
  54. data/lib/mechanize/test_case.rb +659 -0
  55. data/lib/mechanize/unauthorized_error.rb +3 -0
  56. data/lib/mechanize/unsupported_scheme_error.rb +4 -6
  57. data/lib/mechanize/util.rb +0 -12
  58. data/test/htdocs/form_order_test.html +11 -0
  59. data/test/htdocs/form_test.html +2 -2
  60. data/test/htdocs/tc_links.html +1 -0
  61. data/test/test_mechanize.rb +367 -59
  62. data/test/test_mechanize_cookie.rb +69 -4
  63. data/test/test_mechanize_cookie_jar.rb +200 -124
  64. data/test/test_mechanize_download.rb +43 -0
  65. data/test/test_mechanize_file.rb +53 -45
  66. data/test/{test_mechanize_file_response.rb → test_mechanize_file_connection.rb} +2 -2
  67. data/test/test_mechanize_file_request.rb +2 -2
  68. data/test/test_mechanize_file_saver.rb +21 -0
  69. data/test/test_mechanize_form.rb +345 -46
  70. data/test/test_mechanize_form_check_box.rb +5 -4
  71. data/test/test_mechanize_form_encoding.rb +10 -16
  72. data/test/test_mechanize_form_field.rb +45 -3
  73. data/test/test_mechanize_form_file_upload.rb +20 -0
  74. data/test/test_mechanize_form_image_button.rb +2 -2
  75. data/test/test_mechanize_form_keygen.rb +32 -0
  76. data/test/test_mechanize_form_multi_select_list.rb +84 -0
  77. data/test/test_mechanize_form_option.rb +55 -0
  78. data/test/test_mechanize_form_radio_button.rb +78 -0
  79. data/test/test_mechanize_form_select_list.rb +76 -0
  80. data/test/test_mechanize_form_textarea.rb +8 -7
  81. data/test/{test_headers.rb → test_mechanize_headers.rb} +4 -2
  82. data/test/test_mechanize_history.rb +103 -0
  83. data/test/test_mechanize_http_agent.rb +525 -17
  84. data/test/test_mechanize_http_auth_challenge.rb +39 -0
  85. data/test/test_mechanize_http_auth_realm.rb +49 -0
  86. data/test/test_mechanize_http_content_disposition_parser.rb +118 -0
  87. data/test/test_mechanize_http_www_authenticate_parser.rb +146 -0
  88. data/test/test_mechanize_link.rb +10 -14
  89. data/test/test_mechanize_page.rb +118 -0
  90. data/test/test_mechanize_page_encoding.rb +48 -13
  91. data/test/test_mechanize_page_frame.rb +16 -0
  92. data/test/test_mechanize_page_link.rb +27 -19
  93. data/test/test_mechanize_page_meta_refresh.rb +26 -14
  94. data/test/test_mechanize_parser.rb +289 -0
  95. data/test/test_mechanize_pluggable_parser.rb +52 -0
  96. data/test/test_mechanize_redirect_limit_reached_error.rb +24 -0
  97. data/test/test_mechanize_redirect_not_get_or_head_error.rb +3 -7
  98. data/test/test_mechanize_subclass.rb +2 -2
  99. data/test/test_mechanize_util.rb +24 -13
  100. data/test/test_multi_select.rb +23 -22
  101. metadata +145 -114
  102. metadata.gz.sig +0 -0
  103. data/lib/mechanize/inspect.rb +0 -88
  104. data/test/helper.rb +0 -175
  105. data/test/htdocs/form_select_all.html +0 -16
  106. data/test/htdocs/form_select_none.html +0 -17
  107. data/test/htdocs/form_select_noopts.html +0 -10
  108. data/test/htdocs/iframe_test.html +0 -16
  109. data/test/htdocs/nofollow.html +0 -9
  110. data/test/htdocs/norobots.html +0 -8
  111. data/test/htdocs/rel_nofollow.html +0 -8
  112. data/test/htdocs/tc_base_images.html +0 -10
  113. data/test/htdocs/tc_images.html +0 -8
  114. data/test/htdocs/tc_no_attributes.html +0 -16
  115. data/test/htdocs/tc_radiobuttons.html +0 -17
  116. data/test/htdocs/test_bad_encoding.html +0 -52
  117. data/test/servlets.rb +0 -402
  118. data/test/ssl_server.rb +0 -48
  119. data/test/test_cookies.rb +0 -129
  120. data/test/test_form_action.rb +0 -52
  121. data/test/test_form_as_hash.rb +0 -59
  122. data/test/test_form_button.rb +0 -46
  123. data/test/test_frames.rb +0 -34
  124. data/test/test_history.rb +0 -118
  125. data/test/test_history_added.rb +0 -16
  126. data/test/test_html_unscape_forms.rb +0 -46
  127. data/test/test_if_modified_since.rb +0 -20
  128. data/test/test_images.rb +0 -19
  129. data/test/test_no_attributes.rb +0 -13
  130. data/test/test_option.rb +0 -18
  131. data/test/test_pluggable_parser.rb +0 -136
  132. data/test/test_post_form.rb +0 -37
  133. data/test/test_pretty_print.rb +0 -22
  134. data/test/test_radiobutton.rb +0 -75
  135. data/test/test_redirect_limit_reached.rb +0 -39
  136. data/test/test_referer.rb +0 -81
  137. data/test/test_relative_links.rb +0 -40
  138. data/test/test_request.rb +0 -13
  139. data/test/test_response_code.rb +0 -53
  140. data/test/test_robots.rb +0 -72
  141. data/test/test_save_file.rb +0 -48
  142. data/test/test_scheme.rb +0 -48
  143. data/test/test_select.rb +0 -119
  144. data/test/test_select_all.rb +0 -15
  145. data/test/test_select_none.rb +0 -15
  146. data/test/test_select_noopts.rb +0 -18
  147. data/test/test_set_fields.rb +0 -44
  148. data/test/test_ssl_server.rb +0 -20
metadata.gz.sig CHANGED
Binary file
@@ -1,88 +0,0 @@
1
- require 'pp'
2
-
3
- # :stopdoc:
4
- class Mechanize
5
- def pretty_print(q)
6
- q.object_group(self) {
7
- q.breakable
8
- q.pp cookie_jar
9
- q.breakable
10
- q.pp current_page
11
- }
12
- end
13
-
14
- class Page
15
- def pretty_print(q)
16
- q.object_group(self) {
17
- q.breakable
18
- q.group(1, '{url', '}') {q.breakable; q.pp uri }
19
- q.breakable
20
- q.group(1, '{meta_refresh', '}') {
21
- meta_refresh.each { |link| q.breakable; q.pp link }
22
- }
23
- q.breakable
24
- q.group(1, '{title', '}') { q.breakable; q.pp title }
25
- q.breakable
26
- q.group(1, '{iframes', '}') {
27
- iframes.each { |link| q.breakable; q.pp link }
28
- }
29
- q.breakable
30
- q.group(1, '{frames', '}') {
31
- frames.each { |link| q.breakable; q.pp link }
32
- }
33
- q.breakable
34
- q.group(1, '{links', '}') {
35
- links.each { |link| q.breakable; q.pp link }
36
- }
37
- q.breakable
38
- q.group(1, '{forms', '}') {
39
- forms.each { |form| q.breakable; q.pp form }
40
- }
41
- }
42
- end
43
-
44
- class Link
45
- def pretty_print(q)
46
- q.object_group(self) {
47
- q.breakable; q.pp text
48
- q.breakable; q.pp href
49
- }
50
- end
51
- end
52
- end
53
-
54
- class Form
55
- def pretty_print(q)
56
- q.object_group(self) {
57
- q.breakable; q.group(1, '{name', '}') { q.breakable; q.pp name }
58
- q.breakable; q.group(1, '{method', '}') { q.breakable; q.pp method }
59
- q.breakable; q.group(1, '{action', '}') { q.breakable; q.pp action }
60
- q.breakable; q.group(1, '{fields', '}') {
61
- fields.each do |field|
62
- q.breakable
63
- q.pp field
64
- end
65
- }
66
- q.breakable; q.group(1, '{radiobuttons', '}') {
67
- radiobuttons.each { |b| q.breakable; q.pp b }
68
- }
69
- q.breakable; q.group(1, '{checkboxes', '}') {
70
- checkboxes.each { |b| q.breakable; q.pp b }
71
- }
72
- q.breakable; q.group(1, '{file_uploads', '}') {
73
- file_uploads.each { |b| q.breakable; q.pp b }
74
- }
75
- q.breakable; q.group(1, '{buttons', '}') {
76
- buttons.each { |b| q.breakable; q.pp b }
77
- }
78
- }
79
- end
80
-
81
- class RadioButton
82
- def pretty_print_instance_variables
83
- [:@checked, :@name, :@value]
84
- end
85
- end
86
- end
87
- end
88
- # :startdoc:
data/test/helper.rb DELETED
@@ -1,175 +0,0 @@
1
- require 'rubygems'
2
- require 'minitest/autorun'
3
- require 'mechanize'
4
- require 'webrick/httputils'
5
- require 'servlets'
6
- require 'tmpdir'
7
- require 'tempfile'
8
-
9
- BASE_DIR = File.dirname(__FILE__)
10
-
11
- # Move this to a test base class
12
- module MechTestHelper
13
- def self.fake_page(agent)
14
- html = <<-END
15
- <html><body>
16
- <form><input type="submit" value="submit" /></form>
17
- </body></html>
18
- END
19
- html_response = { 'content-type' => 'text/html' }
20
- Mechanize::Page.new( nil, html_response, html, 200, agent )
21
- end
22
- end
23
-
24
- class Net::HTTP
25
- alias :old_do_start :do_start
26
-
27
- def do_start
28
- @started = true
29
- end
30
-
31
- SERVLETS = {
32
- '/gzip' => GzipServlet,
33
- '/form_post' => FormTest,
34
- '/basic_auth' => BasicAuthServlet,
35
- '/form post' => FormTest,
36
- '/response_code' => ResponseCodeTest,
37
- '/http_refresh' => HttpRefreshTest,
38
- '/bad_content_type' => BadContentTypeTest,
39
- '/content_type_test' => ContentTypeTest,
40
- '/referer' => RefererServlet,
41
- '/file_upload' => FileUploadTest,
42
- '/one_cookie' => OneCookieTest,
43
- '/one_cookie_no_space' => OneCookieNoSpacesTest,
44
- '/many_cookies' => ManyCookiesTest,
45
- '/many_cookies_as_string' => ManyCookiesAsStringTest,
46
- '/send_cookies' => SendCookiesTest,
47
- '/quoted_value_cookie' => QuotedValueCookieTest,
48
- '/if_modified_since' => ModifiedSinceServlet,
49
- '/http_headers' => HeaderServlet,
50
- '/infinite_redirect' => InfiniteRedirectTest,
51
- '/infinite_refresh' => InfiniteRefreshTest,
52
- '/redirect_ok' => RedirectOkTest,
53
- '/redirect' => RedirectTest,
54
- '/refresh_without_url' => RefreshWithoutUrl,
55
- '/refresh_with_empty_url' => RefreshWithEmptyUrl,
56
- '/digest_auth' => DigestAuthServlet,
57
- '/verb' => VerbServlet,
58
- }
59
-
60
- PAGE_CACHE = {}
61
-
62
- alias :old_request :request
63
-
64
- def request(request, *data, &block)
65
- url = URI.parse(request.path)
66
- path = WEBrick::HTTPUtils.unescape(url.path)
67
-
68
- path = '/index.html' if path == '/'
69
-
70
- res = ::Response.new
71
- res.query_params = url.query
72
-
73
- request.query = if 'POST' != request.method && url.query then
74
- WEBrick::HTTPUtils.parse_query url.query
75
- elsif request['content-type'] =~ /www-form-urlencoded/ then
76
- WEBrick::HTTPUtils.parse_query request.body
77
- elsif request['content-type'] =~ /boundary=(.+)/ then
78
- boundary = WEBrick::HTTPUtils.dequote $1
79
- WEBrick::HTTPUtils.parse_form_data request.body, boundary
80
- else
81
- {}
82
- end
83
-
84
- request.cookies = WEBrick::Cookie.parse(request['Cookie'])
85
-
86
- if SERVLETS[path]
87
- SERVLETS[path].new({}).send("do_#{request.method}", request, res)
88
- else
89
- filename = "htdocs#{path.gsub(/[^\/\\.\w\s]/, '_')}"
90
- unless PAGE_CACHE[filename]
91
- File.open("#{BASE_DIR}/#{filename}", 'rb') { |file|
92
- PAGE_CACHE[filename] = file.read
93
- }
94
- end
95
-
96
- res.body = PAGE_CACHE[filename]
97
- case filename
98
- when /\.txt$/
99
- res['Content-Type'] = 'text/plain'
100
- when /\.jpg$/
101
- res['Content-Type'] = 'image/jpeg'
102
- end
103
- end
104
-
105
- res['Content-Type'] ||= 'text/html'
106
- res.code ||= "200"
107
-
108
- response_klass = Net::HTTPResponse::CODE_TO_OBJ[res.code.to_s]
109
- response = response_klass.new res.http_version, res.code, res.message
110
-
111
- res.header.each do |k,v|
112
- v = v.first if v.length == 1
113
- response[k] = v
114
- end
115
-
116
- res.cookies.each do |cookie|
117
- response.add_field 'Set-Cookie', cookie.to_s
118
- end
119
-
120
- response['Content-Type'] ||= 'text/html'
121
- response['Content-Length'] = res['Content-Length'] || res.body.length.to_s
122
-
123
- io = StringIO.new(res.body)
124
- response.instance_variable_set :@socket, io
125
- def io.read clen, dest, _
126
- dest << string[0, clen]
127
- end
128
-
129
- body_exist = request.response_body_permitted? &&
130
- response_klass.body_permitted?
131
-
132
- response.instance_variable_set :@body_exist, body_exist
133
-
134
- yield response if block_given?
135
-
136
- response
137
- end
138
- end
139
-
140
- class Net::HTTPRequest
141
- attr_accessor :query, :body, :cookies, :user
142
- end
143
-
144
- class Response
145
- include Net::HTTPHeader
146
-
147
- attr_reader :code
148
- attr_accessor :body, :query, :cookies
149
- attr_accessor :query_params, :http_version
150
- attr_accessor :header
151
-
152
- def code=(c)
153
- @code = c.to_s
154
- end
155
-
156
- alias :status :code
157
- alias :status= :code=
158
-
159
- def initialize
160
- @header = {}
161
- @body = ''
162
- @code = nil
163
- @query = nil
164
- @cookies = []
165
- @http_version = '1.1'
166
- end
167
-
168
- def read_body
169
- yield body
170
- end
171
-
172
- def message
173
- ''
174
- end
175
- end
@@ -1,16 +0,0 @@
1
- <html>
2
- <body>
3
- <form name="form1" method="post" action="/form_post">
4
- <select name="list">
5
- <option value="1" selected>Option 1</option>
6
- <option value="2" selected>Option 2</option>
7
- <option value="3" selected>Option 3</option>
8
- <option value="4" selected>Option 4</option>
9
- <option value="5" selected>Option 5</option>
10
- <option value="6" selected>Option 6</option>
11
- </select>
12
- <br />
13
- <input type="submit" value="Submit" />
14
- </form>
15
- </body>
16
- </html>
@@ -1,17 +0,0 @@
1
- <html>
2
- <body>
3
- <form name="form1" method="post" action="/form_post">
4
- <select name="list">
5
- <option value="1">Option 1</option>
6
- <option value="2">Option 2</option>
7
- <option>Option No Value</option>
8
- <option value="3">Option 3</option>
9
- <option value="4">Option 4</option>
10
- <option value="5">Option 5</option>
11
- <option value="6">Option 6</option>
12
- </select>
13
- <br />
14
- <input type="submit" value="Submit" />
15
- </form>
16
- </body>
17
- </html>
@@ -1,10 +0,0 @@
1
- <html>
2
- <body>
3
- <form name="form1" method="post" action="/form_post">
4
- <select name="list">
5
- </select>
6
- <br />
7
- <input type="submit" value="Submit" />
8
- </form>
9
- </body>
10
- </html>
@@ -1,16 +0,0 @@
1
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
2
- "http://www.w3.org/TR/html4/frameset.dtd">
3
- <HTML>
4
- <HEAD>
5
- <TITLE>A simple frameset document</TITLE>
6
- </HEAD>
7
- <BODY>
8
- <IFRAME src="/file_upload.html" name="frame4">
9
- [Your user agent does not support frames or is currently configured
10
- not to display frames. However, you may visit
11
- <A href="foo.html">the related document.</A>]
12
- </IFRAME>
13
- </BODY>
14
- </HTML>
15
-
16
-
@@ -1,9 +0,0 @@
1
- <html>
2
- <head>
3
- <title>nofollow test</title>
4
- <meta name="ROBOTS" content="nofollow">
5
- </head>
6
- <body>
7
- <p>Do not follow <a href="/robots.html">this</a> or <a href="/">this</a>!</p>
8
- </body>
9
- </html>
@@ -1,8 +0,0 @@
1
- <html>
2
- <head>
3
- <title>No Robots!</title>
4
- </head>
5
- <body>
6
- <p>Go home, robot!</p>
7
- </body>
8
- </html>
@@ -1,8 +0,0 @@
1
- <html>
2
- <head>
3
- <title>rel_nofollow test</title>
4
- </head>
5
- <body>
6
- <p>You can follow <a href="/robots.html">this link</a> but not <a href="/" rel="me nofollow">this</a>!</p>
7
- </body>
8
- </html>
@@ -1,10 +0,0 @@
1
- <html>
2
- <head>
3
- <base href="http://localhost/">
4
- </head>
5
- <body>
6
- <img src="a.jpg">
7
- <img src="b.gif">
8
- </body>
9
- </html>
10
-
@@ -1,8 +0,0 @@
1
- <html>
2
- <head>
3
- </head>
4
- <body>
5
- <img src="a.jpg">
6
- <img src="b.gif">
7
- </body>
8
- </html>
@@ -1,16 +0,0 @@
1
- <html>
2
- <meta>
3
- <head><title></title>
4
- <body>
5
- <a>Hello</a>
6
- <a><img /></a>
7
- <form>
8
- <input />
9
- <select>
10
- <option />
11
- </select>
12
- <textarea></textarea>
13
- </form>
14
- <frame></frame>
15
- </body>
16
- </html>
@@ -1,17 +0,0 @@
1
- <html>
2
- <head><title>tc_radiobuttons.html</title></head>
3
- <body>
4
- <form name="form1" method="post" action="/form_post">
5
- Gender:<br />
6
- M: <input type="radio" name="gender" value="male" /><br />
7
- F: <input type="radio" name="gender" value="female" /><br />
8
- Your one favorite color:<br />
9
- Green: <input type="radio" name="color" value="green" /><br />
10
- Red: <input type="radio" name="color" value="red" /><br />
11
- Blue: <input type="radio" name="color" value="blue" /><br />
12
- Yellow: <input type="radio" name="color" value="yellow" /><br />
13
- Brown: <input type="radio" name="color" value="brown" /><br />
14
- <input type="submit" value="Submit" />
15
- </form>
16
- </body>
17
- </html>
@@ -1,52 +0,0 @@
1
- <html>
2
- <head>
3
- <meta http-equiv="Content-Type" content="text/html;charset=utf-8; charset=utf-8"/>
4
- <title>Page Title</title>
5
- </head>
6
- <body>
7
- <h1>Post Form 1</h1>
8
- <form name="post_form1" method="post" action="/form_post?a=b&amp;b=c">
9
- <table>
10
- <tr>
11
- <td>First Name</td>
12
- <td><input type="text" name="first_name" /></td>
13
- </tr>
14
- </table><br />
15
- <input type="submit" value="Submit" />
16
- </form>
17
-
18
- <h1>Post Form 2</h1>
19
- <form name="post_form2" method="get" action="/form_post?a=b&amp;b=c">
20
- <table>
21
- <tr>
22
- <td>First Name</td>
23
- <td><input type="text" name="first_name" /></td>
24
- </tr>
25
- </table><br />
26
- <input type="submit" value="Submit" />
27
- </form>
28
-
29
- <h1>Post Form 3</h1>
30
- <form name="post_form3" method="post" action="/form_post?a=b&b=c">
31
- <table>
32
- <tr>
33
- <td>First Name</td>
34
- <td><input type="text" name="first_name" /></td>
35
- </tr>
36
- </table><br />
37
- <input type="submit" value="Submit" />
38
- </form>
39
-
40
- <h1>Post Form 4</h1>
41
- <form name="post_form4" method="post" action="/form_post#1">
42
- <table>
43
- <tr>
44
- <td>First Name</td>
45
- <td><input type="text" name="first_name" /></td>
46
- </tr>
47
- </table><br />
48
- <input type="submit" value="Submit" />
49
- </form>
50
- </body>
51
- </html>
52
-