tarantula 0.4.3 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +6 -0
- data/README.rdoc +4 -0
- data/Rakefile +1 -0
- data/ci/rails3.gemfile +1 -1
- data/lib/relevance/tarantula.rb +6 -0
- data/lib/relevance/tarantula/link.rb +13 -12
- data/lib/relevance/tarantula/version.rb +1 -1
- data/spec/relevance/tarantula/html_report_helper_spec.rb +1 -1
- data/spec/relevance/tarantula/link_spec.rb +41 -17
- data/tarantula.gemspec +2 -2
- metadata +127 -75
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
v0.5.0
|
2
|
+
* Handle rails 3.2 link methods
|
3
|
+
* Renamed Relevance::Tarantula::Link#method to #meth
|
4
|
+
* Ensure tests pass with latest Rails 2 and 3
|
5
|
+
* Add notice for deprecating ruby 1.8 in 0.6.0
|
6
|
+
|
1
7
|
v0.4.3
|
2
8
|
* Fix rake tasks #25 [cldwalker]
|
3
9
|
* Remove removing String#chars #18 [cldwalker]
|
data/README.rdoc
CHANGED
@@ -16,6 +16,10 @@ just let RubyGems handle it). Add it to your Gemfile as normal:
|
|
16
16
|
|
17
17
|
gem "tarantula"
|
18
18
|
|
19
|
+
Or for Rails 3 applications:
|
20
|
+
|
21
|
+
gem 'tarantula', :require => 'tarantula-rails3'
|
22
|
+
|
19
23
|
=== Crawling Your App
|
20
24
|
|
21
25
|
Use the included rake task to create a Rails integration test that will allow Tarantula to crawl your
|
data/Rakefile
CHANGED
data/ci/rails3.gemfile
CHANGED
data/lib/relevance/tarantula.rb
CHANGED
@@ -4,6 +4,12 @@ require 'active_support'
|
|
4
4
|
require 'action_controller'
|
5
5
|
require 'htmlentities'
|
6
6
|
|
7
|
+
if RUBY_VERSION < '1.9.1'
|
8
|
+
warn "***************************************************"
|
9
|
+
warn "tarantula will stop supporting ruby 1.8.x in 0.6.0."
|
10
|
+
warn "***************************************************"
|
11
|
+
end
|
12
|
+
|
7
13
|
module Relevance; end
|
8
14
|
module Relevance; module CoreExtensions; end; end
|
9
15
|
module Relevance
|
@@ -10,7 +10,7 @@ module Relevance
|
|
10
10
|
def protect_against_forgery?
|
11
11
|
false
|
12
12
|
end
|
13
|
-
#fast fix for rails3
|
13
|
+
#fast fix for rails3
|
14
14
|
def method_javascript_function(method, url = '', href = nil)
|
15
15
|
action = (href && url.size > 0) ? "'#{url}'" : 'this.href'
|
16
16
|
submit_function =
|
@@ -27,11 +27,11 @@ module Relevance
|
|
27
27
|
submit_function << "s.setAttribute('name', '#{request_forgery_protection_token}'); s.setAttribute('value', '#{escape_javascript form_authenticity_token}'); f.appendChild(s);"
|
28
28
|
end
|
29
29
|
submit_function << "f.submit();"
|
30
|
-
end
|
30
|
+
end
|
31
31
|
end
|
32
32
|
|
33
33
|
METHOD_REGEXPS = {}
|
34
|
-
[:put, :delete, :post].each do |m|
|
34
|
+
[:put, :delete, :post, :patch].each do |m|
|
35
35
|
# remove submit from the end so we'll match with or without forgery protection
|
36
36
|
s = method_javascript_function(m).gsub( /f.submit();/, "" )
|
37
37
|
# don't just match this.href in case a different url was passed originally
|
@@ -46,7 +46,7 @@ module Relevance
|
|
46
46
|
|
47
47
|
if String === link || link.nil?
|
48
48
|
@href = transform_url(link)
|
49
|
-
@
|
49
|
+
@meth = :get
|
50
50
|
else # should be a tag
|
51
51
|
@href = link['href'] ? transform_url(link['href'].downcase) : nil
|
52
52
|
@tag = link
|
@@ -54,23 +54,24 @@ module Relevance
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def crawl
|
57
|
-
response = crawler.follow(
|
57
|
+
response = crawler.follow(meth, href)
|
58
58
|
log "Response #{response.code} for #{self}"
|
59
59
|
crawler.handle_link_results(self, make_result(response))
|
60
60
|
end
|
61
61
|
|
62
62
|
def make_result(response)
|
63
|
-
crawler.make_result(:method =>
|
63
|
+
crawler.make_result(:method => meth,
|
64
64
|
:url => href,
|
65
65
|
:response => response,
|
66
66
|
:referrer => referrer)
|
67
67
|
end
|
68
68
|
|
69
|
-
def
|
70
|
-
@
|
69
|
+
def meth
|
70
|
+
@meth ||= begin
|
71
71
|
(@tag &&
|
72
|
-
[:put, :delete, :post].detect do |m| # post should be last since it's least specific
|
73
|
-
@tag['onclick'] =~ METHOD_REGEXPS[m]
|
72
|
+
[:put, :delete, :post, :patch].detect do |m| # post should be last since it's least specific
|
73
|
+
@tag['onclick'] =~ METHOD_REGEXPS[m] ||
|
74
|
+
@tag['data-method'] == m.to_s.downcase
|
74
75
|
end) ||
|
75
76
|
:get
|
76
77
|
end
|
@@ -82,7 +83,7 @@ module Relevance
|
|
82
83
|
|
83
84
|
def ==(obj)
|
84
85
|
obj.respond_to?(:href) && obj.respond_to?(:method) &&
|
85
|
-
self.href.to_s == obj.href.to_s && self.
|
86
|
+
self.href.to_s == obj.href.to_s && self.meth.to_s == obj.meth.to_s
|
86
87
|
end
|
87
88
|
alias :eql? :==
|
88
89
|
|
@@ -91,7 +92,7 @@ module Relevance
|
|
91
92
|
end
|
92
93
|
|
93
94
|
def to_s
|
94
|
-
"<Relevance::Tarantula::Link href=#{href}, method=#{
|
95
|
+
"<Relevance::Tarantula::Link href=#{href}, method=#{meth}>"
|
95
96
|
end
|
96
97
|
|
97
98
|
end
|
@@ -26,7 +26,7 @@ describe 'Relevance::Tarantula::HtmlReportHelper#wrap_stack_trace_line' do
|
|
26
26
|
line = %{/action_controller/filters.rb:697:in `call_filters'}
|
27
27
|
@reporter.stubs(:textmate_url).returns("ide_url")
|
28
28
|
html = @reporter.wrap_stack_trace_line(line)
|
29
|
-
html.should
|
29
|
+
html.should include "<a href='ide_url'>/action_controller/filters.rb:697</a>:in `call_filters"
|
30
30
|
end
|
31
31
|
|
32
32
|
it "converts html entities for non-stack trace lines" do
|
@@ -2,83 +2,107 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe "Relevance::Tarantula::Link" do
|
4
4
|
include ActionView::Helpers::UrlHelper
|
5
|
-
|
5
|
+
|
6
6
|
it "does not raise an error when initializing without href attribtue" do
|
7
7
|
link = make_link(Hpricot('<a="/foo">foo</a>').at('a'))
|
8
8
|
link.href.should == nil
|
9
|
-
link.
|
9
|
+
link.meth.should == :get
|
10
10
|
end
|
11
11
|
|
12
12
|
it "parses anchor tags" do
|
13
13
|
link = make_link(Hpricot('<a href="/foo">foo</a>').at('a'))
|
14
14
|
link.href.should == '/foo'
|
15
|
-
link.
|
15
|
+
link.meth.should == :get
|
16
16
|
end
|
17
17
|
|
18
18
|
it "parses anchor tags with POST 'method'" do
|
19
19
|
link = make_link(Hpricot(%Q{<a href="/foo" onclick="#{Relevance::Tarantula::Link.method_javascript_function(:post)}">foo</a>}).at('a'))
|
20
20
|
link.href.should == '/foo'
|
21
|
-
link.
|
21
|
+
link.meth.should == :post
|
22
|
+
end
|
23
|
+
|
24
|
+
it "parses anchor tags with POST data-method" do
|
25
|
+
link = make_link(Hpricot(%Q{<a href="/foo" data-method="post">foo</a>}).at('a'))
|
26
|
+
link.href.should == '/foo'
|
27
|
+
link.meth.should == :post
|
22
28
|
end
|
23
29
|
|
24
30
|
it "parses anchor tags with PUT 'method'" do
|
25
31
|
link = make_link(Hpricot(%Q{<a href="/foo" onclick="#{Relevance::Tarantula::Link.method_javascript_function(:put)}">foo</a>}).at('a'))
|
26
32
|
link.href.should == '/foo'
|
27
|
-
link.
|
33
|
+
link.meth.should == :put
|
34
|
+
end
|
35
|
+
|
36
|
+
it "parses anchor tags with PUT data-method" do
|
37
|
+
link = make_link(Hpricot(%Q{<a href="/foo" data-method="put">foo</a>}).at('a'))
|
38
|
+
link.href.should == '/foo'
|
39
|
+
link.meth.should == :put
|
40
|
+
end
|
41
|
+
|
42
|
+
it "parses anchor tags with PATCH data-method" do
|
43
|
+
link = make_link(Hpricot(%Q{<a href="/foo" data-method="patch">foo</a>}).at('a'))
|
44
|
+
link.href.should == '/foo'
|
45
|
+
link.meth.should == :patch
|
28
46
|
end
|
29
47
|
|
30
48
|
it "parses anchor tags with DELETE 'method'" do
|
31
49
|
link = make_link(Hpricot(%Q{<a href="/foo" onclick="#{Relevance::Tarantula::Link.method_javascript_function(:delete)}">foo</a>}).at('a'))
|
32
50
|
link.href.should == '/foo'
|
33
|
-
link.
|
51
|
+
link.meth.should == :delete
|
52
|
+
end
|
53
|
+
|
54
|
+
it "parses anchor tags with DELETE data-method" do
|
55
|
+
link = make_link(Hpricot(%Q{<a href="/foo" data-method="delete">foo</a>}).at('a'))
|
56
|
+
link.href.should == '/foo'
|
57
|
+
link.meth.should == :delete
|
34
58
|
end
|
35
59
|
|
36
60
|
it "parses link tags with text" do
|
37
61
|
link = make_link(Hpricot('<link href="/bar">bar</a>').at('link'))
|
38
62
|
link.href.should == '/bar'
|
39
|
-
link.
|
63
|
+
link.meth.should == :get
|
40
64
|
end
|
41
|
-
|
65
|
+
|
42
66
|
it "parses link tags without text" do
|
43
67
|
link = make_link(Hpricot('<link href="/bar" />').at('link'))
|
44
68
|
link.href.should == '/bar'
|
45
|
-
link.
|
69
|
+
link.meth.should == :get
|
46
70
|
end
|
47
|
-
|
71
|
+
|
48
72
|
it 'remembers link referrer if there is one' do
|
49
73
|
link = make_link('/url', stub_everything, '/some-referrer')
|
50
74
|
link.referrer.should == '/some-referrer'
|
51
75
|
end
|
52
|
-
|
76
|
+
|
53
77
|
it "does two things when crawled: follow, log, and handle" do
|
54
78
|
crawler = Relevance::Tarantula::Crawler.new
|
55
79
|
link = make_link('/foo', crawler)
|
56
|
-
|
80
|
+
|
57
81
|
response = stub(:code => "200")
|
58
82
|
crawler.expects(:follow).returns(response)
|
59
83
|
link.expects(:log)
|
60
84
|
crawler.expects(:handle_link_results)
|
61
|
-
|
85
|
+
|
62
86
|
link.crawl
|
63
87
|
end
|
64
|
-
|
88
|
+
|
65
89
|
# method_javascript_function needs this method
|
66
90
|
def protect_against_forgery?
|
67
91
|
false
|
68
92
|
end
|
69
|
-
|
93
|
+
|
70
94
|
end
|
71
95
|
|
72
96
|
describe "possible conflict when user has an AR model named Link" do
|
73
97
|
it "does not taint Object with Relevance::Tarantula" do
|
74
98
|
Object.ancestors.should_not include(Relevance::Tarantula)
|
75
99
|
end
|
76
|
-
|
100
|
+
|
77
101
|
it "doesnt break with a Link model" do
|
78
102
|
lambda {
|
79
103
|
class Link < ActiveRecord::Base
|
80
104
|
end
|
81
105
|
}.should_not raise_error
|
82
106
|
end
|
83
|
-
|
107
|
+
|
84
108
|
end
|
data/tarantula.gemspec
CHANGED
@@ -17,9 +17,9 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.add_runtime_dependency "htmlentities", "~> 4.3.0"
|
18
18
|
s.add_runtime_dependency "hpricot", "~> 0.8.4"
|
19
19
|
|
20
|
-
s.add_development_dependency "rspec", "~> 2.
|
20
|
+
s.add_development_dependency "rspec", "~> 2.12.0"
|
21
21
|
s.add_development_dependency 'rdoc', '~> 3.12.0'
|
22
22
|
s.add_development_dependency "log_buddy", "~> 0.6.0"
|
23
|
-
s.add_development_dependency "mocha", "~> 0.
|
23
|
+
s.add_development_dependency "mocha", "~> 0.13.2"
|
24
24
|
s.add_development_dependency "rails", ">= 2.3.0"
|
25
25
|
end
|
metadata
CHANGED
@@ -1,101 +1,144 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: tarantula
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 11
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 5
|
9
|
+
- 0
|
10
|
+
version: 0.5.0
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Relevance, Inc.
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
17
|
+
|
18
|
+
date: 2013-04-12 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
15
21
|
name: htmlentities
|
16
|
-
|
22
|
+
prerelease: false
|
23
|
+
type: :runtime
|
24
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
17
25
|
none: false
|
18
|
-
requirements:
|
26
|
+
requirements:
|
19
27
|
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 51
|
30
|
+
segments:
|
31
|
+
- 4
|
32
|
+
- 3
|
33
|
+
- 0
|
21
34
|
version: 4.3.0
|
22
|
-
|
23
|
-
|
24
|
-
version_requirements: *70200734539400
|
25
|
-
- !ruby/object:Gem::Dependency
|
35
|
+
requirement: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
26
37
|
name: hpricot
|
27
|
-
|
38
|
+
prerelease: false
|
39
|
+
type: :runtime
|
40
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
28
41
|
none: false
|
29
|
-
requirements:
|
42
|
+
requirements:
|
30
43
|
- - ~>
|
31
|
-
- !ruby/object:Gem::Version
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 55
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
- 8
|
49
|
+
- 4
|
32
50
|
version: 0.8.4
|
33
|
-
|
34
|
-
|
35
|
-
version_requirements: *70200734538900
|
36
|
-
- !ruby/object:Gem::Dependency
|
51
|
+
requirement: *id002
|
52
|
+
- !ruby/object:Gem::Dependency
|
37
53
|
name: rspec
|
38
|
-
|
54
|
+
prerelease: false
|
55
|
+
type: :development
|
56
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
39
57
|
none: false
|
40
|
-
requirements:
|
58
|
+
requirements:
|
41
59
|
- - ~>
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
-
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 63
|
62
|
+
segments:
|
63
|
+
- 2
|
64
|
+
- 12
|
65
|
+
- 0
|
66
|
+
version: 2.12.0
|
67
|
+
requirement: *id003
|
68
|
+
- !ruby/object:Gem::Dependency
|
48
69
|
name: rdoc
|
49
|
-
|
70
|
+
prerelease: false
|
71
|
+
type: :development
|
72
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
50
73
|
none: false
|
51
|
-
requirements:
|
74
|
+
requirements:
|
52
75
|
- - ~>
|
53
|
-
- !ruby/object:Gem::Version
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 55
|
78
|
+
segments:
|
79
|
+
- 3
|
80
|
+
- 12
|
81
|
+
- 0
|
54
82
|
version: 3.12.0
|
55
|
-
|
56
|
-
|
57
|
-
version_requirements: *70200734537980
|
58
|
-
- !ruby/object:Gem::Dependency
|
83
|
+
requirement: *id004
|
84
|
+
- !ruby/object:Gem::Dependency
|
59
85
|
name: log_buddy
|
60
|
-
|
86
|
+
prerelease: false
|
87
|
+
type: :development
|
88
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
61
89
|
none: false
|
62
|
-
requirements:
|
90
|
+
requirements:
|
63
91
|
- - ~>
|
64
|
-
- !ruby/object:Gem::Version
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 7
|
94
|
+
segments:
|
95
|
+
- 0
|
96
|
+
- 6
|
97
|
+
- 0
|
65
98
|
version: 0.6.0
|
66
|
-
|
67
|
-
|
68
|
-
version_requirements: *70200734537520
|
69
|
-
- !ruby/object:Gem::Dependency
|
99
|
+
requirement: *id005
|
100
|
+
- !ruby/object:Gem::Dependency
|
70
101
|
name: mocha
|
71
|
-
|
102
|
+
prerelease: false
|
103
|
+
type: :development
|
104
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
72
105
|
none: false
|
73
|
-
requirements:
|
106
|
+
requirements:
|
74
107
|
- - ~>
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
-
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
hash: 47
|
110
|
+
segments:
|
111
|
+
- 0
|
112
|
+
- 13
|
113
|
+
- 2
|
114
|
+
version: 0.13.2
|
115
|
+
requirement: *id006
|
116
|
+
- !ruby/object:Gem::Dependency
|
81
117
|
name: rails
|
82
|
-
|
118
|
+
prerelease: false
|
119
|
+
type: :development
|
120
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
83
121
|
none: false
|
84
|
-
requirements:
|
85
|
-
- -
|
86
|
-
- !ruby/object:Gem::Version
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
hash: 3
|
126
|
+
segments:
|
127
|
+
- 2
|
128
|
+
- 3
|
129
|
+
- 0
|
87
130
|
version: 2.3.0
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
description: Tarantula is a big fuzzy spider. It crawls your Rails 2.3 and 3.x applications,
|
92
|
-
fuzzing data to see what breaks.
|
93
|
-
email:
|
131
|
+
requirement: *id007
|
132
|
+
description: Tarantula is a big fuzzy spider. It crawls your Rails 2.3 and 3.x applications, fuzzing data to see what breaks.
|
133
|
+
email:
|
94
134
|
- opensource@thinkrelevance.com
|
95
135
|
executables: []
|
136
|
+
|
96
137
|
extensions: []
|
138
|
+
|
97
139
|
extra_rdoc_files: []
|
98
|
-
|
140
|
+
|
141
|
+
files:
|
99
142
|
- .autotest
|
100
143
|
- .gitignore
|
101
144
|
- .rvmrc
|
@@ -186,27 +229,36 @@ files:
|
|
186
229
|
- vendor/xss-shield/test/test_safe_string.rb
|
187
230
|
homepage: https://github.com/relevance/tarantula
|
188
231
|
licenses: []
|
232
|
+
|
189
233
|
post_install_message:
|
190
234
|
rdoc_options: []
|
191
|
-
|
235
|
+
|
236
|
+
require_paths:
|
192
237
|
- lib
|
193
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
238
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
194
239
|
none: false
|
195
|
-
requirements:
|
196
|
-
- -
|
197
|
-
- !ruby/object:Gem::Version
|
198
|
-
|
199
|
-
|
240
|
+
requirements:
|
241
|
+
- - ">="
|
242
|
+
- !ruby/object:Gem::Version
|
243
|
+
hash: 3
|
244
|
+
segments:
|
245
|
+
- 0
|
246
|
+
version: "0"
|
247
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
200
248
|
none: false
|
201
|
-
requirements:
|
202
|
-
- -
|
203
|
-
- !ruby/object:Gem::Version
|
204
|
-
|
249
|
+
requirements:
|
250
|
+
- - ">="
|
251
|
+
- !ruby/object:Gem::Version
|
252
|
+
hash: 3
|
253
|
+
segments:
|
254
|
+
- 0
|
255
|
+
version: "0"
|
205
256
|
requirements: []
|
257
|
+
|
206
258
|
rubyforge_project:
|
207
|
-
rubygems_version: 1.8.
|
259
|
+
rubygems_version: 1.8.21
|
208
260
|
signing_key:
|
209
261
|
specification_version: 3
|
210
262
|
summary: A big hairy fuzzy spider that crawls your site, wreaking havoc
|
211
|
-
test_files:
|
263
|
+
test_files:
|
212
264
|
- template/tarantula_test.rb
|