mechanize 0.6.9 → 0.6.10
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.txt +19 -0
- data/Manifest.txt +4 -0
- data/lib/mechanize.rb +28 -16
- data/lib/mechanize/form.rb +0 -1
- data/lib/mechanize/form_elements.rb +1 -1
- data/lib/mechanize/history.rb +5 -0
- data/lib/mechanize/inspect.rb +6 -0
- data/lib/mechanize/page.rb +7 -1
- data/lib/mechanize/page_elements.rb +6 -0
- data/test/htdocs/tc_base_link.html +8 -0
- data/test/htdocs/tc_blank_form.html +11 -0
- data/test/htdocs/tc_links.html +1 -0
- data/test/htdocs/unusual______.html +5 -0
- data/test/tc_authenticate.rb +12 -3
- data/test/tc_blank_form.rb +23 -0
- data/test/tc_follow_meta.rb +7 -0
- data/test/tc_history.rb +24 -0
- data/test/tc_links.rb +12 -0
- data/test/test_all.rb +2 -0
- data/test/test_includes.rb +4 -3
- data/test/test_servlets.rb +22 -1
- metadata +164 -163
data/CHANGELOG.txt
CHANGED
@@ -1,5 +1,24 @@
|
|
1
1
|
= Mechanize CHANGELOG
|
2
2
|
|
3
|
+
== 0.6.10
|
4
|
+
|
5
|
+
* Made digest authentication work with POSTs.
|
6
|
+
* Made sure page was HTML before following meta refreshes.
|
7
|
+
http://rubyforge.org/tracker/index.php?func=detail&aid=12260&group_id=1453&atid=5709
|
8
|
+
* Made sure that URLS with a host and no path would default to '/' for history
|
9
|
+
purposes.
|
10
|
+
http://rubyforge.org/tracker/index.php?func=detail&aid=12368&group_id=1453&atid=5709
|
11
|
+
* Avoiding memory leaks with transact. Thanks Tobias Gruetzmacher!
|
12
|
+
http://rubyforge.org/tracker/index.php?func=detail&aid=12057&group_id=1453&atid=5711
|
13
|
+
* Fixing a problem with # signs in the file name. Thanks Tobias Gruetzmacher!
|
14
|
+
http://rubyforge.org/tracker/index.php?func=detail&aid=12510&group_id=1453&atid=5711
|
15
|
+
* Made sure that blank form values are submitted.
|
16
|
+
http://rubyforge.org/tracker/index.php?func=detail&aid=12505&group_id=1453&atid=5709
|
17
|
+
* Mechanize now respects the base tag. Thanks Stephan Dale.
|
18
|
+
http://rubyforge.org/tracker/index.php?func=detail&aid=12468&group_id=1453&atid=5709
|
19
|
+
* Aliasing inspect to pretty_inspect. Thanks Eric Promislow.
|
20
|
+
http://rubyforge.org/pipermail/mechanize-users/2007-July/000157.html
|
21
|
+
|
3
22
|
== 0.6.9
|
4
23
|
|
5
24
|
* Updating UTF-8 support for urls
|
data/Manifest.txt
CHANGED
@@ -58,6 +58,8 @@ test/htdocs/link with space.html
|
|
58
58
|
test/htdocs/no_title_test.html
|
59
59
|
test/htdocs/relative/tc_relative_links.html
|
60
60
|
test/htdocs/tc_bad_links.html
|
61
|
+
test/htdocs/tc_base_link.html
|
62
|
+
test/htdocs/tc_blank_form.html
|
61
63
|
test/htdocs/tc_checkboxes.html
|
62
64
|
test/htdocs/tc_encoded_links.html
|
63
65
|
test/htdocs/tc_follow_meta.html
|
@@ -69,9 +71,11 @@ test/htdocs/tc_radiobuttons.html
|
|
69
71
|
test/htdocs/tc_referer.html
|
70
72
|
test/htdocs/tc_relative_links.html
|
71
73
|
test/htdocs/tc_textarea.html
|
74
|
+
test/htdocs/unusual______.html
|
72
75
|
test/ssl_server.rb
|
73
76
|
test/tc_authenticate.rb
|
74
77
|
test/tc_bad_links.rb
|
78
|
+
test/tc_blank_form.rb
|
75
79
|
test/tc_checkboxes.rb
|
76
80
|
test/tc_cookie_class.rb
|
77
81
|
test/tc_cookie_jar.rb
|
data/lib/mechanize.rb
CHANGED
@@ -64,7 +64,7 @@ class Mechanize
|
|
64
64
|
##
|
65
65
|
# The version of Mechanize you are using.
|
66
66
|
|
67
|
-
VERSION = '0.6.
|
67
|
+
VERSION = '0.6.10'
|
68
68
|
|
69
69
|
##
|
70
70
|
# User Agent aliases
|
@@ -322,14 +322,13 @@ class Mechanize
|
|
322
322
|
end
|
323
323
|
end
|
324
324
|
|
325
|
-
if( @auth_hash[uri.
|
326
|
-
|
327
|
-
case @auth_hash[uri.to_s]
|
325
|
+
if( @auth_hash[uri.host] )
|
326
|
+
case @auth_hash[uri.host]
|
328
327
|
when :basic
|
329
328
|
request.basic_auth(@user, @password)
|
330
329
|
when :digest
|
331
330
|
@digest_response ||= nil
|
332
|
-
@digest_response = self.gen_auth_header(uri,
|
331
|
+
@digest_response = self.gen_auth_header(uri,request,@digest) if @digest
|
333
332
|
request.add_field('Authorization', @digest_response) if @digest_response
|
334
333
|
end
|
335
334
|
end
|
@@ -337,7 +336,7 @@ class Mechanize
|
|
337
336
|
request
|
338
337
|
end
|
339
338
|
|
340
|
-
def gen_auth_header(uri, auth_header, is_IIS = false)
|
339
|
+
def gen_auth_header(uri, request, auth_header, is_IIS = false)
|
341
340
|
@@nonce_count += 1
|
342
341
|
|
343
342
|
user = @digest_user
|
@@ -349,7 +348,7 @@ class Mechanize
|
|
349
348
|
$2.gsub(/(\w+)="(.*?)"/) { params[$1] = $2 }
|
350
349
|
|
351
350
|
a_1 = "#{@user}:#{params['realm']}:#{@password}"
|
352
|
-
a_2 = "
|
351
|
+
a_2 = "#{request.method}:#{uri.path}"
|
353
352
|
request_digest = ''
|
354
353
|
request_digest << Digest::MD5.hexdigest(a_1)
|
355
354
|
request_digest << ':' << params['nonce']
|
@@ -367,6 +366,7 @@ class Mechanize
|
|
367
366
|
header << "qop=#{params['qop']}, "
|
368
367
|
end
|
369
368
|
header << "uri=\"#{uri.path}\", "
|
369
|
+
header << "algorithm=MD5, "
|
370
370
|
header << "nonce=\"#{params['nonce']}\", "
|
371
371
|
header << "nc=#{'%08x' % @@nonce_count}, "
|
372
372
|
header << "cnonce=\"#{CNONCE}\", "
|
@@ -385,18 +385,24 @@ class Mechanize
|
|
385
385
|
|
386
386
|
url = URI.parse(
|
387
387
|
Util.html_unescape(
|
388
|
-
url.split(/%[0-9A-Fa-f]{2}
|
389
|
-
url.scan(/%[0-9A-Fa-f]{2}
|
388
|
+
url.split(/%[0-9A-Fa-f]{2}|#/).zip(
|
389
|
+
url.scan(/%[0-9A-Fa-f]{2}|#/)
|
390
390
|
).map { |x,y|
|
391
391
|
"#{URI.escape(x)}#{y}"
|
392
|
-
}.join('')
|
392
|
+
}.join('')
|
393
393
|
)
|
394
394
|
)
|
395
395
|
end
|
396
396
|
|
397
|
+
url.path = '/' if url.path.length == 0
|
398
|
+
|
397
399
|
# construct an absolute uri
|
398
400
|
if url.relative?
|
399
401
|
raise 'no history. please specify an absolute URL' unless cur_page.uri
|
402
|
+
base = cur_page.respond_to?(:bases) ? cur_page.bases.last : nil
|
403
|
+
url = ((base && base.uri && base.uri.absolute?) ?
|
404
|
+
base.uri :
|
405
|
+
cur_page.uri) + url
|
400
406
|
url = cur_page.uri + url
|
401
407
|
# Strip initial "/.." bits from the path
|
402
408
|
url.path.sub!(/^(\/\.\.)+(?=\/)/, '')
|
@@ -576,7 +582,8 @@ class Mechanize
|
|
576
582
|
|
577
583
|
res_klass = Net::HTTPResponse::CODE_TO_OBJ[page.code.to_s]
|
578
584
|
|
579
|
-
if follow_meta_refresh &&
|
585
|
+
if follow_meta_refresh && page.respond_to?(:meta) &&
|
586
|
+
(redirect = page.meta.first)
|
580
587
|
return redirect.click
|
581
588
|
end
|
582
589
|
|
@@ -594,14 +601,19 @@ class Mechanize
|
|
594
601
|
@history.push(page, from_uri)
|
595
602
|
return page
|
596
603
|
elsif res_klass <= Net::HTTPUnauthorized
|
604
|
+
raise ResponseCodeError.new(page) unless @user || @password
|
605
|
+
raise ResponseCodeError.new(page) if @auth_hash.has_key?(uri.host)
|
597
606
|
if response['www-authenticate'] =~ /Digest/i
|
598
|
-
@auth_hash[uri.
|
607
|
+
@auth_hash[uri.host] = :digest
|
599
608
|
@digest = response['www-authenticate']
|
600
|
-
return fetch_page(uri, fetch_request(uri), cur_page, request_data)
|
601
609
|
else
|
602
|
-
@auth_hash[uri.
|
603
|
-
return fetch_page(uri, fetch_request(uri), cur_page, request_data)
|
610
|
+
@auth_hash[uri.host] = :basic
|
604
611
|
end
|
612
|
+
return fetch_page( uri,
|
613
|
+
fetch_request(uri, request.method.downcase.to_sym),
|
614
|
+
cur_page,
|
615
|
+
request_data
|
616
|
+
)
|
605
617
|
end
|
606
618
|
|
607
619
|
raise ResponseCodeError.new(page), "Unhandled response", caller
|
@@ -620,7 +632,7 @@ class Mechanize
|
|
620
632
|
end
|
621
633
|
|
622
634
|
def add_to_history(page)
|
623
|
-
@history.push(page)
|
635
|
+
@history.push(page, to_absolute_uri(page.uri))
|
624
636
|
end
|
625
637
|
|
626
638
|
# :stopdoc:
|
data/lib/mechanize/form.rb
CHANGED
data/lib/mechanize/history.rb
CHANGED
@@ -10,6 +10,11 @@ module WWW
|
|
10
10
|
@history_index = {}
|
11
11
|
end
|
12
12
|
|
13
|
+
def initialize_copy(orig)
|
14
|
+
super
|
15
|
+
@history_index = orig.instance_variable_get(:@history_index).dup
|
16
|
+
end
|
17
|
+
|
13
18
|
def push(page, uri = nil)
|
14
19
|
super(page)
|
15
20
|
@history_index[(uri ? uri : page.uri).to_s] = page
|
data/lib/mechanize/inspect.rb
CHANGED
@@ -40,6 +40,9 @@ module WWW
|
|
40
40
|
}
|
41
41
|
}
|
42
42
|
end
|
43
|
+
if RUBY_VERSION > '1.8.2'
|
44
|
+
alias :inspect :pretty_inspect
|
45
|
+
end
|
43
46
|
end
|
44
47
|
|
45
48
|
class Link
|
@@ -49,6 +52,9 @@ module WWW
|
|
49
52
|
q.breakable; q.pp href
|
50
53
|
}
|
51
54
|
end
|
55
|
+
if RUBY_VERSION > '1.8.2'
|
56
|
+
alias :inspect :pretty_inspect
|
57
|
+
end
|
52
58
|
end
|
53
59
|
|
54
60
|
class Form
|
data/lib/mechanize/page.rb
CHANGED
@@ -19,7 +19,7 @@ module WWW
|
|
19
19
|
extend Forwardable
|
20
20
|
|
21
21
|
attr_reader :parser, :title, :watch_for_set
|
22
|
-
attr_reader :frames, :iframes, :links, :forms, :meta, :watches
|
22
|
+
attr_reader :frames, :iframes, :links, :forms, :meta, :watches, :bases
|
23
23
|
attr_accessor :mech
|
24
24
|
|
25
25
|
alias :root :parser
|
@@ -69,6 +69,7 @@ module WWW
|
|
69
69
|
@meta = WWW::Mechanize::List.new
|
70
70
|
@frames = WWW::Mechanize::List.new
|
71
71
|
@iframes = WWW::Mechanize::List.new
|
72
|
+
@bases = WWW::Mechanize::List.new
|
72
73
|
@watches = {}
|
73
74
|
|
74
75
|
# Set the title
|
@@ -76,6 +77,11 @@ module WWW
|
|
76
77
|
(@parser/'title').text
|
77
78
|
end
|
78
79
|
|
80
|
+
# Find all 'base' tags
|
81
|
+
(@parser/'base').each do |node|
|
82
|
+
@bases << Base.new(node, @mech, self)
|
83
|
+
end
|
84
|
+
|
79
85
|
# Find all the form tags
|
80
86
|
(@parser/'form').each do |html_form|
|
81
87
|
form = Form.new(html_form, @mech, self)
|
@@ -67,5 +67,11 @@ module WWW
|
|
67
67
|
@href = node['src']
|
68
68
|
end
|
69
69
|
end
|
70
|
+
|
71
|
+
# This class encapsulates a Base tag. Mechanize treats base tags just like
|
72
|
+
# 'a' tags. Base objects will contain links, but most likely will have
|
73
|
+
# no text.
|
74
|
+
class Base < Link
|
75
|
+
end
|
70
76
|
end
|
71
77
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<html>
|
2
|
+
<body>
|
3
|
+
<form name="test" method="post">
|
4
|
+
<input type="hidden" name="hidden_blank" value=''/>
|
5
|
+
<input type="hidden" name="hidden_noval"/>
|
6
|
+
<input type="text" name="visible_blank" value=''/>
|
7
|
+
<input type="text" name="visible_noval"/>
|
8
|
+
<input type="submit"/>
|
9
|
+
</form>
|
10
|
+
</body>
|
11
|
+
</html>
|
data/test/htdocs/tc_links.html
CHANGED
data/test/tc_authenticate.rb
CHANGED
@@ -13,14 +13,23 @@ class BasicAuthTest < Test::Unit::TestCase
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def test_auth_success
|
16
|
-
@agent.basic_auth('
|
17
|
-
page = @agent.get("http://localhost
|
16
|
+
@agent.basic_auth('user', 'pass')
|
17
|
+
page = @agent.get("http://localhost/basic_auth")
|
18
18
|
assert_equal('You are authenticated', page.body)
|
19
19
|
end
|
20
20
|
|
21
|
+
def test_auth_bad_user_pass
|
22
|
+
@agent.basic_auth('aaron', 'aaron')
|
23
|
+
begin
|
24
|
+
page = @agent.get("http://localhost/basic_auth")
|
25
|
+
rescue WWW::Mechanize::ResponseCodeError => e
|
26
|
+
assert_equal("401", e.response_code)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
21
30
|
def test_auth_failure
|
22
31
|
begin
|
23
|
-
page = @agent.get("http://localhost
|
32
|
+
page = @agent.get("http://localhost/basic_auth")
|
24
33
|
rescue WWW::Mechanize::ResponseCodeError => e
|
25
34
|
assert_equal("401", e.response_code)
|
26
35
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), "..", "lib")
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'rubygems'
|
5
|
+
require 'mechanize'
|
6
|
+
require 'test_includes'
|
7
|
+
|
8
|
+
class BlankFormTest < Test::Unit::TestCase
|
9
|
+
include TestMethods
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@agent = WWW::Mechanize.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_blank_form_query_string
|
16
|
+
page = @agent.get('http://localhost/tc_blank_form.html')
|
17
|
+
form = page.forms.first
|
18
|
+
query = form.build_query
|
19
|
+
assert(query.length > 0)
|
20
|
+
assert query.all? { |x| x[1] == '' }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
data/test/tc_follow_meta.rb
CHANGED
@@ -22,4 +22,11 @@ class FollowMetaTest < Test::Unit::TestCase
|
|
22
22
|
assert_equal('http://localhost/index.html', page.uri.to_s)
|
23
23
|
assert_equal(3, @agent.history.length)
|
24
24
|
end
|
25
|
+
|
26
|
+
def test_follow_meta_on_302
|
27
|
+
@agent.follow_meta_refresh = true
|
28
|
+
assert_nothing_raised {
|
29
|
+
@agent.get("http://localhost/response_code?code=302&ct=test/xml")
|
30
|
+
}
|
31
|
+
end
|
25
32
|
end
|
data/test/tc_history.rb
CHANGED
@@ -113,6 +113,30 @@ class TestHistory < Test::Unit::TestCase
|
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
+
def test_no_slash
|
117
|
+
page = @agent.get('http://localhost')
|
118
|
+
|
119
|
+
node = Struct.new(:href, :inner_text).new('http://localhost/', 'blah')
|
120
|
+
link = WWW::Mechanize::Link.new(node, nil, nil)
|
121
|
+
assert(@agent.visited?(link))
|
122
|
+
|
123
|
+
node = Struct.new(:href, :inner_text).new('http://localhost', 'blah')
|
124
|
+
link = WWW::Mechanize::Link.new(node, nil, nil)
|
125
|
+
assert(@agent.visited?(link))
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_with_slash
|
129
|
+
page = @agent.get('http://localhost/')
|
130
|
+
|
131
|
+
node = Struct.new(:href, :inner_text).new('http://localhost/', 'blah')
|
132
|
+
link = WWW::Mechanize::Link.new(node, nil, nil)
|
133
|
+
assert(@agent.visited?(link))
|
134
|
+
|
135
|
+
node = Struct.new(:href, :inner_text).new('http://localhost', 'blah')
|
136
|
+
link = WWW::Mechanize::Link.new(node, nil, nil)
|
137
|
+
assert(@agent.visited?(link))
|
138
|
+
end
|
139
|
+
|
116
140
|
def test_clear
|
117
141
|
page = nil
|
118
142
|
20.times { @history.push(page = @agent.get('http://localhost/index.html')) }
|
data/test/tc_links.rb
CHANGED
@@ -12,6 +12,12 @@ class LinksMechTest < Test::Unit::TestCase
|
|
12
12
|
@agent = WWW::Mechanize.new
|
13
13
|
end
|
14
14
|
|
15
|
+
def test_base
|
16
|
+
page = @agent.get("http://google.com/tc_base_link.html")
|
17
|
+
page = page.links.first.click
|
18
|
+
assert @agent.visited?("http://localhost/index.html")
|
19
|
+
end
|
20
|
+
|
15
21
|
def test_find_meta
|
16
22
|
page = @agent.get("http://localhost:#{PORT}/find_link.html")
|
17
23
|
assert_equal(2, page.meta.length)
|
@@ -88,4 +94,10 @@ class LinksMechTest < Test::Unit::TestCase
|
|
88
94
|
link = page.links.text('not encoded space').first
|
89
95
|
page = @agent.click link
|
90
96
|
end
|
97
|
+
|
98
|
+
def test_link_with_unusual_characters
|
99
|
+
page = @agent.get("http://localhost:#{PORT}/tc_links.html")
|
100
|
+
link = page.links.text('unusual characters').first
|
101
|
+
assert_nothing_raised { @agent.click link }
|
102
|
+
end
|
91
103
|
end
|
data/test/test_all.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
$:.unshift File.join(File.dirname(__FILE__), "..", "lib")
|
2
2
|
$:.unshift File.join(File.dirname(__FILE__), "..", "test")
|
3
3
|
|
4
|
+
require 'tc_authenticate'
|
4
5
|
require 'tc_bad_links'
|
6
|
+
require 'tc_blank_form'
|
5
7
|
require 'tc_checkboxes'
|
6
8
|
require 'tc_cookie_class'
|
7
9
|
require 'tc_cookie_jar'
|
data/test/test_includes.rb
CHANGED
@@ -19,6 +19,7 @@ class Net::HTTP
|
|
19
19
|
SERVLETS = {
|
20
20
|
'/gzip' => GzipServlet,
|
21
21
|
'/form_post' => FormTest,
|
22
|
+
'/basic_auth' => BasicAuthServlet,
|
22
23
|
'/form post' => FormTest,
|
23
24
|
'/response_code' => ResponseCodeTest,
|
24
25
|
'/bad_content_type' => BadContentTypeTest,
|
@@ -40,7 +41,7 @@ class Net::HTTP
|
|
40
41
|
|
41
42
|
def request(request, *data, &block)
|
42
43
|
url = URI.parse(request.path)
|
43
|
-
path = url.path
|
44
|
+
path = URI.unescape(url.path)
|
44
45
|
|
45
46
|
path = '/index.html' if path == '/'
|
46
47
|
|
@@ -57,7 +58,7 @@ class Net::HTTP
|
|
57
58
|
end
|
58
59
|
SERVLETS[path].new({}).send("do_#{request.method}", request, res)
|
59
60
|
else
|
60
|
-
filename = "htdocs#{path}"
|
61
|
+
filename = "htdocs#{path.gsub(/[^\/\\.\w_\s]/, '_')}"
|
61
62
|
unless PAGE_CACHE[filename]
|
62
63
|
File.open("#{BASE_DIR}/#{filename}", 'rb') { |file|
|
63
64
|
PAGE_CACHE[filename] = file.read
|
@@ -79,7 +80,7 @@ class Net::HTTP
|
|
79
80
|
end
|
80
81
|
|
81
82
|
class Net::HTTPRequest
|
82
|
-
attr_accessor :query, :body, :cookies
|
83
|
+
attr_accessor :query, :body, :cookies, :user
|
83
84
|
end
|
84
85
|
|
85
86
|
class Response
|
data/test/test_servlets.rb
CHANGED
@@ -3,6 +3,27 @@ require 'logger'
|
|
3
3
|
require 'date'
|
4
4
|
require 'zlib'
|
5
5
|
require 'stringio'
|
6
|
+
require 'base64'
|
7
|
+
|
8
|
+
class BasicAuthServlet < WEBrick::HTTPServlet::AbstractServlet
|
9
|
+
def do_GET(req,res)
|
10
|
+
htpd = WEBrick::HTTPAuth::Htpasswd.new('dot.htpasswd')
|
11
|
+
htpd.set_passwd('Blah', 'user', 'pass')
|
12
|
+
authenticator = WEBrick::HTTPAuth::BasicAuth.new({
|
13
|
+
:UserDB => htpd,
|
14
|
+
:Realm => 'Blah',
|
15
|
+
:Logger => Logger.new(nil)
|
16
|
+
}
|
17
|
+
)
|
18
|
+
begin
|
19
|
+
authenticator.authenticate(req,res)
|
20
|
+
res.body = 'You are authenticated'
|
21
|
+
rescue WEBrick::HTTPStatus::Unauthorized => ex
|
22
|
+
res.status = 401
|
23
|
+
end
|
24
|
+
FileUtils.rm('dot.htpasswd')
|
25
|
+
end
|
26
|
+
end
|
6
27
|
|
7
28
|
class HeaderServlet < WEBrick::HTTPServlet::AbstractServlet
|
8
29
|
def do_GET(req, res)
|
@@ -90,7 +111,7 @@ end
|
|
90
111
|
|
91
112
|
class ResponseCodeTest < WEBrick::HTTPServlet::AbstractServlet
|
92
113
|
def do_GET(req, res)
|
93
|
-
res['Content-Type'] = "text/html"
|
114
|
+
res['Content-Type'] = req.query['ct'] || "text/html"
|
94
115
|
if req.query['code']
|
95
116
|
code = req.query['code'].to_i
|
96
117
|
case code
|
metadata
CHANGED
@@ -1,192 +1,193 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.2
|
3
3
|
specification_version: 1
|
4
4
|
name: mechanize
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.6.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.6.10
|
7
|
+
date: 2007-07-26 00:00:00 -07:00
|
8
8
|
summary: Mechanize provides automated web-browsing
|
9
9
|
require_paths:
|
10
|
-
|
10
|
+
- lib
|
11
11
|
email: aaronp@rubyforge.org
|
12
12
|
homepage: http://mechanize.rubyforge.org/
|
13
13
|
rubyforge_project: mechanize
|
14
|
-
description:
|
15
|
-
Mechanize automatically stores and sends cookies, follows redirects, can follow
|
16
|
-
links, and submit forms. Form fields can be populated and submitted. Mechanize
|
17
|
-
also keeps track of the sites that you have visited as a history."
|
14
|
+
description: The Mechanize library is used for automating interaction with websites. Mechanize automatically stores and sends cookies, follows redirects, can follow links, and submit forms. Form fields can be populated and submitted. Mechanize also keeps track of the sites that you have visited as a history.
|
18
15
|
autorequire:
|
19
16
|
default_executable:
|
20
17
|
bindir: bin
|
21
18
|
has_rdoc: true
|
22
19
|
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
23
20
|
requirements:
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
version: 0.0.0
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
28
24
|
version:
|
29
25
|
platform: ruby
|
30
26
|
signing_key:
|
31
27
|
cert_chain:
|
32
28
|
post_install_message:
|
33
29
|
authors:
|
34
|
-
|
30
|
+
- Aaron Patterson
|
35
31
|
files:
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
32
|
+
- CHANGELOG.txt
|
33
|
+
- EXAMPLES.txt
|
34
|
+
- GUIDE.txt
|
35
|
+
- LICENSE.txt
|
36
|
+
- Manifest.txt
|
37
|
+
- NOTES.txt
|
38
|
+
- README.txt
|
39
|
+
- Rakefile
|
40
|
+
- eg/flickr_upload.rb
|
41
|
+
- eg/mech-dump.rb
|
42
|
+
- eg/proxy_req.rb
|
43
|
+
- eg/rubyforge.rb
|
44
|
+
- eg/spider.rb
|
45
|
+
- lib/mechanize.rb
|
46
|
+
- lib/mechanize/cookie.rb
|
47
|
+
- lib/mechanize/errors.rb
|
48
|
+
- lib/mechanize/form.rb
|
49
|
+
- lib/mechanize/form_elements.rb
|
50
|
+
- lib/mechanize/history.rb
|
51
|
+
- lib/mechanize/inspect.rb
|
52
|
+
- lib/mechanize/list.rb
|
53
|
+
- lib/mechanize/monkey_patch.rb
|
54
|
+
- lib/mechanize/net-overrides/net/http.rb
|
55
|
+
- lib/mechanize/net-overrides/net/https.rb
|
56
|
+
- lib/mechanize/net-overrides/net/protocol.rb
|
57
|
+
- lib/mechanize/page.rb
|
58
|
+
- lib/mechanize/page_elements.rb
|
59
|
+
- lib/mechanize/parsers/rexml_page.rb
|
60
|
+
- lib/mechanize/pluggable_parsers.rb
|
61
|
+
- lib/mechanize/rexml.rb
|
62
|
+
- setup.rb
|
63
|
+
- test/data/htpasswd
|
64
|
+
- test/data/server.crt
|
65
|
+
- test/data/server.csr
|
66
|
+
- test/data/server.key
|
67
|
+
- test/data/server.pem
|
68
|
+
- test/htdocs/alt_text.html
|
69
|
+
- test/htdocs/bad_form_test.html
|
70
|
+
- test/htdocs/button.jpg
|
71
|
+
- test/htdocs/empty_form.html
|
72
|
+
- test/htdocs/file_upload.html
|
73
|
+
- test/htdocs/find_link.html
|
74
|
+
- test/htdocs/form_multi_select.html
|
75
|
+
- test/htdocs/form_multival.html
|
76
|
+
- test/htdocs/form_no_action.html
|
77
|
+
- test/htdocs/form_no_input_name.html
|
78
|
+
- test/htdocs/form_select.html
|
79
|
+
- test/htdocs/form_select_all.html
|
80
|
+
- test/htdocs/form_select_none.html
|
81
|
+
- test/htdocs/form_select_noopts.html
|
82
|
+
- test/htdocs/form_set_fields.html
|
83
|
+
- test/htdocs/form_test.html
|
84
|
+
- test/htdocs/frame_test.html
|
85
|
+
- test/htdocs/google.html
|
86
|
+
- test/htdocs/iframe_test.html
|
87
|
+
- test/htdocs/index.html
|
88
|
+
- test/htdocs/link with space.html
|
89
|
+
- test/htdocs/no_title_test.html
|
90
|
+
- test/htdocs/relative/tc_relative_links.html
|
91
|
+
- test/htdocs/tc_bad_links.html
|
92
|
+
- test/htdocs/tc_base_link.html
|
93
|
+
- test/htdocs/tc_blank_form.html
|
94
|
+
- test/htdocs/tc_checkboxes.html
|
95
|
+
- test/htdocs/tc_encoded_links.html
|
96
|
+
- test/htdocs/tc_follow_meta.html
|
97
|
+
- test/htdocs/tc_form_action.html
|
98
|
+
- test/htdocs/tc_links.html
|
99
|
+
- test/htdocs/tc_no_attributes.html
|
100
|
+
- test/htdocs/tc_pretty_print.html
|
101
|
+
- test/htdocs/tc_radiobuttons.html
|
102
|
+
- test/htdocs/tc_referer.html
|
103
|
+
- test/htdocs/tc_relative_links.html
|
104
|
+
- test/htdocs/tc_textarea.html
|
105
|
+
- test/htdocs/unusual______.html
|
106
|
+
- test/ssl_server.rb
|
107
|
+
- test/tc_authenticate.rb
|
108
|
+
- test/tc_bad_links.rb
|
109
|
+
- test/tc_blank_form.rb
|
110
|
+
- test/tc_checkboxes.rb
|
111
|
+
- test/tc_cookie_class.rb
|
112
|
+
- test/tc_cookie_jar.rb
|
113
|
+
- test/tc_cookies.rb
|
114
|
+
- test/tc_encoded_links.rb
|
115
|
+
- test/tc_errors.rb
|
116
|
+
- test/tc_follow_meta.rb
|
117
|
+
- test/tc_form_action.rb
|
118
|
+
- test/tc_form_as_hash.rb
|
119
|
+
- test/tc_form_button.rb
|
120
|
+
- test/tc_form_no_inputname.rb
|
121
|
+
- test/tc_forms.rb
|
122
|
+
- test/tc_frames.rb
|
123
|
+
- test/tc_gzipping.rb
|
124
|
+
- test/tc_history.rb
|
125
|
+
- test/tc_html_unscape_forms.rb
|
126
|
+
- test/tc_if_modified_since.rb
|
127
|
+
- test/tc_keep_alive.rb
|
128
|
+
- test/tc_links.rb
|
129
|
+
- test/tc_mech.rb
|
130
|
+
- test/tc_multi_select.rb
|
131
|
+
- test/tc_no_attributes.rb
|
132
|
+
- test/tc_page.rb
|
133
|
+
- test/tc_pluggable_parser.rb
|
134
|
+
- test/tc_post_form.rb
|
135
|
+
- test/tc_pretty_print.rb
|
136
|
+
- test/tc_proxy.rb
|
137
|
+
- test/tc_radiobutton.rb
|
138
|
+
- test/tc_referer.rb
|
139
|
+
- test/tc_relative_links.rb
|
140
|
+
- test/tc_response_code.rb
|
141
|
+
- test/tc_save_file.rb
|
142
|
+
- test/tc_select.rb
|
143
|
+
- test/tc_select_all.rb
|
144
|
+
- test/tc_select_none.rb
|
145
|
+
- test/tc_select_noopts.rb
|
146
|
+
- test/tc_set_fields.rb
|
147
|
+
- test/tc_ssl_server.rb
|
148
|
+
- test/tc_subclass.rb
|
149
|
+
- test/tc_textarea.rb
|
150
|
+
- test/tc_upload.rb
|
151
|
+
- test/tc_watches.rb
|
152
|
+
- test/test_all.rb
|
153
|
+
- test/test_includes.rb
|
154
|
+
- test/test_mechanize_file.rb
|
155
|
+
- test/test_servlets.rb
|
156
156
|
test_files:
|
157
|
-
|
157
|
+
- test/test_all.rb
|
158
158
|
rdoc_options:
|
159
|
-
|
160
|
-
|
159
|
+
- --main
|
160
|
+
- README.txt
|
161
161
|
extra_rdoc_files:
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
162
|
+
- CHANGELOG.txt
|
163
|
+
- EXAMPLES.txt
|
164
|
+
- GUIDE.txt
|
165
|
+
- LICENSE.txt
|
166
|
+
- Manifest.txt
|
167
|
+
- NOTES.txt
|
168
|
+
- README.txt
|
169
169
|
executables: []
|
170
|
+
|
170
171
|
extensions: []
|
172
|
+
|
171
173
|
requirements: []
|
174
|
+
|
172
175
|
dependencies:
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
version: 1.2.1
|
192
|
-
version:
|
176
|
+
- !ruby/object:Gem::Dependency
|
177
|
+
name: hpricot
|
178
|
+
version_requirement:
|
179
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
180
|
+
requirements:
|
181
|
+
- - ">="
|
182
|
+
- !ruby/object:Gem::Version
|
183
|
+
version: 0.5.0
|
184
|
+
version:
|
185
|
+
- !ruby/object:Gem::Dependency
|
186
|
+
name: hoe
|
187
|
+
version_requirement:
|
188
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
189
|
+
requirements:
|
190
|
+
- - ">="
|
191
|
+
- !ruby/object:Gem::Version
|
192
|
+
version: 1.2.2
|
193
|
+
version:
|