nanoc 4.6.3 → 4.6.4
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +5 -5
- data/NEWS.md +6 -0
- data/lib/nanoc.rb +1 -0
- data/lib/nanoc/cli/commands/compile.rb +28 -61
- data/lib/nanoc/cli/stream_cleaners/utf8.rb +1 -1
- data/lib/nanoc/spec.rb +3 -3
- data/lib/nanoc/telemetry.rb +17 -0
- data/lib/nanoc/telemetry/counter.rb +13 -0
- data/lib/nanoc/telemetry/labelled_counter.rb +27 -0
- data/lib/nanoc/telemetry/labelled_summary.rb +31 -0
- data/lib/nanoc/telemetry/registry.rb +16 -0
- data/lib/nanoc/telemetry/stopwatch.rb +41 -0
- data/lib/nanoc/telemetry/summary.rb +53 -0
- data/lib/nanoc/version.rb +1 -1
- data/spec/nanoc/cli/commands/compile/timing_recorder_spec.rb +35 -4
- data/spec/nanoc/cli/stream_cleaners/utf8_spec.rb +7 -0
- data/spec/nanoc/helpers/blogging_spec.rb +7 -6
- data/spec/nanoc/helpers/capturing_spec.rb +5 -4
- data/spec/nanoc/helpers/child_parent_spec.rb +12 -43
- data/spec/nanoc/helpers/filtering_spec.rb +5 -2
- data/spec/nanoc/helpers/link_to_spec.rb +66 -23
- data/spec/nanoc/helpers/rendering_spec.rb +3 -7
- data/spec/nanoc/spec_spec.rb +68 -0
- data/spec/nanoc/telemetry/counter_spec.rb +18 -0
- data/spec/nanoc/telemetry/labelled_counter_spec.rb +56 -0
- data/spec/nanoc/telemetry/labelled_summary_spec.rb +63 -0
- data/spec/nanoc/telemetry/stopwatch_spec.rb +59 -0
- data/spec/nanoc/telemetry/summary_spec.rb +66 -0
- data/spec/nanoc/telemetry_spec.rb +26 -0
- metadata +17 -2
data/lib/nanoc/version.rb
CHANGED
@@ -27,7 +27,7 @@ describe Nanoc::CLI::Commands::Compile::TimingRecorder, stdio: true do
|
|
27
27
|
Nanoc::Int::NotificationCenter.post(:filtering_ended, rep, :erb)
|
28
28
|
|
29
29
|
expect { listener.stop }
|
30
|
-
.to output(/^erb
|
30
|
+
.to output(/^erb │ 1 1\.00s 1\.00s 1\.00s 1\.00s$/).to_stdout
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'records multiple from filtering_started to filtering_ended' do
|
@@ -43,7 +43,39 @@ describe Nanoc::CLI::Commands::Compile::TimingRecorder, stdio: true do
|
|
43
43
|
Nanoc::Int::NotificationCenter.post(:filtering_ended, rep, :erb)
|
44
44
|
|
45
45
|
expect { listener.stop }
|
46
|
-
.to output(/^erb
|
46
|
+
.to output(/^erb │ 2 1\.00s 1\.50s 2\.00s 3\.00s$/).to_stdout
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'records inner filters in nested filtering_started/filtering_ended' do
|
50
|
+
listener.start
|
51
|
+
|
52
|
+
Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 0))
|
53
|
+
Nanoc::Int::NotificationCenter.post(:filtering_started, rep, :outer)
|
54
|
+
Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 1))
|
55
|
+
Nanoc::Int::NotificationCenter.post(:filtering_started, rep, :inner)
|
56
|
+
Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 3))
|
57
|
+
Nanoc::Int::NotificationCenter.post(:filtering_ended, rep, :inner)
|
58
|
+
Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 6))
|
59
|
+
Nanoc::Int::NotificationCenter.post(:filtering_ended, rep, :outer)
|
60
|
+
|
61
|
+
expect { listener.stop }
|
62
|
+
.to output(/^inner │ 1 2\.00s 2\.00s 2\.00s 2\.00s$/).to_stdout
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'records outer filters in nested filtering_started/filtering_ended' do
|
66
|
+
listener.start
|
67
|
+
|
68
|
+
Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 0))
|
69
|
+
Nanoc::Int::NotificationCenter.post(:filtering_started, rep, :outer)
|
70
|
+
Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 1))
|
71
|
+
Nanoc::Int::NotificationCenter.post(:filtering_started, rep, :inner)
|
72
|
+
Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 3))
|
73
|
+
Nanoc::Int::NotificationCenter.post(:filtering_ended, rep, :inner)
|
74
|
+
Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 6))
|
75
|
+
Nanoc::Int::NotificationCenter.post(:filtering_ended, rep, :outer)
|
76
|
+
|
77
|
+
expect { listener.stop }
|
78
|
+
.to output(/^outer │ 1 6\.00s 6\.00s 6\.00s 6\.00s$/).to_stdout
|
47
79
|
end
|
48
80
|
|
49
81
|
it 'records single from filtering_started over compilation_{suspended,started} to filtering_ended' do
|
@@ -59,8 +91,7 @@ describe Nanoc::CLI::Commands::Compile::TimingRecorder, stdio: true do
|
|
59
91
|
Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 7))
|
60
92
|
Nanoc::Int::NotificationCenter.post(:filtering_ended, rep, :erb)
|
61
93
|
|
62
|
-
# FIXME: wrong count (should be 1, not 2)
|
63
94
|
expect { listener.stop }
|
64
|
-
.to output(/^erb
|
95
|
+
.to output(/^erb │ 1 5\.00s 5\.00s 5\.00s 5\.00s$/).to_stdout
|
65
96
|
end
|
66
97
|
end
|
@@ -43,8 +43,8 @@ describe Nanoc::Helpers::Blogging, helper: true do
|
|
43
43
|
let(:item_attributes) { {} }
|
44
44
|
|
45
45
|
before do
|
46
|
-
|
47
|
-
ctx.create_rep(
|
46
|
+
ctx.create_item('Stuff', item_attributes, '/stuff/')
|
47
|
+
ctx.create_rep(ctx.items['/stuff/'], '/rep/path/stuff.html')
|
48
48
|
|
49
49
|
ctx.config[:base_url] = base_url
|
50
50
|
end
|
@@ -96,9 +96,10 @@ describe Nanoc::Helpers::Blogging, helper: true do
|
|
96
96
|
let(:item_attributes) { {} }
|
97
97
|
|
98
98
|
before do
|
99
|
-
ctx.
|
100
|
-
ctx.create_rep(ctx.
|
99
|
+
ctx.create_item('Feed', item_attributes, '/feed/')
|
100
|
+
ctx.create_rep(ctx.items['/feed/'], '/feed.xml')
|
101
101
|
|
102
|
+
ctx.item = ctx.items['/feed/']
|
102
103
|
ctx.config[:base_url] = base_url
|
103
104
|
end
|
104
105
|
|
@@ -170,8 +171,8 @@ describe Nanoc::Helpers::Blogging, helper: true do
|
|
170
171
|
let(:base_url) { 'http://url.base' }
|
171
172
|
|
172
173
|
before do
|
173
|
-
|
174
|
-
ctx.create_rep(
|
174
|
+
ctx.create_item('Stuff', item_attributes, '/stuff/')
|
175
|
+
ctx.create_rep(ctx.items['/stuff/'], item_rep_path)
|
175
176
|
|
176
177
|
ctx.config[:base_url] = base_url
|
177
178
|
end
|
@@ -1,8 +1,9 @@
|
|
1
1
|
describe Nanoc::Helpers::Capturing, helper: true do
|
2
2
|
describe '#content_for' do
|
3
3
|
before do
|
4
|
-
ctx.
|
5
|
-
ctx.create_rep(ctx.
|
4
|
+
ctx.create_item('some content', {}, '/about.md')
|
5
|
+
ctx.create_rep(ctx.items['/about.md'], '/about.html')
|
6
|
+
ctx.item = ctx.items['/about.md']
|
6
7
|
end
|
7
8
|
|
8
9
|
describe 'setting content' do
|
@@ -148,8 +149,8 @@ describe Nanoc::Helpers::Capturing, helper: true do
|
|
148
149
|
let(:item) { ctx.items['/other.md'] }
|
149
150
|
|
150
151
|
before do
|
151
|
-
|
152
|
-
ctx.create_rep(
|
152
|
+
ctx.create_item('other content', {}, '/other.md')
|
153
|
+
ctx.create_rep(ctx.items['/other.md'], '/other.html')
|
153
154
|
end
|
154
155
|
|
155
156
|
context 'other item is not yet compiled' do
|
@@ -2,49 +2,35 @@ describe Nanoc::Helpers::ChildParent, helper: true do
|
|
2
2
|
describe '#children_of' do
|
3
3
|
subject { helper.children_of(item) }
|
4
4
|
|
5
|
-
|
5
|
+
before { ctx.create_item('some content', {}, identifier) }
|
6
|
+
let(:item) { ctx.items[identifier] }
|
6
7
|
|
7
8
|
context 'legacy identifier' do
|
8
9
|
let(:identifier) { Nanoc::Identifier.new('/foo/', type: :legacy) }
|
9
10
|
|
10
|
-
|
11
|
+
before do
|
11
12
|
ctx.create_item('abc', {}, Nanoc::Identifier.new('/foo/a/', type: :legacy))
|
12
|
-
end
|
13
|
-
|
14
|
-
let!(:grandchild_item) do
|
15
13
|
ctx.create_item('def', {}, Nanoc::Identifier.new('/foo/a/b/', type: :legacy))
|
16
|
-
end
|
17
|
-
|
18
|
-
let!(:sibling_item) do
|
19
14
|
ctx.create_item('xyz', {}, Nanoc::Identifier.new('/bar/', type: :legacy))
|
20
15
|
end
|
21
16
|
|
22
17
|
it 'returns only direct children' do
|
23
|
-
expect(subject).to eql([
|
18
|
+
expect(subject).to eql([ctx.items['/foo/a/']])
|
24
19
|
end
|
25
20
|
end
|
26
21
|
|
27
22
|
context 'full identifier' do
|
28
23
|
let(:identifier) { Nanoc::Identifier.new('/foo.md', type: :full) }
|
29
24
|
|
30
|
-
|
25
|
+
before do
|
31
26
|
ctx.create_item('abc', {}, Nanoc::Identifier.new('/foo/a.md', type: :full))
|
32
|
-
end
|
33
|
-
|
34
|
-
let!(:grandchild_item) do
|
35
27
|
ctx.create_item('def', {}, Nanoc::Identifier.new('/foo/a/b.md', type: :full))
|
36
|
-
end
|
37
|
-
|
38
|
-
let!(:sibling_item) do
|
39
28
|
ctx.create_item('xyz', {}, Nanoc::Identifier.new('/bar.md', type: :full))
|
40
|
-
end
|
41
|
-
|
42
|
-
let!(:index_child_item) do
|
43
29
|
ctx.create_item('xyz', {}, Nanoc::Identifier.new('/foo/a/index.md', type: :full))
|
44
30
|
end
|
45
31
|
|
46
32
|
it 'returns only direct children' do
|
47
|
-
expect(subject).to eql([
|
33
|
+
expect(subject).to eql([ctx.items['/foo/a.md']])
|
48
34
|
end
|
49
35
|
end
|
50
36
|
end
|
@@ -52,53 +38,36 @@ describe Nanoc::Helpers::ChildParent, helper: true do
|
|
52
38
|
describe '#parent_of' do
|
53
39
|
subject { helper.parent_of(item) }
|
54
40
|
|
55
|
-
|
41
|
+
before { ctx.create_item('some content', {}, identifier) }
|
42
|
+
let(:item) { ctx.items[identifier] }
|
56
43
|
|
57
44
|
context 'legacy identifier' do
|
58
45
|
let(:identifier) { Nanoc::Identifier.new('/foo/bar/', type: :legacy) }
|
59
46
|
|
60
|
-
|
47
|
+
before do
|
61
48
|
ctx.create_item('abc', {}, Nanoc::Identifier.new('/foo/', type: :legacy))
|
62
|
-
end
|
63
|
-
|
64
|
-
let!(:sibling_item) do
|
65
49
|
ctx.create_item('def', {}, Nanoc::Identifier.new('/foo/qux/', type: :legacy))
|
66
|
-
end
|
67
|
-
|
68
|
-
let!(:child_item) do
|
69
50
|
ctx.create_item('xyz', {}, Nanoc::Identifier.new('/foo/bar/asdf/', type: :legacy))
|
70
|
-
end
|
71
|
-
|
72
|
-
let!(:grandparent_item) do
|
73
51
|
ctx.create_item('opq', {}, Nanoc::Identifier.new('/', type: :legacy))
|
74
52
|
end
|
75
53
|
|
76
54
|
it 'returns parent' do
|
77
|
-
expect(subject).to eql(
|
55
|
+
expect(subject).to eql(ctx.items['/foo/'])
|
78
56
|
end
|
79
57
|
end
|
80
58
|
|
81
59
|
context 'full identifier' do
|
82
60
|
let(:identifier) { Nanoc::Identifier.new('/foo/bar.md', type: :full) }
|
83
61
|
|
84
|
-
|
62
|
+
before do
|
85
63
|
ctx.create_item('abc', {}, Nanoc::Identifier.new('/foo.md', type: :full))
|
86
|
-
end
|
87
|
-
|
88
|
-
let!(:sibling_item) do
|
89
64
|
ctx.create_item('def', {}, Nanoc::Identifier.new('/foo/qux.md', type: :full))
|
90
|
-
end
|
91
|
-
|
92
|
-
let!(:child_item) do
|
93
65
|
ctx.create_item('xyz', {}, Nanoc::Identifier.new('/foo/bar/asdf.md', type: :full))
|
94
|
-
end
|
95
|
-
|
96
|
-
let!(:grandparent_item) do
|
97
66
|
ctx.create_item('opq', {}, Nanoc::Identifier.new('/index.md', type: :full))
|
98
67
|
end
|
99
68
|
|
100
69
|
it 'returns parent' do
|
101
|
-
expect(subject).to eql(
|
70
|
+
expect(subject).to eql(ctx.items['/foo.md'])
|
102
71
|
end
|
103
72
|
end
|
104
73
|
end
|
@@ -1,8 +1,11 @@
|
|
1
1
|
describe Nanoc::Helpers::Filtering, helper: true do
|
2
2
|
describe '#filter' do
|
3
3
|
before do
|
4
|
-
ctx.
|
5
|
-
ctx.
|
4
|
+
ctx.create_item('some content', { title: 'Hello!' }, '/about.md')
|
5
|
+
ctx.create_rep(ctx.items['/about.md'], '/about.html')
|
6
|
+
|
7
|
+
ctx.item = ctx.items['/about.md']
|
8
|
+
ctx.item_rep = ctx.item.reps[:default]
|
6
9
|
end
|
7
10
|
|
8
11
|
let(:content) do
|
@@ -33,14 +33,22 @@ describe Nanoc::Helpers::LinkTo, helper: true do
|
|
33
33
|
end
|
34
34
|
|
35
35
|
context 'with rep' do
|
36
|
-
|
37
|
-
|
36
|
+
before do
|
37
|
+
ctx.create_item('content', {}, '/target/')
|
38
|
+
ctx.create_rep(ctx.items['/target/'], '/target.html')
|
39
|
+
end
|
40
|
+
|
41
|
+
let(:target) { ctx.items['/target/'].reps[:default] }
|
38
42
|
|
39
43
|
it { is_expected.to eql('<a href="/target.html">Text</a>') }
|
40
44
|
end
|
41
45
|
|
42
46
|
context 'with item' do
|
43
|
-
|
47
|
+
before do
|
48
|
+
ctx.create_item('content', {}, '/target/')
|
49
|
+
end
|
50
|
+
|
51
|
+
let(:target) { ctx.items['/target/'] }
|
44
52
|
|
45
53
|
before do
|
46
54
|
ctx.create_rep(target, '/target.html')
|
@@ -66,8 +74,12 @@ describe Nanoc::Helpers::LinkTo, helper: true do
|
|
66
74
|
end
|
67
75
|
|
68
76
|
context 'with nil path' do
|
69
|
-
|
70
|
-
|
77
|
+
before do
|
78
|
+
ctx.create_item('content', {}, '/target/')
|
79
|
+
ctx.create_rep(ctx.items['/target/'], nil)
|
80
|
+
end
|
81
|
+
|
82
|
+
let(:target) { ctx.items['/target/'].reps[:default] }
|
71
83
|
|
72
84
|
it 'raises' do
|
73
85
|
expect { subject }.to raise_error(RuntimeError)
|
@@ -87,8 +99,11 @@ describe Nanoc::Helpers::LinkTo, helper: true do
|
|
87
99
|
|
88
100
|
context 'current' do
|
89
101
|
before do
|
90
|
-
ctx.
|
91
|
-
ctx.
|
102
|
+
ctx.create_item('content', {}, '/target.md')
|
103
|
+
ctx.create_rep(ctx.items['/target.md'], '/target.html')
|
104
|
+
|
105
|
+
ctx.item = ctx.items['/target.md']
|
106
|
+
ctx.item_rep = ctx.item.reps[:default]
|
92
107
|
end
|
93
108
|
|
94
109
|
it { is_expected.to eql('<span class="active">Text</span>') }
|
@@ -100,8 +115,11 @@ describe Nanoc::Helpers::LinkTo, helper: true do
|
|
100
115
|
|
101
116
|
context 'item rep present, but not current' do
|
102
117
|
before do
|
103
|
-
ctx.
|
104
|
-
ctx.
|
118
|
+
ctx.create_item('content', {}, '/other.md')
|
119
|
+
ctx.create_rep(ctx.items['/other.md'], '/other.html')
|
120
|
+
|
121
|
+
ctx.item = ctx.items['/other.md']
|
122
|
+
ctx.item_rep = ctx.item.reps[:default]
|
105
123
|
end
|
106
124
|
|
107
125
|
it { is_expected.to eql('<a href="/target.html">Text</a>') }
|
@@ -110,12 +128,18 @@ describe Nanoc::Helpers::LinkTo, helper: true do
|
|
110
128
|
|
111
129
|
context 'with rep' do
|
112
130
|
before do
|
113
|
-
ctx.
|
114
|
-
ctx.
|
131
|
+
ctx.create_item('content', {}, '/target.md')
|
132
|
+
ctx.create_rep(ctx.items['/target.md'], '/target.html')
|
133
|
+
|
134
|
+
ctx.create_item('content', {}, '/other.md')
|
135
|
+
ctx.create_rep(ctx.items['/other.md'], '/other.html')
|
136
|
+
|
137
|
+
ctx.item = ctx.items['/target.md']
|
138
|
+
ctx.item_rep = ctx.item.reps[:default]
|
115
139
|
end
|
116
140
|
|
117
|
-
let(:some_item) { ctx.
|
118
|
-
let(:some_item_rep) {
|
141
|
+
let(:some_item) { ctx.items['/other.md'] }
|
142
|
+
let(:some_item_rep) { some_item.reps[:default] }
|
119
143
|
|
120
144
|
context 'current' do
|
121
145
|
let(:target) { ctx.item_rep }
|
@@ -141,12 +165,18 @@ describe Nanoc::Helpers::LinkTo, helper: true do
|
|
141
165
|
|
142
166
|
context 'with item' do
|
143
167
|
before do
|
144
|
-
ctx.
|
145
|
-
ctx.
|
168
|
+
ctx.create_item('content', {}, '/target.md')
|
169
|
+
ctx.create_rep(ctx.items['/target.md'], '/target.html')
|
170
|
+
|
171
|
+
ctx.create_item('content', {}, '/other.md')
|
172
|
+
ctx.create_rep(ctx.items['/other.md'], '/other.html')
|
173
|
+
|
174
|
+
ctx.item = ctx.items['/target.md']
|
175
|
+
ctx.item_rep = ctx.item.reps[:default]
|
146
176
|
end
|
147
177
|
|
148
|
-
let
|
149
|
-
let
|
178
|
+
let(:some_item) { ctx.items['/other.md'] }
|
179
|
+
let(:some_item_rep) { some_item.reps[:default] }
|
150
180
|
|
151
181
|
context 'current' do
|
152
182
|
let(:target) { ctx.item }
|
@@ -175,8 +205,11 @@ describe Nanoc::Helpers::LinkTo, helper: true do
|
|
175
205
|
subject { helper.relative_path_to(target) }
|
176
206
|
|
177
207
|
before do
|
178
|
-
ctx.
|
179
|
-
ctx.
|
208
|
+
ctx.create_item('content', {}, '/foo/self.md')
|
209
|
+
ctx.create_rep(ctx.items['/foo/self.md'], self_path)
|
210
|
+
|
211
|
+
ctx.item = ctx.items['/foo/self.md']
|
212
|
+
ctx.item_rep = ctx.item.reps[:default]
|
180
213
|
end
|
181
214
|
|
182
215
|
context 'current item rep has non-nil path' do
|
@@ -214,7 +247,12 @@ describe Nanoc::Helpers::LinkTo, helper: true do
|
|
214
247
|
end
|
215
248
|
|
216
249
|
context 'to rep' do
|
217
|
-
|
250
|
+
before do
|
251
|
+
ctx.create_rep(ctx.item, '/bar/target.html', :special)
|
252
|
+
end
|
253
|
+
|
254
|
+
let(:target) { ctx.item.reps[:special] }
|
255
|
+
|
218
256
|
it { is_expected.to eql('../bar/target.html') }
|
219
257
|
|
220
258
|
context 'to self' do
|
@@ -232,10 +270,11 @@ describe Nanoc::Helpers::LinkTo, helper: true do
|
|
232
270
|
end
|
233
271
|
|
234
272
|
context 'to item' do
|
235
|
-
let(:target) { ctx.
|
273
|
+
let(:target) { ctx.items['/bar/target.md'] }
|
236
274
|
|
237
275
|
before do
|
238
|
-
ctx.
|
276
|
+
ctx.create_item('content', {}, '/bar/target.md')
|
277
|
+
ctx.create_rep(ctx.items['/bar/target.md'], '/bar/target.html')
|
239
278
|
end
|
240
279
|
|
241
280
|
it { is_expected.to eql('../bar/target.html') }
|
@@ -255,7 +294,11 @@ describe Nanoc::Helpers::LinkTo, helper: true do
|
|
255
294
|
end
|
256
295
|
|
257
296
|
context 'to nil path' do
|
258
|
-
let(:target) { ctx.
|
297
|
+
let(:target) { ctx.item.reps[:special] }
|
298
|
+
|
299
|
+
before do
|
300
|
+
ctx.create_rep(ctx.item, nil, :special)
|
301
|
+
end
|
259
302
|
|
260
303
|
it 'raises' do
|
261
304
|
expect { subject }.to raise_error(RuntimeError)
|
@@ -6,15 +6,11 @@ describe Nanoc::Helpers::Rendering, helper: true do
|
|
6
6
|
[Nanoc::Int::ProcessingActions::Filter.new(:erb, {})]
|
7
7
|
end
|
8
8
|
|
9
|
-
let(:layout_view)
|
10
|
-
|
11
|
-
end
|
12
|
-
|
13
|
-
let(:layout) do
|
14
|
-
layout_view.unwrap
|
15
|
-
end
|
9
|
+
let(:layout_view) { ctx.layouts[layout_identifier] }
|
10
|
+
let(:layout) { layout_view.unwrap }
|
16
11
|
|
17
12
|
before do
|
13
|
+
ctx.create_layout(layout_content, {}, layout_identifier)
|
18
14
|
ctx.update_rule_memory(layout, rule_memory_for_layout)
|
19
15
|
end
|
20
16
|
|
@@ -0,0 +1,68 @@
|
|
1
|
+
describe Nanoc::Spec::HelperContext do
|
2
|
+
let(:helper) do
|
3
|
+
Module.new {}
|
4
|
+
end
|
5
|
+
|
6
|
+
subject(:ctx) { described_class.new(helper) }
|
7
|
+
|
8
|
+
it 'has no items by default' do
|
9
|
+
# TODO: Add #empty? to item collection view
|
10
|
+
expect(subject.items.size).to eq(0)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'has no layouts by default' do
|
14
|
+
# TODO: Add #empty? to item collection view
|
15
|
+
expect(subject.layouts.size).to eq(0)
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#create_item' do
|
19
|
+
subject { ctx.create_item('foo', {}, '/foo.md') }
|
20
|
+
|
21
|
+
it 'creates item' do
|
22
|
+
expect { subject }
|
23
|
+
.to change { ctx.items.size }
|
24
|
+
.from(0).to(1)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'creates item without reps' do
|
28
|
+
subject
|
29
|
+
expect(ctx.items['/foo.md'].reps.size).to eq(0)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'returns self' do
|
33
|
+
expect(subject).to eq(ctx)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#create_layout' do
|
38
|
+
subject { ctx.create_layout('foo', {}, '/foo.md') }
|
39
|
+
|
40
|
+
it 'creates layout' do
|
41
|
+
expect { subject }
|
42
|
+
.to change { ctx.layouts.size }
|
43
|
+
.from(0).to(1)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'returns self' do
|
47
|
+
expect(subject).to eq(ctx)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#create_rep' do
|
52
|
+
before do
|
53
|
+
ctx.create_item('foo', {}, '/foo.md')
|
54
|
+
end
|
55
|
+
|
56
|
+
subject { ctx.create_rep(ctx.items['/foo.md'], '/foo.html') }
|
57
|
+
|
58
|
+
it 'creates rep' do
|
59
|
+
expect { subject }
|
60
|
+
.to change { ctx.items['/foo.md'].reps.size }
|
61
|
+
.from(0).to(1)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'returns self' do
|
65
|
+
expect(subject).to eq(ctx)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|