nanoc 4.7.3 → 4.7.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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +5 -5
  3. data/NEWS.md +7 -0
  4. data/lib/nanoc/base/entities.rb +1 -1
  5. data/lib/nanoc/base/entities/{rule_memory.rb → action_sequence.rb} +19 -1
  6. data/lib/nanoc/base/entities/outdatedness_reasons.rb +12 -4
  7. data/lib/nanoc/base/entities/outdatedness_status.rb +1 -1
  8. data/lib/nanoc/base/repos.rb +1 -1
  9. data/lib/nanoc/base/repos/{rule_memory_store.rb → action_sequence_store.rb} +12 -12
  10. data/lib/nanoc/base/repos/checksum_store.rb +3 -3
  11. data/lib/nanoc/base/services/action_provider.rb +1 -9
  12. data/lib/nanoc/base/services/checksummer.rb +4 -2
  13. data/lib/nanoc/base/services/compiler.rb +11 -11
  14. data/lib/nanoc/base/services/compiler/phases/recalculate.rb +3 -3
  15. data/lib/nanoc/base/services/compiler/stages/cleanup.rb +1 -1
  16. data/lib/nanoc/base/services/compiler/stages/compile_reps.rb +3 -3
  17. data/lib/nanoc/base/services/compiler/stages/determine_outdatedness.rb +7 -2
  18. data/lib/nanoc/base/services/compiler_loader.rb +3 -3
  19. data/lib/nanoc/base/services/item_rep_builder.rb +4 -2
  20. data/lib/nanoc/base/services/item_rep_router.rb +7 -2
  21. data/lib/nanoc/base/services/outdatedness_checker.rb +30 -7
  22. data/lib/nanoc/base/services/outdatedness_rule.rb +7 -4
  23. data/lib/nanoc/base/services/outdatedness_rules.rb +9 -161
  24. data/lib/nanoc/base/services/outdatedness_rules/attributes_modified.rb +34 -0
  25. data/lib/nanoc/base/services/outdatedness_rules/code_snippets_modified.rb +26 -0
  26. data/lib/nanoc/base/services/outdatedness_rules/configuration_modified.rb +23 -0
  27. data/lib/nanoc/base/services/outdatedness_rules/content_modified.rb +15 -0
  28. data/lib/nanoc/base/services/outdatedness_rules/not_written.rb +11 -0
  29. data/lib/nanoc/base/services/outdatedness_rules/paths_modified.rb +20 -0
  30. data/lib/nanoc/base/services/outdatedness_rules/rules_modified.rb +13 -0
  31. data/lib/nanoc/base/services/outdatedness_rules/uses_always_outdated_filter.rb +20 -0
  32. data/lib/nanoc/rule_dsl.rb +1 -1
  33. data/lib/nanoc/rule_dsl/action_provider.rb +7 -11
  34. data/lib/nanoc/rule_dsl/{rule_memory_calculator.rb → action_sequence_calculator.rb} +21 -39
  35. data/lib/nanoc/rule_dsl/recording_executor.rb +7 -7
  36. data/lib/nanoc/spec.rb +7 -7
  37. data/lib/nanoc/version.rb +1 -1
  38. data/spec/nanoc/base/checksummer_spec.rb +20 -0
  39. data/spec/nanoc/base/compiler_spec.rb +7 -10
  40. data/spec/nanoc/base/entities/action_sequence_spec.rb +278 -0
  41. data/spec/nanoc/base/repos/checksum_store_spec.rb +22 -2
  42. data/spec/nanoc/base/services/compiler/stages/cleanup_spec.rb +2 -2
  43. data/spec/nanoc/base/services/compiler/stages/compile_reps_spec.rb +5 -9
  44. data/spec/nanoc/base/services/executor_spec.rb +5 -5
  45. data/spec/nanoc/base/services/item_rep_router_spec.rb +36 -18
  46. data/spec/nanoc/base/services/outdatedness_checker_spec.rb +74 -30
  47. data/spec/nanoc/base/services/outdatedness_rules_spec.rb +78 -18
  48. data/spec/nanoc/helpers/rendering_spec.rb +4 -4
  49. data/spec/nanoc/rule_dsl/{rule_memory_calculator_spec.rb → action_sequence_calculator_spec.rb} +6 -61
  50. data/spec/nanoc/rule_dsl/recording_executor_spec.rb +45 -45
  51. data/test/base/test_outdatedness_checker.rb +1 -1
  52. data/test/rule_dsl/test_action_provider.rb +3 -3
  53. metadata +15 -7
  54. data/spec/nanoc/base/entities/rule_memory_spec.rb +0 -167
@@ -3,8 +3,11 @@ describe Nanoc::Int::ChecksumStore do
3
3
 
