meta_tags-rails 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/.rspec +3 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +21 -0
  7. data/CHANGELOG.md +135 -0
  8. data/Gemfile +13 -0
  9. data/MIT-LICENSE +22 -0
  10. data/README.md +627 -0
  11. data/Rakefile +28 -0
  12. data/lib/meta_tags-rails.rb +37 -0
  13. data/lib/meta_tags-rails/configuration.rb +21 -0
  14. data/lib/meta_tags-rails/content_tag.rb +14 -0
  15. data/lib/meta_tags-rails/controller_helper.rb +44 -0
  16. data/lib/meta_tags-rails/meta_tags_collection.rb +176 -0
  17. data/lib/meta_tags-rails/renderer.rb +253 -0
  18. data/lib/meta_tags-rails/tag.rb +25 -0
  19. data/lib/meta_tags-rails/text_normalizer.rb +148 -0
  20. data/lib/meta_tags-rails/version.rb +4 -0
  21. data/lib/meta_tags-rails/view_helper.rb +205 -0
  22. data/meta-tags.gemspec +30 -0
  23. data/spec/configuration_spec.rb +14 -0
  24. data/spec/controller_helper_spec.rb +42 -0
  25. data/spec/spec_helper.rb +84 -0
  26. data/spec/text_normalizer/normalize_title_spec.rb +43 -0
  27. data/spec/text_normalizer/truncate_array_spec.rb +60 -0
  28. data/spec/view_helper/charset_spec.rb +16 -0
  29. data/spec/view_helper/custom_spec.rb +67 -0
  30. data/spec/view_helper/description_spec.rb +61 -0
  31. data/spec/view_helper/icon_spec.rb +42 -0
  32. data/spec/view_helper/keywords_spec.rb +58 -0
  33. data/spec/view_helper/links_spec.rb +125 -0
  34. data/spec/view_helper/module_spec.rb +41 -0
  35. data/spec/view_helper/noindex_spec.rb +107 -0
  36. data/spec/view_helper/open_graph_spec.rb +86 -0
  37. data/spec/view_helper/open_search_spec.rb +33 -0
  38. data/spec/view_helper/refresh_spec.rb +32 -0
  39. data/spec/view_helper/title_spec.rb +155 -0
  40. data/spec/view_helper/twitter_spec.rb +31 -0
  41. data/spec/view_helper_spec.rb +57 -0
  42. metadata +172 -0
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe MetaTags::ViewHelper, 'module' do
4
+ subject { ActionView::Base.new }
5
+
6
+ it 'should be mixed into ActionView::Base' do
7
+ expect(ActionView::Base.included_modules).to include(MetaTags::ViewHelper)
8
+ end
9
+
10
+ it 'should respond to "title" helper' do
11
+ expect(subject).to respond_to(:title)
12
+ end
13
+
14
+ it 'should respond to "description" helper' do
15
+ expect(subject).to respond_to(:description)
16
+ end
17
+
18
+ it 'should respond to "keywords" helper' do
19
+ expect(subject).to respond_to(:keywords)
20
+ end
21
+
22
+ it 'should respond to "noindex" helper' do
23
+ expect(subject).to respond_to(:noindex)
24
+ end
25
+
26
+ it 'should respond to "nofollow" helper' do
27
+ expect(subject).to respond_to(:nofollow)
28
+ end
29
+
30
+ it 'should respond to "set_meta_tags" helper' do
31
+ expect(subject).to respond_to(:set_meta_tags)
32
+ end
33
+
34
+ it 'should respond to "display_meta_tags" helper' do
35
+ expect(subject).to respond_to(:display_meta_tags)
36
+ end
37
+
38
+ it 'should respond to "display_title" helper' do
39
+ expect(subject).to respond_to(:display_title)
40
+ end
41
+ end
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+
3
+ describe MetaTags::ViewHelper do
4
+ subject { ActionView::Base.new }
5
+
6
+ context 'displaying noindex' do
7
+ it 'should display noindex when "noindex" used' do
8
+ subject.noindex(true)
9
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
10
+ expect(meta).to have_tag('meta', with: { content: "noindex", name: "robots" })
11
+ end
12
+ end
13
+
14
+ it 'should display noindex when "set_meta_tags" used' do
15
+ subject.set_meta_tags(noindex: true)
16
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
17
+ expect(meta).to have_tag('meta', with: { content: "noindex", name: "robots" })
18
+ end
19
+ end
20
+
21
+ it 'should use custom noindex if given' do
22
+ subject.noindex('some-noindex')
23
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
24
+ expect(meta).to have_tag('meta', with: { content: "noindex", name: "some-noindex" })
25
+ end
26
+ end
27
+
28
+ it 'should display nothing by default' do
29
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
30
+ expect(meta).to_not have_tag('meta', with: { content: "noindex" })
31
+ end
32
+ end
33
+
34
+ it "should display nothing if given false" do
35
+ subject.set_meta_tags(noindex: false)
36
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
37
+ expect(meta).to_not have_tag('meta', with: { content: "robots" })
38
+ end
39
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
40
+ expect(meta).to_not have_tag('meta', with: { content: "noindex" })
41
+ end
42
+ end
43
+ end
44
+
45
+ context 'displaying nofollow' do
46
+ it 'should display nofollow when "nofollow" used' do
47
+ subject.nofollow(true)
48
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
49
+ expect(meta).to have_tag('meta', with: { content: "nofollow", name: "robots" })
50
+ end
51
+ end
52
+
53
+ it 'should display nofollow when "set_meta_tags" used' do
54
+ subject.set_meta_tags(nofollow: true)
55
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
56
+ expect(meta).to have_tag('meta', with: { content: "nofollow", name: "robots" })
57
+ end
58
+ end
59
+
60
+ it 'should use custom nofollow if given' do
61
+ subject.nofollow('some-nofollow')
62
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
63
+ expect(meta).to have_tag('meta', with: { content: "nofollow", name: "some-nofollow" })
64
+ end
65
+ end
66
+
67
+ it 'should display nothing by default' do
68
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
69
+ expect(meta).to_not have_tag('meta', with: { content: "nofollow" })
70
+ end
71
+ end
72
+ end
73
+
74
+ context 'displaying both nofollow and noindex' do
75
+ it 'should be displayed when set using helpers' do
76
+ subject.noindex(true)
77
+ subject.nofollow(true)
78
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
79
+ expect(meta).to have_tag('meta', with: { content: "noindex, nofollow", name: "robots" })
80
+ end
81
+ end
82
+
83
+ it 'should be displayed when "set_meta_tags" used' do
84
+ subject.set_meta_tags(nofollow: true, noindex: true)
85
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
86
+ expect(meta).to have_tag('meta', with: { content: "noindex, nofollow", name: "robots" })
87
+ end
88
+ end
89
+
90
+ it 'should use custom name if string is used' do
91
+ subject.noindex('some-name')
92
+ subject.nofollow('some-name')
93
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
94
+ expect(meta).to have_tag('meta', with: { content: "noindex, nofollow", name: "some-name" })
95
+ end
96
+ end
97
+
98
+ it 'should display two meta tags when different names used' do
99
+ subject.noindex('some-noindex')
100
+ subject.nofollow('some-nofollow')
101
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
102
+ expect(meta).to have_tag('meta', with: { content: "noindex", name: "some-noindex" })
103
+ expect(meta).to have_tag('meta', with: { content: "nofollow", name: "some-nofollow" })
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ describe MetaTags::ViewHelper, 'displaying Open Graph meta tags' do
4
+ subject { ActionView::Base.new }
5
+
6
+ it 'should display meta tags specified with :open_graph' do
7
+ subject.set_meta_tags(open_graph: {
8
+ title: 'Facebook Share Title',
9
+ description: 'Facebook Share Description'
10
+ })
11
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
12
+ expect(meta).to have_tag('meta', with: { content: "Facebook Share Title", property: "og:title" })
13
+ expect(meta).to have_tag('meta', with: { content: "Facebook Share Description", property: "og:description" })
14
+ end
15
+ end
16
+
17
+ it 'should display meta tags specified with :og' do
18
+ subject.set_meta_tags(og: {
19
+ title: 'Facebook Share Title',
20
+ description: 'Facebook Share Description'
21
+ })
22
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
23
+ expect(meta).to have_tag('meta', with: { content: "Facebook Share Title", property: "og:title" })
24
+ expect(meta).to have_tag('meta', with: { content: "Facebook Share Description", property: "og:description" })
25
+ end
26
+ end
27
+
28
+ it 'should use deep merge when displaying open graph meta tags' do
29
+ subject.set_meta_tags(og: { title: 'Facebook Share Title' })
30
+ subject.display_meta_tags(og: { description: 'Facebook Share Description' }).tap do |meta|
31
+ expect(meta).to have_tag('meta', with: { content: "Facebook Share Title", property: "og:title" })
32
+ expect(meta).to have_tag('meta', with: { content: "Facebook Share Description", property: "og:description" })
33
+ end
34
+ end
35
+
36
+ it "should not display meta tags without content" do
37
+ subject.set_meta_tags(open_graph: {
38
+ title: '',
39
+ description: ''
40
+ })
41
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
42
+ expect(meta).to_not have_tag('meta', with: { content: "", property: "og:title" })
43
+ expect(meta).to_not have_tag('meta', with: { content: "", property: "og:description" })
44
+ end
45
+ end
46
+
47
+ it "should display locale meta tags" do
48
+ subject.display_meta_tags(open_graph: { locale: { _: 'en_GB', alternate: ['fr_FR', 'es_ES'] } }).tap do |meta|
49
+ expect(meta).to have_tag('meta', with: { content: "en_GB", property: "og:locale" })
50
+ expect(meta).to have_tag('meta', with: { content: "fr_FR", property: "og:locale:alternate" })
51
+ expect(meta).to have_tag('meta', with: { content: "es_ES", property: "og:locale:alternate" })
52
+ end
53
+ end
54
+
55
+ it "should display mirrored content" do
56
+ subject.set_meta_tags(title: 'someTitle')
57
+ subject.display_meta_tags(open_graph: { title: :title }).tap do |meta|
58
+ expect(meta).to have_tag('meta', with: { content: "someTitle", property: "og:title" })
59
+ end
60
+ end
61
+
62
+ it "should display open graph meta tags with an array of images" do
63
+ subject.set_meta_tags(open_graph: {
64
+ title: 'someTitle',
65
+ image: [{
66
+ _: 'http://example.com/1.png',
67
+ width: 75,
68
+ height: 75,
69
+ },
70
+ {
71
+ _: 'http://example.com/2.png',
72
+ width: 50,
73
+ height: 50,
74
+ }]
75
+ })
76
+ subject.display_meta_tags(site: 'someTitle').tap do |meta|
77
+ expect(meta).to have_tag('meta', with: { content: "someTitle", property: "og:title" })
78
+ expect(meta).to have_tag('meta', with: { content: "http://example.com/1.png", property: "og:image" })
79
+ expect(meta).to have_tag('meta', with: { content: "75", property: "og:image:width" })
80
+ expect(meta).to have_tag('meta', with: { content: "75", property: "og:image:height" })
81
+ expect(meta).to have_tag('meta', with: { content: "http://example.com/2.png", property: "og:image" })
82
+ expect(meta).to have_tag('meta', with: { content: "50", property: "og:image:width" })
83
+ expect(meta).to have_tag('meta', with: { content: "50", property: "og:image:height" })
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe MetaTags::ViewHelper, 'displaying Open Search meta tags' do
4
+ subject { ActionView::Base.new }
5
+
6
+ it 'should display meta tags specified with :open_search' do
7
+ subject.set_meta_tags(open_search: {
8
+ title: 'Open Search Title',
9
+ href: '/open_search_path.xml'
10
+ })
11
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
12
+ expect(meta).to have_tag('link', with: {
13
+ href: '/open_search_path.xml',
14
+ rel: 'search',
15
+ title: 'Open Search Title',
16
+ type: 'application/opensearchdescription+xml',
17
+ })
18
+ end
19
+ end
20
+
21
+ it 'should not display meta tags without content' do
22
+ subject.set_meta_tags(open_search: {
23
+ title: '',
24
+ href: '',
25
+ })
26
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
27
+ expect(meta).to_not have_tag('link', with: {
28
+ rel: 'search',
29
+ type: 'application/opensearchdescription+xml',
30
+ })
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe MetaTags::ViewHelper, 'displaying refresh' do
4
+ subject { ActionView::Base.new }
5
+
6
+ it 'displays refresh when "refresh" is used' do
7
+ subject.refresh(5)
8
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
9
+ expect(meta).to have_tag('meta', with: { content: '5', 'http-equiv' => 'refresh' })
10
+ end
11
+ end
12
+
13
+ it 'displays refresh when "set_meta_tags" used' do
14
+ subject.set_meta_tags(refresh: 5)
15
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
16
+ expect(meta).to have_tag('meta', with: { content: '5', 'http-equiv' => 'refresh' })
17
+ end
18
+ end
19
+
20
+ it 'should use custom refresh if given' do
21
+ subject.refresh("5;url=http://example.com/")
22
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
23
+ expect(meta).to have_tag('meta', with: { content: '5;url=http://example.com/', 'http-equiv' => "refresh" })
24
+ end
25
+ end
26
+
27
+ it 'should display nothing by default' do
28
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
29
+ expect(meta).to_not have_tag('meta', with: { 'http-equiv' => "refresh" })
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,155 @@
1
+ require 'spec_helper'
2
+
3
+ describe MetaTags::ViewHelper do
4
+ subject { ActionView::Base.new }
5
+
6
+ context 'displaying title' do
7
+ it 'should not display title if blank' do
8
+ expect(subject.display_meta_tags).to eq('')
9
+ subject.title('')
10
+ expect(subject.display_meta_tags).to eq('')
11
+ end
12
+
13
+ it 'should use website name if title is empty' do
14
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
15
+ expect(meta).to eq('<title>someSite</title>')
16
+ end
17
+ end
18
+
19
+ it 'should display title when "title" used' do
20
+ subject.title('someTitle')
21
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
22
+ expect(meta).to eq('<title>someSite | someTitle</title>')
23
+ end
24
+ end
25
+
26
+ it 'should display title only when "site" is empty' do
27
+ subject.title('someTitle')
28
+ expect(subject.display_meta_tags).to eq('<title>someTitle</title>')
29
+ end
30
+
31
+ it 'should display title when "set_meta_tags" used' do
32
+ subject.set_meta_tags(title: 'someTitle')
33
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
34
+ expect(meta).to eq('<title>someSite | someTitle</title>')
35
+ end
36
+ end
37
+
38
+ it 'should display custom title if given' do
39
+ subject.title('someTitle')
40
+ subject.display_meta_tags(site: 'someSite', title: 'defaultTitle').tap do |meta|
41
+ expect(meta).to eq('<title>someSite | someTitle</title>')
42
+ end
43
+ end
44
+
45
+ it 'should use website before page by default' do
46
+ subject.display_meta_tags(site: 'someSite', title: 'someTitle').tap do |meta|
47
+ expect(meta).to eq('<title>someSite | someTitle</title>')
48
+ end
49
+ end
50
+
51
+ it 'should only use markup in titles in the view' do
52
+ expect(subject.title('<b>someTitle</b>')).to eq('<b>someTitle</b>')
53
+ subject.display_meta_tags(site: 'someSite').tap do |meta|
54
+ expect(meta).to eq('<title>someSite | someTitle</title>')
55
+ end
56
+ end
57
+
58
+ it 'should use page before website if :reverse' do
59
+ subject.display_meta_tags(site: 'someSite', title: 'someTitle', reverse: true).tap do |meta|
60
+ expect(meta).to eq('<title>someTitle | someSite</title>')
61
+ end
62
+ end
63
+
64
+ it 'should be lowercase if :lowercase' do
65
+ subject.display_meta_tags(site: 'someSite', title: 'someTitle', lowercase: true).tap do |meta|
66
+ expect(meta).to eq('<title>someSite | sometitle</title>')
67
+ end
68
+ end
69
+
70
+ it 'should use custom separator if :separator' do
71
+ subject.title('someTitle')
72
+ subject.display_meta_tags(site: 'someSite', separator: '-').tap do |meta|
73
+ expect(meta).to eq('<title>someSite - someTitle</title>')
74
+ end
75
+ subject.display_meta_tags(site: 'someSite', separator: ':').tap do |meta|
76
+ expect(meta).to eq('<title>someSite : someTitle</title>')
77
+ end
78
+ subject.display_meta_tags(site: 'someSite', separator: '&amp;').tap do |meta|
79
+ expect(meta).to eq('<title>someSite &amp;amp;amp; someTitle</title>')
80
+ end
81
+ subject.display_meta_tags(site: 'someSite', separator: '&amp;'.html_safe).tap do |meta|
82
+ expect(meta).to eq('<title>someSite &amp;amp; someTitle</title>')
83
+ end
84
+ subject.display_meta_tags(site: 'someSite: ', separator: false).tap do |meta|
85
+ expect(meta).to eq('<title>someSite: someTitle</title>')
86
+ end
87
+ end
88
+
89
+ it 'should use custom prefix and suffix if available' do
90
+ subject.display_meta_tags(site: 'someSite', title: 'someTitle', prefix: ' -', suffix: '- ').tap do |meta|
91
+ expect(meta).to eq('<title>someSite -|- someTitle</title>')
92
+ end
93
+ end
94
+
95
+ it 'should collapse prefix if false' do
96
+ subject.display_meta_tags(site: 'someSite', title: 'someTitle', prefix: false).tap do |meta|
97
+ expect(meta).to eq('<title>someSite| someTitle</title>')
98
+ end
99
+ end
100
+
101
+ it 'should collapse suffix if false' do
102
+ subject.display_meta_tags(site: 'someSite', title: 'someTitle', suffix: false).tap do |meta|
103
+ expect(meta).to eq('<title>someSite |someTitle</title>')
104
+ end
105
+ end
106
+
107
+ it 'should use all custom options if available' do
108
+ subject.display_meta_tags({
109
+ site: 'someSite',
110
+ title: 'someTitle',
111
+ prefix: ' -',
112
+ suffix: '+ ',
113
+ separator: ':',
114
+ lowercase: true,
115
+ reverse: true,
116
+ }).tap do |meta|
117
+ expect(meta).to eq('<title>sometitle -:+ someSite</title>')
118
+ end
119
+ end
120
+
121
+ it 'should allow Arrays in title' do
122
+ subject.display_meta_tags(site: 'someSite', title: ['someTitle', 'anotherTitle']).tap do |meta|
123
+ expect(meta).to eq('<title>someSite | someTitle | anotherTitle</title>')
124
+ end
125
+ end
126
+
127
+ it 'should allow Arrays in title with :lowercase' do
128
+ subject.display_meta_tags(site: 'someSite', title: ['someTitle', 'anotherTitle'], lowercase: true).tap do |meta|
129
+ expect(meta).to eq('<title>someSite | sometitle | anothertitle</title>')
130
+ end
131
+ end
132
+
133
+ it 'should build title in reverse order if :reverse' do
134
+ subject.display_meta_tags({
135
+ site: 'someSite',
136
+ title: ['someTitle', 'anotherTitle'],
137
+ prefix: ' -',
138
+ suffix: '+ ',
139
+ separator: ':',
140
+ reverse: true,
141
+ }).tap do |meta|
142
+ expect(meta).to eq('<title>anotherTitle -:+ someTitle -:+ someSite</title>')
143
+ end
144
+ end
145
+ end
146
+
147
+ context '.display_title' do
148
+ it 'should display custom title if given' do
149
+ subject.title('someTitle')
150
+ subject.display_title(site: 'someSite', title: 'defaultTitle').tap do |meta|
151
+ expect(meta).to eq('someSite | someTitle')
152
+ end
153
+ end
154
+ end
155
+ end