seo_checker 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/README.md +13 -0
  2. data/VERSION +1 -1
  3. data/lib/seo_checker.rb +58 -31
  4. data/seo_checker.gemspec +68 -0
  5. metadata +30 -22
data/README.md CHANGED
@@ -5,11 +5,19 @@ Check your website if it is seo.
5
5
  ## Checklists
6
6
 
7
7
  - use sitemap file
8
+ - each page are reachable
9
+ - each page has title
8
10
  - use unique title tags for each page
11
+ - each page has meta description
9
12
  - ues unique descriptions for each page
13
+ - url does not just use ID number.
10
14
  - url does not use excessive keywords
11
15
  - url does not have deep nesting of subdirectories
12
16
 
17
+ ## Install
18
+
19
+ <code>sudo gem install seo_checker</code>
20
+
13
21
  ## Usage
14
22
 
15
23
  It is easy to use, just one line.
@@ -24,3 +32,8 @@ Usage: seo_checker [OPTIONS] website_url
24
32
  -h, --help Show this message
25
33
  </code></pre>
26
34
 
35
+ For example:
36
+
37
+ <pre><code>seo_checker http://localhost:3000</code></pre>
38
+
39
+ <pre><code>seo_checker http://yoursite.com -b 10 -i 1</code></pre>
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
data/lib/seo_checker.rb CHANGED
@@ -11,9 +11,14 @@ class SEOChecker
11
11
  @locations = []
12
12
  @titles = {}
13
13
  @descriptions = {}
14
- @errors = []
15
- @batch_size = options[:batch_size].to_i
16
- @interval_time = options[:interval_time].to_i || 0
14
+ @id_urls = {}
15
+ @excessive_keywords = []
16
+ @nesting_subdirectories = []
17
+ @no_titles = []
18
+ @no_descriptions = []
19
+ @unreachables = []
20
+ @batch_size = options[:batch_size] ? options[:batch_size].to_i : nil
21
+ @interval_time = options[:interval_time].to_i
17
22
  end
18
23
 
19
24
  def check
@@ -45,31 +50,22 @@ class SEOChecker
45
50
  batch_locations.each do |location|
46
51
  response = get_response(URI.parse(location))
47
52
  if response.is_a? Net::HTTPSuccess
48
- check_title(response, location)
49
- check_description(response, location)
53
+ if response.body =~ %r{<head>(.*?)</head>}m
54
+ check_title($1, location)
55
+ check_description($1, location)
56
+ else
57
+ @no_titles << location
58
+ @no_descriptions << location
59
+ end
50
60
  check_url(location)
51
61
  else
52
- @errors << "The page is unreachable #{location}."
62
+ @unreachables << location
53
63
  end
54
64
  end
55
65
  sleep(@interval_time)
56
66
  end
57
67
  end
58
68
 
59
- def report
60
- @titles.each do |title, locations|
61
- if locations.size > 1
62
- @errors << "#{locations.slice(0, 5).join(', ')} #{'and ...' if locations.size > 5} have the same title '#{title}'."
63
- end
64
- end
65
- @descriptions.each do |description, locations|
66
- if locations.size > 1
67
- @errors << "#{locations.slice(0, 5).join(', ')} #{'and ...' if locations.size > 5} have the same description '#{description}'."
68
- end
69
- end
70
- puts @errors.join("\n")
71
- end
72
-
73
69
  private
74
70
  def get_response(uri)
75
71
  http = Net::HTTP.new(uri.host, uri.port)
@@ -78,34 +74,65 @@ class SEOChecker
78
74
  response = http.request(request)
79
75
  end
80
76
 
81
- def check_title(response, location)
82
- if response.body =~ %r{<title>(.*?)</title>}
77
+ def check_title(header_string, location)
78
+ if header_string =~ %r{<title>(.*?)</title>}
83
79
  title = $1
80
+ (@titles[title] ||= []) << location
84
81
  else
85
- @errors << "#{location} has no title."
82
+ @no_titles << location
86
83
  end
87
- (@titles[title] ||= []) << location
88
84
  end
89
85
 