4
4
  let(:objects) { [item, code_snippet] }
5
5
 
6
- let(:item) { Nanoc::Int::Item.new('asdf', {}, '/foo.md') }
7
- let(:other_item) { Nanoc::Int::Item.new('asdf', {}, '/sneaky.md') }
6
+ let(:item) { Nanoc::Int::Item.new('asdf', item_attributes, '/foo.md') }
7
+ let(:other_item) { Nanoc::Int::Item.new('asdf', other_item_attributes, '/sneaky.md') }
8
+
9
+ let(:item_attributes) { {} }
10
+ let(:other_item_attributes) { {} }
8
11
 
9
12
  let(:code_snippet) { Nanoc::Int::CodeSnippet.new('def hi ; end', 'lib/foo.rb') }
10
13
  let(:other_code_snippet) { Nanoc::Int::CodeSnippet.new('def ho ; end', 'lib/bar.rb') }
@@ -90,6 +93,15 @@ describe Nanoc::Int::ChecksumStore do
90
93
 
91
94
  it 'has attributes checksum' do
92
95
  expect(store.attributes_checksum_for(item)).not_to be_nil
96
+ expect(store.attributes_checksum_for(item)).to eq({})
97
+ end
98
+
99
+ context 'item has attributes' do
100
+ let(:item_attributes) { { animal: 'donkey' } }
101
+
102
+ it 'has attribute checksum for specified attribute' do
103
+ expect(store.attributes_checksum_for(item)).to have_key(:animal)
104
+ end
93
105
  end
94
106
 
95
107
  context 'after storing and loading' do
@@ -119,6 +131,14 @@ describe Nanoc::Int::ChecksumStore do
119
131
  expect(store.attributes_checksum_for(other_item)).not_to be_nil
120
132
  end
121
133
 
134
+ context 'item has attributes' do
135
+ let(:other_item_attributes) { { location: 'Bernauer Str.' } }
136
+
137
+ it 'has attribute checksum for specified attribute' do
138
+ expect(store.attributes_checksum_for(other_item)).to have_key(:location)
139
+ end
140
+ end
141
+
122
142
  context 'after storing and loading' do
123
143
  before do
124
144
  store.store
@@ -57,8 +57,8 @@ describe Nanoc::Int::Compiler::Stages::Cleanup do
57
57
  it_behaves_like 'an old store'
58
58
  end
59
59
 
60
- context 'tmp/rule_memory' do
61
- let(:store_name) { 'rule_memory' }
60
+ context 'tmp/action_sequence' do
61
+ let(:store_name) { 'action_sequence' }
62
62
  it_behaves_like 'an old store'
63
63
  end
64
64
 
@@ -3,7 +3,7 @@ describe Nanoc::Int::Compiler::Stages::CompileReps do
3
3
  described_class.new(
4
4
  outdatedness_store: outdatedness_store,
5
5
  dependency_store: dependency_store,
6
- action_provider: action_provider,
6
+ action_sequences: action_sequences,
7
7
  compilation_context: compilation_context,
8
8
  compiled_content_cache: compiled_content_cache,
9
9
  )
@@ -20,6 +20,7 @@ describe Nanoc::Int::Compiler::Stages::CompileReps do
20
20
  end
21
21
 
22
22
  let(:action_provider) { double(:action_provider) }
23
+ let(:action_sequences) { double(:action_sequences) }
23
24
  let(:reps) { Nanoc::Int::ItemRepRepo.new }
24
25
  let(:compiled_content_cache) { Nanoc::Int::CompiledContentCache.new(items: items) }
25
26
  let(:snapshot_repo) { Nanoc::Int::SnapshotRepo.new }
@@ -59,7 +60,7 @@ describe Nanoc::Int::Compiler::Stages::CompileReps do
59
60
  Nanoc::Int::ProcessingActions::Snapshot.new([:last], []),
60
61
  ]
61
62
 
62
- Nanoc::Int::RuleMemory.new(nil, actions: actions)
63
+ Nanoc::Int::ActionSequence.new(nil, actions: actions)
63
64
  end
64
65
 
65
66
  before do
@@ -70,18 +71,13 @@ describe Nanoc::Int::Compiler::Stages::CompileReps do
70
71
  rep.snapshot_defs << Nanoc::Int::SnapshotDef.new(:last, binary: false)
71
72
  end
72
73
 
73
- allow(action_provider).to receive(:memory_for).with(rep).and_return(memory)
74
- allow(action_provider).to receive(:memory_for).with(other_rep).and_return(memory)
74
+ allow(action_sequences).to receive(:[]).with(rep).and_return(memory)
75
+ allow(action_sequences).to receive(:[]).with(other_rep).and_return(memory)
75
76
  end
