sinatra-seo 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -22,7 +22,13 @@ This library requires you to define the basic SEO information such as the title,
22
22
  description: my About description goes here.
23
23
  keywords: keyword4, keyword5, keyword6
24
24
 
25
- Please note that we are naming each page as named in your *views/* directory. The three attributes you're required to fill (**title**, **description** and **keywords**) should be strings.
25
+ Please note that we are naming each page as named in your *views/* directory. The three attributes you're required to fill (**title**, **description** and **keywords**) should be strings and these attributes also should have a maximum of characters or words as detailed below:
26
+
27
+ * the attribute **Title** should have a maximum of 60 characters.
28
+ * the attribute **Description** should have a maximum of 160 characters.
29
+ * the attribute **Keywords** should contain a maximum of 15 words.
30
+
31
+ Even tough this limitation usually spark a discussion among SEO specialists, I've decided to use the minimum number in order to make sure all the data you define for your pages is parsed by the search engines.
26
32
 
27
33
  Now, as any other existing extension, there are two possible use cases in order to hook up your *site.seo* file to your application. If you follow the **Classic** approach, then you just need to require this extension in your *app.rb* file and then set the SEO file this extension should parse.
28
34
 
data/lib/sinatra/seo.rb CHANGED
@@ -6,6 +6,13 @@ class OpenStruct
6
6
  def new_ostruct_member(name)
7
7
  name = name.to_sym
8
8
 
9
+ @table[name] = case name
10
+ when :title then @table[name][0, 60]
11
+ when :description then @table[name][0, 160]
12
+ when :keywords then @table[name].split(" ")[0, 15].join(" ")
13
+ else @table[name]
14
+ end
15
+
9
16
  unless self.respond_to?(name)
10
17
  class << self; self; end.class_eval do
11
18
  define_method(name) {@table[name].is_a?(Hash) ? OpenStruct.new(@table[name]) : @table[name]}
data/spec/seo_spec.rb CHANGED
@@ -29,33 +29,63 @@ describe Sinatra::Seo do
29
29
  set :seo_file, './test.seo'
30
30
  end
31
31
 
32
- it "then the :seo_file option should contain the path to the SEO file." do
33
- app.seo_file.should_not be_nil
34
- app.seo_file.should be_an_instance_of(String)
35
- app.seo_file.should == './test.seo'
36
- end
37
-
38
- it "then the defined :seo_file should exist and have the '.seo' extension." do
39
- File.exist?('./test.seo').should be_true
40
- File.extname(app.seo_file).should == '.seo'
32
+ context "then the :seo_file" do
33
+ it "should contain the path to the SEO file." do
34
+ app.seo_file.should_not be_nil
35
+ app.seo_file.should be_an_instance_of(String)
36
+ app.seo_file.should == './test.seo'
37
+ end
38
+
39
+ it "should exist and have the '.seo' extension." do
40
+ File.exist?('./test.seo').should be_true
41
+ File.extname(app.seo_file).should == '.seo'
42
+ end
41
43
  end
42
44
 
43
- it "then the seo helper method should include every page (with :title, :description and :keywords as sub-attributes) as a read-only attribute." do
44
- YAML.load_file('./test.seo').keys.each do |page|
45
- seo.methods.include?(page).should be_true
46
- seo.methods.include?(:"#{page}=").should be_false
47
-
48
- eval("seo.#{page}").should be_an_instance_of(OpenStruct)
49
-
50
- [:title, :description, :keywords].each do |attribute|
51
- eval("seo.#{page}.methods").include?(attribute).should be_true
52
- eval("seo.#{page}.methods").include?(:"#{attribute}=").should be_false
53
- eval("seo.#{page}.#{attribute}").should be_an_instance_of(String)
54
- eval("seo.#{page}.#{attribute}").should == DATA[page][attribute]
45
+ context "then the seo helper method" do
46
+ it "should include every page with its sub-attributes as a read-only attributes." do
47
+ YAML.load_file('./test.seo').keys.each do |page|
48
+ seo.methods.include?(page).should be_true
49
+ seo.methods.include?(:"#{page}=").should be_false
50
+
51
+ eval("seo.#{page}").should be_an_instance_of(OpenStruct)
52
+
53
+ [:title, :description, :keywords].each do |attribute|
54
+ eval("seo.#{page}.methods").include?(attribute).should be_true
55
+ eval("seo.#{page}.methods").include?(:"#{attribute}=").should be_false
56
+ eval("seo.#{page}.#{attribute}").should be_an_instance_of(String)
57
+
58
+ case attribute
59
+ when :title
60
+ eval("seo.#{page}.#{attribute}").should == DATA[page][attribute][0, 60]
61
+ when :description
62
+ eval("seo.#{page}.#{attribute}").should == DATA[page][attribute][0, 160]
63
+ else
64
+ eval("seo.#{page}.#{attribute}").should == DATA[page][attribute].split(" ")[0, 15].join(" ")
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ it "should allow a maximum of 60 characters for the Title sub-attribute." do
71
+ seo.instance_variable_get(:@table).keys.each do |page|
72
+ eval("seo.#{page}.title").size.should <= 60
73
+ end
74
+ end
75
+
76
+ it "should allow a maximum of 160 characters for the Description aub-attribute." do
77
+ seo.instance_variable_get(:@table).keys.each do |page|
78
+ eval("seo.#{page}.description").size.should <= 160
79
+ end
80
+ end
81
+
82
+ it "should allow a maximum of 15 words for the Keywords aub-attribute." do
83
+ seo.instance_variable_get(:@table).keys.each do |page|
84
+ eval("seo.#{page}.keywords").split(" ").size.should <= 15
55
85
  end
56
86
  end
57
87
  end
58
-
88
+
59
89
  after :all do
60
90
  File.delete './test.seo'
61
91
  end
data/spec/spec_helper.rb CHANGED
@@ -5,6 +5,13 @@ require File.join(Dir.pwd, %w{lib sinatra seo})
5
5
  set :environment, :test
6
6
  enable :raise_errors
7
7
 
8
- DATA = {:test1 => {:title => 'Title1', :description => 'Description1', :keywords => 'Keywords1'},
9
- :test2 => {:title => 'Title2', :description => 'Description2', :keywords => 'Keywords2'},
10
- :test3 => {:title => 'Title3', :description => 'Description3', :keywords => 'Keywords3'}}
8
+ DATA = {:test1 => { :title => lambda{word = ""; 50.times{word += "t"}; word}.call,
9
+ :description => lambda{word = ""; 150.times{word += "d"}; word}.call,
10
+ :keywords => lambda{word = ""; 10.times{word += "k, "}; word}.call },
11
+ :test2 => { :title => lambda{word = ""; 60.times{word += "t"}; word}.call,
12
+ :description => lambda{word = ""; 160.times{word += "d"}; word}.call,
13
+ :keywords => lambda{word = ""; 15.times{word += "k, "}; word}.call },
14
+ :test3 => { :title => lambda{word = ""; 70.times{word += "t"}; word}.call,
15
+ :description => lambda{word = ""; 170.times{word += "d"}; word}.call,
16
+ :keywords => lambda{word = ""; 20.times{word += "k, "}; word}.call }}
17
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinatra-seo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julio Javier Cicchelli
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-03-13 00:00:00 +01:00
12
+ date: 2010-03-16 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency