jeremylightsmith-actionsite 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,28 @@
1
+ module ActionSite
2
+ class AsyncLinkChecker < LinkChecker
3
+ def check(url)
4
+ url, html = fetch(url)
5
+ do_check(host_for(url), 1, url)
6
+ end
7
+
8
+ def do_check(host, level, *urls)
9
+ return if urls.empty?
10
+ raise "too many levels down" if level > 20
11
+ urls = urls.map {|url| clean_url(url) }.
12
+ reject {|url| ignore_url?(url, host)}
13
+ urls -= @checked_urls
14
+ @checked_urls += urls
15
+ puts "checking #{level} level(s) down :\n #{urls.join("\n ")}\n"
16
+
17
+ child_urls = []
18
+ urls.map do |url|
19
+ Thread.new do
20
+ url, html = fetch(url)
21
+ child_urls << links_from(html, url) if local?(host, url)
22
+ end
23
+ end.each {|t| t.join}
24
+
25
+ do_check(host, level + 1, *child_urls.flatten)
26
+ end
27
+ end
28
+ end
@@ -11,37 +11,40 @@ module ActionSite
11
11
  end
12
12
 
13
13
  def check(url, host = nil, indent = "")
14
- url = url.sub(/\#.*/, '')
15
- return if url.blank?
16
- return if @options[:local] && host && !local?(host, url)
14
+ url = clean_url(url)
15
+ return if ignore_url?(url, host)
17
16
  return if @checked_urls.include?(url)
18
17
  @checked_urls << url
19
18
 
20
19
  puts "#{indent}checking #{url}"
21
20
 
22
- begin
23
- url, html = fetch(url)
24
- rescue
25
- puts "#{url} not found"
26
- raise
27
- end
21
+ url, html = fetch(url)
28
22
 
29
23
  host ||= host_for(url)
30
- doc = Hpricot(html)
31
-
32
24
  if local?(host, url)
33
- (doc / "a").each do |link|
34
- if child_link = expand_link(url, link["href"])
35
- begin
36
- check child_link, host, indent + " "
37
- rescue
38
- puts "from #{url} as #{link}"
39
- raise
40
- end
25
+ links_from(html, url).each do |child_url|
26
+ begin
27
+ check child_url, host, indent + " "
28
+ rescue
29
+ puts "from #{url} as #{link}"
30
+ raise
41
31
  end
42
32
  end
43
33
  end
44
34
  end
35
+
36
+ def clean_url(url)
37
+ url.sub(/\#.*/, '')
38
+ end
39
+
40
+ def ignore_url?(url, host = nil)
41
+ url.blank? || (@options[:local] && host && !local?(host, url))
42
+ end
43
+
44
+ def links_from(html, url)
45
+ doc = Hpricot(html)
46
+ (doc / "a").map {|link| expand_link(url, link["href"])}.compact
47
+ end
45
48
 
46
49
  def expand_link(from, to)
47
50
  case to
@@ -89,6 +92,9 @@ module ActionSite
89
92
  else
90
93
  response.error!
91
94
  end
95
+ rescue
96
+ puts "#{url} not found"
97
+ raise
92
98
  end
93
99
 
94
100
  def host_for(url)
data/lib/action_site.rb CHANGED
@@ -16,7 +16,8 @@ require 'action_site/extensions/string'
16
16
 
17
17
  require 'action_site/site'
18
18
  require 'action_site/link_checker'
19
+ require 'action_site/async_link_checker'
19
20
 
20
21
  module ActionSite
21
- VERSION = 0.3
22
+ VERSION = 0.4
22
23
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jeremylightsmith-actionsite
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.3"
4
+ version: "0.4"
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Lightsmith
@@ -14,6 +14,7 @@ default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
17
+ type: :runtime
17
18
  version_requirement:
18
19
  version_requirements: !ruby/object:Gem::Requirement
19
20
  requirements:
@@ -23,6 +24,7 @@ dependencies:
23
24
  version:
24
25
  - !ruby/object:Gem::Dependency
25
26
  name: RedCloth
27
+ type: :runtime
26
28
  version_requirement:
27
29
  version_requirements: !ruby/object:Gem::Requirement
28
30
  requirements:
@@ -32,6 +34,7 @@ dependencies:
32
34
  version:
33
35
  - !ruby/object:Gem::Dependency
34
36
  name: markaby
37
+ type: :runtime
35
38
  version_requirement:
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
@@ -51,6 +54,7 @@ files:
51
54
  - Rakefile
52
55
  - readme.txt
53
56
  - lib/action_site
57
+ - lib/action_site/async_link_checker.rb
54
58
  - lib/action_site/context.rb
55
59
  - lib/action_site/extensions
56
60
  - lib/action_site/extensions/string.rb