76
77
 
77
78
  describe '#compile_reps' do
78
79
  subject { stage.run }
79
80
 
80
- before do
81
- allow(action_provider).to receive(:snapshots_defs_for).with(rep).and_return(snapshot_defs_for_rep)
82
- allow(action_provider).to receive(:snapshots_defs_for).with(other_rep).and_return(snapshot_defs_for_rep)
83
- end
84
-
85
81
  let(:snapshot_defs_for_rep) do
86
82
  [Nanoc::Int::SnapshotDef.new(:last, binary: false)]
87
83
  end
@@ -407,8 +407,8 @@ describe Nanoc::Int::Executor do
407
407
  )
408
408
  end
409
409
 
410
- let(:rule_memory) do
411
- Nanoc::Int::RuleMemory.new(rep).tap do |mem|
410
+ let(:action_sequence) do
411
+ Nanoc::Int::ActionSequence.new(rep).tap do |mem|
412
412
  mem.add_filter(:erb, {})
413
413
  end
414
414
  end
@@ -422,7 +422,7 @@ describe Nanoc::Int::Executor do
422
422
  allow(compilation_context).to receive(:assigns_for).with(rep, dependency_tracker) { assigns }
423
423
  allow(compilation_context).to receive(:create_view_context).with(dependency_tracker).and_return(view_context)
424
424
 
425
- allow(action_provider).to receive(:memory_for).with(layout).and_return(rule_memory)
425
+ allow(action_provider).to receive(:action_sequence_for).with(layout).and_return(action_sequence)
426
426
  end
427
427
 
428
428
  subject { executor.layout('/default.*') }
@@ -532,8 +532,8 @@ describe Nanoc::Int::Executor do
532
532
  end
533
533
 
534
534
  context 'no filter specified' do
535
- let(:rule_memory) do
536
- Nanoc::Int::RuleMemory.new(rep)
535
+ let(:action_sequence) do
536
+ Nanoc::Int::ActionSequence.new(rep)
537
537
  end
538
538
 
539
539
  it 'raises' do
@@ -18,44 +18,62 @@ describe(Nanoc::Int::ItemRepRouter) do
18
18
  ]
19
19
  end
20
20
 
21
- let(:paths_0) do
22
- [
23
- [[:last], ['/foo/index.html']],
24
- ]
21
+ let(:memory_without_paths) do
22
+ actions =
23
+ [
24
+ Nanoc::Int::ProcessingActions::Filter.new(:erb, {}),
25
+ Nanoc::Int::ProcessingActions::Snapshot.new([], []),
26
+ ]
27
+
28
+ Nanoc::Int::ActionSequence.new(nil, actions: actions)
25
29
  end
26
30
 
27
- let(:paths_1) do
28
- [
29
- [[:last], ['/bar.html']],
30
- ]
31
+ let(:action_sequence_for_default) do
32
+ actions =
33
+ [
34
+ Nanoc::Int::ProcessingActions::Filter.new(:erb, {}),
35
+ Nanoc::Int::ProcessingActions::Snapshot.new([:last], ['/foo/index.html']),
36
+ ]
37
+
38
+ Nanoc::Int::ActionSequence.new(nil, actions: actions)
39
+ end
40
+
41
+ let(:action_sequence_for_csv) do
42
+ actions =
43
+ [
44
+ Nanoc::Int::ProcessingActions::Filter.new(:erb, {}),
45
+ Nanoc::Int::ProcessingActions::Snapshot.new([:last], ['/foo.csv']),
46
+ ]
47
+
48
+ Nanoc::Int::ActionSequence.new(nil, actions: actions)
31
49
  end
32
50
 
33
51
  example do
34
- allow(action_provider).to receive(:paths_for).with(reps[0]).and_return(paths_0)
35
- allow(action_provider).to receive(:paths_for).with(reps[1]).and_return(paths_1)
52
+ allow(action_provider).to receive(:action_sequence_for).with(reps[0]).and_return(action_sequence_for_default)
53
+ allow(action_provider).to receive(:action_sequence_for).with(reps[1]).and_return(action_sequence_for_csv)
36
54
 
37
55
  subject
38
56
 
39
57
  expect(reps[0].raw_paths).to eql(last: ['output/foo/index.html'])
40
58
  expect(reps[0].paths).to eql(last: ['/foo/'])
41
59
 
42
- expect(reps[1].raw_paths).to eql(last: ['output/bar.html'])
43
- expect(reps[1].paths).to eql(last: ['/bar.html'])
60
+ expect(reps[1].raw_paths).to eql(last: ['output/foo.csv'])
61
+ expect(reps[1].paths).to eql(last: ['/foo.csv'])
44
62
  end
