nanoc-toolbox 0.0.7 → 0.1.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.
- data/CHANGELOG.md +13 -2
- data/Gemfile +3 -0
- data/Gemfile.lock +36 -13
- data/Guardfile +9 -0
- data/README.md +22 -5
- data/lib/nanoc/toolbox/filters/add_sections.rb +2 -2
- data/lib/nanoc/toolbox/filters/html_tidy.rb +5 -5
- data/lib/nanoc/toolbox/filters/js_minify.rb +2 -2
- data/lib/nanoc/toolbox/filters.rb +2 -1
- data/lib/nanoc/toolbox/helpers/blogging_extra.rb +105 -0
- data/lib/nanoc/toolbox/helpers/disqus.rb +47 -0
- data/lib/nanoc/toolbox/helpers/google_analytics.rb +7 -5
- data/lib/nanoc/toolbox/helpers/gravatar.rb +2 -2
- data/lib/nanoc/toolbox/helpers/html_tag.rb +13 -8
- data/lib/nanoc/toolbox/helpers/navigation.rb +61 -67
- data/lib/nanoc/toolbox/helpers/tagging_extra.rb +135 -0
- data/lib/nanoc/toolbox/helpers.rb +4 -1
- data/lib/nanoc/toolbox/version.rb +2 -2
- data/nanoc-toolbox.gemspec +15 -14
- data/spec/filters/add_sections_spec.rb +7 -29
- data/spec/filters/js_minify_spec.rb +14 -0
- data/spec/helpers/blogging_extra_spec.rb +134 -0
- data/spec/helpers/disqus_spec.rb +47 -0
- data/spec/helpers/google_analytics_spec.rb +27 -7
- data/spec/helpers/gravatar_spec.rb +25 -25
- data/spec/helpers/html_tag_spec.rb +8 -1
- data/spec/helpers/navigation_spec.rb +110 -49
- data/spec/helpers/tagging_extra_spec.rb +155 -0
- data/spec/spec_helper.rb +5 -1
- metadata +109 -119
@@ -1,17 +1,37 @@
|
|
1
1
|
require "spec_helper"
|
2
|
-
|
2
|
+
|
3
|
+
|
4
|
+
class GoogleAnalyticsDummyClass
|
5
|
+
include Nanoc::Toolbox::Helpers::GoogleAnalytics
|
6
|
+
def initialize
|
7
|
+
@config = { :ga_tracking_code => "UA-0000000-0" }
|
8
|
+
end
|
9
|
+
end
|
3
10
|
|
4
11
|
describe Nanoc::Toolbox::Helpers::GoogleAnalytics do
|
5
|
-
subject {
|
12
|
+
subject { GoogleAnalyticsDummyClass.new }
|
13
|
+
|
6
14
|
it { should respond_to(:ga_tracking_snippet) }
|
15
|
+
|
7
16
|
describe ".ga_tracking_snippet" do
|
17
|
+
|
8
18
|
it "returns a string that contains the JS" do
|
9
|
-
ga_tracking_snippet(
|
10
|
-
ga_tracking_snippet(
|
19
|
+
subject.ga_tracking_snippet().should include("<script")
|
20
|
+
subject.ga_tracking_snippet().should include("var _gaq = _gaq || [];")
|
11
21
|
end
|
12
|
-
|
22
|
+
|
13
23
|
it "includes the passed code" do
|
14
|
-
ga_tracking_snippet("
|
24
|
+
subject.ga_tracking_snippet("UA-123456-1").should include("UA-123456-1")
|
25
|
+
end
|
26
|
+
|
27
|
+
it "includes the tracking code from the site config" do
|
28
|
+
subject.instance_variable_set(:@config, { :ga_tracking_code => "UA-0000000-0"})
|
29
|
+
subject.ga_tracking_snippet().should include "UA-0000000-0"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "includes the placeholder code when no value is found" do
|
33
|
+
subject.instance_variable_set(:@config, { })
|
34
|
+
subject.ga_tracking_snippet().should include "UA-xxxxxx-x"
|
15
35
|
end
|
16
36
|
end
|
17
|
-
end
|
37
|
+
end
|
@@ -1,85 +1,85 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
class GravatarDummyClass
|
4
|
+
include Nanoc::Toolbox::Helpers::Gravatar
|
4
5
|
end
|
5
6
|
|
6
7
|
describe Nanoc::Toolbox::Helpers::Gravatar do
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
subject { GravatarDummyClass.new }
|
9
|
+
|
10
|
+
before(:all) do
|
11
11
|
@email = 'anouar@adlani.com'
|
12
12
|
@avatar = 'avatar/4d076af1db60b16e1ce080505baf821c'
|
13
13
|
@secure_host = {
|
14
14
|
true => 'https://secure.gratatar.com/' + @avatar,
|
15
15
|
false => 'http://gravatar.com/' + @avatar
|
16
16
|
}
|
17
|
-
|
18
17
|
end
|
19
18
|
|
20
|
-
|
19
|
+
it { should respond_to(:gravatar_url) }
|
20
|
+
it { should respond_to(:gravatar_image) }
|
21
|
+
|
22
|
+
|
23
|
+
describe "#subject.gravatar_url" do
|
21
24
|
context "when no parameters passed in the options" do
|
22
25
|
it "converts an email address to the a gravatar URL" do
|
23
|
-
|
26
|
+
subject.gravatar_url(@email).should == @secure_host[false]
|
24
27
|
end
|
25
28
|
|
26
29
|
it "converts an email address to the a secure gravatar URL when requested" do
|
27
|
-
|
30
|
+
subject.gravatar_url(@email, :secure => true).should == @secure_host[true]
|
28
31
|
end
|
29
32
|
|
30
33
|
it "raise an Argument error when the email is invalid" do
|
31
|
-
lambda{
|
32
|
-
lambda{
|
33
|
-
lambda{
|
34
|
-
lambda{
|
34
|
+
lambda{subject.gravatar_url('')}.should raise_error(ArgumentError)
|
35
|
+
lambda{subject.gravatar_url('a@a.c')}.should raise_error(ArgumentError)
|
36
|
+
lambda{subject.gravatar_url('@example.com')}.should raise_error(ArgumentError)
|
37
|
+
lambda{subject.gravatar_url('name@name@example.com')}.should raise_error(ArgumentError)
|
35
38
|
end
|
36
39
|
|
37
40
|
it "strips the additionnal spaces before and after the email" do
|
38
|
-
|
41
|
+
subject.gravatar_url(" \n #{@email} \n").should == @secure_host[false]
|
39
42
|
end
|
40
43
|
end
|
41
44
|
|
42
|
-
|
43
45
|
context "when parameters passed in the options" do
|
44
|
-
|
45
46
|
it "removes unknown parameters" do
|
46
|
-
|
47
|
+
subject.gravatar_url(@email, :blabl => 'jsdfsdfsd').should == @secure_host[false]
|
47
48
|
end
|
48
49
|
|
49
50
|
it "removes empty or nil parameters" do
|
50
|
-
|
51
|
+
subject.gravatar_url(@email, :size => '', :rating => nil).should == @secure_host[false]
|
51
52
|
end
|
52
53
|
|
53
54
|
it "should sort the url parameters" do
|
54
|
-
|
55
|
+
subject.gravatar_url(@email, :size => 45, :default_icon => 'monsterid', :rating => 'x').should == @secure_host[false] + '?default_icon=monsterid&rating=x&size=45'
|
55
56
|
end
|
56
57
|
|
57
58
|
it "accepts well formed option and render them" do
|
58
|
-
|
59
|
+
subject.gravatar_url(@email, :size => 45, :rating => 'x').should == @secure_host[false] + '?rating=x&size=45'
|
59
60
|
end
|
60
61
|
|
61
62
|
it "ignores the bad type or the out of rnage parameters" do
|
62
|
-
|
63
|
+
subject.gravatar_url(@email, :size => '45', :rating => 'xssss').should == @secure_host[false] + '?size=45'
|
63
64
|
end
|
64
65
|
end
|
65
66
|
end
|
66
67
|
|
67
68
|
describe "#gravatar_image" do
|
68
|
-
|
69
69
|
it "converts an email to an html tag" do
|
70
|
-
|
70
|
+
subject.gravatar_image(@email).should == %[<img src="#{@secure_host[false]}" />]
|
71
71
|
end
|
72
72
|
|
73
73
|
it "converts an email to an html tag with options for the gravatar" do
|
74
|
-
|
74
|
+
subject.gravatar_image(@email, :size => 45, :default_icon => 'monsterid', :rating => 'xss').should == %[<img src="#{@secure_host[false]}?default_icon=monsterid&size=45" />]
|
75
75
|
end
|
76
76
|
|
77
77
|
it "converts an email to an html tag with options for the img tag" do
|
78
|
-
|
78
|
+
subject.gravatar_image(@email, :height => 10).should == %[<img height="10" src="#{@secure_host[false]}" />]
|
79
79
|
end
|
80
80
|
|
81
81
|
it "converts an email to an html tag with options for the gravatar and for the img" do
|
82
|
-
|
82
|
+
subject.gravatar_image(@email, :height => 10, :size => 45, :default_icon => 'monsterid', :rating => 'xss').should == %[<img height="10" src="#{@secure_host[false]}?default_icon=monsterid&size=45" />]
|
83
83
|
end
|
84
84
|
end
|
85
85
|
end
|
@@ -2,6 +2,9 @@ require "spec_helper"
|
|
2
2
|
include Nanoc::Toolbox::Helpers::HtmlTag
|
3
3
|
|
4
4
|
describe Nanoc::Toolbox::Helpers::HtmlTag do
|
5
|
+
it { should respond_to(:tag) }
|
6
|
+
it { should respond_to(:content_tag) }
|
7
|
+
|
5
8
|
describe "#tag" do
|
6
9
|
it "returns an simple self-closing tag by default" do
|
7
10
|
tag("br").should == "<br />"
|
@@ -10,6 +13,10 @@ describe Nanoc::Toolbox::Helpers::HtmlTag do
|
|
10
13
|
it "returns an simple self-closing tag with option" do
|
11
14
|
tag("hr", :class => "thin").should == %[<hr class="thin" />]
|
12
15
|
end
|
16
|
+
|
17
|
+
it "returns an orphean tag when open is set to true" do
|
18
|
+
tag("hr", {:class => "thin"}, true).should == %[<hr class="thin">]
|
19
|
+
end
|
13
20
|
end
|
14
21
|
|
15
22
|
describe "#content_tag" do
|
@@ -21,4 +28,4 @@ describe Nanoc::Toolbox::Helpers::HtmlTag do
|
|
21
28
|
content_tag("b", "Hello", :class => "highlight").should == %[<b class="highlight">Hello</b>]
|
22
29
|
end
|
23
30
|
end
|
24
|
-
end
|
31
|
+
end
|
@@ -1,81 +1,142 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
|
4
3
|
class NavigationDummyClass
|
4
|
+
include Nanoc::Toolbox::Helpers::Navigation
|
5
5
|
end
|
6
6
|
|
7
7
|
describe Nanoc::Toolbox::Helpers::Navigation do
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
subject { NavigationDummyClass.new }
|
9
|
+
|
10
|
+
it { should respond_to(:render_menu) }
|
11
|
+
it { should respond_to(:navigation_for) }
|
12
|
+
it { should respond_to(:toc_for) }
|
13
|
+
it { should respond_to(:breadcrumb_for) }
|
12
14
|
|
13
15
|
describe ".render_menu" do
|
16
|
+
before do
|
17
|
+
@sections = [
|
18
|
+
{:title => "Title", :link => "http://example.com", :subsections => [
|
19
|
+
{:title => "Title", :link => "http://example.com", :subsections => [
|
20
|
+
{:title => "Title", :link => "http://example.com", :subsections => [
|
21
|
+
{:title => "Title", :link => "http://example.com"}
|
22
|
+
]}
|
23
|
+
]}
|
24
|
+
]}]
|
25
|
+
end
|
26
|
+
|
14
27
|
context "when no options specified" do
|
28
|
+
|
15
29
|
it "returns nil when the menu is empty" do
|
16
|
-
|
30
|
+
subject.render_menu([]).should be_nil
|
17
31
|
end
|
18
32
|
|
19
33
|
it "returns a simple ordered list when given a 1 level menu" do
|
20
34
|
sections = [{:title => "Title", :link => "http://example.com" }]
|
21
|
-
html_menu = %[<ol><li><a href="http://example.com">Title</a></li></ol>]
|
22
|
-
|
23
|
-
@navigation.render_menu(sections).should == html_menu
|
35
|
+
html_menu = %[<ol class="menu"><li><a href="http://example.com">Title</a></li></ol>]
|
36
|
+
subject.render_menu(sections).should == html_menu
|
24
37
|
end
|
25
38
|
|
26
39
|
it "returns a nested ordered list when given a multi level menu" do
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
@navigation.render_menu(sections).should == html_menu
|
40
|
+
html_menu = %[<ol class="menu"><li><a href="http://example.com">Title</a><ol class="menu"><li><a href="http://example.com">Title</a><ol class="menu"><li><a href="http://example.com">Title</a></li></ol></li></ol></li></ol>]
|
41
|
+
subject.render_menu(@sections).should == html_menu
|
31
42
|
end
|
32
43
|
|
33
|
-
it "returns only 3 levels
|
34
|
-
|
35
|
-
|
36
|
-
{:title => "Title", :link => "http://example.com", :subsections => [
|
37
|
-
{:title => "Title", :link => "http://example.com", :subsections => [
|
38
|
-
{:title => "Title", :link => "http://example.com"}
|
39
|
-
]}
|
40
|
-
]}
|
41
|
-
]}]
|
42
|
-
html_menu = %[<ol><li><a href="http://example.com">Title</a><ol><li><a href="http://example.com">Title</a><ol><li><a href="http://example.com">Title</a></li></ol></li></ol></li></ol>]
|
43
|
-
@navigation.render_menu(sections).should == html_menu
|
44
|
+
it "returns only 3 levels deep" do
|
45
|
+
html_menu = %[<ol class="menu"><li><a href="http://example.com">Title</a><ol class="menu"><li><a href="http://example.com">Title</a><ol class="menu"><li><a href="http://example.com">Title</a></li></ol></li></ol></li></ol>]
|
46
|
+
subject.render_menu(@sections).should == html_menu
|
44
47
|
end
|
45
48
|
|
46
|
-
it "returns menu within an html ordered list (<ol> <li>)
|
47
|
-
sections
|
48
|
-
@navigation.render_menu(sections).should =~ /^<ol><li>/
|
49
|
+
it "returns menu within an html ordered list with menu class(<ol> <li>)" do
|
50
|
+
subject.render_menu(@sections).should =~ /^<ol class="menu"><li>/
|
49
51
|
end
|
50
52
|
end
|
51
|
-
|
52
|
-
context "when
|
53
|
-
it "
|
54
|
-
sections
|
55
|
-
|
53
|
+
|
54
|
+
context "when options specified" do
|
55
|
+
it "renders a title" do
|
56
|
+
subject.render_menu(@sections, :title => 'title').should =~ /^<h2>title<\/h2>/
|
57
|
+
subject.render_menu(@sections, :title => 'title', :title_tag => 'h1').should =~ /^<h1>title<\/h1>/
|
56
58
|
end
|
57
|
-
|
58
|
-
|
59
|
-
sections = [{:title => "Title", :link => "http://example.com" }]
|
60
|
-
@navigation.render_menu(sections, :collection_tag => 'div', :item_tag => 'span').should =~ /^<div><span>/
|
59
|
+
it "returns menu within a html unordered list (<ul> <li>) " do
|
60
|
+
subject.render_menu(@sections, :collection_tag => 'ul').should =~ /^<ul class="menu"><li>/
|
61
61
|
end
|
62
|
-
|
63
|
-
it "returns
|
64
|
-
sections
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
62
|
+
|
63
|
+
it "returns menu within a div/span " do
|
64
|
+
subject.render_menu(@sections, :collection_tag => 'div', :item_tag => 'span').should =~ /^<div class="menu"><span>/
|
65
|
+
end
|
66
|
+
|
67
|
+
it "returns only 2 levels deep" do
|
68
|
+
html_menu = %[<ol class="menu"><li><a href="http://example.com">Title</a><ol class="menu"><li><a href="http://example.com">Title</a></li></ol></li></ol>]
|
69
|
+
subject.render_menu(@sections, :depth => 2).should == html_menu
|
70
|
+
end
|
71
|
+
|
72
|
+
it "set a specific class name" do
|
73
|
+
subject.render_menu(@sections, :collection_tag => 'ul').should =~ /^<ul class="menu"><li>/
|
74
74
|
end
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
78
|
describe ".toc_for" do
|
79
|
-
|
79
|
+
before :all do
|
80
|
+
@content = <<-EOS
|
81
|
+
<html>
|
82
|
+
<body>
|
83
|
+
<div id="title1" class="section">
|
84
|
+
<h1>Title 1</h1>
|
85
|
+
<div id="title21" class="section">
|
86
|
+
<h2>Title 2<h2>
|
87
|
+
</div>
|
88
|
+
<div id="title22" class="section">
|
89
|
+
<h2>Title 2<h2>
|
90
|
+
</div>
|
91
|
+
<div id="title23" class="section">
|
92
|
+
<h2>Title 2<h2>
|
93
|
+
</div>
|
94
|
+
</div>
|
95
|
+
</body>
|
96
|
+
</html>
|
97
|
+
EOS
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should return a toc for a page" do
|
101
|
+
item_rep = Nanoc::ItemRep.new(Nanoc::Item.new("", {:title => ""}, "/yetAnotherItem/"), "")
|
102
|
+
item_rep.instance_variable_set :@content, {:pre => @content}
|
103
|
+
|
104
|
+
subject.toc_for(item_rep).should include "#title1"
|
105
|
+
subject.toc_for(item_rep).should include "#title21"
|
106
|
+
subject.toc_for(item_rep).should include "#title22"
|
107
|
+
subject.toc_for(item_rep).should include "#title23"
|
108
|
+
|
109
|
+
subject.toc_for(item_rep).should include "Title 1"
|
110
|
+
subject.toc_for(item_rep).should include "Title 2"
|
111
|
+
end
|
112
|
+
|
113
|
+
it "calls find_to_sections and render_menu for the formating" do
|
114
|
+
item_rep = Nanoc::ItemRep.new(Nanoc::Item.new("", {:title => ""}, "/yetAnotherItem/"), "")
|
115
|
+
item_rep.instance_variable_set :@content, {:pre => @content}
|
116
|
+
|
117
|
+
subject.should_receive(:find_toc_sections).once
|
118
|
+
subject.should_receive(:render_menu).once
|
119
|
+
subject.toc_for(item_rep)
|
120
|
+
end
|
121
|
+
|
122
|
+
it "returns an empty string when the main content is empty" do
|
123
|
+
item_rep = Nanoc::ItemRep.new(Nanoc::Item.new("", {:title => ""}, "/yetAnotherItem/"), "")
|
124
|
+
item_rep.instance_variable_set :@content, {:pre => ""}
|
125
|
+
subject.toc_for(item_rep).should eq ""
|
126
|
+
end
|
127
|
+
|
128
|
+
it "returns an empty string when the provided css path returns nothing" do
|
129
|
+
item_rep = Nanoc::ItemRep.new(Nanoc::Item.new("", {:title => ""}, "/yetAnotherItem/"), "")
|
130
|
+
item_rep.instance_variable_set :@content, {:pre => @content}
|
131
|
+
subject.toc_for(item_rep, {:path => "section"}).should eq ""
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe ".navigation_for" do
|
136
|
+
it "should return a navigation menu for a item"
|
137
|
+
end
|
138
|
+
|
139
|
+
describe ".breadcrumb_for" do
|
140
|
+
it "should return a breadcrumb for an item"
|
80
141
|
end
|
81
142
|
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class DummyTaggingExtra
|
4
|
+
include Nanoc::Toolbox::Helpers::TaggingExtra
|
5
|
+
end
|
6
|
+
|
7
|
+
describe Nanoc::Toolbox::Helpers::TaggingExtra do
|
8
|
+
subject { DummyTaggingExtra.new }
|
9
|
+
|
10
|
+
it { should respond_to :tag_set }
|
11
|
+
it { should respond_to :has_tag? }
|
12
|
+
it { should respond_to :items_with_tag }
|
13
|
+
it { should respond_to :count_tags }
|
14
|
+
it { should respond_to :rank_tags }
|
15
|
+
it { should respond_to :create_tag_pages }
|
16
|
+
it { should respond_to :tag_links_for }
|
17
|
+
|
18
|
+
describe ".tag_set" do
|
19
|
+
it "returns all the tags present in a collection of item" do
|
20
|
+
items = [ {:tags => ['a', 'b', 'c', 'd']}, {:tags => ['e', 'f']} ]
|
21
|
+
subject.tag_set(items).should eq %w{a b c d e f}
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns distinct tags in a collection of items" do
|
25
|
+
items = [ {:tags => ['a', 'b', 'c', 'd']}, {:tags => ['a', 'd', 'c', 'e', 'f']}]
|
26
|
+
subject.tag_set(items).should eq %w{a b c d e f}
|
27
|
+
end
|
28
|
+
|
29
|
+
it "returns tags without nil value when an item has no tag" do
|
30
|
+
items = [ {:tags => ['a', 'b', 'c', 'd']}, {:tags => ['a', 'd', 'c', 'e', 'f']}, {}]
|
31
|
+
subject.tag_set(items).should eq %w{a b c d e f}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe ".has_tag?" do
|
36
|
+
it "returns true when the item contains the desired tag" do
|
37
|
+
item = { :tags => ['a', 'b', 'c'] }
|
38
|
+
subject.has_tag?(item, 'a').should be_true
|
39
|
+
end
|
40
|
+
it "returns false when the item contains the desired tag" do
|
41
|
+
item = { :tags => ['a', 'b', 'c'] }
|
42
|
+
subject.has_tag?(item, 'd').should be_false
|
43
|
+
end
|
44
|
+
it "returns fals when the item do not have tag" do
|
45
|
+
item = { }
|
46
|
+
subject.has_tag?(item, 'd').should be_false
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe ".items_with_tag" do
|
51
|
+
it "returns only the item whith the specified tag" do
|
52
|
+
item_a = {:tags => ['a', 'b', 'c', 'd']}
|
53
|
+
item_b = {:tags => ['a', 'd', 'c', 'e', 'f']}
|
54
|
+
items = [ item_a, item_b, {}]
|
55
|
+
subject.items_with_tag('f', items).should eq [item_b]
|
56
|
+
end
|
57
|
+
|
58
|
+
it "returns only all the item whith the specified tag" do
|
59
|
+
item_a = {:tags => ['a', 'b', 'c', 'd']}
|
60
|
+
item_b = {:tags => ['a', 'd', 'c', 'e', 'f']}
|
61
|
+
items = [ item_a, item_b, {}]
|
62
|
+
subject.items_with_tag('a', items).should eq [item_a, item_b]
|
63
|
+
end
|
64
|
+
|
65
|
+
it "returns an empty array when no item has been found" do
|
66
|
+
item_a = {:tags => ['a', 'b', 'c', 'd']}
|
67
|
+
item_b = {:tags => ['a', 'd', 'c', 'e', 'f']}
|
68
|
+
items = [ item_a, item_b, {}]
|
69
|
+
subject.items_with_tag('g', items).should eq []
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe ".count_tag" do
|
74
|
+
it "return the occurences of all the tags in a collection of item" do
|
75
|
+
items = [ {:tags => ['a', 'b', 'c', 'd']}, {:tags => ['a', 'd', 'c', 'e' ]}]
|
76
|
+
subject.count_tags(items).should eq({'a' => 2, 'b' => 1, 'c' => 2, 'd' => 2, 'e' => 1 })
|
77
|
+
end
|
78
|
+
it "return the occurences of all the tags without the empty item" do
|
79
|
+
items = [ {:tags => ['a', 'b', 'c', 'd']}, {:tags => ['a', 'd', 'c', 'e' ]}, {}]
|
80
|
+
subject.count_tags(items).should eq({'a' => 2, 'b' => 1, 'c' => 2, 'd' => 2, 'e' => 1 })
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe ".rank_tags" do
|
85
|
+
it "Sort the tags of an item collection in N classes of rank" do
|
86
|
+
items = [ {:tags => ['a', 'b']}, {:tags => ['b', 'c']} ]
|
87
|
+
subject.rank_tags(2, items)['a'].should eq 1
|
88
|
+
subject.rank_tags(2, items)['b'].should eq 0
|
89
|
+
subject.rank_tags(2, items)['c'].should eq 1
|
90
|
+
end
|
91
|
+
|
92
|
+
it "Raises exception when the number of argument is invalid" do
|
93
|
+
items = [ {:tags => ['a', 'b']}, {:tags => ['b', 'c']} ]
|
94
|
+
lambda { subject.rank_tags(-1, items) }.should raise_error ArgumentError
|
95
|
+
lambda { subject.rank_tags(0, items) }.should raise_error ArgumentError
|
96
|
+
lambda { subject.rank_tags(1, items) }.should raise_error ArgumentError
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe ".create_tag_pages" do
|
101
|
+
it "Creates in-memory tag pages" do
|
102
|
+
subject.instance_variable_set(:@items, [ {:tags => ['a', 'b']}, {:tags => ['b', 'c']} ])
|
103
|
+
|
104
|
+
expect {
|
105
|
+
subject.create_tag_pages
|
106
|
+
}.to change { subject.instance_variable_get(:@items).size }.by(3)
|
107
|
+
|
108
|
+
subject.instance_variable_get(:@items).last(3).each do |tag_item|
|
109
|
+
tag_item.should be_a Nanoc::Item
|
110
|
+
tag_item.identifier.should =~ /^\/tags\//
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe ".tag_links_for" do
|
116
|
+
it "generates the tags lings corresponding to the parameter" do
|
117
|
+
tags = %W[a b c d e f]
|
118
|
+
item = { :tags => tags }
|
119
|
+
subject.tag_links_for(item).size.should == tags.size
|
120
|
+
tags.each do |t|
|
121
|
+
subject.tag_links_for(item).should include("<a href=\"/tags/#{t}.html\">#{t}</a>")
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
it "generates the same number of links than tags" do
|
126
|
+
tags = %W[a b c d e f]
|
127
|
+
subject.tag_links_for({ :tags => tags }).size.should == 6
|
128
|
+
end
|
129
|
+
|
130
|
+
it "excludes the tags passed as second parameter" do
|
131
|
+
omited = %W[ d e ]
|
132
|
+
item = { :tags => %W[a b c d e f] }
|
133
|
+
|
134
|
+
generated_links = subject.tag_links_for(item, omited)
|
135
|
+
generated_links.size.should == (item[:tags].size - omited.size)
|
136
|
+
|
137
|
+
omited.each do |t|
|
138
|
+
generated_links.should_not include("<a href=\"/tags/#{t}.html\">#{t}</a>")
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
it "handle the tag format in the URL and title passed in param" do
|
143
|
+
tags = %W[a b c d e f]
|
144
|
+
item = { :tags => tags }
|
145
|
+
omited = []
|
146
|
+
options = { :title => "all articles tagged with %%TAGNAME%%", :tag_pattern => "%%TAGNAME%%", :url_format => "/tags/tag_%%TAGNAME%%.html"}
|
147
|
+
|
148
|
+
generated_links = subject.tag_links_for(item, omited, options)
|
149
|
+
tags.each do |t|
|
150
|
+
generated_links.should include("<a href=\"/tags/tag_#{t}.html\">all articles tagged with #{t}</a>")
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start
|
3
|
+
|
1
4
|
require "rspec/core"
|
2
5
|
require 'rspec/mocks'
|
3
6
|
require "nanoc/toolbox"
|
7
|
+
require "nanoc3"
|
4
8
|
|
5
9
|
unless defined?(SPEC_ROOT)
|
6
10
|
SPEC_ROOT = File.expand_path("../", __FILE__)
|
@@ -8,4 +12,4 @@ end
|
|
8
12
|
|
9
13
|
RSpec.configure do |config|
|
10
14
|
config.mock_with :rspec
|
11
|
-
end
|
15
|
+
end
|