nanoc 4.7.7 → 4.7.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +6 -5
- data/NEWS.md +12 -0
- data/lib/nanoc/base/entities.rb +1 -0
- data/lib/nanoc/base/entities/action_sequence.rb +8 -36
- data/lib/nanoc/base/entities/checksum_collection.rb +31 -0
- data/lib/nanoc/base/entities/directed_graph.rb +35 -11
- data/lib/nanoc/base/errors.rb +3 -1
- data/lib/nanoc/base/repos/checksum_store.rb +1 -0
- data/lib/nanoc/base/services.rb +1 -0
- data/lib/nanoc/base/services/action_sequence_builder.rb +45 -0
- data/lib/nanoc/base/services/compiler.rb +34 -14
- data/lib/nanoc/base/services/compiler/stages.rb +1 -0
- data/lib/nanoc/base/services/compiler/stages/calculate_checksums.rb +31 -0
- data/lib/nanoc/base/services/compiler/stages/store_pre_compilation_state.rb +6 -13
- data/lib/nanoc/base/services/outdatedness_checker.rb +4 -2
- data/lib/nanoc/base/services/outdatedness_rules/attributes_modified.rb +1 -1
- data/lib/nanoc/base/services/outdatedness_rules/code_snippets_modified.rb +1 -1
- data/lib/nanoc/base/services/outdatedness_rules/configuration_modified.rb +1 -1
- data/lib/nanoc/base/services/outdatedness_rules/content_modified.rb +1 -1
- data/lib/nanoc/cli/cleaning_stream.rb +1 -1
- data/lib/nanoc/cli/commands/show-data.rb +1 -0
- data/lib/nanoc/rule_dsl/action_sequence_calculator.rb +7 -14
- data/lib/nanoc/rule_dsl/recording_executor.rb +40 -7
- data/lib/nanoc/version.rb +1 -1
- data/spec/nanoc/base/compiler_spec.rb +5 -5
- data/spec/nanoc/base/directed_graph_spec.rb +12 -0
- data/spec/nanoc/base/entities/action_sequence_spec.rb +132 -79
- data/spec/nanoc/base/errors/dependency_cycle_spec.rb +4 -4
- data/spec/nanoc/base/services/compiler/stages/calculate_checksums_spec.rb +69 -0
- data/spec/nanoc/base/services/executor_spec.rb +2 -2
- data/spec/nanoc/base/services/item_rep_router_spec.rb +4 -4
- data/spec/nanoc/base/services/outdatedness_checker_spec.rb +40 -24
- data/spec/nanoc/base/services/outdatedness_rules_spec.rb +27 -15
- data/spec/nanoc/cli/commands/show_data_spec.rb +2 -0
- data/spec/nanoc/rule_dsl/action_sequence_calculator_spec.rb +15 -13
- data/spec/nanoc/rule_dsl/recording_executor_spec.rb +4 -3
- data/test/cli/test_cleaning_stream.rb +8 -0
- metadata +6 -2
@@ -2,32 +2,25 @@ module Nanoc::Int::Compiler::Stages
|
|
2
2
|
class StorePreCompilationState
|
3
3
|
include Nanoc::Int::ContractsSupport
|
4
4
|
|
5
|
-
def initialize(reps:, layouts:,
|
5
|
+
def initialize(reps:, layouts:, checksum_store:, action_sequence_store:, action_sequences:)
|
6
6
|
@reps = reps
|
7
7
|
@layouts = layouts
|
8
|
-
@items = items
|
9
|
-
@code_snippets = code_snippets
|
10
|
-
@config = config
|
11
8
|
@checksum_store = checksum_store
|
12
9
|
@action_sequence_store = action_sequence_store
|
13
10
|
@action_sequences = action_sequences
|
14
11
|
end
|
15
12
|
|
16
|
-
contract
|
17
|
-
def run
|
13
|
+
contract Nanoc::Int::ChecksumCollection => C::Any
|
14
|
+
def run(checksums)
|
18
15
|
# Calculate action sequence
|
19
16
|
(@reps.to_a + @layouts.to_a).each do |obj|
|
20
17
|
@action_sequence_store[obj] = @action_sequences[obj].serialize
|
21
18
|
end
|
19
|
+
@action_sequence_store.store
|
22
20
|
|
23
|
-
#
|
24
|
-
|
25
|
-
@items.to_a + @layouts.to_a + @code_snippets + [@config]
|
26
|
-
objects_to_checksum.each { |obj| @checksum_store.add(obj) }
|
27
|
-
|
28
|
-
# Store
|
21
|
+
# Set checksums
|
22
|
+
@checksum_store.checksums = checksums.to_h
|
29
23
|
@checksum_store.store
|
30
|
-
@action_sequence_store.store
|
31
24
|
end
|
32
25
|
end
|
33
26
|
end
|
@@ -78,6 +78,7 @@ module Nanoc::Int
|
|
78
78
|
include Nanoc::Int::ContractsSupport
|
79
79
|
|
80
80
|
attr_reader :checksum_store
|
81
|
+
attr_reader :checksums
|
81
82
|
attr_reader :dependency_store
|
82
83
|
attr_reader :action_sequence_store
|
83
84
|
attr_reader :action_sequences
|
@@ -88,10 +89,11 @@ module Nanoc::Int
|
|
88
89
|
C_OBJ = C::Or[Nanoc::Int::Item, Nanoc::Int::ItemRep, Nanoc::Int::Layout]
|
89
90
|
C_ACTION_SEQUENCES = C::HashOf[C_OBJ => Nanoc::Int::ActionSequence]
|
90
91
|
|
91
|
-
contract C::KeywordArgs[site: Nanoc::Int::Site, checksum_store: Nanoc::Int::ChecksumStore, dependency_store: Nanoc::Int::DependencyStore, action_sequence_store: Nanoc::Int::ActionSequenceStore, action_sequences: C_ACTION_SEQUENCES, reps: Nanoc::Int::ItemRepRepo] => C::Any
|
92
|
-
def initialize(site:, checksum_store:, dependency_store:, action_sequence_store:, action_sequences:, reps:)
|
92
|
+
contract C::KeywordArgs[site: Nanoc::Int::Site, checksum_store: Nanoc::Int::ChecksumStore, checksums: Nanoc::Int::ChecksumCollection, dependency_store: Nanoc::Int::DependencyStore, action_sequence_store: Nanoc::Int::ActionSequenceStore, action_sequences: C_ACTION_SEQUENCES, reps: Nanoc::Int::ItemRepRepo] => C::Any
|
93
|
+
def initialize(site:, checksum_store:, checksums:, dependency_store:, action_sequence_store:, action_sequences:, reps:)
|
93
94
|
@site = site
|
94
95
|
@checksum_store = checksum_store
|
96
|
+
@checksums = checksums
|
95
97
|
@dependency_store = dependency_store
|
96
98
|
@action_sequence_store = action_sequence_store
|
97
99
|
@action_sequences = action_sequences
|
@@ -17,7 +17,7 @@ module Nanoc::Int::OutdatednessRules
|
|
17
17
|
return Nanoc::Int::OutdatednessReasons::AttributesModified.new(true)
|
18
18
|
end
|
19
19
|
|
20
|
-
new_checksums =
|
20
|
+
new_checksums = outdatedness_checker.checksums.attributes_checksum_for(obj)
|
21
21
|
|
22
22
|
attributes = Set.new(old_checksums.keys) + Set.new(new_checksums.keys)
|
23
23
|
changed_attributes = attributes.reject { |a| old_checksums[a] == new_checksums[a] }
|
@@ -17,7 +17,7 @@ module Nanoc::Int::OutdatednessRules
|
|
17
17
|
memoized def any_snippets_modified?(outdatedness_checker)
|
18
18
|
outdatedness_checker.site.code_snippets.any? do |cs|
|
19
19
|
ch_old = outdatedness_checker.checksum_store[cs]
|
20
|
-
ch_new =
|
20
|
+
ch_new = outdatedness_checker.checksums.checksum_for(cs)
|
21
21
|
ch_old != ch_new
|
22
22
|
end
|
23
23
|
end
|
@@ -15,7 +15,7 @@ module Nanoc::Int::OutdatednessRules
|
|
15
15
|
memoized def config_modified?(outdatedness_checker)
|
16
16
|
obj = outdatedness_checker.site.config
|
17
17
|
ch_old = outdatedness_checker.checksum_store[obj]
|
18
|
-
ch_new =
|
18
|
+
ch_new = outdatedness_checker.checksums.checksum_for(obj)
|
19
19
|
ch_old != ch_new
|
20
20
|
end
|
21
21
|
end
|
@@ -6,7 +6,7 @@ module Nanoc::Int::OutdatednessRules
|
|
6
6
|
obj = obj.item if obj.is_a?(Nanoc::Int::ItemRep)
|
7
7
|
|
8
8
|
ch_old = outdatedness_checker.checksum_store.content_checksum_for(obj)
|
9
|
-
ch_new =
|
9
|
+
ch_new = outdatedness_checker.checksums.content_checksum_for(obj)
|
10
10
|
if ch_old != ch_new
|
11
11
|
Nanoc::Int::OutdatednessReasons::ContentModified
|
12
12
|
end
|
@@ -147,7 +147,7 @@ module Nanoc::CLI
|
|
147
147
|
protected
|
148
148
|
|
149
149
|
def _nanoc_clean(s)
|
150
|
-
@stream_cleaners.reduce(s.to_s) { |acc, elem| elem.clean(acc) }
|
150
|
+
@stream_cleaners.reduce(s.to_s.scrub) { |acc, elem| elem.clean(acc) }
|
151
151
|
end
|
152
152
|
|
153
153
|
def _nanoc_swallow_broken_pipe_errors_while
|
@@ -144,6 +144,7 @@ module Nanoc::CLI::Commands
|
|
144
144
|
end
|
145
145
|
|
146
146
|
def print_outdatedness_reasons_for(obj, compiler)
|
147
|
+
compiler.calculate_checksums
|
147
148
|
outdatedness_checker = compiler.create_outdatedness_checker
|
148
149
|
reasons = outdatedness_checker.outdatedness_reasons_for(obj)
|
149
150
|
if reasons.any?
|
@@ -58,8 +58,7 @@ module Nanoc::RuleDSL
|
|
58
58
|
dependency_tracker = Nanoc::Int::DependencyTracker::Null.new
|
59
59
|
view_context = @site.compiler.compilation_context.create_view_context(dependency_tracker)
|
60
60
|
|
61
|
-
|
62
|
-
executor = Nanoc::RuleDSL::RecordingExecutor.new(action_sequence)
|
61
|
+
executor = Nanoc::RuleDSL::RecordingExecutor.new(rep)
|
63
62
|
rule = @rules_collection.compilation_rule_for(rep)
|
64
63
|
|
65
64
|
unless rule
|
@@ -68,17 +67,11 @@ module Nanoc::RuleDSL
|
|
68
67
|
|
69
68
|
executor.snapshot(:raw)
|
70
69
|
rule.apply_to(rep, executor: executor, site: @site, view_context: view_context)
|
71
|
-
if
|
72
|
-
|
73
|
-
|
74
|
-
unless action_sequence.snapshot_actions.any? { |sa| sa.snapshot_names.include?(:last) }
|
75
|
-
executor.snapshot(:last)
|
76
|
-
end
|
77
|
-
unless action_sequence.snapshot_actions.any? { |sa| sa.snapshot_names.include?(:pre) }
|
78
|
-
executor.snapshot(:pre)
|
79
|
-
end
|
70
|
+
executor.snapshot(:post) if executor.any_layouts?
|
71
|
+
executor.snapshot(:last) unless executor.last_snapshot?
|
72
|
+
executor.snapshot(:pre) unless executor.pre_snapshot?
|
80
73
|
|
81
|
-
copy_paths_from_routing_rules(compact_snapshots(action_sequence), rep: rep)
|
74
|
+
copy_paths_from_routing_rules(compact_snapshots(executor.action_sequence), rep: rep)
|
82
75
|
end
|
83
76
|
|
84
77
|
# @param [Nanoc::Int::Layout] layout
|
@@ -91,8 +84,8 @@ module Nanoc::RuleDSL
|
|
91
84
|
raise NoActionSequenceForLayoutException.new(layout)
|
92
85
|
end
|
93
86
|
|
94
|
-
Nanoc::Int::ActionSequence.
|
95
|
-
|
87
|
+
Nanoc::Int::ActionSequence.build(layout) do |b|
|
88
|
+
b.add_filter(res[0], res[1])
|
96
89
|
end
|
97
90
|
end
|
98
91
|
|
@@ -3,12 +3,17 @@ module Nanoc
|
|
3
3
|
class RecordingExecutor
|
4
4
|
include Nanoc::Int::ContractsSupport
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
contract Nanoc::Int::ItemRep => C::Any
|
7
|
+
def initialize(rep)
|
8
|
+
@action_sequence_builder = Nanoc::Int::ActionSequenceBuilder.new(rep)
|
9
|
+
|
10
|
+
@any_layouts = false
|
11
|
+
@last_snapshot = false
|
12
|
+
@pre_snapshot = false
|
8
13
|
end
|
9
14
|
|
10
15
|
def filter(filter_name, filter_args = {})
|
11
|
-
@
|
16
|
+
@action_sequence_builder.add_filter(filter_name, filter_args)
|
12
17
|
end
|
13
18
|
|
14
19
|
def layout(layout_identifier, extra_filter_args = {})
|
@@ -16,19 +21,47 @@ module Nanoc
|
|
16
21
|
raise ArgumentError.new('The layout passed to #layout must be a string')
|
17
22
|
end
|
18
23
|
|
19
|
-
unless
|
20
|
-
@
|
24
|
+
unless any_layouts?
|
25
|
+
@pre_snapshot = true
|
26
|
+
@action_sequence_builder.add_snapshot(:pre, nil)
|
21
27
|
end
|
22
28
|
|
23
|
-
@
|
29
|
+
@action_sequence_builder.add_layout(layout_identifier, extra_filter_args)
|
30
|
+
@any_layouts = true
|
24
31
|
end
|
25
32
|
|
26
33
|
Pathlike = C::Maybe[C::Or[String, Nanoc::Identifier]]
|
27
34
|
contract Symbol, C::KeywordArgs[path: C::Optional[Pathlike]] => nil
|
28
35
|
def snapshot(snapshot_name, path: nil)
|
29
|
-
@
|
36
|
+
@action_sequence_builder.add_snapshot(snapshot_name, path && path.to_s)
|
37
|
+
case snapshot_name
|
38
|
+
when :last
|
39
|
+
@last_snapshot = true
|
40
|
+
when :pre
|
41
|
+
@pre_snapshot = true
|
42
|
+
end
|
30
43
|
nil
|
31
44
|
end
|
45
|
+
|
46
|
+
contract C::None => Nanoc::Int::ActionSequence
|
47
|
+
def action_sequence
|
48
|
+
@action_sequence_builder.action_sequence
|
49
|
+
end
|
50
|
+
|
51
|
+
contract C::None => C::Bool
|
52
|
+
def any_layouts?
|
53
|
+
@any_layouts
|
54
|
+
end
|
55
|
+
|
56
|
+
contract C::None => C::Bool
|
57
|
+
def last_snapshot?
|
58
|
+
@last_snapshot
|
59
|
+
end
|
60
|
+
|
61
|
+
contract C::None => C::Bool
|
62
|
+
def pre_snapshot?
|
63
|
+
@pre_snapshot
|
64
|
+
end
|
32
65
|
end
|
33
66
|
end
|
34
67
|
end
|
data/lib/nanoc/version.rb
CHANGED
@@ -58,6 +58,10 @@ describe Nanoc::Int::Compiler do
|
|
58
58
|
Nanoc::Int::ActionSequence.new(nil, actions: actions)
|
59
59
|
end
|
60
60
|
|
61
|
+
let(:action_sequences) do
|
62
|
+
{ rep => memory, other_rep => memory }
|
63
|
+
end
|
64
|
+
|
61
65
|
before do
|
62
66
|
reps << rep
|
63
67
|
reps << other_rep
|
@@ -66,15 +70,11 @@ describe Nanoc::Int::Compiler do
|
|
66
70
|
rep.snapshot_defs << Nanoc::Int::SnapshotDef.new(:last, binary: false)
|
67
71
|
end
|
68
72
|
|
69
|
-
# FIXME: eww
|
70
|
-
action_sequences = { rep => memory, other_rep => memory }
|
71
|
-
compiler.instance_variable_set(:@action_sequences, action_sequences)
|
72
|
-
|
73
73
|
allow(Nanoc::Int::NotificationCenter).to receive(:post)
|
74
74
|
end
|
75
75
|
|
76
76
|
describe '#compile_rep' do
|
77
|
-
let(:stage) { compiler.send(:compile_reps_stage) }
|
77
|
+
let(:stage) { compiler.send(:compile_reps_stage, action_sequences) }
|
78
78
|
|
79
79
|
subject { stage.send(:compile_rep, rep, is_outdated: is_outdated) }
|
80
80
|
|
@@ -27,6 +27,18 @@ describe Nanoc::Int::DirectedGraph do
|
|
27
27
|
it { is_expected.to eq([2, 3]) }
|
28
28
|
end
|
29
29
|
|
30
|
+
context 'one cycle with tail' do
|
31
|
+
before do
|
32
|
+
graph.add_edge(1, 2)
|
33
|
+
graph.add_edge(2, 20)
|
34
|
+
graph.add_edge(20, 21)
|
35
|
+
graph.add_edge(2, 3)
|
36
|
+
graph.add_edge(3, 1)
|
37
|
+
end
|
38
|
+
|
39
|
+
it { is_expected.to eq([1, 2, 3]) }
|
40
|
+
end
|
41
|
+
|
30
42
|
context 'large cycle' do
|
31
43
|
before do
|
32
44
|
graph.add_edge(1, 2)
|
@@ -1,17 +1,26 @@
|
|
1
1
|
describe Nanoc::Int::ActionSequence do
|
2
|
-
let(:action_sequence) {
|
3
|
-
|
2
|
+
let(:action_sequence) { raise 'override me' }
|
3
|
+
|
4
|
+
let(:item) { Nanoc::Int::Item.new('foo', {}, '/foo.md') }
|
5
|
+
let(:rep) { Nanoc::Int::ItemRep.new(item, :default) }
|
4
6
|
|
5
7
|
describe '#size' do
|
6
8
|
subject { action_sequence.size }
|
7
9
|
|
8
10
|
context 'no actions' do
|
11
|
+
let(:action_sequence) do
|
12
|
+
described_class.build(rep) do |b|
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
9
16
|
it { is_expected.to eql(0) }
|
10
17
|
end
|
11
18
|
|
12
19
|
context 'some actions' do
|
13
|
-
|
14
|
-
|
20
|
+
let(:action_sequence) do
|
21
|
+
described_class.build(rep) do |b|
|
22
|
+
b.add_filter(:foo, {})
|
23
|
+
end
|
15
24
|
end
|
16
25
|
|
17
26
|
it { is_expected.to eql(1) }
|
@@ -23,12 +32,19 @@ describe Nanoc::Int::ActionSequence do
|
|
23
32
|
let(:index) { 0 }
|
24
33
|
|
25
34
|
context 'no actions' do
|
35
|
+
let(:action_sequence) do
|
36
|
+
described_class.build(rep) do |b|
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
26
40
|
it { is_expected.to be_nil }
|
27
41
|
end
|
28
42
|
|
29
43
|
context 'some actions' do
|
30
|
-
|
31
|
-
|
44
|
+
let(:action_sequence) do
|
45
|
+
described_class.build(rep) do |b|
|
46
|
+
b.add_filter(:foo, {})
|
47
|
+
end
|
32
48
|
end
|
33
49
|
|
34
50
|
it { is_expected.to be_a(Nanoc::Int::ProcessingActions::Filter) }
|
@@ -36,9 +52,13 @@ describe Nanoc::Int::ActionSequence do
|
|
36
52
|
end
|
37
53
|
|
38
54
|
describe '#add_filter' do
|
39
|
-
|
40
|
-
|
55
|
+
let(:action_sequence) do
|
56
|
+
described_class.build(rep) do |b|
|
57
|
+
b.add_filter(:foo, donkey: 123)
|
58
|
+
end
|
59
|
+
end
|
41
60
|
|
61
|
+
example do
|
42
62
|
expect(action_sequence.size).to eql(1)
|
43
63
|
expect(action_sequence[0]).to be_a(Nanoc::Int::ProcessingActions::Filter)
|
44
64
|
expect(action_sequence[0].filter_name).to eql(:foo)
|
@@ -47,9 +67,13 @@ describe Nanoc::Int::ActionSequence do
|
|
47
67
|
end
|
48
68
|
|
49
69
|
describe '#add_layout' do
|
50
|
-
|
51
|
-
|
70
|
+
let(:action_sequence) do
|
71
|
+
described_class.build(rep) do |b|
|
72
|
+
b.add_layout('/foo.*', donkey: 123)
|
73
|
+
end
|
74
|
+
end
|
52
75
|
|
76
|
+
example do
|
53
77
|
expect(action_sequence.size).to eql(1)
|
54
78
|
expect(action_sequence[0]).to be_a(Nanoc::Int::ProcessingActions::Layout)
|
55
79
|
expect(action_sequence[0].layout_identifier).to eql('/foo.*')
|
@@ -59,9 +83,13 @@ describe Nanoc::Int::ActionSequence do
|
|
59
83
|
|
60
84
|
describe '#add_snapshot' do
|
61
85
|
context 'snapshot does not yet exist' do
|
62
|
-
|
63
|
-
|
86
|
+
let(:action_sequence) do
|
87
|
+
described_class.build(rep) do |b|
|
88
|
+
b.add_snapshot(:before_layout, '/foo.md')
|
89
|
+
end
|
90
|
+
end
|
64
91
|
|
92
|
+
example do
|
65
93
|
expect(action_sequence.size).to eql(1)
|
66
94
|
expect(action_sequence[0]).to be_a(Nanoc::Int::ProcessingActions::Snapshot)
|
67
95
|
expect(action_sequence[0].snapshot_names).to eql([:before_layout])
|
@@ -70,22 +98,23 @@ describe Nanoc::Int::ActionSequence do
|
|
70
98
|
end
|
71
99
|
|
72
100
|
context 'snapshot already exist' do
|
73
|
-
before do
|
74
|
-
action_sequence.add_snapshot(:before_layout, '/bar.md')
|
75
|
-
end
|
76
|
-
|
77
101
|
it 'raises' do
|
78
|
-
|
79
|
-
.
|
102
|
+
described_class.build(rep) do |b|
|
103
|
+
b.add_snapshot(:before_layout, '/bar.md')
|
104
|
+
expect { b.add_snapshot(:before_layout, '/foo.md') }
|
105
|
+
.to raise_error(Nanoc::Int::Errors::CannotCreateMultipleSnapshotsWithSameName)
|
106
|
+
end
|
80
107
|
end
|
81
108
|
end
|
82
109
|
end
|
83
110
|
|
84
111
|
describe '#each' do
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
112
|
+
let(:action_sequence) do
|
113
|
+
described_class.build(rep) do |b|
|
114
|
+
b.add_filter(:erb, awesomeness: 'high')
|
115
|
+
b.add_snapshot(:bar, '/foo.md')
|
116
|
+
b.add_layout('/default.erb', somelayoutparam: 'yes')
|
117
|
+
end
|
89
118
|
end
|
90
119
|
|
91
120
|
example do
|
@@ -96,10 +125,12 @@ describe Nanoc::Int::ActionSequence do
|
|
96
125
|
end
|
97
126
|
|
98
127
|
describe '#map' do
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
128
|
+
let(:action_sequence) do
|
129
|
+
described_class.build(rep) do |b|
|
130
|
+
b.add_filter(:erb, awesomeness: 'high')
|
131
|
+
b.add_snapshot(:bar, '/foo.md')
|
132
|
+
b.add_layout('/default.erb', somelayoutparam: 'yes')
|
133
|
+
end
|
103
134
|
end
|
104
135
|
|
105
136
|
example do
|
@@ -112,10 +143,12 @@ describe Nanoc::Int::ActionSequence do
|
|
112
143
|
describe '#serialize' do
|
113
144
|
subject { action_sequence.serialize }
|
114
145
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
146
|
+
let(:action_sequence) do
|
147
|
+
described_class.build(rep) do |b|
|
148
|
+
b.add_filter(:erb, awesomeness: 'high')
|
149
|
+
b.add_snapshot(:bar, '/foo.md')
|
150
|
+
b.add_layout('/default.erb', somelayoutparam: 'yes')
|
151
|
+
end
|
119
152
|
end
|
120
153
|
|
121
154
|
example do
|
@@ -130,8 +163,6 @@ describe Nanoc::Int::ActionSequence do
|
|
130
163
|
end
|
131
164
|
|
132
165
|
describe '#snapshots_defs' do
|
133
|
-
subject { action_sequence.snapshots_defs }
|
134
|
-
|
135
166
|
let(:item) { Nanoc::Int::Item.new('asdf', {}, '/foo.md') }
|
136
167
|
let(:rep) { Nanoc::Int::ItemRep.new(item, :default) }
|
137
168
|
|
@@ -164,42 +195,55 @@ describe Nanoc::Int::ActionSequence do
|
|
164
195
|
end
|
165
196
|
|
166
197
|
it 'has no snapshot defs by default' do
|
167
|
-
|
198
|
+
action_sequence =
|
199
|
+
described_class.build(rep) do |b|
|
200
|
+
end
|
201
|
+
|
202
|
+
expect(action_sequence.snapshots_defs).to be_empty
|
168
203
|
end
|
169
204
|
|
170
205
|
context 'textual item' do
|
171
206
|
let(:item) { Nanoc::Int::Item.new('asdf', {}, '/foo.md') }
|
172
207
|
|
173
208
|
it 'generates initial textual snapshot def' do
|
174
|
-
action_sequence
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
209
|
+
action_sequence =
|
210
|
+
described_class.build(rep) do |b|
|
211
|
+
b.add_snapshot(:giraffe, nil)
|
212
|
+
end
|
213
|
+
|
214
|
+
expect(action_sequence.snapshots_defs.size).to eq(1)
|
215
|
+
expect(action_sequence.snapshots_defs[0].name).to eq(:giraffe)
|
216
|
+
expect(action_sequence.snapshots_defs[0]).not_to be_binary
|
179
217
|
end
|
180
218
|
|
181
219
|
it 'generated follow-up textual snapshot def if previous filter is textual' do
|
182
|
-
action_sequence
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
expect(
|
190
|
-
expect(
|
220
|
+
action_sequence =
|
221
|
+
described_class.build(rep) do |b|
|
222
|
+
b.add_snapshot(:giraffe, nil)
|
223
|
+
b.add_filter(:RuleMemSpec_filter_t2t, arguments: 'irrelevant')
|
224
|
+
b.add_snapshot(:zebra, nil)
|
225
|
+
end
|
226
|
+
|
227
|
+
expect(action_sequence.snapshots_defs.size).to eq(2)
|
228
|
+
expect(action_sequence.snapshots_defs[0].name).to eq(:giraffe)
|
229
|
+
expect(action_sequence.snapshots_defs[0]).not_to be_binary
|
230
|
+
expect(action_sequence.snapshots_defs[1].name).to eq(:zebra)
|
231
|
+
expect(action_sequence.snapshots_defs[1]).not_to be_binary
|
191
232
|
end
|
192
233
|
|
193
234
|
it 'generated follow-up binary snapshot def if previous filter is text-to-bianry' do
|
194
|
-
action_sequence
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
expect(
|
202
|
-
expect(
|
235
|
+
action_sequence =
|
236
|
+
described_class.build(rep) do |b|
|
237
|
+
b.add_snapshot(:giraffe, nil)
|
238
|
+
b.add_filter(:RuleMemSpec_filter_t2b, arguments: 'irrelevant')
|
239
|
+
b.add_snapshot(:zebra, nil)
|
240
|
+
end
|
241
|
+
|
242
|
+
expect(action_sequence.snapshots_defs.size).to eq(2)
|
243
|
+
expect(action_sequence.snapshots_defs[0].name).to eq(:giraffe)
|
244
|
+
expect(action_sequence.snapshots_defs[0]).not_to be_binary
|
245
|
+
expect(action_sequence.snapshots_defs[1].name).to eq(:zebra)
|
246
|
+
expect(action_sequence.snapshots_defs[1]).to be_binary
|
203
247
|
end
|
204
248
|
end
|
205
249
|
|
@@ -207,35 +251,44 @@ describe Nanoc::Int::ActionSequence do
|
|
207
251
|
let(:item) { Nanoc::Int::Item.new(Nanoc::Int::BinaryContent.new('/asdf.dat'), {}, '/foo.md') }
|
208
252
|
|
209
253
|
it 'generates initial binary snapshot def' do
|
210
|
-
action_sequence
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
254
|
+
action_sequence =
|
255
|
+
described_class.build(rep) do |b|
|
256
|
+
b.add_snapshot(:giraffe, nil)
|
257
|
+
end
|
258
|
+
|
259
|
+
expect(action_sequence.snapshots_defs.size).to eq(1)
|
260
|
+
expect(action_sequence.snapshots_defs[0].name).to eq(:giraffe)
|
261
|
+
expect(action_sequence.snapshots_defs[0]).to be_binary
|
215
262
|
end
|
216
263
|
|
217
264
|
it 'generated follow-up binary snapshot def if previous filter is binary' do
|
218
|
-
action_sequence
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
expect(
|
226
|
-
expect(
|
265
|
+
action_sequence =
|
266
|
+
described_class.build(rep) do |b|
|
267
|
+
b.add_snapshot(:giraffe, nil)
|
268
|
+
b.add_filter(:RuleMemSpec_filter_b2b, arguments: 'irrelevant')
|
269
|
+
b.add_snapshot(:zebra, nil)
|
270
|
+
end
|
271
|
+
|
272
|
+
expect(action_sequence.snapshots_defs.size).to eq(2)
|
273
|
+
expect(action_sequence.snapshots_defs[0].name).to eq(:giraffe)
|
274
|
+
expect(action_sequence.snapshots_defs[0]).to be_binary
|
275
|
+
expect(action_sequence.snapshots_defs[1].name).to eq(:zebra)
|
276
|
+
expect(action_sequence.snapshots_defs[1]).to be_binary
|
227
277
|
end
|
228
278
|
|
229
279
|
it 'generated follow-up textual snapshot def if previous filter is binary-to-text' do
|
230
|
-
action_sequence
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
expect(
|
238
|
-
expect(
|
280
|
+
action_sequence =
|
281
|
+
described_class.build(rep) do |b|
|
282
|
+
b.add_snapshot(:giraffe, nil)
|
283
|
+
b.add_filter(:RuleMemSpec_filter_b2t, arguments: 'irrelevant')
|
284
|
+
b.add_snapshot(:zebra, nil)
|
285
|
+
end
|
286
|
+
|
287
|
+
expect(action_sequence.snapshots_defs.size).to eq(2)
|
288
|
+
expect(action_sequence.snapshots_defs[0].name).to eq(:giraffe)
|
289
|
+
expect(action_sequence.snapshots_defs[0]).to be_binary
|
290
|
+
expect(action_sequence.snapshots_defs[1].name).to eq(:zebra)
|
291
|
+
expect(action_sequence.snapshots_defs[1]).not_to be_binary
|
239
292
|
end
|
240
293
|
end
|
241
294
|
end
|