45
63
 
46
64
  it 'picks the paths last returned' do
47
- expect(action_provider).to receive(:paths_for).with(reps[0]).and_return([[[:last], []]]).ordered
48
- expect(action_provider).to receive(:paths_for).with(reps[0]).and_return(paths_0).ordered
49
- expect(action_provider).to receive(:paths_for).with(reps[1]).and_return([[[:last], []]]).ordered
50
- expect(action_provider).to receive(:paths_for).with(reps[1]).and_return(paths_1).ordered
65
+ allow(action_provider).to receive(:action_sequence_for).with(reps[0])
66
+ .and_return(memory_without_paths, action_sequence_for_default)
67
+ allow(action_provider).to receive(:action_sequence_for).with(reps[1])
68
+ .and_return(memory_without_paths, action_sequence_for_csv)
51
69
 
52
70
  subject
53
71
 
54
72
  expect(reps[0].raw_paths).to eql(last: ['output/foo/index.html'])
55
73
  expect(reps[0].paths).to eql(last: ['/foo/'])
56
74
 
57
- expect(reps[1].raw_paths).to eql(last: ['output/bar.html'])
58
- expect(reps[1].paths).to eql(last: ['/bar.html'])
75
+ expect(reps[1].raw_paths).to eql(last: ['output/foo.csv'])
76
+ expect(reps[1].paths).to eql(last: ['/foo.csv'])
59
77
  end
60
78
  end
61
79
 
@@ -4,7 +4,7 @@ describe Nanoc::Int::OutdatednessChecker do
4
4
  site: site,
5
5
  checksum_store: checksum_store,
6
6
  dependency_store: dependency_store,
7
- rule_memory_store: rule_memory_store,
7
+ action_sequence_store: action_sequence_store,
8
8
  action_provider: action_provider,
9
9
  reps: reps,
10
10
  )
@@ -26,17 +26,17 @@ describe Nanoc::Int::OutdatednessChecker do
26
26
  )
27
27
  end
28
28
 
29
- let(:rule_memory_store) do
30
- Nanoc::Int::RuleMemoryStore.new
29
+ let(:action_sequence_store) do
30
+ Nanoc::Int::ActionSequenceStore.new
31
31
  end
32
32
 
33
- let(:old_memory_for_item_rep) do
34
- Nanoc::Int::RuleMemory.new(item_rep).tap do |mem|
33
+ let(:old_action_sequence_for_item_rep) do
34
+ Nanoc::Int::ActionSequence.new(item_rep).tap do |mem|
35
35
  mem.add_filter(:erb, {})
36
36
  end
37
37
  end
38
38
 
39
- let(:new_memory_for_item_rep) { old_memory_for_item_rep }
39
+ let(:new_action_sequence_for_item_rep) { old_action_sequence_for_item_rep }
40
40
 
41
41
  let(:action_provider) { double(:action_provider) }
42
42
 
@@ -51,9 +51,9 @@ describe Nanoc::Int::OutdatednessChecker do
51
51
 
52
52
  before do
53
53
  reps << item_rep
54
- rule_memory_store[item_rep] = old_memory_for_item_rep.serialize
54
+ action_sequence_store[item_rep] = old_action_sequence_for_item_rep.serialize
55
55
 
56
- allow(action_provider).to receive(:memory_for).with(item_rep).and_return(new_memory_for_item_rep)
56
+ allow(action_provider).to receive(:action_sequence_for).with(item_rep).and_return(new_action_sequence_for_item_rep)
57
57
  end
58
58
 
59
59
  describe '#basic_outdatedness_reason_for' do
@@ -73,9 +73,9 @@ describe Nanoc::Int::OutdatednessChecker do
73
73
  context 'with item' do
74
74
  let(:obj) { item }
75
75
 
76
- context 'rule memory differs' do
77
- let(:new_memory_for_item_rep) do
78
- Nanoc::Int::RuleMemory.new(item_rep).tap do |mem|
76
+ context 'action sequence differs' do
77
+ let(:new_action_sequence_for_item_rep) do
78
+ Nanoc::Int::ActionSequence.new(item_rep).tap do |mem|
79
79
  mem.add_filter(:super_erb, {})
80
80
  end
81
81
  end
@@ -91,9 +91,9 @@ describe Nanoc::Int::OutdatednessChecker do
91
91
  context 'with item rep' do
92
92
  let(:obj) { item_rep }
93
93
 
94
- context 'rule memory differs' do
95
- let(:new_memory_for_item_rep) do
96
- Nanoc::Int::RuleMemory.new(item_rep).tap do |mem|
94
+ context 'action sequence differs' do
95
+ let(:new_action_sequence_for_item_rep) do
96
+ Nanoc::Int::ActionSequence.new(item_rep).tap do |mem|
97
97
  mem.add_filter(:super_erb, {})
98
98
  end
99
99
  end
@@ -123,22 +123,22 @@ describe Nanoc::Int::OutdatednessChecker do
123
123
 
124
124
  let(:objects) { [item, other_item] }
125
125
 
126
- let(:old_memory_for_other_item_rep) do
127
- Nanoc::Int::RuleMemory.new(other_item_rep).tap do |mem|
126
+ let(:old_action_sequence_for_other_item_rep) do
127
+ Nanoc::Int::ActionSequence.new(other_item_rep).tap do |mem|
128
128
  mem.add_filter(:erb, {})
129
129
  end
130
130
  end
131
131
 
132
- let(:new_memory_for_other_item_rep) { old_memory_for_other_item_rep }
132
+ let(:new_action_sequence_for_other_item_rep) { old_action_sequence_for_other_item_rep }
133
133
 
134
134
  before do
135
135
  reps << other_item_rep
136
- rule_memory_store[other_item_rep] = old_memory_for_other_item_rep.serialize
136
+ action_sequence_store[other_item_rep] = old_action_sequence_for_other_item_rep.serialize
137
137
  checksum_store.add(item)
138
138
  checksum_store.add(other_item)
139
139
  checksum_store.add(config)
140
140
 
141
- allow(action_provider).to receive(:memory_for).with(other_item_rep).and_return(new_memory_for_other_item_rep)
141
+ allow(action_provider).to receive(:action_sequence_for).with(other_item_rep).and_return(new_action_sequence_for_other_item_rep)
142
142
  allow(site).to receive(:code_snippets).and_return([])
143
143
  allow(site).to receive(:config).and_return(config)
144
144
  end
@@ -150,8 +150,8 @@ describe Nanoc::Int::OutdatednessChecker do
150
150
  before do
151
151
  reps << distant_item_rep
152
152
  checksum_store.add(distant_item)
153
- rule_memory_store[distant_item_rep] = old_memory_for_other_item_rep.serialize
154
- allow(action_provider).to receive(:memory_for).with(distant_item_rep).and_return(new_memory_for_other_item_rep)
153
+ action_sequence_store[distant_item_rep] = old_action_sequence_for_other_item_rep.serialize
154
+ allow(action_provider).to receive(:action_sequence_for).with(distant_item_rep).and_return(new_action_sequence_for_other_item_rep)
155
155
  end
156
156
 
157
157
  context 'on attribute + attribute' do
@@ -217,7 +217,7 @@ describe Nanoc::Int::OutdatednessChecker do
217
217
  end
218
218
  end
219
219
 
220
- context 'only attribute dependency' do
220
+ context 'only generic attribute dependency' do
221
221
  before do
222
222
  dependency_store.record_dependency(item, other_item, attributes: true)
223
223
  end
@@ -239,8 +239,52 @@ describe Nanoc::Int::OutdatednessChecker do
239
239
  end
240
240
 
241
241
  context 'path changed' do
242
- let(:new_memory_for_other_item_rep) do
243
- Nanoc::Int::RuleMemory.new(other_item_rep).tap do |mem|
242
+ let(:new_action_sequence_for_other_item_rep) do
243
+ Nanoc::Int::ActionSequence.new(other_item_rep).tap do |mem|
244
+ mem.add_filter(:erb, {})
245
+ mem.add_snapshot(:donkey, '/giraffe.txt')
246
+ end
247
+ end
248
+
249
+ it { is_expected.not_to be }
250
+ end
251
+ end
252
+
253
+ context 'only specific attribute dependency' do
254
+ before do
255
+ dependency_store.record_dependency(item, other_item, attributes: [:title])
256
+ end
257
+
258
+ context 'attribute changed' do
259
+ before { other_item.attributes[:title] = 'omg new title' }
260
+ it { is_expected.to be }
261
+ end
262
+
263
+ context 'other attribute changed' do
264
+ before { other_item.attributes[:subtitle] = 'tagline here' }
265
+ it { is_expected.not_to be }
266
+ end
267
+
268
+ context 'raw content changed' do
269
+ before { other_item.content = Nanoc::Int::TextualContent.new('omg new content') }
270
+ it { is_expected.not_to be }
271
+ end
272
+
273
+ context 'attribute + raw content changed' do
274
+ before { other_item.attributes[:title] = 'omg new title' }
275
+ before { other_item.content = Nanoc::Int::TextualContent.new('omg new content') }
276
+ it { is_expected.to be }
277
+ end
278
+
279
+ context 'other attribute + raw content changed' do
280
+ before { other_item.attributes[:subtitle] = 'tagline here' }
281
+ before { other_item.content = Nanoc::Int::TextualContent.new('omg new content') }
282
+ it { is_expected.not_to be }
283
+ end
284
+
285
+ context 'path changed' do
286
+ let(:new_action_sequence_for_other_item_rep) do
287
+ Nanoc::Int::ActionSequence.new(other_item_rep).tap do |mem|
244
288
  mem.add_filter(:erb, {})
245
289
  mem.add_snapshot(:donkey, '/giraffe.txt')
246
290
  end
@@ -272,8 +316,8 @@ describe Nanoc::Int::OutdatednessChecker do
272
316
  end
273
317
 
274
318
  context 'path changed' do
275
- let(:new_memory_for_other_item_rep) do
276
- Nanoc::Int::RuleMemory.new(other_item_rep).tap do |mem|
319
+ let(:new_action_sequence_for_other_item_rep) do
320
+ Nanoc::Int::ActionSequence.new(other_item_rep).tap do |mem|
277
321
  mem.add_filter(:erb, {})
278
322
  mem.add_snapshot(:donkey, '/giraffe.txt')
279
323
  end
@@ -299,8 +343,8 @@ describe Nanoc::Int::OutdatednessChecker do
299
343
  end
300
344
 
301
345
  context 'path changed' do
302
- let(:new_memory_for_other_item_rep) do
303
- Nanoc::Int::RuleMemory.new(other_item_rep).tap do |mem|
346
+ let(:new_action_sequence_for_other_item_rep) do
347
+ Nanoc::Int::ActionSequence.new(other_item_rep).tap do |mem|
304
348
  mem.add_filter(:erb, {})
305
349
  mem.add_snapshot(:donkey, '/giraffe.txt')
306
350
  end
@@ -332,8 +376,8 @@ describe Nanoc::Int::OutdatednessChecker do
332
376
  end
333
377
 
334
378
  context 'rules changed' do
335
- let(:new_memory_for_other_item_rep) do
336
- Nanoc::Int::RuleMemory.new(other_item_rep).tap do |mem|
379
+ let(:new_action_sequence_for_other_item_rep) do
380
+ Nanoc::Int::ActionSequence.new(other_item_rep).tap do |mem|
337
381
  mem.add_filter(:erb, {})
338
382
  mem.add_filter(:donkey, {})
339
383
  end
@@ -9,7 +9,7 @@ describe Nanoc::Int::OutdatednessRules do
9
9
  site: site,
10
10
  checksum_store: checksum_store,
11
11
  dependency_store: dependency_store,
12
- rule_memory_store: rule_memory_store,
12
+ action_sequence_store: action_sequence_store,
13
13
  action_provider: action_provider,
14
14
  reps: reps,
15
15
  )
@@ -33,7 +33,7 @@ describe Nanoc::Int::OutdatednessRules do
33
33
  let(:action_provider) { double(:action_provider) }
34
34
  let(:reps) { Nanoc::Int::ItemRepRepo.new }
35
35
  let(:dependency_store) { Nanoc::Int::DependencyStore.new(dependency_store_objects) }
36
- let(:rule_memory_store) { Nanoc::Int::RuleMemoryStore.new }
36
+ let(:action_sequence_store) { Nanoc::Int::ActionSequenceStore.new }
37
37
  let(:checksum_store) { Nanoc::Int::ChecksumStore.new(objects: objects) }
38
38
 
39
39
  let(:dependency_store_objects) { [item] }
@@ -213,8 +213,58 @@ describe Nanoc::Int::OutdatednessRules do
213
213
 
214
214
  context 'checksum available, but attributes different' do
215
215
  let(:old_item) { Nanoc::Int::Item.new('stuff', { greeting: 'hi' }, '/foo.md') }
216
+
216
217
  before { checksum_store.add(old_item) }
218
+
217
219
  it { is_expected.to be }
220
+
221
+ it 'has the one changed attribute' do
222
+ expect(subject.attributes).to contain_exactly(:greeting)
223
+ end
224
+ end
225
+
226
+ context 'attribute kept identical' do
227
+ let(:item) { Nanoc::Int::Item.new('stuff', { greeting: 'hi' }, '/foo.md') }
228
+ let(:old_item) { Nanoc::Int::Item.new('stuff', { greeting: 'hi' }, '/foo.md') }
229
+
230
+ before { checksum_store.add(old_item) }
231
+
232
+ it 'has the one changed attribute' do
233
+ expect(subject).to be_nil
234
+ end
235
+ end
236
+
237
+ context 'attribute changed' do
238
+ let(:item) { Nanoc::Int::Item.new('stuff', { greeting: 'hi' }, '/foo.md') }
239
+ let(:old_item) { Nanoc::Int::Item.new('stuff', { greeting: 'ho' }, '/foo.md') }
240
+
241
+ before { checksum_store.add(old_item) }
242
+
243
+ it 'has the one changed attribute' do
244
+ expect(subject.attributes).to contain_exactly(:greeting)
245
+ end
246
+ end
247
+
248
+ context 'attribute deleted' do
249
+ let(:item) { Nanoc::Int::Item.new('stuff', { greeting: 'hi' }, '/foo.md') }
250
+ let(:old_item) { Nanoc::Int::Item.new('stuff', {}, '/foo.md') }
251
+
252
+ before { checksum_store.add(old_item) }
253
+
254
+ it 'has the one changed attribute' do
255
+ expect(subject.attributes).to contain_exactly(:greeting)
256
+ end
257
+ end
258
+
259
+ context 'attribute added' do
260
+ let(:item) { Nanoc::Int::Item.new('stuff', {}, '/foo.md') }
261
+ let(:old_item) { Nanoc::Int::Item.new('stuff', { greeting: 'hi' }, '/foo.md') }
262
+
263
+ before { checksum_store.add(old_item) }
264
+
265
+ it 'has the one changed attribute' do
266
+ expect(subject.attributes).to contain_exactly(:greeting)
267
+ end
218
268
  end
219
269
  end
220
270
 
@@ -238,8 +288,14 @@ describe Nanoc::Int::OutdatednessRules do
238
288
 
239
289
  context 'checksum available, but attributes different' do
240
290
  let(:old_item) { Nanoc::Int::Item.new('stuff', { greeting: 'hi' }, '/foo.md') }
291
+
241
292
  before { checksum_store.add(old_item) }
293
+
242
294
  it { is_expected.to be }
295
+
296
+ it 'has the one changed attribute' do
297
+ expect(subject.attributes).to contain_exactly(:greeting)
298
+ end
243
299
  end
244
300
  end
245
301
  end
@@ -248,14 +304,14 @@ describe Nanoc::Int::OutdatednessRules do
248
304
  let(:rule_class) { Nanoc::Int::OutdatednessRules::RulesModified }
249
305
 
250
306
  let(:old_mem) do
251
- Nanoc::Int::RuleMemory.new(item_rep).tap do |mem|
307
+ Nanoc::Int::ActionSequence.new(item_rep).tap do |mem|
252
308
  mem.add_filter(:erb, {})
253
309
  end
254
310
  end
255
311
 
256
312
  before do
257
- rule_memory_store[item_rep] = old_mem.serialize
258
- allow(action_provider).to receive(:memory_for).with(item_rep).and_return(new_mem)
313
+ action_sequence_store[item_rep] = old_mem.serialize
314
+ allow(action_provider).to receive(:action_sequence_for).with(item_rep).and_return(new_mem)
259
315
  end
260
316
 
261
317
  context 'memory is the same' do
@@ -265,7 +321,7 @@ describe Nanoc::Int::OutdatednessRules do
265
321
 
266
322
  context 'memory is different' do
267
323
  let(:new_mem) do
268
- Nanoc::Int::RuleMemory.new(item_rep).tap do |mem|
324
+ Nanoc::Int::ActionSequence.new(item_rep).tap do |mem|
269
325
  mem.add_filter(:erb, {})
270
326
  mem.add_filter(:donkey, {})
271
327
  end
@@ -279,12 +335,12 @@ describe Nanoc::Int::OutdatednessRules do
279
335
  let(:rule_class) { Nanoc::Int::OutdatednessRules::PathsModified }
280
336
 
281
337
  before do
282
- allow(action_provider).to receive(:memory_for).with(item_rep).and_return(new_mem)
338
+ allow(action_provider).to receive(:action_sequence_for).with(item_rep).and_return(new_mem)
283
339
  end
284
340
 
285
341
  context 'old mem does not exist' do
286
342
  let(:new_mem) do
287
- Nanoc::Int::RuleMemory.new(item_rep).tap do |mem|
343
+ Nanoc::Int::ActionSequence.new(item_rep).tap do |mem|
288
344
  mem.add_snapshot(:donkey, '/foo.md')
289
345
  mem.add_filter(:asdf, {})
290
346
  end
@@ -295,19 +351,19 @@ describe Nanoc::Int::OutdatednessRules do
295
351
 
296
352
  context 'old mem exists' do
297
353
  let(:old_mem) do
298
- Nanoc::Int::RuleMemory.new(item_rep).tap do |mem|
354
+ Nanoc::Int::ActionSequence.new(item_rep).tap do |mem|
299
355
  mem.add_filter(:erb, {})
300
356
  mem.add_snapshot(:donkey, '/foo.md')
301
357
  end
302
358
  end
303
359
 
304
360
  before do
305
- rule_memory_store[item_rep] = old_mem.serialize
361
+ action_sequence_store[item_rep] = old_mem.serialize
306
362
  end
307
363
 
308
364
  context 'paths in memory are the same' do
309
365
  let(:new_mem) do
310
- Nanoc::Int::RuleMemory.new(item_rep).tap do |mem|
366
+ Nanoc::Int::ActionSequence.new(item_rep).tap do |mem|
311
367
  mem.add_snapshot(:donkey, '/foo.md')
312
368
  mem.add_filter(:asdf, {})
313
369
  end
@@ -318,7 +374,7 @@ describe Nanoc::Int::OutdatednessRules do
318
374
 
319
375
  context 'paths in memory are different' do
320
376
  let(:new_mem) do
321
- Nanoc::Int::RuleMemory.new(item_rep).tap do |mem|
377
+ Nanoc::Int::ActionSequence.new(item_rep).tap do |mem|
322
378
  mem.add_filter(:erb, {})
323
379
  mem.add_snapshot(:donkey, '/foo.md')
324
380
  mem.add_filter(:donkey, {})
@@ -382,8 +438,10 @@ describe Nanoc::Int::OutdatednessRules do
382
438
  before { checksum_store.add(stored_obj) }
383
439
 
384
440
  context 'but checksum data afterwards' do
441
+ # NOTE: ignored for attributes!
442
+
385
443
  let(:new_obj) { klass.new('a', {}, '/foo.md', checksum_data: 'cs-data-new') }
386
- it { is_expected.to eql([true, true]) }
444
+ it { is_expected.to eql([true, false]) }
387
445
  end
388
446
 
389
447
  context 'and unchanged' do
@@ -415,6 +473,8 @@ describe Nanoc::Int::OutdatednessRules do
415
473
  end
416
474
 
417
475
  context 'attributes_checksum_data' do
476
+ # NOTE: attributes_checksum_data is ignored!
477
+
418
478
  let(:stored_obj) { klass.new('a', {}, '/foo.md', attributes_checksum_data: 'cs-data') }
419
479
  let(:new_obj) { stored_obj }
420
480
 
@@ -427,7 +487,7 @@ describe Nanoc::Int::OutdatednessRules do
427
487
 
428
488
  context 'but checksum data afterwards' do
429
489
  let(:new_obj) { klass.new('a', {}, '/foo.md', attributes_checksum_data: 'cs-data-new') }
430
- it { is_expected.to eql([false, true]) }
490
+ it { is_expected.to eql([false, false]) }
431
491
  end
432
492
 
433
493
  context 'and unchanged' do
@@ -454,12 +514,12 @@ describe Nanoc::Int::OutdatednessRules do
454
514
  let(:rule_class) { Nanoc::Int::OutdatednessRules::UsesAlwaysOutdatedFilter }
455
515
 
456
516
  before do
457
- allow(action_provider).to receive(:memory_for).with(item_rep).and_return(mem)
517
+ allow(action_provider).to receive(:action_sequence_for).with(item_rep).and_return(mem)
458
518
  end
459
519
 
460
520
  context 'unknown filter' do
461
521
  let(:mem) do
462
- Nanoc::Int::RuleMemory.new(item_rep).tap do |mem|
522
+ Nanoc::Int::ActionSequence.new(item_rep).tap do |mem|
463
523
  mem.add_snapshot(:donkey, '/foo.md')
464
524
  mem.add_filter(:asdf, {})
465
525
  end
@@ -470,7 +530,7 @@ describe Nanoc::Int::OutdatednessRules do
470
530
 
471
531
  context 'known filter, not always outdated' do
472
532
  let(:mem) do
473
- Nanoc::Int::RuleMemory.new(item_rep).tap do |mem|
533
+ Nanoc::Int::ActionSequence.new(item_rep).tap do |mem|
474
534
  mem.add_snapshot(:donkey, '/foo.md')
475
535
  mem.add_filter(:erb, {})
476
536
  end
@@ -481,7 +541,7 @@ describe Nanoc::Int::OutdatednessRules do
481
541
 
482
542
  context 'known filter, always outdated' do
483
543
  let(:mem) do
484
- Nanoc::Int::RuleMemory.new(item_rep).tap do |mem|
544
+ Nanoc::Int::ActionSequence.new(item_rep).tap do |mem|
485
545
  mem.add_snapshot(:donkey, '/foo.md')
486
546
  mem.add_filter(:xsl, {})
487
547
  end