nanoc 4.7.2 → 4.7.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: db20da1ff9f55058bb62c68ac59ec1abd74e5afe
4
- data.tar.gz: fc4c46dfd186f22446ad8a39c457fc72fcd93994
3
+ metadata.gz: 06af73e98c0935c6d7d8fd00b40d9e09329d745c
4
+ data.tar.gz: f5e03e20454c8d526ef62d3be16638e9a4e8bfe6
5
5
  SHA512:
6
- metadata.gz: b8f484dac9493470c64172ac234a026f17413a0fe688782426a606396e51b343c866165e24e58a574dfd948a86ea4ae1006114dbb1e495454fa27bd83f468e13
7
- data.tar.gz: bc68076395418f75d02e6ece28d8af476423007b63d3badc18238c52c711352f02eab2ca1ec13ea79865154fca17ba15da4b0d2653bf1d32bc261ce615757ae0
6
+ metadata.gz: e898a8a5f2270666742feff827ab473843fed2f9dd6801016fbf5c201b6649d4f3a9825ce17fada634be2254252cfabda285e35ca004388d88ce2900994c208d
7
+ data.tar.gz: 4246e6c9ad39036c4f271f3e99ac28b2b44f0f3de670459d72761046416369948a4695c9c4953ff4f7d7591f42f7dde698f4665f9ec1aaea5d940982fef53938
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  GIT
2
2
  remote: https://github.com/bbatsov/rubocop.git
3
- revision: 7917f22cb5f1e2ce6c81a1cc07b2b4a14fcd4fa8
3
+ revision: d1b9d66c3518389b0c408a6a4a42061b36748df4
4
4
  specs:
5
- rubocop (0.47.1)
5
+ rubocop (0.48.0)
6
6
  parser (>= 2.3.3.1, < 3.0)
7
7
  powerpack (~> 0.1)
8
8
  rainbow (>= 1.99.1, < 3.0)
@@ -27,7 +27,7 @@ GIT
27
27
  PATH
28
28
  remote: .
29
29
  specs:
30
- nanoc (4.7.2)
30
+ nanoc (4.7.3)
31
31
  cri (~> 2.3)
32
32
  ddplugin (~> 1.0)
33
33
  hamster (~> 3.0)
@@ -273,9 +273,9 @@ GEM
273
273
  mocha (1.2.1)
274
274
  metaclass (~> 0.0.1)
275
275
  multi_json (1.12.1)
276
- mustache (1.0.3)
276
+ mustache (1.0.4)
277
277
  nenv (0.3.0)
278
- nokogiri (1.7.0.1)
278
+ nokogiri (1.7.1)
279
279
  mini_portile2 (~> 2.1.0)
280
280
  notiffany (0.1.1)
281
281
  nenv (~> 0.1)
@@ -338,7 +338,7 @@ GEM
338
338
  tilt (>= 1.3.3, < 2.1)
339
339
  slop (3.6.0)
340
340
  temple (0.7.7)
341
- term-ansicolor (1.4.0)
341
+ term-ansicolor (1.4.1)
342
342
  tins (~> 1.0)
343
343
  thor (0.19.4)
344
344
  tilt (2.0.7)
@@ -347,7 +347,7 @@ GEM
347
347
  trollop (2.1.2)
348
348
  typogruby (1.0.18)
349
349
  rubypants
350
- uglifier (3.1.9)
350
+ uglifier (3.1.10)
351
351
  execjs (>= 0.3.0, < 3)
352
352
  unicode-display_width (1.1.3)
353
353
  url (0.3.2)
data/NEWS.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Nanoc news
2
2
 
3
+ ## 4.7.3 (2017-03-26)
4
+
5
+ Fixes:
6
+
7
+ * Fixed an issue which could cause a missing file for a snapshot that is not `:last` not to be regenerated when compiling (#1134, #1135)
8
+
3
9
  ## 4.7.2 (2017-03-21)
4
10
 
5
11
  Fixes:
@@ -3,12 +3,22 @@ module Nanoc::Int
3
3
  class Props
4
4
  include Nanoc::Int::ContractsSupport
5
5
 
6
- contract C::KeywordArgs[raw_content: C::Optional[C::Bool], attributes: C::Optional[C::Bool], compiled_content: C::Optional[C::Bool], path: C::Optional[C::Bool]] => C::Any
6
+ attr_reader :attributes
7
+
8
+ C_ATTRS = C::Or[C::IterOf[Symbol], C::Bool]
9
+ contract C::KeywordArgs[raw_content: C::Optional[C::Bool], attributes: C::Optional[C_ATTRS], compiled_content: C::Optional[C::Bool], path: C::Optional[C::Bool]] => C::Any
7
10
  def initialize(raw_content: false, attributes: false, compiled_content: false, path: false)
8
11
  @raw_content = raw_content
9
- @attributes = attributes
10
12
  @compiled_content = compiled_content
11
13
  @path = path
14
+
15
+ @attributes =
16
+ case attributes
17
+ when Enumerable
18
+ Set.new(attributes)
19
+ else
20
+ attributes
21
+ end
12
22
  end
13
23
 
14
24
  contract C::None => String
@@ -30,7 +40,12 @@ module Nanoc::Int
30
40
 
31
41
  contract C::None => C::Bool
32
42
  def attributes?
33
- @attributes
43
+ case @attributes
44
+ when Enumerable
45
+ @attributes.any?
46
+ else
47
+ @attributes
48
+ end
34
49
  end
35
50
 
36
51
  contract C::None => C::Bool
@@ -47,12 +62,30 @@ module Nanoc::Int
47
62
  def merge(other)
48
63
  Props.new(
49
64
  raw_content: raw_content? || other.raw_content?,
50
- attributes: attributes? || other.attributes?,
65
+ attributes: merge_attributes(other),
51
66
  compiled_content: compiled_content? || other.compiled_content?,
52
67
  path: path? || other.path?,
53
68
  )
54
69
  end
55
70
 
71
+ def merge_attributes(other)
72
+ case attributes
73
+ when true
74
+ true
75
+ when false
76
+ other.attributes
77
+ else
78
+ case other.attributes
79
+ when true
80
+ true
81
+ when false
82
+ attributes
83
+ else
84
+ attributes + other.attributes
85
+ end
86
+ end
87
+ end
88
+
56
89
  contract C::None => Set
57
90
  def active
58
91
  Set.new.tap do |pr|
@@ -67,7 +100,7 @@ module Nanoc::Int
67
100
  def to_h
68
101
  {
69
102
  raw_content: raw_content?,
70
- attributes: attributes?,
103
+ attributes: attributes,
71
104
  compiled_content: compiled_content?,
72
105
  path: path?,
73
106
  }
@@ -58,7 +58,9 @@ module Nanoc::Int
58
58
  end
59
59
  end
60
60
 
61
- contract C::Maybe[C::Or[Nanoc::Int::Item, Nanoc::Int::Layout]], C::Maybe[C::Or[Nanoc::Int::Item, Nanoc::Int::Layout]], C::KeywordArgs[raw_content: C::Optional[C::Bool], attributes: C::Optional[C::Bool], compiled_content: C::Optional[C::Bool], path: C::Optional[C::Bool]] => C::Any
61
+ C_DOC = C::Or[Nanoc::Int::Item, Nanoc::Int::Layout]
62
+ C_ATTR = C::Or[C::IterOf[Symbol], C::Bool]
63
+ contract C::Maybe[C_DOC], C::Maybe[C_DOC], C::KeywordArgs[raw_content: C::Optional[C::Bool], attributes: C::Optional[C_ATTR], compiled_content: C::Optional[C::Bool], path: C::Optional[C::Bool]] => C::Any
62
64
  # Records a dependency from `src` to `dst` in the dependency graph. When
63
65
  # `dst` is oudated, `src` will also become outdated.
64
66
  #
@@ -75,7 +77,6 @@ module Nanoc::Int
75
77
  new_props = Nanoc::Int::Props.new(raw_content: raw_content, attributes: attributes, compiled_content: compiled_content, path: path)
76
78
  props = existing_props.merge(new_props)
77
79
 
78
- # Warning! dst and src are *reversed* here!
79
80
  @graph.add_edge(dst, src, props: props.to_h) unless src == dst
80
81
  end
81
82
 
@@ -4,7 +4,8 @@ module Nanoc::Int
4
4
  include Nanoc::Int::ContractsSupport
5
5
 
6
6
  C_OBJ = C::Or[Nanoc::Int::Item, Nanoc::Int::Layout]
7
- C_ARGS = C::KeywordArgs[raw_content: C::Optional[C::Bool], attributes: C::Optional[C::Bool], compiled_content: C::Optional[C::Bool], path: C::Optional[C::Bool]]
7
+ C_ATTR = C::Or[C::IterOf[Symbol], C::Bool]
8
+ C_ARGS = C::KeywordArgs[raw_content: C::Optional[C::Bool], attributes: C::Optional[C_ATTR], compiled_content: C::Optional[C::Bool], path: C::Optional[C::Bool]]
8
9
 
9
10
  class Null
10
11
  include Nanoc::Int::ContractsSupport
@@ -58,10 +58,13 @@ module Nanoc::Int
58
58
  rules.inject(status) do |acc, rule|
59
59
  if !acc.useful_to_apply?(rule)
60
60
  acc
61
- elsif rule.instance.call(obj, @outdatedness_checker)
62
- acc.update(rule.instance.reason)
63
61
  else
64
- acc
62
+ reason = rule.instance.call(obj, @outdatedness_checker)
63
+ if reason
64
+ acc.update(reason)
65
+ else
66
+ acc
67
+ end
65
68
  end
66
69
  end
67
70
  end
@@ -11,7 +11,9 @@ module Nanoc::Int
11
11
  end
12
12
 
13
13
  def apply(_obj, outdatedness_checker)
14
- any_snippets_modified?(outdatedness_checker)
14
+ if any_snippets_modified?(outdatedness_checker)
15
+ Nanoc::Int::OutdatednessReasons::CodeSnippetsModified
16
+ end
15
17
  end
16
18
 
17
19
  private
@@ -34,7 +36,9 @@ module Nanoc::Int
34
36
  end
35
37
 
36
38
  def apply(_obj, outdatedness_checker)
37
- config_modified?(outdatedness_checker)
39
+ if config_modified?(outdatedness_checker)
40
+ Nanoc::Int::OutdatednessReasons::ConfigurationModified
41
+ end
38
42
  end
39
43
 
40
44
  private
@@ -54,8 +58,9 @@ module Nanoc::Int
54
58
  end
55
59
 
56
60
  def apply(obj, _outdatedness_checker)
57
- # FIXME: check all paths (for all snapshots)
58
- obj.raw_path && !File.file?(obj.raw_path)
61
+ if obj.raw_paths.values.flatten.compact.any? { |fn| !File.file?(fn) }
62
+ Nanoc::Int::OutdatednessReasons::NotWritten
63
+ end
59
64
  end
60
65
  end
61
66
 
@@ -69,7 +74,9 @@ module Nanoc::Int
69
74
 
70
75
  ch_old = outdatedness_checker.checksum_store.content_checksum_for(obj)
71
76
  ch_new = Nanoc::Int::Checksummer.calc_for_content_of(obj)
72
- ch_old != ch_new
77
+ if ch_old != ch_new
78
+ Nanoc::Int::OutdatednessReasons::ContentModified
79
+ end
73
80
  end
74
81
  end
75
82
 
@@ -82,7 +89,7 @@ module Nanoc::Int
82
89
  Nanoc::Int::OutdatednessReasons::AttributesModified
83
90
  end
84
91
 
85
- contract C::Or[Nanoc::Int::ItemRep, Nanoc::Int::Item, Nanoc::Int::Layout], C::Named['Nanoc::Int::OutdatednessChecker'] => C::Bool
92
+ contract C::Or[Nanoc::Int::ItemRep, Nanoc::Int::Item, Nanoc::Int::Layout], C::Named['Nanoc::Int::OutdatednessChecker'] => C::Maybe[Nanoc::Int::OutdatednessReasons::Generic]
86
93
  def apply(obj, outdatedness_checker)
87
94
  case obj
88
95
  when Nanoc::Int::ItemRep
@@ -90,8 +97,9 @@ module Nanoc::Int
90
97
  when Nanoc::Int::Item, Nanoc::Int::Layout
91
98
  ch_old = outdatedness_checker.checksum_store.attributes_checksum_for(obj)
92
99
  ch_new = Nanoc::Int::Checksummer.calc_for_attributes_of(obj)
93
- res = ch_old != ch_new
94
- res
100
+ if ch_old != ch_new
101
+ Nanoc::Int::OutdatednessReasons::AttributesModified
102
+ end
95
103
  else
96
104
  raise ArgumentError
97
105
  end
@@ -107,7 +115,9 @@ module Nanoc::Int
107
115
  def apply(obj, outdatedness_checker)
108
116
  mem_old = outdatedness_checker.rule_memory_store[obj]
109
117
  mem_new = outdatedness_checker.action_provider.memory_for(obj).serialize
110
- !mem_old.eql?(mem_new)
118
+ unless mem_old.eql?(mem_new)
119
+ Nanoc::Int::OutdatednessReasons::RulesModified
120
+ end
111
121
  end
112
122
  end
113
123
 
@@ -126,7 +136,9 @@ module Nanoc::Int
126
136
  paths_old = mem_old.select { |pa| pa[0] == :snapshot }
127
137
  paths_new = mem_new.select { |pa| pa[0] == :snapshot }
128
138
 
129
- paths_old != paths_new
139
+ if paths_old != paths_new
140
+ Nanoc::Int::OutdatednessReasons::PathsModified
141
+ end
130
142
  end
131
143
  end
132
144
 
@@ -137,7 +149,12 @@ module Nanoc::Int
137
149
 
138
150
  def apply(obj, outdatedness_checker)
139
151
  mem = outdatedness_checker.action_provider.memory_for(obj)
152
+ if any_always_outdated?(mem)
153
+ Nanoc::Int::OutdatednessReasons::UsesAlwaysOutdatedFilter
154
+ end
155
+ end
140
156
 
157
+ def any_always_outdated?(mem)
141
158
  mem
142
159
  .select { |a| a.is_a?(Nanoc::Int::ProcessingActions::Filter) }
143
160
  .map { |a| Nanoc::Filter.named(a.filter_name) }
@@ -36,19 +36,20 @@ module Nanoc
36
36
 
37
37
  # @see Hash#[]
38
38
  def [](key)
39
- @context.dependency_tracker.bounce(unwrap, attributes: true)
39
+ @context.dependency_tracker.bounce(unwrap, attributes: [key])
40
40
  unwrap.attributes[key]
41
41
  end
42
42
 
43
43
  # @return [Hash]
44
44
  def attributes
45
+ # TODO: Refine dependencies
45
46
  @context.dependency_tracker.bounce(unwrap, attributes: true)
46
47
  unwrap.attributes
47
48
  end
48
49
 
49
50
  # @see Hash#fetch
50
51
  def fetch(key, fallback = NONE, &_block)
51
- @context.dependency_tracker.bounce(unwrap, attributes: true)
52
+ @context.dependency_tracker.bounce(unwrap, attributes: [key])
52
53
 
53
54
  if unwrap.attributes.key?(key)
54
55
  unwrap.attributes[key]
@@ -63,7 +64,7 @@ module Nanoc
63
64
 
64
65
  # @see Hash#key?
65
66
  def key?(key)
66
- @context.dependency_tracker.bounce(unwrap, attributes: true)
67
+ @context.dependency_tracker.bounce(unwrap, attributes: [key])
67
68
  unwrap.attributes.key?(key)
68
69
  end
69
70
 
data/lib/nanoc/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Nanoc
2
2
  # The current Nanoc version.
3
- VERSION = '4.7.2'.freeze
3
+ VERSION = '4.7.3'.freeze
4
4
  end
@@ -58,6 +58,16 @@ describe Nanoc::Int::Props do
58
58
  let(:props) { described_class.new(raw_content: true, attributes: true, compiled_content: true, path: true) }
59
59
  it { is_expected.to be }
60
60
  end
61
+
62
+ context 'attributes is empty list' do
63
+ let(:props) { described_class.new(attributes: []) }
64
+ it { is_expected.not_to be }
65
+ end
66
+
67
+ context 'attributes is non-empty list' do
68
+ let(:props) { described_class.new(attributes: [:donkey]) }
69
+ it { is_expected.to be }
70
+ end
61
71
  end
62
72
 
63
73
  describe '#compiled_content?' do
@@ -135,6 +145,92 @@ describe Nanoc::Int::Props do
135
145
  end
136
146
  end
137
147
 
148
+ describe '#merge_attributes' do
149
+ let(:props_attrs_true) do
150
+ described_class.new(attributes: true)
151
+ end
152
+
153
+ let(:props_attrs_false) do
154
+ described_class.new(attributes: false)
155
+ end
156
+
157
+ let(:props_attrs_list_a) do
158
+ described_class.new(attributes: %i(donkey giraffe))
159
+ end
160
+
161
+ let(:props_attrs_list_b) do
162
+ described_class.new(attributes: %i(giraffe zebra))
163
+ end
164
+
165
+ subject { props.merge(other_props).attributes }
166
+
167
+ context 'false + false' do
168
+ let(:props) { props_attrs_false }
169
+ let(:other_props) { props_attrs_false }
170
+
171
+ it { is_expected.to be(false) }
172
+ end
173
+
174
+ context 'false + true' do
175
+ let(:props) { props_attrs_false }
176
+ let(:other_props) { props_attrs_true }
177
+
178
+ it { is_expected.to be(true) }
179
+ end
180
+
181
+ context 'false + list' do
182
+ let(:props) { props_attrs_false }
183
+ let(:other_props) { props_attrs_list_a }
184
+
185
+ it { is_expected.to be_a(Set) }
186
+ it { is_expected.to match_array(%i(donkey giraffe)) }
187
+ end
188
+
189
+ context 'true + false' do
190
+ let(:props) { props_attrs_true }
191
+ let(:other_props) { props_attrs_false }
192
+
193
+ it { is_expected.to be(true) }
194
+ end
195
+
196
+ context 'true + true' do
197
+ let(:props) { props_attrs_true }
198
+ let(:other_props) { props_attrs_true }
199
+
200
+ it { is_expected.to be(true) }
201
+ end
202
+
203
+ context 'true + list' do
204
+ let(:props) { props_attrs_true }
205
+ let(:other_props) { props_attrs_list_a }
206
+
207
+ it { is_expected.to be(true) }
208
+ end
209
+
210
+ context 'list + false' do
211
+ let(:props) { props_attrs_list_a }
212
+ let(:other_props) { props_attrs_false }
213
+
214
+ it { is_expected.to be_a(Set) }
215
+ it { is_expected.to match_array(%i(donkey giraffe)) }
216
+ end
217
+
218
+ context 'list + true' do
219
+ let(:props) { props_attrs_list_a }
220
+ let(:other_props) { props_attrs_true }
221
+
222
+ it { is_expected.to be(true) }
223
+ end
224
+
225
+ context 'list + list' do
226
+ let(:props) { props_attrs_list_a }
227
+ let(:other_props) { props_attrs_list_b }
228
+
229
+ it { is_expected.to be_a(Set) }
230
+ it { is_expected.to match_array(%i(donkey giraffe zebra)) }
231
+ end
232
+ end
233
+
138
234
  describe '#active' do
139
235
  subject { props.active }
140
236
 
@@ -192,4 +192,76 @@ describe Nanoc::Int::DependencyStore do
192
192
  end
193
193
  end
194
194
  end
195
+
196
+ describe '#record_dependency' do
197
+ context 'no props' do
198
+ subject { store.record_dependency(obj_a, obj_b) }
199
+
200
+ it 'records a dependency' do
201
+ expect { subject }
202
+ .to change { store.objects_causing_outdatedness_of(obj_a) }
203
+ .from([])
204
+ .to([obj_b])
205
+ end
206
+ end
207
+
208
+ context 'compiled content prop' do
209
+ subject { store.record_dependency(obj_a, obj_b, compiled_content: true) }
210
+
211
+ it 'records a dependency' do
212
+ expect { subject }
213
+ .to change { store.objects_causing_outdatedness_of(obj_a) }
214
+ .from([])
215
+ .to([obj_b])
216
+ end
217
+
218
+ it 'records a dependency with the right props' do
219
+ subject
220
+ deps = store.dependencies_causing_outdatedness_of(obj_a)
221
+
222
+ expect(deps.first.props.attributes?).not_to be
223
+ expect(deps.first.props.compiled_content?).to be
224
+ end
225
+ end
226
+
227
+ context 'attribute prop (true)' do
228
+ subject { store.record_dependency(obj_a, obj_b, attributes: true) }
229
+
230
+ it 'records a dependency' do
231
+ expect { subject }
232
+ .to change { store.objects_causing_outdatedness_of(obj_a) }
233
+ .from([])
234
+ .to([obj_b])
235
+ end
236
+
237
+ it 'records a dependency with the right props' do
238
+ subject
239
+ deps = store.dependencies_causing_outdatedness_of(obj_a)
240
+
241
+ expect(deps.first.props.attributes?).to be
242
+ expect(deps.first.props.attributes).to be
243
+ expect(deps.first.props.compiled_content?).not_to be
244
+ end
245
+ end
246
+
247
+ context 'attribute prop (true)' do
248
+ subject { store.record_dependency(obj_a, obj_b, attributes: [:giraffe]) }
249
+
250
+ it 'records a dependency' do
251
+ expect { subject }
252
+ .to change { store.objects_causing_outdatedness_of(obj_a) }
253
+ .from([])
254
+ .to([obj_b])
255
+ end
256
+
257
+ it 'records a dependency with the right props' do
258
+ subject
259
+ deps = store.dependencies_causing_outdatedness_of(obj_a)
260
+
261
+ expect(deps.first.props.attributes?).to be
262
+ expect(deps.first.props.attributes).to match_array([:giraffe])
263
+ expect(deps.first.props.compiled_content?).not_to be
264
+ end
265
+ end
266
+ end
195
267
  end
@@ -434,7 +434,7 @@ describe Nanoc::Int::Executor do
434
434
  allow(dependency_tracker).to receive(:enter)
435
435
  .with(layout, raw_content: true, attributes: false, compiled_content: false, path: false)
436
436
  allow(dependency_tracker).to receive(:enter)
437
- .with(layout, raw_content: false, attributes: true, compiled_content: false, path: false)
437
+ .with(layout, raw_content: false, attributes: [:bug], compiled_content: false, path: false)
438
438
  allow(dependency_tracker).to receive(:exit)
439
439
  subject
440
440
  expect(snapshot_repo.get(rep, :last).string).to eq('head Gum Emperor foot')
@@ -101,7 +101,7 @@ describe Nanoc::Int::OutdatednessRules do
101
101
  it { is_expected.not_to be }
102
102
  end
103
103
 
104
- context 'path' do
104
+ context 'path for last snapshot' do
105
105
  let(:path) { 'foo.txt' }
106
106
 
107
107
  before { item_rep.raw_paths = { last: [path] } }
@@ -115,6 +115,21 @@ describe Nanoc::Int::OutdatednessRules do
115
115
  it { is_expected.not_to be }
116
116
  end
117
117
  end
118
+
119
+ context 'path for other snapshot' do
120
+ let(:path) { 'foo.txt' }
121
+
122
+ before { item_rep.raw_paths = { donkey: [path] } }
123
+
124
+ context 'not written' do
125
+ it { is_expected.to be }
126
+ end
127
+
128
+ context 'written' do
129
+ before { File.write(path, 'hello') }
130
+ it { is_expected.not_to be }
131
+ end
132
+ end
118
133
  end
119
134
 
120
135
  context 'ContentModified' do
@@ -318,11 +333,10 @@ describe Nanoc::Int::OutdatednessRules do
318
333
 
319
334
  describe '#{Content,Attributes}Modified' do
320
335
  subject do
321
- # TODO: remove negation
322
336
  [
323
337
  Nanoc::Int::OutdatednessRules::ContentModified,
324
338
  Nanoc::Int::OutdatednessRules::AttributesModified,
325
- ].map { |c| !c.instance.apply(new_obj, outdatedness_checker) }
339
+ ].map { |c| !!c.instance.apply(new_obj, outdatedness_checker) } # rubocop:disable Style/DoubleNegation
326
340
  end
327
341
 
328
342
  let(:stored_obj) { raise 'override me' }
@@ -334,7 +348,7 @@ describe Nanoc::Int::OutdatednessRules do
334
348
 
335
349
  context 'no checksum data' do
336
350
  context 'not stored' do
337
- it { is_expected.to eql([false, false]) }
351
+ it { is_expected.to eql([true, true]) }
338
352
  end
339
353
 
340
354
  context 'stored' do
@@ -342,16 +356,16 @@ describe Nanoc::Int::OutdatednessRules do
342
356
 
343
357
  context 'but content changed afterwards' do
344
358
  let(:new_obj) { klass.new('aaaaaaaa', {}, '/foo.md') }
345
- it { is_expected.to eql([false, true]) }
359
+ it { is_expected.to eql([true, false]) }
346
360
  end
347
361
 
348
362
  context 'but attributes changed afterwards' do
349
363
  let(:new_obj) { klass.new('a', { animal: 'donkey' }, '/foo.md') }
350
- it { is_expected.to eql([true, false]) }
364
+ it { is_expected.to eql([false, true]) }
351
365
  end
352
366
 
353
367
  context 'and unchanged' do
354
- it { is_expected.to eql([true, true]) }
368
+ it { is_expected.to eql([false, false]) }
355
369
  end
356
370
  end
357
371
  end
@@ -361,7 +375,7 @@ describe Nanoc::Int::OutdatednessRules do
361
375
  let(:new_obj) { stored_obj }
362
376
 
363
377
  context 'not stored' do
364
- it { is_expected.to eql([false, false]) }
378
+ it { is_expected.to eql([true, true]) }
365
379
  end
366
380
 
367
381
  context 'stored' do
@@ -369,11 +383,11 @@ describe Nanoc::Int::OutdatednessRules do
369
383
 
370
384
  context 'but checksum data afterwards' do
371
385
  let(:new_obj) { klass.new('a', {}, '/foo.md', checksum_data: 'cs-data-new') }
372
- it { is_expected.to eql([false, false]) }
386
+ it { is_expected.to eql([true, true]) }
373
387
  end
374
388
 
375
389
  context 'and unchanged' do
376
- it { is_expected.to eql([true, true]) }
390
+ it { is_expected.to eql([false, false]) }
377
391
  end
378
392
  end
379
393
  end
@@ -383,7 +397,7 @@ describe Nanoc::Int::OutdatednessRules do
383
397
  let(:new_obj) { stored_obj }
384
398
 
385
399
  context 'not stored' do
386
- it { is_expected.to eql([false, false]) }
400
+ it { is_expected.to eql([true, true]) }
387
401
  end
388
402
 
389
403
  context 'stored' do
@@ -391,11 +405,11 @@ describe Nanoc::Int::OutdatednessRules do
391
405
 
392
406
  context 'but checksum data afterwards' do
393
407
  let(:new_obj) { klass.new('a', {}, '/foo.md', content_checksum_data: 'cs-data-new') }
394
- it { is_expected.to eql([false, true]) }
408
+ it { is_expected.to eql([true, false]) }
395
409
  end
396
410
 
397
411
  context 'and unchanged' do
398
- it { is_expected.to eql([true, true]) }
412
+ it { is_expected.to eql([false, false]) }
399
413
  end
400
414
  end
401
415
  end
@@ -405,7 +419,7 @@ describe Nanoc::Int::OutdatednessRules do
405
419
  let(:new_obj) { stored_obj }
406
420
 
407
421
  context 'not stored' do
408
- it { is_expected.to eql([false, false]) }
422
+ it { is_expected.to eql([true, true]) }
409
423
  end
410
424
 
411
425
  context 'stored' do
@@ -413,11 +427,11 @@ describe Nanoc::Int::OutdatednessRules do
413
427
 
414
428
  context 'but checksum data afterwards' do
415
429
  let(:new_obj) { klass.new('a', {}, '/foo.md', attributes_checksum_data: 'cs-data-new') }
416
- it { is_expected.to eql([true, false]) }
430
+ it { is_expected.to eql([false, true]) }
417
431
  end
418
432
 
419
433
  context 'and unchanged' do
420
- it { is_expected.to eql([true, true]) }
434
+ it { is_expected.to eql([false, false]) }
421
435
  end
422
436
  end
423
437
  end
@@ -0,0 +1,27 @@
1
+ describe 'GH-1134', site: true, stdio: true do
2
+ before do
3
+ File.write('content/foo.txt', 'asdf')
4
+
5
+ File.write('Rules', <<EOS)
6
+ compile '/**/*' do
7
+ write '/first.html'
8
+ filter :erb
9
+ write '/last.html'
10
+ end
11
+ EOS
12
+ end
13
+
14
+ it 'detects missing output file of non-default rep' do
15
+ Nanoc::CLI.run(%w(compile))
16
+ expect(File.file?('output/first.html')).to be
17
+ expect(File.file?('output/last.html')).to be
18
+
19
+ FileUtils.rm_f('output/first.html')
20
+ expect(File.file?('output/first.html')).not_to be
21
+ expect(File.file?('output/last.html')).to be
22
+
23
+ Nanoc::CLI.run(%w(compile))
24
+ expect(File.file?('output/first.html')).to be
25
+ expect(File.file?('output/last.html')).to be
26
+ end
27
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nanoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.7.2
4
+ version: 4.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Defreyne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-21 00:00:00.000000000 Z
11
+ date: 2017-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cri
@@ -468,6 +468,7 @@ files:
468
468
  - spec/nanoc/regressions/gh_1102_spec.rb
469
469
  - spec/nanoc/regressions/gh_1107_spec.rb
470
470
  - spec/nanoc/regressions/gh_1130_spec.rb
471
+ - spec/nanoc/regressions/gh_1134_spec.rb
471
472
  - spec/nanoc/regressions/gh_761_spec.rb
472
473
  - spec/nanoc/regressions/gh_767_spec.rb
473
474
  - spec/nanoc/regressions/gh_769_spec.rb