cobweb 1.0.12 → 1.0.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/README.textile +2 -1
- data/lib/cobweb.rb +5 -2
- data/lib/cobweb_crawler.rb +2 -0
- data/lib/cobweb_version.rb +1 -1
- data/lib/server.rb +4 -4
- data/lib/stats.rb +2 -0
- data/public/js/jquery.flot.js +2 -2
- data/spec/http_stubs.rb +62 -62
- data/views/statistics.haml +4 -5
- metadata +5 -29
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ODVkZmRkYjU3NjVkN2U2NjEzYmNlZDQxYTI4MDc3N2Y5MzBjZjhkOA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MGU3M2EzNmJiMTk4NzdjZTY0MjJiY2M1YTQ5ZDcyOGY2ZjEzNzU0OQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MzI0NTc1YTM4ODYxNjVhZWE1ZDEwZjI5MWEzYzc3MmYwMzExNDdkM2U0OThl
|
10
|
+
MTRhOTA3ZGRmN2RjYWUzODlmYjgwM2U5Mzg1ZmU1OWY0YWFkMWU1ODYyMTU1
|
11
|
+
Y2ViYjNjZmZiOTExNWU0MDFiN2QzODExMzc3NTVhNjRmNGJjNmE=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NTdkZWJhNTgzYzU5YjRjYzI4ZmYxMDE2NGNhZTkxZWFkMTBlZTU5MWQ0YjUw
|
14
|
+
YzAyOGQ0Y2Y1NjI1OGUyY2MxM2M0NGU0MTZhMWIzMDcwZTA3MmZhMTg4NmUx
|
15
|
+
YzE5NWZhZjljZTM5NzI5MWFhODQ1MDI1YjI3Zjc0MjlhODdhNjE=
|
data/README.textile
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
h1. Cobweb v1.0.
|
2
|
+
h1. Cobweb v1.0.15
|
3
3
|
|
4
4
|
"@cobweb_gem":https://twitter.com/cobweb_gem
|
5
5
|
!https://badge.fury.io/rb/cobweb.png!:http://badge.fury.io/rb/cobweb
|
@@ -106,6 +106,7 @@ Creates a new crawler object based on a base_url
|
|
106
106
|
** :crawl_id - the id used internally for identifying the crawl. Can be used by the processing job to seperate crawls
|
107
107
|
** :internal_urls - an array of urls with * wildcards that represent urls internal to the site (ie pages within the same domain)
|
108
108
|
** :external_urls - an array of urls with * wildcards that represent urls external to the site (overrides internal_urls)
|
109
|
+
** :seed_urls - an array of urls that are put into the queue regardless of any other setting, combine with {:external_urls => "*"} to limit to seed urls
|
109
110
|
** :obey_robots - boolean determining if robots.txt should be honoured. (default: false)
|
110
111
|
** :user_agent - user agent string to match in robots.txt (not sent as user_agent of requests yet) (default: cobweb)
|
111
112
|
** :crawl_limit_by_page - sets the crawl counter to only use html page types when counting objects crawled
|
data/lib/cobweb.rb
CHANGED
@@ -49,6 +49,7 @@ class Cobweb
|
|
49
49
|
default_redis_options_to Hash.new
|
50
50
|
default_internal_urls_to []
|
51
51
|
default_external_urls_to []
|
52
|
+
default_seed_urls_to []
|
52
53
|
default_first_page_redirect_internal_to true
|
53
54
|
default_text_mime_types_to ["text/*", "application/xhtml+xml"]
|
54
55
|
default_obey_robots_to false
|
@@ -80,6 +81,8 @@ class Cobweb
|
|
80
81
|
@redis.hset "statistics", "queued_at", DateTime.now
|
81
82
|
@redis.set("crawl-counter", 0)
|
82
83
|
@redis.set("queue-counter", 1)
|
84
|
+
|
85
|
+
@options[:seed_urls].map{|link| @redis.sadd "queued", link }
|
83
86
|
|
84
87
|
@stats = Stats.new(request)
|
85
88
|
@stats.start_crawl(request)
|
@@ -138,10 +141,10 @@ class Cobweb
|
|
138
141
|
# check if it has already been cached
|
139
142
|
if ((@options[:cache_type] == :crawl_based && redis.get(unique_id)) || (@options[:cache_type] == :full && full_redis.get(unique_id))) && @options[:cache]
|
140
143
|
if @options[:cache_type] == :crawl_based
|
141
|
-
puts "Cache hit for #{url}" unless @options[:quiet]
|
144
|
+
puts "Cache hit in crawl for #{url}" #unless @options[:quiet]
|
142
145
|
content = HashUtil.deep_symbolize_keys(Marshal.load(redis.get(unique_id)))
|
143
146
|
else
|
144
|
-
puts "Cache hit for #{url}" unless @options[:quiet]
|
147
|
+
puts "Cache hit for #{url}" #unless @options[:quiet]
|
145
148
|
content = HashUtil.deep_symbolize_keys(Marshal.load(full_redis.get(unique_id)))
|
146
149
|
end
|
147
150
|
else
|
data/lib/cobweb_crawler.rb
CHANGED
@@ -23,6 +23,8 @@ class CobwebCrawler
|
|
23
23
|
@redis = Redis::Namespace.new("cobweb-#{Cobweb.version}-#{@crawl_id}", :redis => Redis.new(@options[:redis_options]))
|
24
24
|
@options[:internal_urls] = [] if @options[:internal_urls].nil?
|
25
25
|
@options[:internal_urls].map{|url| @redis.sadd("internal_urls", url)}
|
26
|
+
@options[:seed_urls] = [] if @options[:seed_urls].nil?
|
27
|
+
@options[:seed_urls].map{|link| @redis.sadd "queued", link }
|
26
28
|
|
27
29
|
@options[:crawl_linked_external] = false unless @options.has_key? :crawl_linked_external
|
28
30
|
|
data/lib/cobweb_version.rb
CHANGED
data/lib/server.rb
CHANGED
@@ -7,6 +7,7 @@ class Server < Sinatra::Base
|
|
7
7
|
set :root, File.dirname(__FILE__)
|
8
8
|
set :views, settings.root + '/../views'
|
9
9
|
set :public_folder, settings.root + '/../public'
|
10
|
+
set :bind, '0.0.0.0'
|
10
11
|
enable :static
|
11
12
|
|
12
13
|
# Sinatra Dashboard
|
@@ -26,6 +27,7 @@ class Server < Sinatra::Base
|
|
26
27
|
:minute_totals => redis.hgetall("minute_totals"),
|
27
28
|
})
|
28
29
|
@crawls << stats
|
30
|
+
@crawls.sort!{|a,b| b[:statistics][:crawl_started_at] <=> a[:statistics][:crawl_started_at]}
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
@@ -63,10 +65,8 @@ class Server < Sinatra::Base
|
|
63
65
|
:pages_count => HashUtil.deep_symbolize_keys(redis.hgetall("pages_count")),
|
64
66
|
:assets_count => HashUtil.deep_symbolize_keys(redis.hgetall("assets_count"))
|
65
67
|
}
|
66
|
-
|
67
|
-
|
68
|
-
end
|
69
|
-
|
68
|
+
|
69
|
+
@dates = (1..30).to_a.reverse.map{|minutes| [(DateTime.now - (minutes/1440.0)).strftime("%Y-%m-%d %H:%M").to_sym, minutes] }
|
70
70
|
haml :statistics
|
71
71
|
end
|
72
72
|
|
data/lib/stats.rb
CHANGED
@@ -20,6 +20,7 @@ class Stats
|
|
20
20
|
@redis.hset "crawl_details", key, options[key].to_s
|
21
21
|
end
|
22
22
|
end
|
23
|
+
@redis.hset "statistics", "crawl_started_at", DateTime.now
|
23
24
|
@redis.hset "statistics", "current_status", CobwebCrawlHelper::STARTING
|
24
25
|
end
|
25
26
|
|
@@ -31,6 +32,7 @@ class Stats
|
|
31
32
|
else
|
32
33
|
@redis.hset "statistics", "current_status", CobwebCrawlHelper::FINISHED
|
33
34
|
end
|
35
|
+
@redis.hset "statistics", "crawl_finished_at", DateTime.now
|
34
36
|
#@redis.del "crawl_details"
|
35
37
|
end
|
36
38
|
|
data/public/js/jquery.flot.js
CHANGED
@@ -56,7 +56,7 @@
|
|
56
56
|
xaxis: {
|
57
57
|
show: null, // null = auto-detect, true = always, false = never
|
58
58
|
position: "bottom", // or "top"
|
59
|
-
mode:
|
59
|
+
mode: "time", // null or "time"
|
60
60
|
color: null, // base color, labels, ticks
|
61
61
|
tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)"
|
62
62
|
transform: null, // null or f: number -> number to transform axis
|
@@ -77,7 +77,7 @@
|
|
77
77
|
tickSize: null, // number or [number, "unit"]
|
78
78
|
minTickSize: null, // number or [number, "unit"]
|
79
79
|
monthNames: null, // list of names of months
|
80
|
-
timeformat:
|
80
|
+
timeformat: "%H:%M", // format string to use
|
81
81
|
twelveHourClock: false // 12 or 24 time in time mode
|
82
82
|
},
|
83
83
|
yaxis: {
|
data/spec/http_stubs.rb
CHANGED
@@ -21,75 +21,75 @@ module HttpStubs
|
|
21
21
|
:"X-XSS-Protection" => "1; mode=block"}
|
22
22
|
|
23
23
|
|
24
|
-
@mock_http_client =
|
25
|
-
@mock_http_request =
|
26
|
-
@mock_http_robot_request =
|
27
|
-
@mock_http_redirect_request =
|
28
|
-
@mock_http_redirect_request2 =
|
24
|
+
@mock_http_client = double(Net::HTTP)
|
25
|
+
@mock_http_request = double(Net::HTTPRequest)
|
26
|
+
@mock_http_robot_request = double(Net::HTTPRequest)
|
27
|
+
@mock_http_redirect_request = double(Net::HTTPRequest)
|
28
|
+
@mock_http_redirect_request2 = double(Net::HTTPRequest)
|
29
29
|
|
30
|
-
@mock_http_response =
|
31
|
-
@mock_http_robot_response =
|
32
|
-
@mock_http_redirect_response =
|
33
|
-
@mock_http_redirect_response2 =
|
34
|
-
@mock_http_get =
|
30
|
+
@mock_http_response = double(Net::HTTPResponse)
|
31
|
+
@mock_http_robot_response = double(Net::HTTPResponse)
|
32
|
+
@mock_http_redirect_response = double(Net::HTTPRedirection)
|
33
|
+
@mock_http_redirect_response2 = double(Net::HTTPRedirection)
|
34
|
+
@mock_http_get = double(Net::HTTP::Get)
|
35
35
|
|
36
|
-
Net::HTTP.stub
|
37
|
-
Net::HTTP::Get.stub
|
38
|
-
Net::HTTP::Get.stub
|
39
|
-
Net::HTTP::Get.stub
|
40
|
-
Net::HTTP::Get.stub
|
41
|
-
Net::HTTP::Get.stub
|
36
|
+
Net::HTTP.stub(:new).and_return(@mock_http_client)
|
37
|
+
Net::HTTP::Get.stub(:new).and_return(@mock_http_request)
|
38
|
+
Net::HTTP::Get.stub(:new).with("/redirect.html", an_instance_of(Hash)).and_return(@mock_http_redirect_request)
|
39
|
+
Net::HTTP::Get.stub(:new).with("/robots.txt", an_instance_of(Hash)).and_return(@mock_http_robot_request)
|
40
|
+
Net::HTTP::Get.stub(:new).with("/redirect2.html", an_instance_of(Hash)).and_return(@mock_http_redirect_request2)
|
41
|
+
Net::HTTP::Get.stub(:new).with("/redirected.html", an_instance_of(Hash)).and_return(@mock_http_request)
|
42
42
|
|
43
|
-
Net::HTTP::Head.stub
|
43
|
+
Net::HTTP::Head.stub(:new).and_return(@mock_http_request)
|
44
44
|
|
45
|
-
@mock_http_client.stub
|
46
|
-
@mock_http_client.stub
|
47
|
-
@mock_http_client.stub
|
48
|
-
@mock_http_client.stub
|
49
|
-
@mock_http_client.stub
|
50
|
-
@mock_http_client.stub
|
51
|
-
@mock_http_client.stub
|
52
|
-
@mock_http_client.stub
|
53
|
-
@mock_http_client.stub
|
45
|
+
@mock_http_client.stub(:request).with(@mock_http_request).and_return(@mock_http_response)
|
46
|
+
@mock_http_client.stub(:request).with(@mock_http_robot_request).and_return(@mock_http_robot_response)
|
47
|
+
@mock_http_client.stub(:request).with(@mock_http_redirect_request).and_return(@mock_http_redirect_response)
|
48
|
+
@mock_http_client.stub(:request).with(@mock_http_redirect_request2).and_return(@mock_http_redirect_response2)
|
49
|
+
@mock_http_client.stub(:read_timeout=).and_return(nil)
|
50
|
+
@mock_http_client.stub(:open_timeout=).and_return(nil)
|
51
|
+
@mock_http_client.stub(:start).and_return(@mock_http_response)
|
52
|
+
@mock_http_client.stub(:address).and_return("www.baseurl.com")
|
53
|
+
@mock_http_client.stub(:port).and_return("80")
|
54
54
|
|
55
|
-
@mock_http_robot_response.stub
|
56
|
-
@mock_http_robot_response.stub
|
57
|
-
@mock_http_robot_response.stub
|
58
|
-
@mock_http_robot_response.stub
|
59
|
-
@mock_http_robot_response.stub
|
60
|
-
@mock_http_robot_response.stub
|
61
|
-
@mock_http_robot_response.stub
|
62
|
-
@mock_http_robot_response.stub
|
63
|
-
@mock_http_robot_response.stub
|
55
|
+
@mock_http_robot_response.stub(:code).and_return(200)
|
56
|
+
@mock_http_robot_response.stub(:body).and_return(File.open(File.dirname(__FILE__) + '/../spec/samples/robots.txt', "r").read)
|
57
|
+
@mock_http_robot_response.stub(:content_type).and_return("text/plain")
|
58
|
+
@mock_http_robot_response.stub(:[]).with("Content-Type").and_return(@default_headers["Content-Type"])
|
59
|
+
@mock_http_robot_response.stub(:[]).with("location").and_return(@default_headers["location"])
|
60
|
+
@mock_http_robot_response.stub(:[]).with("Content-Encoding").and_return(@default_headers["Content-Encoding"])
|
61
|
+
@mock_http_robot_response.stub(:content_length).and_return(1024)
|
62
|
+
@mock_http_robot_response.stub(:get_fields).with('set-cookie').and_return(["session=al98axx; expires=Fri, 31-Dec-1999 23:58:23", "query=rubyscript; expires=Fri, 31-Dec-1999 23:58:23"])
|
63
|
+
@mock_http_robot_response.stub(:to_hash).and_return(@default_headers)
|
64
64
|
|
65
|
-
@mock_http_response.stub
|
66
|
-
@mock_http_response.stub
|
67
|
-
@mock_http_response.stub
|
68
|
-
@mock_http_response.stub
|
69
|
-
@mock_http_response.stub
|
70
|
-
@mock_http_response.stub
|
71
|
-
@mock_http_response.stub
|
72
|
-
@mock_http_response.stub
|
73
|
-
@mock_http_response.stub
|
65
|
+
@mock_http_response.stub(:code).and_return(200)
|
66
|
+
@mock_http_response.stub(:content_type).and_return("text/html")
|
67
|
+
@mock_http_response.stub(:[]).with("Content-Type").and_return(@default_headers["Content-Type"])
|
68
|
+
@mock_http_response.stub(:[]).with("location").and_return(@default_headers["location"])
|
69
|
+
@mock_http_response.stub(:[]).with("Content-Encoding").and_return(@default_headers["Content-Encoding"])
|
70
|
+
@mock_http_response.stub(:content_length).and_return(1024)
|
71
|
+
@mock_http_response.stub(:body).and_return("asdf")
|
72
|
+
@mock_http_response.stub(:get_fields).with('set-cookie').and_return(["session=al98axx; expires=Fri, 31-Dec-1999 23:58:23", "query=rubyscript; expires=Fri, 31-Dec-1999 23:58:23"])
|
73
|
+
@mock_http_response.stub(:to_hash).and_return(@default_headers)
|
74
74
|
|
75
|
-
@mock_http_redirect_response.stub
|
76
|
-
@mock_http_redirect_response.stub
|
77
|
-
@mock_http_redirect_response.stub
|
78
|
-
@mock_http_redirect_response.stub
|
79
|
-
@mock_http_redirect_response.stub
|
80
|
-
@mock_http_redirect_response.stub
|
81
|
-
@mock_http_redirect_response.stub
|
82
|
-
@mock_http_redirect_response.stub
|
83
|
-
@mock_http_redirect_response.stub
|
75
|
+
@mock_http_redirect_response.stub(:code).and_return(301)
|
76
|
+
@mock_http_redirect_response.stub(:content_type).and_return("text/html")
|
77
|
+
@mock_http_redirect_response.stub(:[]).with("Content-Type").and_return(@default_headers["Content-Type"])
|
78
|
+
@mock_http_redirect_response.stub(:[]).with("location").and_return("http://redirected-to.com/redirect2.html")
|
79
|
+
@mock_http_redirect_response.stub(:[]).with("Content-Encoding").and_return(@default_headers["Content-Encoding"])
|
80
|
+
@mock_http_redirect_response.stub(:content_length).and_return(2048)
|
81
|
+
@mock_http_redirect_response.stub(:body).and_return("redirected body")
|
82
|
+
@mock_http_redirect_response.stub(:get_fields).with('set-cookie').and_return(["session=al98axx; expires=Fri, 31-Dec-1999 23:58:23", "query=rubyscript; expires=Fri, 31-Dec-1999 23:58:23"])
|
83
|
+
@mock_http_redirect_response.stub(:to_hash).and_return(@default_headers)
|
84
84
|
|
85
|
-
@mock_http_redirect_response2.stub
|
86
|
-
@mock_http_redirect_response2.stub
|
87
|
-
@mock_http_redirect_response2.stub
|
88
|
-
@mock_http_redirect_response2.stub
|
89
|
-
@mock_http_redirect_response2.stub
|
90
|
-
@mock_http_redirect_response2.stub
|
91
|
-
@mock_http_redirect_response2.stub
|
92
|
-
@mock_http_redirect_response2.stub
|
93
|
-
@mock_http_redirect_response2.stub
|
85
|
+
@mock_http_redirect_response2.stub(:code).and_return(301)
|
86
|
+
@mock_http_redirect_response2.stub(:content_type).and_return("text/html")
|
87
|
+
@mock_http_redirect_response2.stub(:[]).with("Content-Type").and_return(@default_headers["Content-Type"])
|
88
|
+
@mock_http_redirect_response2.stub(:[]).with("location").and_return("http://redirected-to.com/redirected.html")
|
89
|
+
@mock_http_redirect_response2.stub(:[]).with("Content-Encoding").and_return(@default_headers["Content-Encoding"])
|
90
|
+
@mock_http_redirect_response2.stub(:content_length).and_return(2048)
|
91
|
+
@mock_http_redirect_response2.stub(:body).and_return("redirected body")
|
92
|
+
@mock_http_redirect_response2.stub(:get_fields).with('set-cookie').and_return(["session=al98axx; expires=Fri, 31-Dec-1999 23:58:23", "query=rubyscript; expires=Fri, 31-Dec-1999 23:58:23"])
|
93
|
+
@mock_http_redirect_response2.stub(:to_hash).and_return(@default_headers)
|
94
94
|
end
|
95
95
|
end
|
data/views/statistics.haml
CHANGED
@@ -30,7 +30,7 @@
|
|
30
30
|
%h2 Pages and Assets
|
31
31
|
%span.hide
|
32
32
|
.content
|
33
|
-
.caption Counts of assets and pages that have been crawled
|
33
|
+
.caption Counts of assets and pages that have been crawled over the last 30 mins
|
34
34
|
%table.statics{:style => "width : 100%;"}
|
35
35
|
%thead
|
36
36
|
%tr
|
@@ -39,8 +39,7 @@
|
|
39
39
|
%th{:style => "color: #006ba0;"} Assets
|
40
40
|
|
41
41
|
%tbody
|
42
|
-
-
|
43
|
-
- date = (DateTime.now.new_offset(0) - (minutes/1440.0)).strftime("%Y-%m-%d %H:%M").to_sym
|
42
|
+
- @dates.each do |date, minutes|
|
44
43
|
%tr
|
45
44
|
%th= minutes
|
46
45
|
%td= @crawl[:pages_count][date]
|
@@ -88,7 +87,7 @@
|
|
88
87
|
|
89
88
|
%tbody
|
90
89
|
- (1..30).each do |minutes|
|
91
|
-
- date = (DateTime.now
|
90
|
+
- date = (DateTime.now - (minutes/1440.0)).strftime("%Y-%m-%d %H:%M").to_sym
|
92
91
|
%tr
|
93
92
|
%th= minutes
|
94
93
|
%td= @crawl[:status_200_count][date]
|
@@ -113,7 +112,7 @@
|
|
113
112
|
|
114
113
|
%tbody
|
115
114
|
- (1..30).each do |minutes|
|
116
|
-
- date = (DateTime.now
|
115
|
+
- date = (DateTime.now - (minutes/1440.0)).strftime("%Y-%m-%d %H:%M").to_sym
|
117
116
|
%tr
|
118
117
|
%th= minutes
|
119
118
|
%td= @crawl[:mime_text_count][date]
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cobweb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.15
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Stewart McKee
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-08-
|
11
|
+
date: 2013-08-19 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: redis
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ! '>='
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ! '>='
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,7 +27,6 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: nokogiri
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ! '>='
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ! '>='
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,7 +41,6 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: addressable
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - ! '>='
|
52
46
|
- !ruby/object:Gem::Version
|
@@ -54,7 +48,6 @@ dependencies:
|
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
52
|
- - ! '>='
|
60
53
|
- !ruby/object:Gem::Version
|
@@ -62,7 +55,6 @@ dependencies:
|
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: rspec
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
59
|
- - ! '>='
|
68
60
|
- !ruby/object:Gem::Version
|
@@ -70,7 +62,6 @@ dependencies:
|
|
70
62
|
type: :runtime
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
66
|
- - ! '>='
|
76
67
|
- !ruby/object:Gem::Version
|
@@ -78,7 +69,6 @@ dependencies:
|
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: awesome_print
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
73
|
- - ! '>='
|
84
74
|
- !ruby/object:Gem::Version
|
@@ -86,7 +76,6 @@ dependencies:
|
|
86
76
|
type: :runtime
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
80
|
- - ! '>='
|
92
81
|
- !ruby/object:Gem::Version
|
@@ -94,7 +83,6 @@ dependencies:
|
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: sinatra
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
87
|
- - ! '>='
|
100
88
|
- !ruby/object:Gem::Version
|
@@ -102,7 +90,6 @@ dependencies:
|
|
102
90
|
type: :runtime
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
93
|
requirements:
|
107
94
|
- - ! '>='
|
108
95
|
- !ruby/object:Gem::Version
|
@@ -110,7 +97,6 @@ dependencies:
|
|
110
97
|
- !ruby/object:Gem::Dependency
|
111
98
|
name: thin
|
112
99
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
100
|
requirements:
|
115
101
|
- - ! '>='
|
116
102
|
- !ruby/object:Gem::Version
|
@@ -118,7 +104,6 @@ dependencies:
|
|
118
104
|
type: :runtime
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
107
|
requirements:
|
123
108
|
- - ! '>='
|
124
109
|
- !ruby/object:Gem::Version
|
@@ -126,7 +111,6 @@ dependencies:
|
|
126
111
|
- !ruby/object:Gem::Dependency
|
127
112
|
name: haml
|
128
113
|
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
114
|
requirements:
|
131
115
|
- - ! '>='
|
132
116
|
- !ruby/object:Gem::Version
|
@@ -134,7 +118,6 @@ dependencies:
|
|
134
118
|
type: :runtime
|
135
119
|
prerelease: false
|
136
120
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
121
|
requirements:
|
139
122
|
- - ! '>='
|
140
123
|
- !ruby/object:Gem::Version
|
@@ -142,7 +125,6 @@ dependencies:
|
|
142
125
|
- !ruby/object:Gem::Dependency
|
143
126
|
name: namespaced_redis
|
144
127
|
requirement: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
128
|
requirements:
|
147
129
|
- - ! '>='
|
148
130
|
- !ruby/object:Gem::Version
|
@@ -150,7 +132,6 @@ dependencies:
|
|
150
132
|
type: :runtime
|
151
133
|
prerelease: false
|
152
134
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
135
|
requirements:
|
155
136
|
- - ! '>='
|
156
137
|
- !ruby/object:Gem::Version
|
@@ -158,7 +139,6 @@ dependencies:
|
|
158
139
|
- !ruby/object:Gem::Dependency
|
159
140
|
name: json
|
160
141
|
requirement: !ruby/object:Gem::Requirement
|
161
|
-
none: false
|
162
142
|
requirements:
|
163
143
|
- - ! '>='
|
164
144
|
- !ruby/object:Gem::Version
|
@@ -166,7 +146,6 @@ dependencies:
|
|
166
146
|
type: :runtime
|
167
147
|
prerelease: false
|
168
148
|
version_requirements: !ruby/object:Gem::Requirement
|
169
|
-
none: false
|
170
149
|
requirements:
|
171
150
|
- - ! '>='
|
172
151
|
- !ruby/object:Gem::Version
|
@@ -174,7 +153,6 @@ dependencies:
|
|
174
153
|
- !ruby/object:Gem::Dependency
|
175
154
|
name: slop
|
176
155
|
requirement: !ruby/object:Gem::Requirement
|
177
|
-
none: false
|
178
156
|
requirements:
|
179
157
|
- - ! '>='
|
180
158
|
- !ruby/object:Gem::Version
|
@@ -182,7 +160,6 @@ dependencies:
|
|
182
160
|
type: :runtime
|
183
161
|
prerelease: false
|
184
162
|
version_requirements: !ruby/object:Gem::Requirement
|
185
|
-
none: false
|
186
163
|
requirements:
|
187
164
|
- - ! '>='
|
188
165
|
- !ruby/object:Gem::Version
|
@@ -562,27 +539,26 @@ files:
|
|
562
539
|
- README.textile
|
563
540
|
homepage: http://github.com/stewartmckee/cobweb
|
564
541
|
licenses: []
|
542
|
+
metadata: {}
|
565
543
|
post_install_message:
|
566
544
|
rdoc_options: []
|
567
545
|
require_paths:
|
568
546
|
- lib
|
569
547
|
required_ruby_version: !ruby/object:Gem::Requirement
|
570
|
-
none: false
|
571
548
|
requirements:
|
572
549
|
- - ! '>='
|
573
550
|
- !ruby/object:Gem::Version
|
574
551
|
version: '0'
|
575
552
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
576
|
-
none: false
|
577
553
|
requirements:
|
578
554
|
- - ! '>='
|
579
555
|
- !ruby/object:Gem::Version
|
580
556
|
version: '0'
|
581
557
|
requirements: []
|
582
558
|
rubyforge_project:
|
583
|
-
rubygems_version:
|
559
|
+
rubygems_version: 2.0.3
|
584
560
|
signing_key:
|
585
|
-
specification_version:
|
561
|
+
specification_version: 4
|
586
562
|
summary: Cobweb is a web crawler that can use resque to cluster crawls to quickly
|
587
563
|
crawl extremely large sites faster than multi-threaded crawlers. It is also a standalone
|
588
564
|
crawler that has a sophisticated statistics monitoring interface to monitor the
|