nanoc 4.7.6 → 4.7.7
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 +2 -2
- data/NEWS.md +7 -0
- data/lib/nanoc/base/entities/identifiable_collection.rb +8 -8
- data/lib/nanoc/base/entities/outdatedness_reasons.rb +0 -5
- data/lib/nanoc/base/repos/dependency_store.rb +23 -9
- data/lib/nanoc/base/services/compiler/stages/preprocess.rb +2 -1
- data/lib/nanoc/base/services/compiler_loader.rb +1 -1
- data/lib/nanoc/base/services/outdatedness_checker.rb +0 -1
- data/lib/nanoc/base/services/outdatedness_rules.rb +0 -1
- data/lib/nanoc/cli/commands/compile.rb +1 -0
- data/lib/nanoc/cli/commands/compile_listeners/diff_generator.rb +1 -1
- data/lib/nanoc/filters/colorize_syntax.rb +54 -316
- data/lib/nanoc/filters/colorize_syntax/colorizers.rb +177 -0
- data/lib/nanoc/version.rb +1 -1
- data/spec/nanoc/base/compiler_spec.rb +5 -2
- data/spec/nanoc/base/entities/identifiable_collection_spec.rb +29 -0
- data/spec/nanoc/base/repos/dependency_store_spec.rb +79 -79
- data/spec/nanoc/base/services/compiler/stages/compile_reps_spec.rb +5 -2
- data/spec/nanoc/base/services/dependency_tracker_spec.rb +7 -1
- data/spec/nanoc/base/services/outdatedness_checker_spec.rb +6 -7
- data/spec/nanoc/base/services/outdatedness_rules_spec.rb +3 -56
- data/spec/nanoc/base/views/document_view_spec.rb +7 -1
- data/spec/nanoc/base/views/item_rep_view_spec.rb +7 -1
- data/spec/nanoc/base/views/item_view_spec.rb +7 -1
- data/spec/nanoc/cli/commands/compile/diff_generator_spec.rb +44 -0
- data/spec/nanoc/cli/commands/show_data_spec.rb +1 -5
- data/spec/nanoc/integration/compile_command_spec.rb +31 -0
- data/test/base/test_dependency_tracker.rb +106 -86
- data/test/filters/test_xsl.rb +5 -1
- metadata +5 -3
- data/lib/nanoc/base/services/outdatedness_rules/paths_modified.rb +0 -20
@@ -0,0 +1,177 @@
|
|
1
|
+
module Nanoc::Filters::ColorizeSyntax::Colorizers
|
2
|
+
class Abstract
|
3
|
+
extend DDPlugin::Plugin
|
4
|
+
|
5
|
+
def process(_code, _language, params = {}) # rubocop:disable Lint/UnusedMethodArgument
|
6
|
+
raise NotImplementedError
|
7
|
+
end
|
8
|
+
|
9
|
+
def postprocess(_language, _element); end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def check_availability(*cmd)
|
14
|
+
piper = Nanoc::Extra::Piper.new(stdout: StringIO.new, stderr: StringIO.new)
|
15
|
+
piper.run(cmd, nil)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class DummyColorizer < Abstract
|
20
|
+
identifier :dummy
|
21
|
+
|
22
|
+
def process(code, language, params = {}) # rubocop:disable Lint/UnusedMethodArgument
|
23
|
+
code
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class CoderayColorizer < Abstract
|
28
|
+
identifier :coderay
|
29
|
+
|
30
|
+
def process(code, language, params = {})
|
31
|
+
require 'coderay'
|
32
|
+
|
33
|
+
::CodeRay.scan(code, language).html(params)
|
34
|
+
end
|
35
|
+
|
36
|
+
def postprocess(_language, element)
|
37
|
+
# Skip if we're a free <code>
|
38
|
+
return if element.parent.nil?
|
39
|
+
|
40
|
+
# <div class="code">
|
41
|
+
div_inner = Nokogiri::XML::Node.new('div', element.document)
|
42
|
+
div_inner['class'] = 'code'
|
43
|
+
div_inner.children = element.dup
|
44
|
+
|
45
|
+
# <div class="CodeRay">
|
46
|
+
div_outer = Nokogiri::XML::Node.new('div', element.document)
|
47
|
+
div_outer['class'] = 'CodeRay'
|
48
|
+
div_outer.children = div_inner
|
49
|
+
|
50
|
+
# orig element
|
51
|
+
element.swap div_outer
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
class PygmentizeColorizer < Abstract
|
56
|
+
identifier :pygmentize
|
57
|
+
|
58
|
+
def process(code, language, params = {})
|
59
|
+
check_availability('pygmentize', '-V')
|
60
|
+
|
61
|
+
params[:encoding] ||= 'utf-8'
|
62
|
+
params[:nowrap] ||= 'True'
|
63
|
+
|
64
|
+
cmd = ['pygmentize', '-l', language, '-f', 'html']
|
65
|
+
cmd << '-O' << params.map { |k, v| "#{k}=#{v}" }.join(',') unless params.empty?
|
66
|
+
|
67
|
+
stdout = StringIO.new
|
68
|
+
stderr = $stderr
|
69
|
+
piper = Nanoc::Extra::Piper.new(stdout: stdout, stderr: stderr)
|
70
|
+
piper.run(cmd, code)
|
71
|
+
|
72
|
+
stdout.string
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class PygmentsrbColorizer < Abstract
|
77
|
+
identifier :pygmentsrb
|
78
|
+
|
79
|
+
def process(code, language, params = {})
|
80
|
+
require 'pygments'
|
81
|
+
|
82
|
+
args = params.dup
|
83
|
+
args[:lexer] ||= language
|
84
|
+
args[:options] ||= {}
|
85
|
+
args[:options][:encoding] ||= 'utf-8'
|
86
|
+
args[:options][:nowrap] ||= 'True'
|
87
|
+
|
88
|
+
Pygments.highlight(code, args)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
class SimonHighlightColorizer < Abstract
|
93
|
+
identifier :simon_highlight
|
94
|
+
|
95
|
+
SIMON_HIGHLIGHT_OPT_MAP = {
|
96
|
+
wrap: '-W',
|
97
|
+
include_style: '-I',
|
98
|
+
line_numbers: '-l',
|
99
|
+
}.freeze
|
100
|
+
|
101
|
+
def process(code, language, params = {})
|
102
|
+
check_availability('highlight', '--version')
|
103
|
+
|
104
|
+
cmd = ['highlight', '--syntax', language, '--fragment']
|
105
|
+
params.each do |key, _value|
|
106
|
+
if SIMON_HIGHLIGHT_OPT_MAP[key]
|
107
|
+
cmd << SIMON_HIGHLIGHT_OPT_MAP[key]
|
108
|
+
else
|
109
|
+
# TODO: allow passing other options
|
110
|
+
case key
|
111
|
+
when :style
|
112
|
+
cmd << '--style' << params[:style]
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
stdout = StringIO.new
|
118
|
+
stderr = $stderr
|
119
|
+
piper = Nanoc::Extra::Piper.new(stdout: stdout, stderr: stderr)
|
120
|
+
piper.run(cmd, code)
|
121
|
+
|
122
|
+
stdout.string
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
class RougeColorizer < Abstract
|
127
|
+
identifier :rouge
|
128
|
+
|
129
|
+
def process(code, language, params = {})
|
130
|
+
require 'rouge'
|
131
|
+
|
132
|
+
if Rouge.version < '2' || params.fetch(:legacy, false)
|
133
|
+
# Rouge 1.x or Rouge 2.x legacy options
|
134
|
+
formatter_options = {
|
135
|
+
css_class: params.fetch(:css_class, 'highlight'),
|
136
|
+
inline_theme: params.fetch(:inline_theme, nil),
|
137
|
+
line_numbers: params.fetch(:line_numbers, false),
|
138
|
+
start_line: params.fetch(:start_line, 1),
|
139
|
+
wrap: params.fetch(:wrap, false),
|
140
|
+
}
|
141
|
+
formatter_cls = Rouge::Formatters.const_get(Rouge.version < '2' ? 'HTML' : 'HTMLLegacy')
|
142
|
+
formatter = formatter_cls.new(formatter_options)
|
143
|
+
else
|
144
|
+
formatter = params.fetch(:formatter, Rouge::Formatters::HTML.new)
|
145
|
+
end
|
146
|
+
|
147
|
+
lexer = Rouge::Lexer.find_fancy(language, code) || Rouge::Lexers::PlainText
|
148
|
+
formatter.format(lexer.lex(code))
|
149
|
+
end
|
150
|
+
|
151
|
+
def postprocess(_language, element)
|
152
|
+
# Removes the double wrapping.
|
153
|
+
#
|
154
|
+
# Before:
|
155
|
+
#
|
156
|
+
# <pre><code class="language-ruby"><pre class="highlight"><code>
|
157
|
+
#
|
158
|
+
# After:
|
159
|
+
#
|
160
|
+
# <pre><code class="language-ruby highlight">
|
161
|
+
|
162
|
+
return if element.name != 'pre'
|
163
|
+
|
164
|
+
code1 = element.xpath('code').first
|
165
|
+
return if code1.nil?
|
166
|
+
|
167
|
+
pre = code1.xpath('pre').first
|
168
|
+
return if pre.nil?
|
169
|
+
|
170
|
+
code2 = pre.xpath('code').first
|
171
|
+
return if code2.nil?
|
172
|
+
|
173
|
+
code1.inner_html = code2.inner_html
|
174
|
+
code1['class'] = [code1['class'], pre['class']].compact.join(' ')
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
data/lib/nanoc/version.rb
CHANGED
@@ -15,7 +15,7 @@ describe Nanoc::Int::Compiler do
|
|
15
15
|
let(:checksum_store) { Nanoc::Int::ChecksumStore.new(objects: items) }
|
16
16
|
let(:action_sequence_store) { Nanoc::Int::ActionSequenceStore.new }
|
17
17
|
|
18
|
-
let(:dependency_store) { Nanoc::Int::DependencyStore.new(items
|
18
|
+
let(:dependency_store) { Nanoc::Int::DependencyStore.new(items, layouts) }
|
19
19
|
let(:reps) { Nanoc::Int::ItemRepRepo.new }
|
20
20
|
|
21
21
|
let(:outdatedness_store) { Nanoc::Int::OutdatednessStore.new(site: site, reps: reps) }
|
@@ -38,13 +38,16 @@ describe Nanoc::Int::Compiler do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
let(:config) { Nanoc::Int::Configuration.new.with_defaults }
|
41
|
-
let(:layouts) { [] }
|
42
41
|
let(:code_snippets) { [] }
|
43
42
|
|
44
43
|
let(:items) do
|
45
44
|
Nanoc::Int::IdentifiableCollection.new(config, [item, other_item])
|
46
45
|
end
|
47
46
|
|
47
|
+
let(:layouts) do
|
48
|
+
Nanoc::Int::IdentifiableCollection.new(config)
|
49
|
+
end
|
50
|
+
|
48
51
|
let(:memory) do
|
49
52
|
actions =
|
50
53
|
[
|
@@ -43,4 +43,33 @@ describe Nanoc::Int::IdentifiableCollection do
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
46
|
+
|
47
|
+
describe '#object_with_identifier' do
|
48
|
+
let(:objects) do
|
49
|
+
[
|
50
|
+
Nanoc::Int::Item.new('stuff', {}, Nanoc::Identifier.new('/about.css')),
|
51
|
+
Nanoc::Int::Item.new('stuff', {}, Nanoc::Identifier.new('/about.md')),
|
52
|
+
Nanoc::Int::Item.new('stuff', {}, Nanoc::Identifier.new('/style.css')),
|
53
|
+
]
|
54
|
+
end
|
55
|
+
|
56
|
+
let(:arg) { raise 'override me' }
|
57
|
+
|
58
|
+
subject { identifiable_collection.object_with_identifier(arg) }
|
59
|
+
|
60
|
+
context 'with string' do
|
61
|
+
let(:arg) { '/about.css' }
|
62
|
+
it { is_expected.to eq(objects[0]) }
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'with identifier' do
|
66
|
+
let(:arg) { Nanoc::Identifier.new('/about.css') }
|
67
|
+
it { is_expected.to eq(objects[0]) }
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'with glob string' do
|
71
|
+
let(:arg) { '/about.*' }
|
72
|
+
it { is_expected.to be_nil }
|
73
|
+
end
|
74
|
+
end
|
46
75
|
end
|
@@ -1,43 +1,43 @@
|
|
1
1
|
describe Nanoc::Int::DependencyStore do
|
2
|
-
let(:store) { described_class.new(
|
2
|
+
let(:store) { described_class.new(items, layouts) }
|
3
3
|
|
4
|
-
let(:
|
5
|
-
|
6
|
-
|
4
|
+
let(:item_a) { Nanoc::Int::Item.new('a', {}, '/a.md') }
|
5
|
+
let(:item_b) { Nanoc::Int::Item.new('b', {}, '/b.md') }
|
6
|
+
let(:item_c) { Nanoc::Int::Item.new('c', {}, '/c.md') }
|
7
7
|
|
8
|
-
let(:
|
9
|
-
let(:
|
10
|
-
let(:
|
8
|
+
let(:items) { Nanoc::Int::IdentifiableCollection.new(config, [item_a, item_b, item_c]) }
|
9
|
+
let(:layouts) { Nanoc::Int::IdentifiableCollection.new(config) }
|
10
|
+
let(:config) { Nanoc::Int::Configuration.new }
|
11
11
|
|
12
12
|
describe '#dependencies_causing_outdatedness_of' do
|
13
13
|
context 'no dependencies' do
|
14
14
|
it 'returns nothing for each' do
|
15
|
-
expect(store.dependencies_causing_outdatedness_of(
|
16
|
-
expect(store.dependencies_causing_outdatedness_of(
|
17
|
-
expect(store.dependencies_causing_outdatedness_of(
|
15
|
+
expect(store.dependencies_causing_outdatedness_of(item_a)).to be_empty
|
16
|
+
expect(store.dependencies_causing_outdatedness_of(item_b)).to be_empty
|
17
|
+
expect(store.dependencies_causing_outdatedness_of(item_c)).to be_empty
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
21
|
context 'one dependency' do
|
22
22
|
context 'no props' do
|
23
23
|
before do
|
24
|
-
# FIXME: weird argument order (
|
25
|
-
store.record_dependency(
|
24
|
+
# FIXME: weird argument order (item_b depends on item_a, not th other way around)
|
25
|
+
store.record_dependency(item_a, item_b)
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'returns one dependency' do
|
29
|
-
deps = store.dependencies_causing_outdatedness_of(
|
29
|
+
deps = store.dependencies_causing_outdatedness_of(item_a)
|
30
30
|
expect(deps.size).to eql(1)
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'returns dependency from b to a' do
|
34
|
-
deps = store.dependencies_causing_outdatedness_of(
|
35
|
-
expect(deps[0].from).to eql(
|
36
|
-
expect(deps[0].to).to eql(
|
34
|
+
deps = store.dependencies_causing_outdatedness_of(item_a)
|
35
|
+
expect(deps[0].from).to eql(item_b)
|
36
|
+
expect(deps[0].to).to eql(item_a)
|
37
37
|
end
|
38
38
|
|
39
39
|
it 'returns true for all props by default' do
|
40
|
-
deps = store.dependencies_causing_outdatedness_of(
|
40
|
+
deps = store.dependencies_causing_outdatedness_of(item_a)
|
41
41
|
expect(deps[0].props.raw_content?).to eq(true)
|
42
42
|
expect(deps[0].props.attributes?).to eq(true)
|
43
43
|
expect(deps[0].props.compiled_content?).to eq(true)
|
@@ -45,45 +45,45 @@ describe Nanoc::Int::DependencyStore do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
it 'returns nothing for the others' do
|
48
|
-
expect(store.dependencies_causing_outdatedness_of(
|
49
|
-
expect(store.dependencies_causing_outdatedness_of(
|
48
|
+
expect(store.dependencies_causing_outdatedness_of(item_b)).to be_empty
|
49
|
+
expect(store.dependencies_causing_outdatedness_of(item_c)).to be_empty
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
53
|
context 'one prop' do
|
54
54
|
before do
|
55
|
-
# FIXME: weird argument order (
|
56
|
-
store.record_dependency(
|
55
|
+
# FIXME: weird argument order (item_b depends on item_a, not th other way around)
|
56
|
+
store.record_dependency(item_a, item_b, compiled_content: true)
|
57
57
|
end
|
58
58
|
|
59
59
|
it 'returns false for all unspecified props' do
|
60
|
-
deps = store.dependencies_causing_outdatedness_of(
|
60
|
+
deps = store.dependencies_causing_outdatedness_of(item_a)
|
61
61
|
expect(deps[0].props.raw_content?).to eq(false)
|
62
62
|
expect(deps[0].props.attributes?).to eq(false)
|
63
63
|
expect(deps[0].props.path?).to eq(false)
|
64
64
|
end
|
65
65
|
|
66
66
|
it 'returns the specified props' do
|
67
|
-
deps = store.dependencies_causing_outdatedness_of(
|
67
|
+
deps = store.dependencies_causing_outdatedness_of(item_a)
|
68
68
|
expect(deps[0].props.compiled_content?).to eq(true)
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
72
|
context 'two props' do
|
73
73
|
before do
|
74
|
-
# FIXME: weird argument order (
|
75
|
-
store.record_dependency(
|
76
|
-
store.record_dependency(
|
74
|
+
# FIXME: weird argument order (item_b depends on item_a, not th other way around)
|
75
|
+
store.record_dependency(item_a, item_b, compiled_content: true)
|
76
|
+
store.record_dependency(item_a, item_b, attributes: true)
|
77
77
|
end
|
78
78
|
|
79
79
|
it 'returns false for all unspecified props' do
|
80
|
-
deps = store.dependencies_causing_outdatedness_of(
|
80
|
+
deps = store.dependencies_causing_outdatedness_of(item_a)
|
81
81
|
expect(deps[0].props.raw_content?).to eq(false)
|
82
82
|
expect(deps[0].props.path?).to eq(false)
|
83
83
|
end
|
84
84
|
|
85
85
|
it 'returns the specified props' do
|
86
|
-
deps = store.dependencies_causing_outdatedness_of(
|
86
|
+
deps = store.dependencies_causing_outdatedness_of(item_a)
|
87
87
|
expect(deps[0].props.attributes?).to eq(true)
|
88
88
|
expect(deps[0].props.compiled_content?).to eq(true)
|
89
89
|
end
|
@@ -92,48 +92,48 @@ describe Nanoc::Int::DependencyStore do
|
|
92
92
|
|
93
93
|
context 'two dependency in a chain' do
|
94
94
|
before do
|
95
|
-
# FIXME: weird argument order (
|
96
|
-
store.record_dependency(
|
97
|
-
store.record_dependency(
|
95
|
+
# FIXME: weird argument order (item_b depends on item_a, not th other way around)
|
96
|
+
store.record_dependency(item_a, item_b)
|
97
|
+
store.record_dependency(item_b, item_c)
|
98
98
|
end
|
99
99
|
|
100
100
|
it 'returns one dependency for object A' do
|
101
|
-
deps = store.dependencies_causing_outdatedness_of(
|
101
|
+
deps = store.dependencies_causing_outdatedness_of(item_a)
|
102
102
|
expect(deps.size).to eql(1)
|
103
|
-
expect(deps[0].from).to eql(
|
103
|
+
expect(deps[0].from).to eql(item_b)
|
104
104
|
end
|
105
105
|
|
106
106
|
it 'returns one dependency for object B' do
|
107
|
-
deps = store.dependencies_causing_outdatedness_of(
|
107
|
+
deps = store.dependencies_causing_outdatedness_of(item_b)
|
108
108
|
expect(deps.size).to eql(1)
|
109
|
-
expect(deps[0].from).to eql(
|
109
|
+
expect(deps[0].from).to eql(item_c)
|
110
110
|
end
|
111
111
|
|
112
112
|
it 'returns nothing for the others' do
|
113
|
-
expect(store.dependencies_causing_outdatedness_of(
|
113
|
+
expect(store.dependencies_causing_outdatedness_of(item_c)).to be_empty
|
114
114
|
end
|
115
115
|
end
|
116
116
|
end
|
117
117
|
|
118
118
|
describe 'reloading' do
|
119
119
|
before do
|
120
|
-
store.record_dependency(
|
121
|
-
store.record_dependency(
|
120
|
+
store.record_dependency(item_a, item_b, compiled_content: true)
|
121
|
+
store.record_dependency(item_a, item_b, attributes: true)
|
122
122
|
|
123
123
|
store.store
|
124
|
-
store.
|
124
|
+
store.items = items_after
|
125
125
|
store.load
|
126
126
|
end
|
127
127
|
|
128
|
-
context 'no new
|
129
|
-
let(:
|
128
|
+
context 'no new items' do
|
129
|
+
let(:items_after) { items }
|
130
130
|
|
131
131
|
it 'has the right dependencies for item A' do
|
132
|
-
deps = store.dependencies_causing_outdatedness_of(
|
132
|
+
deps = store.dependencies_causing_outdatedness_of(item_a)
|
133
133
|
expect(deps.size).to eql(1)
|
134
134
|
|
135
|
-
expect(deps[0].from).to eql(
|
136
|
-
expect(deps[0].to).to eql(
|
135
|
+
expect(deps[0].from).to eql(item_b)
|
136
|
+
expect(deps[0].to).to eql(item_a)
|
137
137
|
|
138
138
|
expect(deps[0].props.raw_content?).to eq(false)
|
139
139
|
expect(deps[0].props.attributes?).to eq(true)
|
@@ -142,82 +142,82 @@ describe Nanoc::Int::DependencyStore do
|
|
142
142
|
end
|
143
143
|
|
144
144
|
it 'has the right dependencies for item B' do
|
145
|
-
deps = store.dependencies_causing_outdatedness_of(
|
145
|
+
deps = store.dependencies_causing_outdatedness_of(item_b)
|
146
146
|
expect(deps).to be_empty
|
147
147
|
end
|
148
148
|
|
149
149
|
it 'has the right dependencies for item C' do
|
150
|
-
deps = store.dependencies_causing_outdatedness_of(
|
150
|
+
deps = store.dependencies_causing_outdatedness_of(item_c)
|
151
151
|
expect(deps).to be_empty
|
152
152
|
end
|
153
153
|
end
|
154
154
|
|
155
|
-
context 'one new
|
156
|
-
let(:
|
157
|
-
[
|
155
|
+
context 'one new item' do
|
156
|
+
let(:items_after) do
|
157
|
+
Nanoc::Int::IdentifiableCollection.new(config, [item_a, item_b, item_c, item_d])
|
158
158
|
end
|
159
159
|
|
160
|
-
let(:
|
160
|
+
let(:item_d) { Nanoc::Int::Item.new('d', {}, '/d.md') }
|
161
161
|
|
162
162
|
it 'marks existing items as outdated' do
|
163
|
-
expect(store.objects_causing_outdatedness_of(
|
164
|
-
expect(store.objects_causing_outdatedness_of(
|
165
|
-
expect(store.objects_causing_outdatedness_of(
|
163
|
+
expect(store.objects_causing_outdatedness_of(item_a)).to eq([item_d])
|
164
|
+
expect(store.objects_causing_outdatedness_of(item_b)).to eq([item_d])
|
165
|
+
expect(store.objects_causing_outdatedness_of(item_c)).to eq([item_d])
|
166
166
|
end
|
167
167
|
|
168
168
|
it 'marks new items as outdated' do
|
169
|
-
expect(store.objects_causing_outdatedness_of(
|
169
|
+
expect(store.objects_causing_outdatedness_of(item_d)).to eq([item_d])
|
170
170
|
end
|
171
171
|
end
|
172
172
|
|
173
|
-
context 'two new
|
174
|
-
let(:
|
175
|
-
[
|
173
|
+
context 'two new items' do
|
174
|
+
let(:items_after) do
|
175
|
+
Nanoc::Int::IdentifiableCollection.new(config, [item_a, item_b, item_c, item_d, item_e])
|
176
176
|
end
|
177
177
|
|
178
|
-
let(:
|
179
|
-
let(:
|
178
|
+
let(:item_d) { Nanoc::Int::Item.new('d', {}, '/d.md') }
|
179
|
+
let(:item_e) { Nanoc::Int::Item.new('e', {}, '/e.md') }
|
180
180
|
|
181
181
|
it 'marks existing items as outdated' do
|
182
182
|
# Only one of obj D or E needed!
|
183
|
-
expect(store.objects_causing_outdatedness_of(
|
184
|
-
expect(store.objects_causing_outdatedness_of(
|
185
|
-
expect(store.objects_causing_outdatedness_of(
|
183
|
+
expect(store.objects_causing_outdatedness_of(item_a)).to eq([item_d]).or eq([item_e])
|
184
|
+
expect(store.objects_causing_outdatedness_of(item_b)).to eq([item_d]).or eq([item_e])
|
185
|
+
expect(store.objects_causing_outdatedness_of(item_c)).to eq([item_d]).or eq([item_e])
|
186
186
|
end
|
187
187
|
|
188
188
|
it 'marks new items as outdated' do
|
189
189
|
# Only one of obj D or E needed!
|
190
|
-
expect(store.objects_causing_outdatedness_of(
|
191
|
-
expect(store.objects_causing_outdatedness_of(
|
190
|
+
expect(store.objects_causing_outdatedness_of(item_d)).to eq([item_d]).or eq([item_e])
|
191
|
+
expect(store.objects_causing_outdatedness_of(item_e)).to eq([item_d]).or eq([item_e])
|
192
192
|
end
|
193
193
|
end
|
194
194
|
end
|
195
195
|
|
196
196
|
describe '#record_dependency' do
|
197
197
|
context 'no props' do
|
198
|
-
subject { store.record_dependency(
|
198
|
+
subject { store.record_dependency(item_a, item_b) }
|
199
199
|
|
200
200
|
it 'records a dependency' do
|
201
201
|
expect { subject }
|
202
|
-
.to change { store.objects_causing_outdatedness_of(
|
202
|
+
.to change { store.objects_causing_outdatedness_of(item_a) }
|
203
203
|
.from([])
|
204
|
-
.to([
|
204
|
+
.to([item_b])
|
205
205
|
end
|
206
206
|
end
|
207
207
|
|
208
208
|
context 'compiled content prop' do
|
209
|
-
subject { store.record_dependency(
|
209
|
+
subject { store.record_dependency(item_a, item_b, compiled_content: true) }
|
210
210
|
|
211
211
|
it 'records a dependency' do
|
212
212
|
expect { subject }
|
213
|
-
.to change { store.objects_causing_outdatedness_of(
|
213
|
+
.to change { store.objects_causing_outdatedness_of(item_a) }
|
214
214
|
.from([])
|
215
|
-
.to([
|
215
|
+
.to([item_b])
|
216
216
|
end
|
217
217
|
|
218
218
|
it 'records a dependency with the right props' do
|
219
219
|
subject
|
220
|
-
deps = store.dependencies_causing_outdatedness_of(
|
220
|
+
deps = store.dependencies_causing_outdatedness_of(item_a)
|
221
221
|
|
222
222
|
expect(deps.first.props.attributes?).not_to be
|
223
223
|
expect(deps.first.props.compiled_content?).to be
|
@@ -225,18 +225,18 @@ describe Nanoc::Int::DependencyStore do
|
|
225
225
|
end
|
226
226
|
|
227
227
|
context 'attribute prop (true)' do
|
228
|
-
subject { store.record_dependency(
|
228
|
+
subject { store.record_dependency(item_a, item_b, attributes: true) }
|
229
229
|
|
230
230
|
it 'records a dependency' do
|
231
231
|
expect { subject }
|
232
|
-
.to change { store.objects_causing_outdatedness_of(
|
232
|
+
.to change { store.objects_causing_outdatedness_of(item_a) }
|
233
233
|
.from([])
|
234
|
-
.to([
|
234
|
+
.to([item_b])
|
235
235
|
end
|
236
236
|
|
237
237
|
it 'records a dependency with the right props' do
|
238
238
|
subject
|
239
|
-
deps = store.dependencies_causing_outdatedness_of(
|
239
|
+
deps = store.dependencies_causing_outdatedness_of(item_a)
|
240
240
|
|
241
241
|
expect(deps.first.props.attributes?).to be
|
242
242
|
expect(deps.first.props.attributes).to be
|
@@ -245,18 +245,18 @@ describe Nanoc::Int::DependencyStore do
|
|
245
245
|
end
|
246
246
|
|
247
247
|
context 'attribute prop (true)' do
|
248
|
-
subject { store.record_dependency(
|
248
|
+
subject { store.record_dependency(item_a, item_b, attributes: [:giraffe]) }
|
249
249
|
|
250
250
|
it 'records a dependency' do
|
251
251
|
expect { subject }
|
252
|
-
.to change { store.objects_causing_outdatedness_of(
|
252
|
+
.to change { store.objects_causing_outdatedness_of(item_a) }
|
253
253
|
.from([])
|
254
|
-
.to([
|
254
|
+
.to([item_b])
|
255
255
|
end
|
256
256
|
|
257
257
|
it 'records a dependency with the right props' do
|
258
258
|
subject
|
259
|
-
deps = store.dependencies_causing_outdatedness_of(
|
259
|
+
deps = store.dependencies_causing_outdatedness_of(item_a)
|
260
260
|
|
261
261
|
expect(deps.first.props.attributes?).to be
|
262
262
|
expect(deps.first.props.attributes).to match_array([:giraffe])
|