90
- def check_description(response, location)
91
- if response.body =~ %r{<meta\s+name=["']description["']\s+content=["'](.*?)["']\s*/>|<meta\s+content=["'](.*?)["']\s+name=["']description["']\s*/>}
86
+ def check_description(header_string, location)
87
+ if header_string =~ %r{<meta\s+name=["']description["']\s+content=["'](.*?)["']\s*/>|<meta\s+content=["'](.*?)["']\s+name=["']description["']\s*/>}
92
88
  description = $1 || $2
89
+ (@descriptions[description] ||= []) << location
93
90
  else
94
- @errors << "#{location} has no description."
91
+ @no_descriptions << location
95
92
  end
96
- (@descriptions[description] ||= []) << location
97
93
  end
98
94
 
99
95
  def check_url(location)
100
96
  items = location.split('/')
101
97
  if items.find { |item| item =~ /^\d+$/ } || items.last =~ /^\d+\.htm(l)?/
102
- @errors << "#{location} should not just use ID number in URL."
98
+ @id_urls[location.gsub(%r{/\d+/}, 'id')] = location
103
99
  end
104
100
  if items.find { |item| item.split('-').size > 5 }
105
- @errors << "#{location} use excessive keywords"
101
+ @excessive_keywords << location
106
102
  end
107
103
  if items.size > 8
108
- @errors << "#{location} has deep nesting of subdirectories"
104
+ @nesting_subdirectories << location
105
+ end
106
+ end
107
+
108
+ def report
109
+ unless @unreachables.empty?
110
+ print "#{@unreachables.slice(0, 5).join(",\n")} #{'and ...' if @unreachables.size > 5} are unreachable.\n\n"
111
+ end
112
+ unless @no_titles.empty?
113
+ print "#{@no_titles.slice(0, 5).join(",\n")} #{'and ...' if @no_titles.size > 5} have no title.\n\n"
114
+ end
115
+ unless @no_descriptions.empty?
116
+ print "#{@no_descriptions.slice(0, 5).join(",\n")} #{'and ...' if @no_descriptions.size > 5} have no description.\n\n"
117
+ end
118
+ @titles.each do |title, locations|
119
+ if locations.size > 1
120
+ print "#{locations.slice(0, 5).join(",\n")} #{'and ...' if locations.size > 5} have the same title '#{title}'.\n\n"
121
+ end
122
+ end
123
+ @descriptions.each do |description, locations|
124
+ if locations.size > 1
125
+ print "#{locations.slice(0, 5).join(",\n")} #{'and ...' if locations.size > 5} have the same description '#{description}'.\n\n"
126
+ end
127
+ end
128
+ unless @id_urls.empty?
129
+ print "#{@id_urls.values.slice(0, 5).join(",\n")} #{'and ...' if @id_urls.values.size > 5} use ID number in URL.\n\n"
130
+ end
131
+ unless @excessive_keywords.empty?
132
+ print "#{@excessive_keywords.slice(0, 5).join(",\n")} #{'and ...' if @excessive_keywords.size > 5} use excessive keywords in URL.\n\n"
133
+ end
134
+ unless @nesting_subdirectories.empty?
135
+ print "#{@nesting_subdirectories.slice(0, 5).join(",\n")} #{'and ...' if @nesting_subdirectories.size > 5} have deep nesting of subdirectories in URL.\n\n"
109
136
  end
110
137
  end
111
138
  end
@@ -0,0 +1,68 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{seo_checker}
8
+ s.version = "0.2.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Richard Huang"]
12
+ s.date = %q{2010-03-04}
13
+ s.description = %q{seo_checker check your website if it is seo.}
14
+ s.email = %q{flyerhzm@gmail.com}
15
+ s.executables = ["seo_checker", "seo_checker"]
16
+ s.extra_rdoc_files = [
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ "README.md",
21
+ "Rakefile",
22
+ "VERSION",
23
+ "bin/seo_checker",
24
+ "lib/seo_checker.rb",
25
+ "seo_checker.gemspec"
26
+ ]
27
+ s.homepage = %q{http://github.com/flyerhzm/seo_checker}
28
+ s.rdoc_options = ["--charset=UTF-8"]
29
+ s.require_paths = ["lib"]
30
+ s.rubygems_version = %q{1.3.6}
31
+ s.summary = %q{seo_checker check your website if it is seo.}
32
+ s.test_files = [
33
+ "examples/bad_seo/app/controllers/application_controller.rb",
34
+ "examples/bad_seo/app/controllers/posts_controller.rb",
35
+ "examples/bad_seo/app/helpers/application_helper.rb",
36
+ "examples/bad_seo/app/helpers/posts_helper.rb",
37
+ "examples/bad_seo/app/models/post.rb",
38
+ "examples/bad_seo/config/boot.rb",
39
+ "examples/bad_seo/config/environment.rb",
40
+ "examples/bad_seo/config/environments/development.rb",
41
+ "examples/bad_seo/config/environments/production.rb",
42
+ "examples/bad_seo/config/initializers/backtrace_silencers.rb",
43
+ "examples/bad_seo/config/initializers/inflections.rb",
44
+ "examples/bad_seo/config/initializers/mime_types.rb",
45
+ "examples/bad_seo/config/initializers/new_rails_defaults.rb",
46
+ "examples/bad_seo/config/initializers/session_store.rb",
47
+ "examples/bad_seo/config/routes.rb",
48
+ "examples/bad_seo/db/migrate/20100228140057_create_posts.rb",
49
+ "examples/bad_seo/db/schema.rb",
50
+ "examples/bad_seo/db/seeds.rb",
51
+ "examples/bad_seo/test/functional/posts_controller_test.rb",
52
+ "examples/bad_seo/test/performance/browsing_test.rb",
53
+ "examples/bad_seo/test/test_helper.rb",
54
+ "examples/bad_seo/test/unit/helpers/posts_helper_test.rb",
55
+ "examples/bad_seo/test/unit/post_test.rb"
56
+ ]
57
+
58
+ if s.respond_to? :specification_version then
59
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
60
+ s.specification_version = 3
61
+
62
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
63
+ else
64
+ end
65
+ else
66
+ end
67
+ end
68
+
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: seo_checker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
5
10
  platform: ruby
6
11
  authors:
7
12
  - Richard Huang
@@ -9,7 +14,7 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-03-02 00:00:00 +08:00
17
+ date: 2010-03-04 00:00:00 +08:00
13
18
  default_executable:
14
19
  dependencies: []
15
20
 
@@ -28,6 +33,7 @@ files:
28
33
  - VERSION
29
34
  - bin/seo_checker
30
35
  - lib/seo_checker.rb
36
+ - seo_checker.gemspec
31
37
  has_rdoc: true
32
38
  homepage: http://github.com/flyerhzm/seo_checker
33
39
  licenses: []
@@ -41,42 +47,44 @@ required_ruby_version: !ruby/object:Gem::Requirement
41
47
  requirements:
42
48
  - - ">="
43
49
  - !ruby/object:Gem::Version
50
+ segments:
51
+ - 0
44
52
  version: "0"
45
- version:
46
53
  required_rubygems_version: !ruby/object:Gem::Requirement
47
54
  requirements:
48
55
  - - ">="
49
56
  - !ruby/object:Gem::Version
57
+ segments:
58
+ - 0
50
59
  version: "0"
51
- version:
52
60
  requirements: []
53
61
 
54
62
  rubyforge_project:
55
- rubygems_version: 1.3.5
63
+ rubygems_version: 1.3.6
56
64
  signing_key:
57
65
  specification_version: 3
58
66
  summary: seo_checker check your website if it is seo.
59
67
  test_files:
60
- - examples/bad_seo/config/routes.rb
68
+ - examples/bad_seo/app/controllers/application_controller.rb
69
+ - examples/bad_seo/app/controllers/posts_controller.rb
70
+ - examples/bad_seo/app/helpers/application_helper.rb
71
+ - examples/bad_seo/app/helpers/posts_helper.rb
72
+ - examples/bad_seo/app/models/post.rb
73
+ - examples/bad_seo/config/boot.rb
74
+ - examples/bad_seo/config/environment.rb
75
+ - examples/bad_seo/config/environments/development.rb
76
+ - examples/bad_seo/config/environments/production.rb
61
77
  - examples/bad_seo/config/initializers/backtrace_silencers.rb
62
- - examples/bad_seo/config/initializers/new_rails_defaults.rb
63
- - examples/bad_seo/config/initializers/session_store.rb
64
78
  - examples/bad_seo/config/initializers/inflections.rb
65
79
  - examples/bad_seo/config/initializers/mime_types.rb
66
- - examples/bad_seo/config/environment.rb
67
- - examples/bad_seo/config/boot.rb
68
- - examples/bad_seo/config/environments/production.rb
69
- - examples/bad_seo/config/environments/development.rb
70
- - examples/bad_seo/test/test_helper.rb
71
- - examples/bad_seo/test/performance/browsing_test.rb
80
+ - examples/bad_seo/config/initializers/new_rails_defaults.rb
81
+ - examples/bad_seo/config/initializers/session_store.rb
82
+ - examples/bad_seo/config/routes.rb
83
+ - examples/bad_seo/db/migrate/20100228140057_create_posts.rb
84
+ - examples/bad_seo/db/schema.rb
85
+ - examples/bad_seo/db/seeds.rb
72
86
  - examples/bad_seo/test/functional/posts_controller_test.rb
87
+ - examples/bad_seo/test/performance/browsing_test.rb
88
+ - examples/bad_seo/test/test_helper.rb
73
89
  - examples/bad_seo/test/unit/helpers/posts_helper_test.rb
74
90
  - examples/bad_seo/test/unit/post_test.rb
75
- - examples/bad_seo/db/migrate/20100228140057_create_posts.rb
76
- - examples/bad_seo/db/seeds.rb
77
- - examples/bad_seo/db/schema.rb
78
- - examples/bad_seo/app/helpers/application_helper.rb
79
- - examples/bad_seo/app/helpers/posts_helper.rb
80
- - examples/bad_seo/app/models/post.rb
81
- - examples/bad_seo/app/controllers/application_controller.rb
82
- - examples/bad_seo/app/controllers/posts_controller.rb