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
@@ -1,40 +0,0 @@
1
- require "helper"
2
-
3
- class TestRelativeLinks < MiniTest::Unit::TestCase
4
- def setup
5
- @agent = Mechanize.new
6
- end
7
-
8
- def test_dot_dot_slash
9
- @page = @agent.get("http://localhost/relative/tc_relative_links.html")
10
- @page.links.first.click
11
- assert_equal('http://localhost/tc_relative_links.html', @agent.current_page.uri.to_s)
12
- end
13
-
14
- def test_too_many_dots
15
- @page = @agent.get("http://localhost/relative/tc_relative_links.html")
16
- page = @page.link_with(:text => 'too many dots').click
17
-
18
- assert_equal('http://localhost/tc_relative_links.html', page.uri.to_s)
19
- end
20
-
21
- def test_go_forward
22
- @page = @agent.get("http://localhost/tc_relative_links.html")
23
- @page = @page.links.first.click
24
- assert_equal('http://localhost/relative/tc_relative_links.html', @agent.current_page.uri.to_s)
25
- end
26
-
27
- def test_frame_dot_dot_slash
28
- @page = @agent.get("http://localhost/relative/tc_relative_links.html")
29
- @agent.click(@page.frame_with(:text => 'frame1'))
30
- assert_equal('http://localhost/tc_relative_links.html', @agent.current_page.uri.to_s)
31
- end
32
-
33
- def test_frame_forward_back_forward
34
- @page = @agent.get("http://localhost/tc_relative_links.html")
35
- @agent.click @page.frame_with(:name => 'frame1')
36
- assert_equal('http://localhost/relative/tc_relative_links.html', @agent.current_page.uri.to_s)
37
- @agent.click @page.frame_with(:name => 'frame2')
38
- assert_equal('http://localhost/relative/tc_relative_links.html', @agent.current_page.uri.to_s)
39
- end
40
- end
data/test/test_request.rb DELETED
@@ -1,13 +0,0 @@
1
- require "helper"
2
-
3
- class RequestTest < MiniTest::Unit::TestCase
4
- def setup
5
- @agent = Mechanize.new
6
- end
7
-
8
- def test_uri_is_not_polluted
9
- uri = URI.parse('http://localhost/')
10
- @agent.get(uri, {'q' => 'Ruby'})
11
- assert_equal 'http://localhost/', uri.to_s
12
- end
13
- end
@@ -1,53 +0,0 @@
1
- require "helper"
2
-
3
- class ResponseCodeMechTest < MiniTest::Unit::TestCase
4
- def setup
5
- @mech = Mechanize.new
6
- end
7
-
8
- def test_eof_error_loop
9
- assert_raises(Net::HTTP::Persistent::Error) {
10
- @mech.get("http://localhost/http_headers?Content-Length=300")
11
- }
12
- end
13
-
14
- def test_redirect
15
- @mech.get("http://localhost/response_code?code=300")
16
- assert_equal("http://localhost/index.html",
17
- @mech.current_page.uri.to_s)
18
-
19
- @mech.get("http://localhost/response_code?code=301")
20
- assert_equal("http://localhost/index.html",
21
- @mech.current_page.uri.to_s)
22
-
23
- @mech.get("http://localhost/response_code?code=302")
24
- assert_equal("http://localhost/index.html",
25
- @mech.current_page.uri.to_s)
26
-
27
- @mech.get("http://localhost/response_code?code=303")
28
- assert_equal("http://localhost/index.html",
29
- @mech.current_page.uri.to_s)
30
-
31
- @mech.get("http://localhost/response_code?code=307")
32
- assert_equal("http://localhost/index.html",
33
- @mech.current_page.uri.to_s)
34
- end
35
-
36
- def test_do_not_follow_redirect
37
- @mech.redirect_ok = false
38
-
39
- @mech.get("http://localhost/response_code?code=302")
40
- assert_equal("http://localhost/response_code?code=302",
41
- @mech.current_page.uri.to_s)
42
- end
43
-
44
- def test_error
45
- e = assert_raises Mechanize::ResponseCodeError do
46
- @mech.get "http://localhost/response_code?code=500"
47
- end
48
-
49
- assert_equal "500", e.response_code
50
- end
51
-
52
- end
53
-
data/test/test_robots.rb DELETED
@@ -1,72 +0,0 @@
1
- require "helper"
2
-
3
- class TestRobots < MiniTest::Unit::TestCase
4
-
5
- def setup
6
- @mech = Mechanize.new
7
- @robot = Mechanize.new { |a|
8
- a.robots = true
9
- }
10
- end
11
-
12
- def test_robots
13
- assert_equal "Welcome!", @robot.get("http://localhost/robots.html").title
14
-
15
- assert_raises Mechanize::RobotsDisallowedError do
16
- @robot.get("http://localhost/norobots.html")
17
- end
18
- end
19
-
20
- def test_robots_allowed_eh
21
- allowed = URI.parse 'http://localhost/robots.html'
22
- disallowed = URI.parse 'http://localhost/norobots.html'
23
- assert @mech.agent.robots_allowed?(allowed)
24
- assert !@mech.agent.robots_allowed?(disallowed)
25
-
26
- assert !@mech.agent.robots_disallowed?(allowed)
27
- assert @mech.agent.robots_disallowed?(disallowed)
28
- end
29
-
30
- def test_noindex
31
- @mech.get("http://localhost/noindex.html")
32
-
33
- assert @robot.agent.robots_allowed? URI("http://localhost/noindex.html")
34
-
35
- assert_raises Mechanize::RobotsDisallowedError do
36
- @robot.get("http://localhost/noindex.html")
37
- end
38
- end
39
-
40
- def test_nofollow
41
- page = @mech.get("http://localhost/nofollow.html")
42
-
43
- page.links[0].click
44
- page.links[1].click
45
-
46
- page = @robot.get("http://localhost/nofollow.html")
47
-
48
- assert_raises Mechanize::RobotsDisallowedError do
49
- page.links[0].click
50
- end
51
- assert_raises Mechanize::RobotsDisallowedError do
52
- page.links[1].click
53
- end
54
- end
55
-
56
- def test_rel_nofollow
57
- page = @mech.get("http://localhost/rel_nofollow.html")
58
-
59
- page.links[0].click
60
- page.links[1].click
61
-
62
- page = @robot.get("http://localhost/rel_nofollow.html")
63
-
64
- page.links[0].click
65
-
66
- assert_raises Mechanize::RobotsDisallowedError do
67
- page.links[1].click
68
- end
69
- end
70
-
71
- end
72
-
@@ -1,48 +0,0 @@
1
- require "helper"
2
-
3
- class TestSaveFile < MiniTest::Unit::TestCase
4
- def setup
5
- @agent = Mechanize.new
6
- end
7
-
8
- def test_save_file
9
- page = @agent.get('http://localhost:2000/form_no_action.html')
10
- length = page.response['Content-Length']
11
- page.save_as("test.html")
12
- file_length = nil
13
- File.open("test.html", "r") { |f| file_length = f.read.length }
14
- FileUtils.rm("test.html")
15
- assert_equal(length.to_i, file_length)
16
- end
17
-
18
- def test_save_file_default
19
- page = Mechanize::File.new(
20
- URI.parse('http://localhost/test.html'),
21
- {},
22
- "hello"
23
- )
24
- page.save
25
- assert(File.exists?('test.html'))
26
- page.save
27
- assert(File.exists?('test.html.1'))
28
- page.save
29
- assert(File.exists?('test.html.2'))
30
- FileUtils.rm("test.html")
31
- FileUtils.rm("test.html.1")
32
- FileUtils.rm("test.html.2")
33
- end
34
-
35
- def test_save_file_default_with_dots
36
- page = Mechanize::File.new(
37
- URI.parse('http://localhost/../test.html'),
38
- {},
39
- "hello"
40
- )
41
- page.save
42
- assert(File.exists?('test.html'))
43
- page.save
44
- assert(File.exists?('test.html.1'))
45
- FileUtils.rm("test.html")
46
- FileUtils.rm("test.html.1")
47
- end
48
- end
data/test/test_scheme.rb DELETED
@@ -1,48 +0,0 @@
1
- require "helper"
2
-
3
- class SchemeTest < MiniTest::Unit::TestCase
4
- def setup
5
- @agent = Mechanize.new
6
- @agent.log = Class.new(Object) do
7
- def method_missing(*args)
8
- end
9
- end.new
10
- end
11
-
12
- def test_file_scheme
13
- f = File.expand_path(__FILE__)
14
- page = @agent.get("file://#{f}")
15
- assert_equal(File.read(f), page.body)
16
- end
17
-
18
- def test_file_scheme_parses_html
19
- f = File.expand_path(
20
- File.join(File.dirname(__FILE__), "htdocs", 'google.html'))
21
- page = @agent.get("file://#{f}")
22
- assert_equal(File.read(f), page.body)
23
- assert_kind_of(Mechanize::Page, page)
24
- end
25
-
26
- def test_file_scheme_supports_directories
27
- f = File.expand_path(File.join(File.dirname(__FILE__), "htdocs"))
28
- page = @agent.get("file://#{f}")
29
- assert_equal(Dir[File.join(f, '*')].length, page.links.length)
30
- assert_kind_of(Mechanize::Page, page)
31
- end
32
-
33
- def test_click_file_link
34
- f = File.expand_path(File.join(File.dirname(__FILE__), "htdocs"))
35
- page = @agent.get("file://#{f}")
36
- link = page.links.find { |l| l.text =~ /tc_follow_meta/ }
37
-
38
- path = URI.parse(link.href).path
39
-
40
- page = link.click
41
- assert_equal(File.read(path), page.body)
42
-
43
- link = page.meta_refresh.first
44
- page = @agent.click(link)
45
-
46
- assert_equal("http://localhost/index.html", @agent.history.last.uri.to_s)
47
- end
48
- end
data/test/test_select.rb DELETED
@@ -1,119 +0,0 @@
1
- require "helper"
2
-
3
- class SelectTest < MiniTest::Unit::TestCase
4
- def setup
5
- @agent = Mechanize.new
6
- @page = @agent.get("http://localhost/form_select.html")
7
- @form = @page.forms.first
8
- end
9
-
10
- def test_option_with
11
- o = @form.field_with(:name => 'list').option_with(:value => '1')
12
- assert_equal '1', o.value
13
- end
14
-
15
- def test_options_with
16
- os = @form.field_with(:name => 'list').options_with(:value => /1|2/)
17
- assert_equal ['1', '2'].sort, os.map { |x| x.value }.sort
18
- end
19
-
20
- def test_select_none
21
- @form.fields_with(:name => 'list').first.select_none
22
- assert_equal('1', @form.list)
23
- end
24
-
25
- def test_select_all
26
- @form.fields_with(:name => 'list').first.select_all
27
- assert_equal('6', @form.list)
28
- end
29
-
30
- def test_correct_class
31
- assert_instance_of(Mechanize::Form::SelectList,
32
- @form.field_with(:name => 'list'))
33
- end
34
-
35
- def test_click_all
36
- @form.field_with(:name => 'list').options.each { |o| o.click }
37
-
38
- option_list = @form.field_with(:name => 'list').options
39
-
40
- assert_equal(6, option_list.length)
41
- assert_equal(option_list.last.value, @form.list)
42
-
43
- page = @agent.submit(@form)
44
-
45
- assert_equal(1, page.links.length)
46
- assert_equal(1, page.links_with(:text => "list:#{option_list.last}").length)
47
- end
48
-
49
- def test_select_default
50
- assert_equal("2", @form.list)
51
- page = @agent.submit(@form)
52
- assert_equal(1, page.links.length)
53
- assert_equal(1, page.links_with(:text => 'list:2').length)
54
- end
55
-
56
- def test_select_one
57
- @form.list = 'Aaron'
58
- assert_equal('Aaron', @form.list)
59
- page = @agent.submit(@form)
60
- assert_equal(1, page.links.length)
61
- assert_equal('list:Aaron', page.links.first.text)
62
- end
63
-
64
- def test_select_two
65
- @form.list = ['1', 'Aaron']
66
- assert_equal('1', @form.list)
67
- page = @agent.submit(@form)
68
- assert_equal(1, page.links.length)
69
- assert_equal(1, page.links_with(:text => 'list:1').length)
70
- end
71
-
72
- def test_select_three
73
- @form.list = ['1', '2', '3']
74
- assert_equal('1', @form.list)
75
- page = @agent.submit(@form)
76
- assert_equal(1, page.links.length)
77
- assert_equal(1, page.links_with(:text => 'list:1').length)
78
- end
79
-
80
- def test_select_three_twice
81
- @form.list = ['1', '2', '3']
82
- @form.list = ['1', '2', '3']
83
- assert_equal('1', @form.list)
84
- page = @agent.submit(@form)
85
- assert_equal(1, page.links.length)
86
- assert_equal(1, page.links_with(:text => 'list:1').length)
87
- end
88
-
89
- def test_select_with_empty_value
90
- list = @form.field_with(:name => 'list')
91
- list.options.last.instance_variable_set(:@value, '')
92
- list.options.last.tick
93
- page = @agent.submit(@form)
94
- assert_equal(1, page.links.length)
95
- assert_equal(1, page.links_with(:text => 'list:').length)
96
- end
97
-
98
- def test_select_with_click
99
- @form.list = ['1', 'Aaron']
100
- @form.field_with(:name => 'list').options[3].tick
101
- assert_equal('4', @form.list)
102
- page = @agent.submit(@form)
103
- assert_equal(1, page.links.length)
104
- assert_equal(1, page.links_with(:text => 'list:4').length)
105
- end
106
-
107
- def test_click_twice
108
- list = @form.field_with(:name => 'list')
109
- list.options[0].click
110
- assert_equal('1', @form.list)
111
- list.options[1].click
112
- assert_equal('2', @form.list)
113
- list.options.last.click
114
- assert_equal('6', @form.list)
115
- assert_equal(1, list.selected_options.length)
116
- list.select_all
117
- assert_equal(1, list.selected_options.length)
118
- end
119
- end
@@ -1,15 +0,0 @@
1
- require "helper"
2
- class SelectAllTest < MiniTest::Unit::TestCase
3
- def setup
4
- @agent = Mechanize.new
5
- @page = @agent.get("http://localhost/form_select_all.html")
6
- @form = @page.forms.first
7
- end
8
-
9
- def test_select_default
10
- assert_equal("6", @form.list)
11
- page = @agent.submit(@form)
12
- assert_equal(1, page.links.length)
13
- assert_equal(1, page.links_with(:text => 'list:6').length)
14
- end
15
- end
@@ -1,15 +0,0 @@
1
- require "helper"
2
- class SelectNoneTest < MiniTest::Unit::TestCase
3
- def setup
4
- @agent = Mechanize.new
5
- @page = @agent.get("http://localhost/form_select_none.html")
6
- @form = @page.forms.first
7
- end
8
-
9
- def test_select_default
10
- assert_equal("1", @form.list)
11
- page = @agent.submit(@form)
12
- assert_equal(1, page.links.length)
13
- assert_equal(1, page.links_with(:text => 'list:1').length)
14
- end
15
- end
@@ -1,18 +0,0 @@
1
- require "helper"
2
-
3
- class SelectNoOptionsTest < MiniTest::Unit::TestCase
4
- def setup
5
- @agent = Mechanize.new
6
- @page = @agent.get("http://localhost/form_select_noopts.html")
7
- @form = @page.forms.first
8
- end
9
-
10
- def test_select_default
11
- assert @form.field('list')
12
- assert_nil @form.list
13
-
14
- page = @agent.submit(@form)
15
-
16
- assert_equal(0, page.links.length)
17
- end
18
- end