excalibur 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b949e8ce1e9848ef126f58c9250c16ed82f862f8
4
- data.tar.gz: 221b7b12fafb7bc6c74edc91315630b0a3891944
3
+ metadata.gz: 4e73905a05488d0f31f7bee41eef8755cfd72010
4
+ data.tar.gz: 9d8eb4c51d7996a0faff11fcc93977773b83257e
5
5
  SHA512:
6
- metadata.gz: e41843c3cb31b43956310993bb536692b56f1002bef3b43a1731b4708b7018da08187d7f3ca562ab87802cd15599bed8e82332fa81d803c1e2e3fc58d834a1eb
7
- data.tar.gz: f3c106e9a5ea7a1828b0c4229d25967cfd52d485052ff93c021ca20dd860a2577bd9fb42fc6b0aeffdef95c7283804e3bb425e5330105f5ba8127c128ba1f89e
6
+ metadata.gz: 631f7546330c3bbefeafb82e8ccf2cd0cc6b7c89b990c6f5c60bcdcb967ea3f9865adcf320bbb5dc9a13d689ed9a04ebdcaa8a9ace15dfd4c951e9946c65ab3c
7
+ data.tar.gz: 9d81f8a6b01e62e92dfe7a982696e7193bfb4655785521ff8173b61e4d2245dd4bb506103791266490f4d5517174ca244360e6f6922be4d1c1f4c0eaff3a2f6b
data/README.md CHANGED
@@ -1,14 +1,26 @@
1
1
  # Excalibur
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/excalibur.svg)](http://badge.fury.io/rb/excalibur)
3
4
  [![Build Status](https://travis-ci.org/yopefonic/excalibur.svg)](https://travis-ci.org/yopefonic/excalibur)
4
5
  [![Code Climate](https://codeclimate.com/github/yopefonic/excalibur/badges/gpa.svg)](https://codeclimate.com/github/yopefonic/excalibur)
5
6
 
6
- Excalibur is a SEO gem for [Ruby on Rails](rubyonrails.org) and helps you to
7
- set the title and meta tags for you site overall and per page. Unlike other
8
- options like [meta-tags](https://github.com/kpumuk/meta-tags) and
9
- [meta_magic](https://github.com/lassebunk/metamagic) Excalibur focusses on
10
- providing an object based DSL to turn the objects you are presenting on the
11
- page into SEO related tags in the head.
7
+ Excalibur is a SEO related gem for [Ruby on Rails](rubyonrails.org) that helps
8
+ you to set the title and meta tags for your site overall and per page in a
9
+ nicely structured and with separated concerns.
10
+
11
+ Setting titles and meta tags for pages can become a hassle when dealing with
12
+ more complex SEO requirements. When adding [OpenGraph](http://ogp.me/),
13
+ [Twitter Cards](https://dev.twitter.com/cards/overview) or
14
+ [schema.org](http://schema.org/docs/gs.html) for Google+ there are a host of
15
+ options that differ from object to object. You could add methods to the object
16
+ model to create these meta tags but that would put rendering concerns into
17
+ model's class. Not an ideal situation. Other option could be to create helper
18
+ methods but as you need to present more than 3 different object they can
19
+ become cluttered, long and unyielding.
20
+
21
+ In comes Excalibur; object presentors that have all the logic per object type,
22
+ convenient helper methods to print them on the page and an application wide
23
+ default configuration.
12
24
 
13
25
  ## Installation
14
26
 
@@ -78,6 +90,24 @@ context.
78
90
  entitle @your_object, config: @custom_config
79
91
  ```
80
92
 
93
+ ### Views without an object
94
+
95
+ In some cases you might not have an object to present. Like when on a
96
+ collection page or when dealing with a static page. There is a helper method
97
+ that allows you to set some custom values. ```quick_set``` takes a couple of
98
+ arguments to set the values of titles, descriptions and meta_tags.
99
+
100
+ These are some examples of what you can set:
101
+
102
+ ```erb
103
+ <%
104
+ quick_set :title, :content, :body, 'custom quick set title body'
105
+ quick_set :description, :option, :length, 42
106
+ quick_set :title, :combinator, proc { |obj| custom_code }
107
+ quick_set :meta_tag, :name, :description, 'custom quick set meta tag'
108
+ %>
109
+ ```
110
+
81
111
  ### Decorators
82
112
 
83
113
  The decorators are what turns your object into data that can be used for the
data/excalibur.gemspec CHANGED
@@ -8,8 +8,12 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Excalibur::VERSION
9
9
  spec.authors = ['Joost Elfering']
10
10
  spec.email = ['yopefonic@gmail.com']
11
- spec.summary = %q{helper gem to set page title and meta tags in a rails app}
12
- spec.description = %q{helper gem for rails apps to set the title and meta tags for a page. The helper can take custom input per page, objects that use decorator to determine the tags or an application wide configurable default.}
11
+ spec.summary = %q{helper gem to set page title and meta tags in a
12
+ rails app}
13
+ spec.description = %q{Excalibur is a SEO related gem for Ruby on Rails
14
+ that helps you to set the title and meta tags for your
15
+ site overall and per page in a nicely structured and
16
+ with separated concerns.}
13
17
  spec.homepage = 'https://github.com/yopefonic/excalibur'
14
18
  spec.license = 'MIT'
15
19
 
@@ -21,6 +21,10 @@ module Excalibur
21
21
  @configuration ||= ::Excalibur.configuration.dup
22
22
  end
23
23
 
24
+ # methods:
25
+ # excalibur_set_title_content, excalibur_set_title_option,
26
+ # excalibur_set_title_combinator, excalibur_set_description_content,
27
+ # excalibur_set_description_option, excalibur_set_description_combinator
24
28
  def method_missing(meth, *args)
25
29
  if meth.to_s =~ /^excalibur_set_(title|description+)_(content|option|combinator+)$/
26
30
  configuration.send($1).send("update_#{$2}", *args)
@@ -48,8 +52,18 @@ module Excalibur
48
52
  configuration.merge!(config)
49
53
  end
50
54
 
51
- def render_title(obj = self)
52
- configuration.title.to_s(obj) if configuration.title.present?
55
+ # methods: render_title, render_description
56
+ def method_missing(meth, *args)
57
+ if meth.to_s =~ /^render_(title|description+)$/
58
+ obj = args.first || self
59
+ subject = configuration.send($1)
60
+
61
+ if subject.present?
62
+ subject.to_s(obj)
63
+ end
64
+ else
65
+ super
66
+ end
53
67
  end
54
68
  end
55
69
  end
@@ -1,4 +1,4 @@
1
1
  # setting version number for the Excalibur gem
2
2
  module Excalibur
3
- VERSION = '0.0.3'
3
+ VERSION = '0.0.4'
4
4
  end
@@ -6,6 +6,19 @@ module Excalibur
6
6
  @excalibur_subject = excalibur_decorate_subject(object, options)
7
7
  end
8
8
 
9
+ def quick_set(type, *args)
10
+ case type
11
+ when :title, :description
12
+ section = args.shift
13
+ excalibur_subject.configuration.send(type).send(
14
+ "update_#{section}",
15
+ *args
16
+ )
17
+ when :meta_tag
18
+ excalibur_subject.configuration.set_meta_tag(*args)
19
+ end
20
+ end
21
+
9
22
  def render_title_tag
10
23
  content_tag :title, excalibur_subject.render_title
11
24
  end
@@ -24,7 +37,7 @@ module Excalibur
24
37
  :meta,
25
38
  type_name => type_value,
26
39
  content: content
27
- )
40
+ ) unless content.nil?
28
41
  end
29
42
  end
30
43
  end
data/lib/excalibur.rb CHANGED
@@ -80,9 +80,7 @@ module Excalibur
80
80
  def new_default_meta_tags
81
81
  ::HashWithIndifferentAccess.new(
82
82
  name: ::HashWithIndifferentAccess.new(
83
- description: proc do |obj|
84
- obj.configuration.description.to_s(obj)
85
- end,
83
+ description: proc { |obj| obj.render_description },
86
84
  viewport: 'width=device-width, initial-scale=1'
87
85
  )
88
86
  )
@@ -71,5 +71,6 @@ class Excalibur::<%= class_name %>Decorator < Excalibur::Decorator
71
71
  # responsibility. The decorator becomes easier to test and it is also a lot
72
72
  # cleaner.
73
73
  #
74
- # TODO: An article about how to do it properly will come soon!
74
+ # read more about how to use decorators with procs properly:
75
+ # https://github.com/yopefonic/excalibur/wiki/Advised-usage-of-proc%27s
75
76
  end
@@ -220,5 +220,19 @@ module Excalibur
220
220
  end
221
221
  end
222
222
  end
223
+
224
+ describe '#render_description' do
225
+ let(:obj) { DummyDecorator.decorate(Dummy.new) }
226
+
227
+ context 'when using the default settings' do
228
+ it { expect(obj.render_description).to eq('Excalibur; a worthy title for a gem about titles.') }
229
+
230
+ it 'should call to_s in the title' do
231
+ expect(obj.configuration.description).to receive(:to_s)
232
+
233
+ obj.render_description
234
+ end
235
+ end
236
+ end
223
237
  end
224
238
  end
@@ -31,6 +31,42 @@ module Excalibur
31
31
  end
32
32
  end
33
33
 
34
+ describe '#quick_set' do
35
+ it 'should be able to set a meta tag' do
36
+ expect_any_instance_of(Configuration).to receive(:set_meta_tag).with(:name, :description, 'quick set value')
37
+
38
+ helpers.quick_set(:meta_tag, :name, :description, 'quick set value')
39
+
40
+ expect(helpers.instance_variable_get(:@excalibur_subject)).to be_instance_of Decorator
41
+ end
42
+
43
+ [:title, :description].each do |type|
44
+ it "should be able to set #{type} content" do
45
+ expect_any_instance_of(TruncateableContent).to receive(:update_content).with(:body, 'quick set value')
46
+
47
+ helpers.quick_set(type, :content, :body, 'quick set value')
48
+
49
+ expect(helpers.instance_variable_get(:@excalibur_subject)).to be_instance_of Decorator
50
+ end
51
+
52
+ it "should be able to set #{type} options" do
53
+ expect_any_instance_of(TruncateableContent).to receive(:update_option).with(:length, 42)
54
+
55
+ helpers.quick_set(type, :option, :length, 42)
56
+
57
+ expect(helpers.instance_variable_get(:@excalibur_subject)).to be_instance_of Decorator
58
+ end
59
+
60
+ it "should be able to set #{type} combinator" do
61
+ expect_any_instance_of(TruncateableContent).to receive(:update_combinator).with('foobar')
62
+
63
+ helpers.quick_set(type, :combinator, 'foobar')
64
+
65
+ expect(helpers.instance_variable_get(:@excalibur_subject)).to be_instance_of Decorator
66
+ end
67
+ end
68
+ end
69
+
34
70
  describe '#render_title_tag' do
35
71
  context 'when the configuration is standard' do
36
72
  it 'should return a title tag with the default content' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: excalibur
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joost Elfering
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-10 00:00:00.000000000 Z
11
+ date: 2014-10-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -152,9 +152,11 @@ dependencies:
152
152
  - - '>='
153
153
  - !ruby/object:Gem::Version
154
154
  version: 0.10.1
155
- description: helper gem for rails apps to set the title and meta tags for a page.
156
- The helper can take custom input per page, objects that use decorator to determine
157
- the tags or an application wide configurable default.
155
+ description: |-
156
+ Excalibur is a SEO related gem for Ruby on Rails
157
+ that helps you to set the title and meta tags for your
158
+ site overall and per page in a nicely structured and
159
+ with separated concerns.
158
160
  email:
159
161
  - yopefonic@gmail.com
160
162
  executables: []