mechanize 0.9.3 → 1.0.0
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.
- data/CHANGELOG.rdoc +21 -1
- data/EXAMPLES.rdoc +32 -18
- data/GUIDE.rdoc +11 -10
- data/Manifest.txt +60 -49
- data/README.rdoc +4 -4
- data/Rakefile +12 -22
- data/examples/flickr_upload.rb +5 -5
- data/examples/mech-dump.rb +1 -1
- data/examples/proxy_req.rb +1 -1
- data/examples/rubyforge.rb +3 -2
- data/examples/spider.rb +1 -1
- data/lib/mechanize.rb +657 -4
- data/lib/mechanize/chain.rb +33 -0
- data/lib/mechanize/chain/auth_headers.rb +78 -0
- data/lib/mechanize/chain/body_decoding_handler.rb +48 -0
- data/lib/mechanize/chain/connection_resolver.rb +77 -0
- data/lib/mechanize/chain/custom_headers.rb +21 -0
- data/lib/{www/mechanize → mechanize}/chain/handler.rb +1 -1
- data/lib/mechanize/chain/header_resolver.rb +57 -0
- data/lib/mechanize/chain/parameter_resolver.rb +22 -0
- data/lib/{www/mechanize → mechanize}/chain/post_connect_hook.rb +0 -0
- data/lib/mechanize/chain/pre_connect_hook.rb +20 -0
- data/lib/mechanize/chain/request_resolver.rb +30 -0
- data/lib/mechanize/chain/response_body_parser.rb +38 -0
- data/lib/mechanize/chain/response_header_handler.rb +48 -0
- data/lib/mechanize/chain/response_reader.rb +39 -0
- data/lib/mechanize/chain/ssl_resolver.rb +40 -0
- data/lib/mechanize/chain/uri_resolver.rb +75 -0
- data/lib/mechanize/content_type_error.rb +14 -0
- data/lib/mechanize/cookie.rb +78 -0
- data/lib/mechanize/cookie_jar.rb +186 -0
- data/lib/mechanize/file.rb +71 -0
- data/lib/mechanize/file_response.rb +60 -0
- data/lib/mechanize/file_saver.rb +37 -0
- data/lib/mechanize/form.rb +455 -0
- data/lib/mechanize/form/button.rb +9 -0
- data/lib/mechanize/form/check_box.rb +11 -0
- data/lib/mechanize/form/field.rb +38 -0
- data/lib/mechanize/form/file_upload.rb +23 -0
- data/lib/mechanize/form/image_button.rb +21 -0
- data/lib/mechanize/form/multi_select_list.rb +67 -0
- data/lib/mechanize/form/option.rb +49 -0
- data/lib/mechanize/form/radio_button.rb +48 -0
- data/lib/mechanize/form/select_list.rb +68 -0
- data/lib/mechanize/headers.rb +11 -0
- data/lib/mechanize/history.rb +65 -0
- data/lib/mechanize/inspect.rb +88 -0
- data/lib/{www/mechanize → mechanize}/monkey_patch.rb +4 -6
- data/lib/mechanize/page.rb +300 -0
- data/lib/mechanize/page/base.rb +8 -0
- data/lib/mechanize/page/frame.rb +20 -0
- data/lib/mechanize/page/image.rb +26 -0
- data/lib/mechanize/page/label.rb +20 -0
- data/lib/mechanize/page/link.rb +48 -0
- data/lib/mechanize/page/meta.rb +50 -0
- data/lib/mechanize/pluggable_parsers.rb +101 -0
- data/lib/mechanize/redirect_limit_reached_error.rb +16 -0
- data/lib/mechanize/redirect_not_get_or_head_error.rb +18 -0
- data/lib/mechanize/response_code_error.rb +22 -0
- data/lib/mechanize/unsupported_scheme_error.rb +8 -0
- data/lib/mechanize/util.rb +69 -0
- data/test/chain/test_argument_validator.rb +3 -3
- data/test/chain/test_auth_headers.rb +25 -0
- data/test/chain/test_custom_headers.rb +3 -3
- data/test/chain/test_header_resolver.rb +5 -4
- data/test/chain/test_parameter_resolver.rb +5 -5
- data/test/chain/test_request_resolver.rb +5 -5
- data/test/chain/test_response_reader.rb +4 -4
- data/test/helper.rb +7 -4
- data/test/htdocs/tc_bad_charset.html +9 -0
- data/test/htdocs/tc_charset.html +6 -0
- data/test/htdocs/tc_field_precedence.html +11 -0
- data/test/htdocs/tc_meta_in_body.html +9 -0
- data/test/htdocs/test_bad_encoding.html +52 -0
- data/test/servlets.rb +2 -2
- data/test/test_authenticate.rb +4 -4
- data/test/test_bad_links.rb +2 -2
- data/test/test_blank_form.rb +2 -2
- data/test/test_checkboxes.rb +2 -2
- data/test/test_content_type.rb +3 -3
- data/test/test_cookie_class.rb +13 -13
- data/test/test_cookie_jar.rb +81 -119
- data/test/test_cookies.rb +2 -2
- data/test/test_encoded_links.rb +2 -2
- data/test/test_errors.rb +3 -3
- data/test/test_field_precedence.rb +30 -0
- data/test/test_follow_meta.rb +23 -12
- data/test/test_form_action.rb +10 -2
- data/test/test_form_as_hash.rb +2 -2
- data/test/test_form_button.rb +3 -3
- data/test/test_form_no_inputname.rb +2 -2
- data/test/test_forms.rb +9 -2
- data/test/test_frames.rb +2 -2
- data/test/test_get_headers.rb +2 -2
- data/test/test_gzipping.rb +3 -3
- data/test/test_hash_api.rb +2 -2
- data/test/test_history.rb +8 -8
- data/test/test_history_added.rb +2 -2
- data/test/test_html_unscape_forms.rb +15 -8
- data/test/test_if_modified_since.rb +2 -2
- data/test/test_keep_alive.rb +2 -2
- data/test/test_links.rb +11 -3
- data/test/test_mech.rb +3 -3
- data/test/test_mech_proxy.rb +16 -0
- data/test/test_mechanize_file.rb +8 -8
- data/test/test_meta.rb +20 -20
- data/test/test_multi_select.rb +2 -2
- data/test/test_no_attributes.rb +2 -2
- data/test/test_option.rb +2 -2
- data/test/test_page.rb +9 -4
- data/test/test_pluggable_parser.rb +15 -15
- data/test/test_post_form.rb +2 -2
- data/test/test_pretty_print.rb +3 -3
- data/test/test_radiobutton.rb +2 -2
- data/test/test_redirect_limit_reached.rb +2 -4
- data/test/test_redirect_verb_handling.rb +9 -5
- data/test/test_referer.rb +2 -2
- data/test/test_relative_links.rb +2 -2
- data/test/test_request.rb +2 -2
- data/test/test_response_code.rb +4 -4
- data/test/test_save_file.rb +4 -4
- data/test/test_scheme.rb +5 -5
- data/test/test_select.rb +13 -3
- data/test/test_select_all.rb +2 -2
- data/test/test_select_none.rb +2 -2
- data/test/test_select_noopts.rb +2 -2
- data/test/test_set_fields.rb +2 -2
- data/test/test_ssl_server.rb +2 -2
- data/test/test_subclass.rb +18 -2
- data/test/test_textarea.rb +2 -2
- data/test/test_upload.rb +2 -2
- data/test/test_util.rb +7 -0
- data/test/test_verbs.rb +3 -3
- metadata +70 -55
- data/lib/www/mechanize.rb +0 -589
- data/lib/www/mechanize/chain.rb +0 -34
- data/lib/www/mechanize/chain/auth_headers.rb +0 -80
- data/lib/www/mechanize/chain/body_decoding_handler.rb +0 -48
- data/lib/www/mechanize/chain/connection_resolver.rb +0 -78
- data/lib/www/mechanize/chain/custom_headers.rb +0 -23
- data/lib/www/mechanize/chain/header_resolver.rb +0 -53
- data/lib/www/mechanize/chain/parameter_resolver.rb +0 -23
- data/lib/www/mechanize/chain/pre_connect_hook.rb +0 -22
- data/lib/www/mechanize/chain/request_resolver.rb +0 -32
- data/lib/www/mechanize/chain/response_body_parser.rb +0 -40
- data/lib/www/mechanize/chain/response_header_handler.rb +0 -50
- data/lib/www/mechanize/chain/response_reader.rb +0 -41
- data/lib/www/mechanize/chain/ssl_resolver.rb +0 -42
- data/lib/www/mechanize/chain/uri_resolver.rb +0 -77
- data/lib/www/mechanize/content_type_error.rb +0 -16
- data/lib/www/mechanize/cookie.rb +0 -72
- data/lib/www/mechanize/cookie_jar.rb +0 -191
- data/lib/www/mechanize/file.rb +0 -73
- data/lib/www/mechanize/file_response.rb +0 -62
- data/lib/www/mechanize/file_saver.rb +0 -39
- data/lib/www/mechanize/form.rb +0 -360
- data/lib/www/mechanize/form/button.rb +0 -8
- data/lib/www/mechanize/form/check_box.rb +0 -13
- data/lib/www/mechanize/form/field.rb +0 -28
- data/lib/www/mechanize/form/file_upload.rb +0 -24
- data/lib/www/mechanize/form/image_button.rb +0 -23
- data/lib/www/mechanize/form/multi_select_list.rb +0 -69
- data/lib/www/mechanize/form/option.rb +0 -51
- data/lib/www/mechanize/form/radio_button.rb +0 -38
- data/lib/www/mechanize/form/select_list.rb +0 -45
- data/lib/www/mechanize/headers.rb +0 -12
- data/lib/www/mechanize/history.rb +0 -67
- data/lib/www/mechanize/inspect.rb +0 -90
- data/lib/www/mechanize/page.rb +0 -176
- data/lib/www/mechanize/page/base.rb +0 -10
- data/lib/www/mechanize/page/frame.rb +0 -22
- data/lib/www/mechanize/page/link.rb +0 -50
- data/lib/www/mechanize/page/meta.rb +0 -51
- data/lib/www/mechanize/pluggable_parsers.rb +0 -103
- data/lib/www/mechanize/redirect_limit_reached_error.rb +0 -18
- data/lib/www/mechanize/redirect_not_get_or_head_error.rb +0 -20
- data/lib/www/mechanize/response_code_error.rb +0 -25
- data/lib/www/mechanize/unsupported_scheme_error.rb +0 -10
- data/lib/www/mechanize/util.rb +0 -76
- data/mechanize.gemspec +0 -42
data/CHANGELOG.rdoc
CHANGED
@@ -1,10 +1,30 @@
|
|
1
1
|
= Mechanize CHANGELOG
|
2
2
|
|
3
|
-
===
|
3
|
+
=== 1.0.0
|
4
|
+
|
5
|
+
* New Features:
|
6
|
+
|
7
|
+
* An optional verb may be passed to Mechanize#get GH #26
|
8
|
+
* The WWW constant is deprecated. Switch to the top level constant Mechanize
|
9
|
+
* SelectList#option_with and options_with for finding options
|
10
|
+
|
11
|
+
* Bug Fixes:
|
12
|
+
|
13
|
+
* Rescue errors from bogus encodings
|
14
|
+
* 7bit content-encoding support. Thanks sporkmonger! GH #2
|
15
|
+
* Fixed a bug with iconv conversion. Thanks awesomeman! GH #9
|
16
|
+
* meta redirects outside the head are not followed. GH #13
|
17
|
+
* Form submissions work with nil page encodings. GH #25
|
18
|
+
* Fixing default values with serialized cookies. GH #3
|
19
|
+
* Checkboxes and fields are sorted by page appearance before submitting. #11
|
20
|
+
|
21
|
+
=== 0.9.3
|
4
22
|
|
5
23
|
* Bug Fixes:
|
6
24
|
|
7
25
|
* Do not apply encoding if encoding equals 'none' Thanks Akinori MUSHA!
|
26
|
+
* Fixed Page#encoding= when changing the value from or to nil. Made
|
27
|
+
it return the assigned value while at it. (Akinori MUSHA)
|
8
28
|
* Custom request headers may be supplied WWW::Mechanize#request_headers
|
9
29
|
RF #24516
|
10
30
|
* HTML Parser may be set on a per instance level WWW::Mechanize#html_parser
|
data/EXAMPLES.rdoc
CHANGED
@@ -1,10 +1,15 @@
|
|
1
|
-
=
|
1
|
+
= Mechanize examples
|
2
|
+
|
3
|
+
Note: Several examples show methods chained to the end of do/end blocks.
|
4
|
+
Do...end is the same as curly braces ({...}). For example, do ... end.submit
|
5
|
+
is the same as { ... }.submit.
|
2
6
|
|
3
7
|
== Google
|
8
|
+
|
4
9
|
require 'rubygems'
|
5
10
|
require 'mechanize'
|
6
11
|
|
7
|
-
a =
|
12
|
+
a = Mechanize.new { |agent|
|
8
13
|
agent.user_agent_alias = 'Mac Safari'
|
9
14
|
}
|
10
15
|
|
@@ -20,10 +25,13 @@
|
|
20
25
|
|
21
26
|
== Rubyforge
|
22
27
|
|
23
|
-
|
28
|
+
require 'rubygems'
|
29
|
+
require 'mechanize'
|
30
|
+
|
31
|
+
a = Mechanize.new
|
24
32
|
a.get('http://rubyforge.org/') do |page|
|
25
33
|
# Click the login link
|
26
|
-
login_page = a.click(page.
|
34
|
+
login_page = a.click(page.link_with(:text => /Log In/))
|
27
35
|
|
28
36
|
# Submit the login form
|
29
37
|
my_page = login_page.form_with(:action => '/account/login.php') do |f|
|
@@ -41,25 +49,30 @@
|
|
41
49
|
== File Upload
|
42
50
|
Upload a file to flickr.
|
43
51
|
|
44
|
-
|
52
|
+
require 'rubygems'
|
53
|
+
require 'mechanize'
|
54
|
+
|
55
|
+
abort "#{$0} login passwd filename" if (ARGV.size != 3)
|
56
|
+
|
57
|
+
a = Mechanize.new { |agent|
|
45
58
|
# Flickr refreshes after login
|
46
59
|
agent.follow_meta_refresh = true
|
47
60
|
}
|
48
|
-
|
61
|
+
|
49
62
|
a.get('http://flickr.com/') do |home_page|
|
50
|
-
signin_page = a.click(home_page.
|
51
|
-
|
63
|
+
signin_page = a.click(home_page.link_with(:text => /Sign In/))
|
64
|
+
|
52
65
|
my_page = signin_page.form_with(:name => 'login_form') do |form|
|
53
66
|
form.login = ARGV[0]
|
54
67
|
form.passwd = ARGV[1]
|
55
68
|
end.submit
|
56
|
-
|
69
|
+
|
57
70
|
# Click the upload link
|
58
|
-
upload_page = a.click(my_page.
|
59
|
-
|
71
|
+
upload_page = a.click(my_page.link_with(:text => /Upload/))
|
72
|
+
|
60
73
|
# We want the basic upload page.
|
61
|
-
upload_page = a.click(upload_page.
|
62
|
-
|
74
|
+
upload_page = a.click(upload_page.link_with(:text => /basic Uploader/))
|
75
|
+
|
63
76
|
# Upload the file
|
64
77
|
upload_page.form_with(:method => 'POST') do |upload_form|
|
65
78
|
upload_form.file_uploads.first.file_name = ARGV[2]
|
@@ -74,7 +87,7 @@ This example shows you how:
|
|
74
87
|
require 'mechanize'
|
75
88
|
require 'rubyful_soup'
|
76
89
|
|
77
|
-
class SoupParser <
|
90
|
+
class SoupParser < Mechanize::Page
|
78
91
|
attr_reader :soup
|
79
92
|
def initialize(uri = nil, response = nil, body = nil, code = nil)
|
80
93
|
@soup = BeautifulSoup.new(body)
|
@@ -82,7 +95,7 @@ This example shows you how:
|
|
82
95
|
end
|
83
96
|
end
|
84
97
|
|
85
|
-
agent =
|
98
|
+
agent = Mechanize.new
|
86
99
|
agent.pluggable_parser.html = SoupParser
|
87
100
|
|
88
101
|
Now all HTML pages will be parsed with the SoupParser class, and automatically
|
@@ -94,7 +107,7 @@ Beautiful Soup for that page.
|
|
94
107
|
require 'rubygems'
|
95
108
|
require 'mechanize'
|
96
109
|
|
97
|
-
agent =
|
110
|
+
agent = Mechanize.new
|
98
111
|
agent.set_proxy('localhost', '8000')
|
99
112
|
page = agent.get(ARGV[0])
|
100
113
|
puts page.body
|
@@ -108,9 +121,10 @@ possible exceptions).
|
|
108
121
|
|
109
122
|
This example also demonstrates subclassing Mechanize.
|
110
123
|
|
124
|
+
require 'rubygems'
|
111
125
|
require 'mechanize'
|
112
126
|
|
113
|
-
class TestMech <
|
127
|
+
class TestMech < Mechanize
|
114
128
|
def process
|
115
129
|
get 'http://rubyforge.org/'
|
116
130
|
search_form = page.forms.first
|
@@ -154,7 +168,7 @@ openssl.exe pkcs12 -in input_file.p12 -clcerts -out example.cer -nokeys
|
|
154
168
|
require 'mechanize'
|
155
169
|
|
156
170
|
# create Mechanize instance
|
157
|
-
agent =
|
171
|
+
agent = Mechanize.new
|
158
172
|
|
159
173
|
# set the path of the certificate file
|
160
174
|
agent.cert = 'example.cer'
|
data/GUIDE.rdoc
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
= Getting Started With
|
1
|
+
= Getting Started With Mechanize
|
2
2
|
This guide is meant to get you started using Mechanize. By the end of this
|
3
3
|
guide, you should be able to fetch pages, click links, fill out and submit
|
4
4
|
forms, scrape data, and many other hopefully useful things. This guide
|
@@ -11,7 +11,7 @@ instantiate a new mechanize object:
|
|
11
11
|
require 'rubygems'
|
12
12
|
require 'mechanize'
|
13
13
|
|
14
|
-
agent =
|
14
|
+
agent = Mechanize.new
|
15
15
|
Now we'll use the agent we've created to fetch a page. Let's fetch google
|
16
16
|
with our mechanize agent:
|
17
17
|
page = agent.get('http://google.com/')
|
@@ -34,18 +34,18 @@ Now that we've fetched google's homepage, lets try listing all of the links:
|
|
34
34
|
We can list the links, but Mechanize gives a few shortcuts to help us find a
|
35
35
|
link to click on. Lets say we wanted to click the link whose text is 'News'.
|
36
36
|
Normally, we would have to do this:
|
37
|
-
page = agent.
|
37
|
+
page = agent.page.links.find { |l| l.text == 'News' }.click
|
38
38
|
But Mechanize gives us a shortcut. Instead we can say this:
|
39
|
-
page = agent.
|
39
|
+
page = agent.page.link_with(:text => 'News').click
|
40
40
|
That shortcut says "find all links with the name 'News'". You're probably
|
41
41
|
thinking "there could be multiple links with that text!", and you would be
|
42
42
|
correct! If you use the plural form, you can access the list.
|
43
43
|
If you wanted to click on the second news link, you could do this:
|
44
|
-
agent.
|
44
|
+
agent.page.links_with(:text => 'News')[1].click
|
45
45
|
We can even find a link with a certain href like so:
|
46
|
-
page.
|
46
|
+
page.link_with(:href => '/something')
|
47
47
|
Or chain them together to find a link with certain text and certain href:
|
48
|
-
page.
|
48
|
+
page.link_with(:text => 'News', :href => '/something')
|
49
49
|
|
50
50
|
These shortcuts that mechanize provides are available on any list that you
|
51
51
|
can fetch like frames, iframes, or forms. Now that we know how to find and
|
@@ -56,7 +56,7 @@ Lets continue with our google example. Here's the code we have so far:
|
|
56
56
|
require 'rubygems'
|
57
57
|
require 'mechanize'
|
58
58
|
|
59
|
-
agent =
|
59
|
+
agent = Mechanize.new
|
60
60
|
page = agent.get('http://google.com/')
|
61
61
|
If we pretty print the page, we can see that there is one form named 'f',
|
62
62
|
that has a couple buttons and a few fields:
|
@@ -69,7 +69,7 @@ object. So lets set the form field named 'q' on the form to 'ruby mechanize':
|
|
69
69
|
google_form.q = 'ruby mechanize'
|
70
70
|
To make sure that we set the value, lets pretty print the form, and you should
|
71
71
|
see a line similar to this:
|
72
|
-
#<
|
72
|
+
#<Mechanize::Field:0x1403488 @name="q", @value="ruby mechanize">
|
73
73
|
If you saw that the value of 'q' changed, you're on the right track! Now we
|
74
74
|
can submit the form and 'press' the submit button and print the results:
|
75
75
|
page = agent.submit(google_form, google_form.buttons.first)
|
@@ -83,7 +83,7 @@ Lets take a look at the code all together:
|
|
83
83
|
require 'rubygems'
|
84
84
|
require 'mechanize'
|
85
85
|
|
86
|
-
agent =
|
86
|
+
agent = Mechanize.new
|
87
87
|
page = agent.get('http://google.com/')
|
88
88
|
google_form = page.form('f')
|
89
89
|
google_form.q = 'ruby mechanize'
|
@@ -120,3 +120,4 @@ html. What does this mean for you? You can treat a mechanize page like
|
|
120
120
|
an nokogiri object. After you have used Mechanize to navigate to the page
|
121
121
|
that you need to scrape, then scrape it using nokogiri methods:
|
122
122
|
agent.get('http://someurl.com/').search(".//p[@class='posted']")
|
123
|
+
|
data/Manifest.txt
CHANGED
@@ -12,57 +12,59 @@ examples/proxy_req.rb
|
|
12
12
|
examples/rubyforge.rb
|
13
13
|
examples/spider.rb
|
14
14
|
lib/mechanize.rb
|
15
|
-
lib/
|
16
|
-
lib/
|
17
|
-
lib/
|
18
|
-
lib/
|
19
|
-
lib/
|
20
|
-
lib/
|
21
|
-
lib/
|
22
|
-
lib/
|
23
|
-
lib/
|
24
|
-
lib/
|
25
|
-
lib/
|
26
|
-
lib/
|
27
|
-
lib/
|
28
|
-
lib/
|
29
|
-
lib/
|
30
|
-
lib/
|
31
|
-
lib/
|
32
|
-
lib/
|
33
|
-
lib/
|
34
|
-
lib/
|
35
|
-
lib/
|
36
|
-
lib/
|
37
|
-
lib/
|
38
|
-
lib/
|
39
|
-
lib/
|
40
|
-
lib/
|
41
|
-
lib/
|
42
|
-
lib/
|
43
|
-
lib/
|
44
|
-
lib/
|
45
|
-
lib/
|
46
|
-
lib/
|
47
|
-
lib/
|
48
|
-
lib/
|
49
|
-
lib/
|
50
|
-
lib/
|
51
|
-
lib/
|
52
|
-
lib/
|
53
|
-
lib/
|
54
|
-
lib/
|
55
|
-
lib/
|
56
|
-
lib/
|
57
|
-
lib/
|
58
|
-
lib/
|
59
|
-
lib/
|
60
|
-
lib/
|
61
|
-
lib/
|
62
|
-
lib/
|
63
|
-
mechanize.
|
15
|
+
lib/mechanize/chain.rb
|
16
|
+
lib/mechanize/chain/auth_headers.rb
|
17
|
+
lib/mechanize/chain/body_decoding_handler.rb
|
18
|
+
lib/mechanize/chain/connection_resolver.rb
|
19
|
+
lib/mechanize/chain/custom_headers.rb
|
20
|
+
lib/mechanize/chain/handler.rb
|
21
|
+
lib/mechanize/chain/header_resolver.rb
|
22
|
+
lib/mechanize/chain/parameter_resolver.rb
|
23
|
+
lib/mechanize/chain/post_connect_hook.rb
|
24
|
+
lib/mechanize/chain/pre_connect_hook.rb
|
25
|
+
lib/mechanize/chain/request_resolver.rb
|
26
|
+
lib/mechanize/chain/response_body_parser.rb
|
27
|
+
lib/mechanize/chain/response_header_handler.rb
|
28
|
+
lib/mechanize/chain/response_reader.rb
|
29
|
+
lib/mechanize/chain/ssl_resolver.rb
|
30
|
+
lib/mechanize/chain/uri_resolver.rb
|
31
|
+
lib/mechanize/content_type_error.rb
|
32
|
+
lib/mechanize/cookie.rb
|
33
|
+
lib/mechanize/cookie_jar.rb
|
34
|
+
lib/mechanize/file.rb
|
35
|
+
lib/mechanize/file_response.rb
|
36
|
+
lib/mechanize/file_saver.rb
|
37
|
+
lib/mechanize/form.rb
|
38
|
+
lib/mechanize/form/button.rb
|
39
|
+
lib/mechanize/form/check_box.rb
|
40
|
+
lib/mechanize/form/field.rb
|
41
|
+
lib/mechanize/form/file_upload.rb
|
42
|
+
lib/mechanize/form/image_button.rb
|
43
|
+
lib/mechanize/form/multi_select_list.rb
|
44
|
+
lib/mechanize/form/option.rb
|
45
|
+
lib/mechanize/form/radio_button.rb
|
46
|
+
lib/mechanize/form/select_list.rb
|
47
|
+
lib/mechanize/headers.rb
|
48
|
+
lib/mechanize/history.rb
|
49
|
+
lib/mechanize/inspect.rb
|
50
|
+
lib/mechanize/monkey_patch.rb
|
51
|
+
lib/mechanize/page.rb
|
52
|
+
lib/mechanize/page/base.rb
|
53
|
+
lib/mechanize/page/frame.rb
|
54
|
+
lib/mechanize/page/image.rb
|
55
|
+
lib/mechanize/page/label.rb
|
56
|
+
lib/mechanize/page/link.rb
|
57
|
+
lib/mechanize/page/meta.rb
|
58
|
+
lib/mechanize/pluggable_parsers.rb
|
59
|
+
lib/mechanize/redirect_limit_reached_error.rb
|
60
|
+
lib/mechanize/redirect_not_get_or_head_error.rb
|
61
|
+
lib/mechanize/response_code_error.rb
|
62
|
+
lib/mechanize/unsupported_scheme_error.rb
|
63
|
+
lib/mechanize/util.rb
|
64
64
|
test/chain/test_argument_validator.rb
|
65
|
+
test/chain/test_auth_headers.rb
|
65
66
|
test/chain/test_custom_headers.rb
|
67
|
+
test/chain/test_header_resolver.rb
|
66
68
|
test/chain/test_parameter_resolver.rb
|
67
69
|
test/chain/test_request_resolver.rb
|
68
70
|
test/chain/test_response_reader.rb
|
@@ -96,20 +98,25 @@ test/htdocs/link with space.html
|
|
96
98
|
test/htdocs/meta_cookie.html
|
97
99
|
test/htdocs/no_title_test.html
|
98
100
|
test/htdocs/relative/tc_relative_links.html
|
101
|
+
test/htdocs/tc_bad_charset.html
|
99
102
|
test/htdocs/tc_bad_links.html
|
100
103
|
test/htdocs/tc_base_link.html
|
101
104
|
test/htdocs/tc_blank_form.html
|
105
|
+
test/htdocs/tc_charset.html
|
102
106
|
test/htdocs/tc_checkboxes.html
|
103
107
|
test/htdocs/tc_encoded_links.html
|
108
|
+
test/htdocs/tc_field_precedence.html
|
104
109
|
test/htdocs/tc_follow_meta.html
|
105
110
|
test/htdocs/tc_form_action.html
|
106
111
|
test/htdocs/tc_links.html
|
112
|
+
test/htdocs/tc_meta_in_body.html
|
107
113
|
test/htdocs/tc_no_attributes.html
|
108
114
|
test/htdocs/tc_pretty_print.html
|
109
115
|
test/htdocs/tc_radiobuttons.html
|
110
116
|
test/htdocs/tc_referer.html
|
111
117
|
test/htdocs/tc_relative_links.html
|
112
118
|
test/htdocs/tc_textarea.html
|
119
|
+
test/htdocs/test_bad_encoding.html
|
113
120
|
test/htdocs/unusual______.html
|
114
121
|
test/servlets.rb
|
115
122
|
test/ssl_server.rb
|
@@ -123,6 +130,7 @@ test/test_cookie_jar.rb
|
|
123
130
|
test/test_cookies.rb
|
124
131
|
test/test_encoded_links.rb
|
125
132
|
test/test_errors.rb
|
133
|
+
test/test_field_precedence.rb
|
126
134
|
test/test_follow_meta.rb
|
127
135
|
test/test_form_action.rb
|
128
136
|
test/test_form_as_hash.rb
|
@@ -140,7 +148,9 @@ test/test_if_modified_since.rb
|
|
140
148
|
test/test_keep_alive.rb
|
141
149
|
test/test_links.rb
|
142
150
|
test/test_mech.rb
|
151
|
+
test/test_mech_proxy.rb
|
143
152
|
test/test_mechanize_file.rb
|
153
|
+
test/test_meta.rb
|
144
154
|
test/test_multi_select.rb
|
145
155
|
test/test_no_attributes.rb
|
146
156
|
test/test_option.rb
|
@@ -166,4 +176,5 @@ test/test_ssl_server.rb
|
|
166
176
|
test/test_subclass.rb
|
167
177
|
test/test_textarea.rb
|
168
178
|
test/test_upload.rb
|
179
|
+
test/test_util.rb
|
169
180
|
test/test_verbs.rb
|
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
=
|
1
|
+
= Mechanize
|
2
2
|
|
3
|
-
* http://mechanize.rubyforge.org
|
3
|
+
* http://mechanize.rubyforge.org
|
4
4
|
* http://github.com/tenderlove/mechanize/tree/master
|
5
5
|
|
6
6
|
== DESCRIPTION
|
@@ -24,7 +24,7 @@ The mechanize mailing list is available here:
|
|
24
24
|
|
25
25
|
The bug tracker is available here:
|
26
26
|
|
27
|
-
* http://
|
27
|
+
* http://github.com/tenderlove/mechanize/issues
|
28
28
|
|
29
29
|
== Examples
|
30
30
|
|
@@ -35,7 +35,7 @@ Also, check out the EXAMPLES file.
|
|
35
35
|
|
36
36
|
Copyright (c) 2005 by Michael Neumann (mneumann@ntecs.de)
|
37
37
|
|
38
|
-
Copyright (c) 2006-
|
38
|
+
Copyright (c) 2006-2010:
|
39
39
|
|
40
40
|
* {Aaron Patterson}[http://tenderlovemaking.com] (aaronp@rubyforge.org)
|
41
41
|
* {Mike Dalessio}[http://mike.daless.io] (mike@csa.net)
|
data/Rakefile
CHANGED
@@ -1,17 +1,14 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'hoe'
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
Hoe.spec 'mechanize' do
|
5
|
+
developer 'Aaron Patterson', 'aaronp@rubyforge.org'
|
6
|
+
developer 'Mike Dalessio', 'mike.dalessio@gmail.com'
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
p.history_file = 'CHANGELOG.rdoc'
|
12
|
-
p.extra_rdoc_files = FileList['*.rdoc']
|
13
|
-
p.summary = "Mechanize provides automated web-browsing"
|
14
|
-
p.extra_deps = [['nokogiri', '>= 1.2.1']]
|
8
|
+
self.readme_file = 'README.rdoc'
|
9
|
+
self.history_file = 'CHANGELOG.rdoc'
|
10
|
+
self.extra_rdoc_files += Dir['*.rdoc']
|
11
|
+
self.extra_deps << ['nokogiri', '>= 1.2.1']
|
15
12
|
end
|
16
13
|
|
17
14
|
desc "Update SSL Certificate"
|
@@ -26,18 +23,11 @@ task('ssl_cert') do |p|
|
|
26
23
|
sh "rm server.key.org"
|
27
24
|
end
|
28
25
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
f.write(HOE.spec.to_ruby)
|
35
|
-
end
|
26
|
+
desc 'Generate a gem spec'
|
27
|
+
task "gem:spec" do
|
28
|
+
File.open("mechanize.gemspec", 'w') do |f|
|
29
|
+
now = Time.now.strftime("%Y%m%d%H%M%S")
|
30
|
+
f.write `rake debug_gem`.sub(/(s.version = ".*)(")/) { "#{$1}.#{now}#{$2}" }
|
36
31
|
end
|
37
32
|
end
|
38
33
|
|
39
|
-
desc "Run code-coverage analysis"
|
40
|
-
task :coverage do
|
41
|
-
rm_rf "coverage"
|
42
|
-
sh "rcov -x Library -I lib:test #{Dir[*HOE.test_globs].join(' ')}"
|
43
|
-
end
|