nanoc 4.3.8 → 4.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/NEWS.md +6 -0
- data/lib/nanoc/base.rb +4 -16
- data/lib/nanoc/base/compilation/compiler.rb +6 -8
- data/lib/nanoc/base/compilation/outdatedness_checker.rb +30 -4
- data/lib/nanoc/base/compilation/outdatedness_reasons.rb +6 -2
- data/lib/nanoc/base/entities.rb +5 -2
- data/lib/nanoc/base/entities/code_snippet.rb +2 -0
- data/lib/nanoc/base/{context.rb → entities/context.rb} +2 -0
- data/lib/nanoc/base/{directed_graph.rb → entities/directed_graph.rb} +0 -0
- data/lib/nanoc/base/entities/document.rb +21 -4
- data/lib/nanoc/base/entities/{rule_memory_action.rb → processing_action.rb} +3 -3
- data/lib/nanoc/base/entities/processing_actions.rb +3 -0
- data/lib/nanoc/base/entities/{rule_memory_actions → processing_actions}/filter.rb +2 -2
- data/lib/nanoc/base/entities/{rule_memory_actions → processing_actions}/layout.rb +2 -2
- data/lib/nanoc/base/entities/{rule_memory_actions → processing_actions}/snapshot.rb +2 -2
- data/lib/nanoc/base/entities/rule_memory.rb +8 -8
- data/lib/nanoc/base/feature.rb +1 -2
- data/lib/nanoc/base/repos.rb +1 -0
- data/lib/nanoc/base/repos/checksum_store.rb +21 -7
- data/lib/nanoc/base/repos/config_loader.rb +1 -5
- data/lib/nanoc/base/repos/data_source.rb +14 -6
- data/lib/nanoc/base/{compilation → repos}/item_rep_repo.rb +0 -0
- data/lib/nanoc/base/services.rb +3 -0
- data/lib/nanoc/base/{checksummer.rb → services/checksummer.rb} +20 -4
- data/lib/nanoc/base/{compilation → services}/dependency_tracker.rb +9 -4
- data/lib/nanoc/base/{compilation → services}/filter.rb +0 -0
- data/lib/nanoc/cli/cleaning_stream.rb +2 -0
- data/lib/nanoc/cli/commands/nanoc.rb +2 -4
- data/lib/nanoc/cli/commands/view.rb +3 -1
- data/lib/nanoc/data_sources/filesystem.rb +15 -6
- data/lib/nanoc/extra.rb +3 -0
- data/lib/nanoc/version.rb +1 -1
- data/test/base/test_context.rb +1 -1
- data/test/base/test_data_source.rb +22 -0
- data/test/base/test_dependency_tracker.rb +53 -29
- data/test/base/test_directed_graph.rb +1 -1
- data/test/base/test_outdatedness_checker.rb +30 -3
- metadata +13 -13
- data/lib/nanoc/base/entities/rule_memory_actions.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 25161ec9b45e6f1a49b7eb87b64eeff9a6640b8f
|
4
|
+
data.tar.gz: d4b23a01bbdfc6846fbcf5b1c128c0fcba5b06b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fd3b4caa69b4e48ae48bfb35f2553a1ff6e88eb722a7056f268aa7138984b7e6114f6cfa40328bd41bf8803b8788fb27a491b5195e00b9bd09876d9af05a6c65
|
7
|
+
data.tar.gz: 868162e517d1711878df3d9027617e55b96be2040e36c14497fcea3a8f8f057c4e69ab7aac0b1947a5c513a002e0d378cd612ad263842b5d53986d95e2be91eb
|
data/Gemfile.lock
CHANGED
data/NEWS.md
CHANGED
data/lib/nanoc/base.rb
CHANGED
@@ -1,28 +1,16 @@
|
|
1
|
-
module Nanoc
|
2
|
-
autoload 'Error', 'nanoc/base/error'
|
3
|
-
autoload 'Filter', 'nanoc/base/compilation/filter'
|
4
|
-
end
|
5
|
-
|
6
1
|
# @api private
|
7
2
|
module Nanoc::Int
|
8
|
-
# Load helper classes
|
9
|
-
autoload 'Context', 'nanoc/base/context'
|
10
|
-
autoload 'Checksummer', 'nanoc/base/checksummer'
|
11
|
-
autoload 'DirectedGraph', 'nanoc/base/directed_graph'
|
12
|
-
autoload 'Errors', 'nanoc/base/errors'
|
13
|
-
autoload 'Memoization', 'nanoc/base/memoization'
|
14
|
-
autoload 'PluginRegistry', 'nanoc/base/plugin_registry'
|
15
|
-
|
16
|
-
# Load compilation classes
|
17
3
|
autoload 'Compiler', 'nanoc/base/compilation/compiler'
|
18
|
-
autoload 'DependencyTracker', 'nanoc/base/compilation/dependency_tracker'
|
19
|
-
autoload 'ItemRepRepo', 'nanoc/base/compilation/item_rep_repo'
|
20
4
|
autoload 'OutdatednessChecker', 'nanoc/base/compilation/outdatedness_checker'
|
21
5
|
autoload 'OutdatednessReasons', 'nanoc/base/compilation/outdatedness_reasons'
|
22
6
|
end
|
23
7
|
|
24
8
|
require_relative 'base/core_ext'
|
25
9
|
require_relative 'base/contracts_support'
|
10
|
+
require_relative 'base/memoization'
|
11
|
+
require_relative 'base/plugin_registry'
|
12
|
+
require_relative 'base/error'
|
13
|
+
require_relative 'base/errors'
|
26
14
|
|
27
15
|
require_relative 'base/entities'
|
28
16
|
require_relative 'base/feature'
|
@@ -118,9 +118,7 @@ module Nanoc::Int
|
|
118
118
|
# Calculate checksums
|
119
119
|
objects_to_checksum =
|
120
120
|
site.items.to_a + site.layouts.to_a + site.code_snippets + [site.config]
|
121
|
-
objects_to_checksum.each
|
122
|
-
checksum_store[obj] = Nanoc::Int::Checksummer.calc(obj)
|
123
|
-
end
|
121
|
+
objects_to_checksum.each { |obj| checksum_store.add(obj) }
|
124
122
|
|
125
123
|
# Store
|
126
124
|
stores.each(&:store)
|
@@ -172,7 +170,7 @@ module Nanoc::Int
|
|
172
170
|
# @api private
|
173
171
|
def filter_name_and_args_for_layout(layout)
|
174
172
|
mem = action_provider.memory_for(layout)
|
175
|
-
if mem.nil? || mem.size != 1 || !mem[0].is_a?(Nanoc::Int::
|
173
|
+
if mem.nil? || mem.size != 1 || !mem[0].is_a?(Nanoc::Int::ProcessingActions::Filter)
|
176
174
|
# FIXME: Provide a nicer error message
|
177
175
|
raise Nanoc::Int::Errors::Generic, "No rule memory found for #{layout.identifier}"
|
178
176
|
end
|
@@ -246,7 +244,7 @@ module Nanoc::Int
|
|
246
244
|
|
247
245
|
@fibers.delete(rep)
|
248
246
|
ensure
|
249
|
-
dependency_tracker.exit
|
247
|
+
dependency_tracker.exit
|
250
248
|
end
|
251
249
|
end
|
252
250
|
|
@@ -278,11 +276,11 @@ module Nanoc::Int
|
|
278
276
|
|
279
277
|
action_provider.memory_for(rep).each do |action|
|
280
278
|
case action
|
281
|
-
when Nanoc::Int::
|
279
|
+
when Nanoc::Int::ProcessingActions::Filter
|
282
280
|
executor.filter(rep, action.filter_name, action.params)
|
283
|
-
when Nanoc::Int::
|
281
|
+
when Nanoc::Int::ProcessingActions::Layout
|
284
282
|
executor.layout(rep, action.layout_identifier, action.params)
|
285
|
-
when Nanoc::Int::
|
283
|
+
when Nanoc::Int::ProcessingActions::Snapshot
|
286
284
|
executor.snapshot(rep, action.snapshot_name, final: action.final?, path: action.path)
|
287
285
|
else
|
288
286
|
raise "Internal inconsistency: unknown action #{action.inspect}"
|
@@ -5,6 +5,8 @@ module Nanoc::Int
|
|
5
5
|
class OutdatednessChecker
|
6
6
|
extend Nanoc::Int::Memoization
|
7
7
|
|
8
|
+
include Nanoc::Int::ContractsSupport
|
9
|
+
|
8
10
|
attr_reader :checksum_store
|
9
11
|
attr_reader :dependency_store
|
10
12
|
attr_reader :rule_memory_store
|
@@ -31,6 +33,7 @@ module Nanoc::Int
|
|
31
33
|
@objects_outdated_due_to_dependencies = {}
|
32
34
|
end
|
33
35
|
|
36
|
+
contract C::Or[Nanoc::Int::Item, Nanoc::Int::ItemRep, Nanoc::Int::Layout] => C::Bool
|
34
37
|
# Checks whether the given object is outdated and therefore needs to be
|
35
38
|
# recompiled.
|
36
39
|
#
|
@@ -42,6 +45,7 @@ module Nanoc::Int
|
|
42
45
|
!outdatedness_reason_for(obj).nil?
|
43
46
|
end
|
44
47
|
|
48
|
+
contract C::Or[Nanoc::Int::Item, Nanoc::Int::ItemRep, Nanoc::Int::Layout] => C::Maybe[Reasons::Generic]
|
45
49
|
# Calculates the reason why the given object is outdated.
|
46
50
|
#
|
47
51
|
# @param [Nanoc::Int::Item, Nanoc::Int::ItemRep, Nanoc::Int::Layout] obj The object
|
@@ -60,6 +64,7 @@ module Nanoc::Int
|
|
60
64
|
|
61
65
|
private
|
62
66
|
|
67
|
+
contract C::Or[Nanoc::Int::Item, Nanoc::Int::ItemRep, Nanoc::Int::Layout] => C::Bool
|
63
68
|
# Checks whether the given object is outdated and therefore needs to be
|
64
69
|
# recompiled. This method does not take dependencies into account; use
|
65
70
|
# {#outdated?} if you want to include dependencies in the outdatedness
|
@@ -73,6 +78,7 @@ module Nanoc::Int
|
|
73
78
|
!basic_outdatedness_reason_for(obj).nil?
|
74
79
|
end
|
75
80
|
|
81
|
+
contract C::Or[Nanoc::Int::Item, Nanoc::Int::ItemRep, Nanoc::Int::Layout] => C::Maybe[Reasons::Generic]
|
76
82
|
# Calculates the reason why the given object is outdated. This method does
|
77
83
|
# not take dependencies into account; use {#outdatedness_reason_for?} if
|
78
84
|
# you want to include dependencies in the outdatedness check.
|
@@ -91,7 +97,8 @@ module Nanoc::Int
|
|
91
97
|
|
92
98
|
# Outdated if checksums are missing or different
|
93
99
|
return Reasons::NotEnoughData unless checksums_available?(obj.item)
|
94
|
-
return Reasons::
|
100
|
+
return Reasons::ContentModified unless content_checksums_identical?(obj.item)
|
101
|
+
return Reasons::AttributesModified unless attributes_checksums_identical?(obj.item)
|
95
102
|
|
96
103
|
# Outdated if compiled file doesn't exist (yet)
|
97
104
|
return Reasons::NotWritten if obj.raw_path && !File.file?(obj.raw_path)
|
@@ -107,7 +114,7 @@ module Nanoc::Int
|
|
107
114
|
# Not outdated
|
108
115
|
nil
|
109
116
|
when Nanoc::Int::Item
|
110
|
-
@reps[obj].
|
117
|
+
@reps[obj].lazy.map { |rep| basic_outdatedness_reason_for(rep) }.find { |s| s }
|
111
118
|
when Nanoc::Int::Layout
|
112
119
|
# Outdated if rules outdated
|
113
120
|
return Reasons::RulesModified if
|
@@ -115,7 +122,8 @@ module Nanoc::Int
|
|
115
122
|
|
116
123
|
# Outdated if checksums are missing or different
|
117
124
|
return Reasons::NotEnoughData unless checksums_available?(obj)
|
118
|
-
return Reasons::
|
125
|
+
return Reasons::ContentModified unless content_checksums_identical?(obj)
|
126
|
+
return Reasons::AttributesModified unless attributes_checksums_identical?(obj)
|
119
127
|
|
120
128
|
# Not outdated
|
121
129
|
nil
|
@@ -125,6 +133,7 @@ module Nanoc::Int
|
|
125
133
|
end
|
126
134
|
memoize :basic_outdatedness_reason_for
|
127
135
|
|
136
|
+
contract C::Or[Nanoc::Int::Item, Nanoc::Int::ItemRep, Nanoc::Int::Layout], Hamster::Set => C::Bool
|
128
137
|
# Checks whether the given object is outdated due to dependencies.
|
129
138
|
#
|
130
139
|
# @param [Nanoc::Int::Item, Nanoc::Int::ItemRep, Nanoc::Int::Layout] obj The object
|
@@ -162,6 +171,7 @@ module Nanoc::Int
|
|
162
171
|
is_outdated
|
163
172
|
end
|
164
173
|
|
174
|
+
contract C::Or[Nanoc::Int::Item, Nanoc::Int::ItemRep, Nanoc::Int::Layout] => C::Bool
|
165
175
|
# @param [Nanoc::Int::ItemRep, Nanoc::Int::Layout] obj The layout or item
|
166
176
|
# representation to check the rule memory for
|
167
177
|
#
|
@@ -172,6 +182,7 @@ module Nanoc::Int
|
|
172
182
|
end
|
173
183
|
memoize :rule_memory_differs_for
|
174
184
|
|
185
|
+
contract C::Any => String
|
175
186
|
# @param obj The object to create a checksum for
|
176
187
|
#
|
177
188
|
# @return [String] The digest
|
@@ -180,15 +191,17 @@ module Nanoc::Int
|
|
180
191
|
end
|
181
192
|
memoize :calc_checksum
|
182
193
|
|
194
|
+
contract C::Any => C::Bool
|
183
195
|
# @param obj
|
184
196
|
#
|
185
197
|
# @return [Boolean] false if either the new or the old checksum for the
|
186
198
|
# given object is not available, true if both checksums are available
|
187
199
|
def checksums_available?(obj)
|
188
|
-
checksum_store[obj] && calc_checksum(obj)
|
200
|
+
checksum_store[obj] && calc_checksum(obj) ? true : false
|
189
201
|
end
|
190
202
|
memoize :checksums_available?
|
191
203
|
|
204
|
+
contract C::Any => C::Bool
|
192
205
|
# @param obj
|
193
206
|
#
|
194
207
|
# @return [Boolean] false if the old and new checksums for the given
|
@@ -198,6 +211,19 @@ module Nanoc::Int
|
|
198
211
|
end
|
199
212
|
memoize :checksums_identical?
|
200
213
|
|
214
|
+
contract C::Or[Nanoc::Int::Item, Nanoc::Int::Layout] => C::Bool
|
215
|
+
def content_checksums_identical?(obj)
|
216
|
+
checksum_store.content_checksum_for(obj) == Nanoc::Int::Checksummer.calc_for_content_of(obj)
|
217
|
+
end
|
218
|
+
memoize :content_checksums_identical?
|
219
|
+
|
220
|
+
contract C::Or[Nanoc::Int::Item, Nanoc::Int::Layout] => C::Bool
|
221
|
+
def attributes_checksums_identical?(obj)
|
222
|
+
checksum_store.attributes_checksum_for(obj) == Nanoc::Int::Checksummer.calc_for_attributes_of(obj)
|
223
|
+
end
|
224
|
+
memoize :attributes_checksums_identical?
|
225
|
+
|
226
|
+
contract C::Any => C::Bool
|
201
227
|
# @param obj
|
202
228
|
#
|
203
229
|
# @return [Boolean] true if the old and new checksums for the given object
|
@@ -40,8 +40,12 @@ module Nanoc::Int
|
|
40
40
|
'The rules file has been modified since the last time the site was compiled.',
|
41
41
|
)
|
42
42
|
|
43
|
-
|
44
|
-
'The
|
43
|
+
ContentModified = Generic.new(
|
44
|
+
'The content of this item has been modified since the last time the site was compiled.',
|
45
|
+
)
|
46
|
+
|
47
|
+
AttributesModified = Generic.new(
|
48
|
+
'The attributes of this item have been modified since the last time the site was compiled.',
|
45
49
|
)
|
46
50
|
end
|
47
51
|
end
|
data/lib/nanoc/base/entities.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
|
+
require_relative 'entities/context'
|
2
|
+
require_relative 'entities/directed_graph'
|
3
|
+
|
1
4
|
require_relative 'entities/identifier'
|
2
5
|
require_relative 'entities/content'
|
3
|
-
require_relative 'entities/
|
4
|
-
require_relative 'entities/
|
6
|
+
require_relative 'entities/processing_action'
|
7
|
+
require_relative 'entities/processing_actions'
|
5
8
|
|
6
9
|
require_relative 'entities/code_snippet'
|
7
10
|
require_relative 'entities/configuration'
|
@@ -37,9 +37,11 @@ module Nanoc::Int
|
|
37
37
|
# Returns a binding for this instance.
|
38
38
|
#
|
39
39
|
# @return [Binding] A binding for this instance
|
40
|
+
# rubocop:disable Style/AccessorMethodName
|
40
41
|
def get_binding
|
41
42
|
binding
|
42
43
|
end
|
44
|
+
# rubocop:enable Style/AccessorMethodName
|
43
45
|
|
44
46
|
def include(mod)
|
45
47
|
metaclass = class << self; self; end
|
File without changes
|
@@ -18,24 +18,41 @@ module Nanoc
|
|
18
18
|
# @return [String, nil]
|
19
19
|
attr_accessor :checksum_data
|
20
20
|
|
21
|
+
# @return [String, nil]
|
22
|
+
attr_accessor :content_checksum_data
|
23
|
+
|
24
|
+
# @return [String, nil]
|
25
|
+
attr_accessor :attributes_checksum_data
|
26
|
+
|
21
27
|
c_content = C::Or[String, Nanoc::Int::Content]
|
22
28
|
c_attributes = C::Or[Hash, Proc]
|
23
29
|
c_identifier = C::Or[String, Nanoc::Identifier]
|
24
|
-
c_checksum_data = C::
|
30
|
+
c_checksum_data = C::KeywordArgs[
|
31
|
+
checksum_data: C::Optional[C::Maybe[String]],
|
32
|
+
content_checksum_data: C::Optional[C::Maybe[String]],
|
33
|
+
attributes_checksum_data: C::Optional[C::Maybe[String]],
|
34
|
+
]
|
25
35
|
|
26
|
-
contract c_content, c_attributes, c_identifier,
|
36
|
+
contract c_content, c_attributes, c_identifier, c_checksum_data => C::Any
|
27
37
|
# @param [String, Nanoc::Int::Content] content
|
28
38
|
#
|
29
39
|
# @param [Hash, Proc] attributes
|
30
40
|
#
|
31
41
|
# @param [String, Nanoc::Identifier] identifier
|
32
42
|
#
|
33
|
-
# @param [String, nil] checksum_data
|
34
|
-
|
43
|
+
# @param [String, nil] checksum_data
|
44
|
+
#
|
45
|
+
# @param [String, nil] content_checksum_data
|
46
|
+
#
|
47
|
+
# @param [String, nil] attributes_checksum_data
|
48
|
+
def initialize(content, attributes, identifier, checksum_data: nil, content_checksum_data: nil, attributes_checksum_data: nil)
|
35
49
|
@content = Nanoc::Int::Content.create(content)
|
36
50
|
@attributes = Nanoc::Int::LazyValue.new(attributes).map(&:__nanoc_symbolize_keys_recursively)
|
37
51
|
@identifier = Nanoc::Identifier.from(identifier)
|
52
|
+
|
38
53
|
@checksum_data = checksum_data
|
54
|
+
@content_checksum_data = content_checksum_data
|
55
|
+
@attributes_checksum_data = attributes_checksum_data
|
39
56
|
end
|
40
57
|
|
41
58
|
contract C::None => self
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module Nanoc::Int
|
2
|
-
class
|
2
|
+
class ProcessingAction
|
3
3
|
def serialize
|
4
|
-
raise NotImplementedError.new('Nanoc::
|
4
|
+
raise NotImplementedError.new('Nanoc::ProcessingAction subclasses must implement #serialize and #to_s')
|
5
5
|
end
|
6
6
|
|
7
7
|
def to_s
|
8
|
-
raise NotImplementedError.new('Nanoc::
|
8
|
+
raise NotImplementedError.new('Nanoc::ProcessingAction subclasses must implement #serialize and #to_s')
|
9
9
|
end
|
10
10
|
|
11
11
|
def inspect
|
@@ -1,5 +1,5 @@
|
|
1
|
-
module Nanoc::Int::
|
2
|
-
class Snapshot < Nanoc::Int::
|
1
|
+
module Nanoc::Int::ProcessingActions
|
2
|
+
class Snapshot < Nanoc::Int::ProcessingAction
|
3
3
|
# snapshot :before_layout
|
4
4
|
# snapshot :before_layout, final: true
|
5
5
|
# snapshot :before_layout, path: '/about.md'
|
@@ -13,38 +13,38 @@ module Nanoc::Int
|
|
13
13
|
@actions.size
|
14
14
|
end
|
15
15
|
|
16
|
-
contract Numeric => C::Maybe[Nanoc::Int::
|
16
|
+
contract Numeric => C::Maybe[Nanoc::Int::ProcessingAction]
|
17
17
|
def [](idx)
|
18
18
|
@actions[idx]
|
19
19
|
end
|
20
20
|
|
21
21
|
contract Symbol, Hash => self
|
22
22
|
def add_filter(filter_name, params)
|
23
|
-
@actions << Nanoc::Int::
|
23
|
+
@actions << Nanoc::Int::ProcessingActions::Filter.new(filter_name, params)
|
24
24
|
self
|
25
25
|
end
|
26
26
|
|
27
27
|
contract String, C::Maybe[Hash] => self
|
28
28
|
def add_layout(layout_identifier, params)
|
29
|
-
@actions << Nanoc::Int::
|
29
|
+
@actions << Nanoc::Int::ProcessingActions::Layout.new(layout_identifier, params)
|
30
30
|
self
|
31
31
|
end
|
32
32
|
|
33
33
|
contract Symbol, C::Bool, C::Maybe[String] => self
|
34
34
|
def add_snapshot(snapshot_name, final, path)
|
35
35
|
will_add_snapshot(snapshot_name) if final
|
36
|
-
@actions << Nanoc::Int::
|
36
|
+
@actions << Nanoc::Int::ProcessingActions::Snapshot.new(snapshot_name, final, path)
|
37
37
|
self
|
38
38
|
end
|
39
39
|
|
40
|
-
contract C::None => C::ArrayOf[Nanoc::Int::
|
40
|
+
contract C::None => C::ArrayOf[Nanoc::Int::ProcessingAction]
|
41
41
|
def snapshot_actions
|
42
|
-
@actions.select { |a| a.is_a?(Nanoc::Int::
|
42
|
+
@actions.select { |a| a.is_a?(Nanoc::Int::ProcessingActions::Snapshot) }
|
43
43
|
end
|
44
44
|
|
45
45
|
contract C::None => C::Bool
|
46
46
|
def any_layouts?
|
47
|
-
@actions.any? { |a| a.is_a?(Nanoc::Int::
|
47
|
+
@actions.any? { |a| a.is_a?(Nanoc::Int::ProcessingActions::Layout) }
|
48
48
|
end
|
49
49
|
|
50
50
|
# TODO: Add contract
|
@@ -52,7 +52,7 @@ module Nanoc::Int
|
|
52
52
|
map(&:serialize)
|
53
53
|
end
|
54
54
|
|
55
|
-
contract C::Func[Nanoc::Int::
|
55
|
+
contract C::Func[Nanoc::Int::ProcessingAction => C::Any] => self
|
56
56
|
def each
|
57
57
|
@actions.each { |a| yield(a) }
|
58
58
|
self
|
data/lib/nanoc/base/feature.rb
CHANGED
data/lib/nanoc/base/repos.rb
CHANGED
@@ -5,5 +5,6 @@ require_relative 'repos/compiled_content_cache'
|
|
5
5
|
require_relative 'repos/config_loader'
|
6
6
|
require_relative 'repos/data_source'
|
7
7
|
require_relative 'repos/dependency_store'
|
8
|
+
require_relative 'repos/item_rep_repo'
|
8
9
|
require_relative 'repos/rule_memory_store'
|
9
10
|
require_relative 'repos/site_loader'
|
@@ -4,6 +4,8 @@ module Nanoc::Int
|
|
4
4
|
#
|
5
5
|
# @api private
|
6
6
|
class ChecksumStore < ::Nanoc::Int::Store
|
7
|
+
include Nanoc::Int::ContractsSupport
|
8
|
+
|
7
9
|
# @param [Nanoc::Int::Site] site
|
8
10
|
def initialize(site: nil)
|
9
11
|
super(Nanoc::Int::Store.tmp_path_for(env_name: (site.config.env_name if site), store_name: 'checksums'), 1)
|
@@ -13,6 +15,7 @@ module Nanoc::Int
|
|
13
15
|
@checksums = {}
|
14
16
|
end
|
15
17
|
|
18
|
+
contract C::Any => C::Maybe[String]
|
16
19
|
# Returns the old checksum for the given object. This makes sense for
|
17
20
|
# items, layouts and code snippets.
|
18
21
|
#
|
@@ -23,13 +26,24 @@ module Nanoc::Int
|
|
23
26
|
@checksums[obj.reference]
|
24
27
|
end
|
25
28
|
|
26
|
-
#
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
# Calculates and stores the checksum for the given object.
|
30
|
+
def add(obj)
|
31
|
+
if obj.is_a?(Nanoc::Int::Document)
|
32
|
+
@checksums[[obj.reference, :content]] = Nanoc::Int::Checksummer.calc_for_content_of(obj)
|
33
|
+
@checksums[[obj.reference, :attributes]] = Nanoc::Int::Checksummer.calc_for_attributes_of(obj)
|
34
|
+
end
|
35
|
+
|
36
|
+
@checksums[obj.reference] = Nanoc::Int::Checksummer.calc(obj)
|
37
|
+
end
|
38
|
+
|
39
|
+
contract C::Any => C::Maybe[String]
|
40
|
+
def content_checksum_for(obj)
|
41
|
+
@checksums[[obj.reference, :content]]
|
42
|
+
end
|
43
|
+
|
44
|
+
contract C::Any => C::Maybe[String]
|
45
|
+
def attributes_checksum_for(obj)
|
46
|
+
@checksums[[obj.reference, :attributes]]
|
33
47
|
end
|
34
48
|
|
35
49
|
protected
|
@@ -140,10 +140,14 @@ module Nanoc
|
|
140
140
|
#
|
141
141
|
# @param [Boolean] binary Whether or not this item is binary
|
142
142
|
#
|
143
|
-
# @param [String, nil] checksum_data
|
144
|
-
|
143
|
+
# @param [String, nil] checksum_data
|
144
|
+
#
|
145
|
+
# @param [String, nil] content_checksum_data
|
146
|
+
#
|
147
|
+
# @param [String, nil] attributes_checksum_data
|
148
|
+
def new_item(content, attributes, identifier, binary: false, checksum_data: nil, content_checksum_data: nil, attributes_checksum_data: nil)
|
145
149
|
content = Nanoc::Int::Content.create(content, binary: binary)
|
146
|
-
Nanoc::Int::Item.new(content, attributes, identifier, checksum_data: checksum_data)
|
150
|
+
Nanoc::Int::Item.new(content, attributes, identifier, checksum_data: checksum_data, content_checksum_data: content_checksum_data, attributes_checksum_data: attributes_checksum_data)
|
147
151
|
end
|
148
152
|
|
149
153
|
# Creates a new in-memory layout instance. This is intended for use within
|
@@ -155,9 +159,13 @@ module Nanoc
|
|
155
159
|
#
|
156
160
|
# @param [String] identifier This layout's identifier.
|
157
161
|
#
|
158
|
-
# @param [String, nil] checksum_data
|
159
|
-
|
160
|
-
|
162
|
+
# @param [String, nil] checksum_data
|
163
|
+
#
|
164
|
+
# @param [String, nil] content_checksum_data
|
165
|
+
#
|
166
|
+
# @param [String, nil] attributes_checksum_data
|
167
|
+
def new_layout(raw_content, attributes, identifier, checksum_data: nil, content_checksum_data: nil, attributes_checksum_data: nil)
|
168
|
+
Nanoc::Int::Layout.new(raw_content, attributes, identifier, checksum_data: checksum_data, content_checksum_data: content_checksum_data, attributes_checksum_data: attributes_checksum_data)
|
161
169
|
end
|
162
170
|
end
|
163
171
|
end
|
File without changes
|
data/lib/nanoc/base/services.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require_relative 'services/action_provider'
|
2
|
+
require_relative 'services/checksummer'
|
2
3
|
require_relative 'services/compiler_loader'
|
4
|
+
require_relative 'services/dependency_tracker'
|
3
5
|
require_relative 'services/executor'
|
6
|
+
require_relative 'services/filter'
|
4
7
|
require_relative 'services/item_rep_builder'
|
5
8
|
require_relative 'services/item_rep_router'
|
6
9
|
require_relative 'services/item_rep_selector'
|
@@ -44,6 +44,14 @@ module Nanoc::Int
|
|
44
44
|
digest.to_s
|
45
45
|
end
|
46
46
|
|
47
|
+
def calc_for_content_of(obj)
|
48
|
+
obj.content_checksum_data || obj.checksum_data || Nanoc::Int::Checksummer.calc(obj.content)
|
49
|
+
end
|
50
|
+
|
51
|
+
def calc_for_attributes_of(obj)
|
52
|
+
obj.attributes_checksum_data || obj.checksum_data || Nanoc::Int::Checksummer.calc(obj.attributes)
|
53
|
+
end
|
54
|
+
|
47
55
|
private
|
48
56
|
|
49
57
|
def update(obj, digest, visited = Hamster::Set.new)
|
@@ -181,11 +189,19 @@ module Nanoc::Int
|
|
181
189
|
if obj.checksum_data
|
182
190
|
digest.update('checksum_data=' + obj.checksum_data)
|
183
191
|
else
|
184
|
-
|
185
|
-
|
192
|
+
if obj.content_checksum_data
|
193
|
+
digest.update('content_checksum_data=' + obj.content_checksum_data)
|
194
|
+
else
|
195
|
+
digest.update('content=')
|
196
|
+
yield(obj.content)
|
197
|
+
end
|
186
198
|
|
187
|
-
|
188
|
-
|
199
|
+
if obj.attributes_checksum_data
|
200
|
+
digest.update(',attributes_checksum_data=' + obj.attributes_checksum_data)
|
201
|
+
else
|
202
|
+
digest.update(',attributes=')
|
203
|
+
yield(obj.attributes)
|
204
|
+
end
|
189
205
|
|
190
206
|
digest.update(',identifier=')
|
191
207
|
yield(obj.identifier)
|
@@ -2,12 +2,17 @@ module Nanoc::Int
|
|
2
2
|
# @api private
|
3
3
|
class DependencyTracker
|
4
4
|
class Null
|
5
|
+
include Nanoc::Int::ContractsSupport
|
6
|
+
|
7
|
+
contract C::Or[Nanoc::Int::Item, Nanoc::Int::Layout] => C::Any
|
5
8
|
def enter(_obj)
|
6
9
|
end
|
7
10
|
|
8
|
-
|
11
|
+
contract C::None => C::Any
|
12
|
+
def exit
|
9
13
|
end
|
10
14
|
|
15
|
+
contract C::Or[Nanoc::Int::Item, Nanoc::Int::Layout] => C::Any
|
11
16
|
def bounce(_obj)
|
12
17
|
end
|
13
18
|
end
|
@@ -29,15 +34,15 @@ module Nanoc::Int
|
|
29
34
|
@stack.push(obj)
|
30
35
|
end
|
31
36
|
|
32
|
-
contract C::
|
33
|
-
def exit
|
37
|
+
contract C::None => C::Any
|
38
|
+
def exit
|
34
39
|
@stack.pop
|
35
40
|
end
|
36
41
|
|
37
42
|
contract C::Or[Nanoc::Int::Item, Nanoc::Int::Layout] => C::Any
|
38
43
|
def bounce(obj)
|
39
44
|
enter(obj)
|
40
|
-
exit
|
45
|
+
exit
|
41
46
|
end
|
42
47
|
end
|
43
48
|
end
|
File without changes
|
@@ -138,9 +138,11 @@ module Nanoc::CLI
|
|
138
138
|
end
|
139
139
|
|
140
140
|
# @see ARGF.set_encoding
|
141
|
+
# rubocop:disable Style/AccessorMethodName
|
141
142
|
def set_encoding(*args)
|
142
143
|
@stream.set_encoding(*args)
|
143
144
|
end
|
145
|
+
# rubocop:enable Style/AccessorMethodName
|
144
146
|
|
145
147
|
protected
|
146
148
|
|
@@ -10,10 +10,8 @@ opt :d, :debug, 'enable debugging' do
|
|
10
10
|
Nanoc::CLI.debug = true
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
ENV.store('NANOC_ENV', value)
|
16
|
-
end
|
13
|
+
opt :e, :env, 'set environment', argument: :required do |value|
|
14
|
+
ENV.store('NANOC_ENV', value)
|
17
15
|
end
|
18
16
|
|
19
17
|
opt :h, :help, 'show the help message and quit' do |_value, cmd|
|
@@ -44,7 +44,9 @@ module Nanoc::CLI::Commands
|
|
44
44
|
use Rack::ShowExceptions
|
45
45
|
use Rack::Lint
|
46
46
|
use Rack::Head
|
47
|
-
use Adsf::Rack::IndexFileFinder,
|
47
|
+
use Adsf::Rack::IndexFileFinder,
|
48
|
+
root: site.config[:output_dir],
|
49
|
+
index_filenames: %w(index.html index.xhtml)
|
48
50
|
run Rack::File.new(site.config[:output_dir])
|
49
51
|
end.to_app
|
50
52
|
|
@@ -76,11 +76,12 @@ module Nanoc::DataSources
|
|
76
76
|
|
77
77
|
class ProtoDocument
|
78
78
|
attr_reader :attributes
|
79
|
-
attr_reader :
|
79
|
+
attr_reader :content_checksum_data
|
80
|
+
attr_reader :attributes_checksum_data
|
80
81
|
attr_reader :is_binary
|
81
82
|
alias binary? is_binary
|
82
83
|
|
83
|
-
def initialize(is_binary:, content: nil, filename: nil, attributes:,
|
84
|
+
def initialize(is_binary:, content: nil, filename: nil, attributes:, content_checksum_data: nil, attributes_checksum_data: nil)
|
84
85
|
if content.nil? && filename.nil?
|
85
86
|
raise ArgumentError, '#initialize needs at least content or filename'
|
86
87
|
end
|
@@ -89,7 +90,8 @@ module Nanoc::DataSources
|
|
89
90
|
@content = content
|
90
91
|
@filename = filename
|
91
92
|
@attributes = attributes
|
92
|
-
@
|
93
|
+
@content_checksum_data = content_checksum_data
|
94
|
+
@attributes_checksum_data = attributes_checksum_data
|
93
95
|
end
|
94
96
|
|
95
97
|
def content
|
@@ -125,7 +127,8 @@ module Nanoc::DataSources
|
|
125
127
|
is_binary: false,
|
126
128
|
content: parse_result.content,
|
127
129
|
attributes: parse_result.attributes,
|
128
|
-
|
130
|
+
content_checksum_data: parse_result.content,
|
131
|
+
attributes_checksum_data: parse_result.attributes_data,
|
129
132
|
)
|
130
133
|
end
|
131
134
|
end
|
@@ -157,7 +160,13 @@ module Nanoc::DataSources
|
|
157
160
|
attributes = attributes_for(proto_doc, content_filename, meta_filename)
|
158
161
|
identifier = identifier_for(content_filename, meta_filename, dir_name)
|
159
162
|
|
160
|
-
res << klass.new(
|
163
|
+
res << klass.new(
|
164
|
+
content,
|
165
|
+
attributes,
|
166
|
+
identifier,
|
167
|
+
content_checksum_data: proto_doc.content_checksum_data,
|
168
|
+
attributes_checksum_data: proto_doc.attributes_checksum_data,
|
169
|
+
)
|
161
170
|
end
|
162
171
|
end
|
163
172
|
|
@@ -358,7 +367,7 @@ module Nanoc::DataSources
|
|
358
367
|
def parse_metadata(data, filename)
|
359
368
|
begin
|
360
369
|
meta = YAML.load(data) || {}
|
361
|
-
rescue
|
370
|
+
rescue => e
|
362
371
|
raise "Could not parse YAML for #{filename}: #{e.message}"
|
363
372
|
end
|
364
373
|
|
data/lib/nanoc/extra.rb
CHANGED
data/lib/nanoc/version.rb
CHANGED
data/test/base/test_context.rb
CHANGED
@@ -17,7 +17,7 @@ class Nanoc::Int::ContextTest < Nanoc::TestCase
|
|
17
17
|
|
18
18
|
def test_example
|
19
19
|
# Parse
|
20
|
-
YARD.parse(LIB_DIR + '/nanoc/base/context.rb')
|
20
|
+
YARD.parse(LIB_DIR + '/nanoc/base/entities/context.rb')
|
21
21
|
|
22
22
|
# Run
|
23
23
|
assert_examples_correct 'Nanoc::Int::Context#initialize'
|
@@ -40,6 +40,17 @@ class Nanoc::DataSourceTest < Nanoc::TestCase
|
|
40
40
|
assert_equal 'abcdef', item.checksum_data
|
41
41
|
end
|
42
42
|
|
43
|
+
def test_new_item_with_checksums
|
44
|
+
data_source = Nanoc::DataSource.new(nil, nil, nil, nil)
|
45
|
+
|
46
|
+
item = data_source.new_item('stuff', { title: 'Stuff!' }, '/asdf/', content_checksum_data: 'con-cs', attributes_checksum_data: 'attr-cs')
|
47
|
+
assert_equal 'stuff', item.content.string
|
48
|
+
assert_equal 'Stuff!', item.attributes[:title]
|
49
|
+
assert_equal Nanoc::Identifier.new('/asdf/'), item.identifier
|
50
|
+
assert_equal 'con-cs', item.content_checksum_data
|
51
|
+
assert_equal 'attr-cs', item.attributes_checksum_data
|
52
|
+
end
|
53
|
+
|
43
54
|
def test_new_layout
|
44
55
|
data_source = Nanoc::DataSource.new(nil, nil, nil, nil)
|
45
56
|
|
@@ -49,4 +60,15 @@ class Nanoc::DataSourceTest < Nanoc::TestCase
|
|
49
60
|
assert_equal Nanoc::Identifier.new('/asdf/'), layout.identifier
|
50
61
|
assert_equal 'abcdef', layout.checksum_data
|
51
62
|
end
|
63
|
+
|
64
|
+
def test_new_layout_with_checksums
|
65
|
+
data_source = Nanoc::DataSource.new(nil, nil, nil, nil)
|
66
|
+
|
67
|
+
layout = data_source.new_layout('stuff', { title: 'Stuff!' }, '/asdf/', content_checksum_data: 'con-cs', attributes_checksum_data: 'attr-cs')
|
68
|
+
assert_equal 'stuff', layout.content.string
|
69
|
+
assert_equal 'Stuff!', layout.attributes[:title]
|
70
|
+
assert_equal Nanoc::Identifier.new('/asdf/'), layout.identifier
|
71
|
+
assert_equal 'con-cs', layout.content_checksum_data
|
72
|
+
assert_equal 'attr-cs', layout.attributes_checksum_data
|
73
|
+
end
|
52
74
|
end
|
@@ -1,7 +1,10 @@
|
|
1
1
|
class Nanoc::Int::DependencyTrackerTest < Nanoc::TestCase
|
2
2
|
def test_initialize
|
3
3
|
# Mock items
|
4
|
-
items = [
|
4
|
+
items = [
|
5
|
+
Nanoc::Int::Item.new('a', {}, '/a.md'),
|
6
|
+
Nanoc::Int::Item.new('b', {}, '/b.md'),
|
7
|
+
]
|
5
8
|
|
6
9
|
# Create
|
7
10
|
store = Nanoc::Int::DependencyStore.new(items)
|
@@ -13,7 +16,10 @@ class Nanoc::Int::DependencyTrackerTest < Nanoc::TestCase
|
|
13
16
|
|
14
17
|
def test_record_dependency
|
15
18
|
# Mock items
|
16
|
-
items = [
|
19
|
+
items = [
|
20
|
+
Nanoc::Int::Item.new('a', {}, '/a.md'),
|
21
|
+
Nanoc::Int::Item.new('b', {}, '/b.md'),
|
22
|
+
]
|
17
23
|
|
18
24
|
# Create
|
19
25
|
store = Nanoc::Int::DependencyStore.new(items)
|
@@ -27,7 +33,10 @@ class Nanoc::Int::DependencyTrackerTest < Nanoc::TestCase
|
|
27
33
|
|
28
34
|
def test_record_dependency_no_self
|
29
35
|
# Mock items
|
30
|
-
items = [
|
36
|
+
items = [
|
37
|
+
Nanoc::Int::Item.new('a', {}, '/a.md'),
|
38
|
+
Nanoc::Int::Item.new('b', {}, '/b.md'),
|
39
|
+
]
|
31
40
|
|
32
41
|
# Create
|
33
42
|
store = Nanoc::Int::DependencyStore.new(items)
|
@@ -42,7 +51,10 @@ class Nanoc::Int::DependencyTrackerTest < Nanoc::TestCase
|
|
42
51
|
|
43
52
|
def test_record_dependency_no_doubles
|
44
53
|
# Mock items
|
45
|
-
items = [
|
54
|
+
items = [
|
55
|
+
Nanoc::Int::Item.new('a', {}, '/a.md'),
|
56
|
+
Nanoc::Int::Item.new('b', {}, '/b.md'),
|
57
|
+
]
|
46
58
|
|
47
59
|
# Create
|
48
60
|
store = Nanoc::Int::DependencyStore.new(items)
|
@@ -58,7 +70,11 @@ class Nanoc::Int::DependencyTrackerTest < Nanoc::TestCase
|
|
58
70
|
|
59
71
|
def test_objects_causing_outdatedness_of
|
60
72
|
# Mock items
|
61
|
-
items = [
|
73
|
+
items = [
|
74
|
+
Nanoc::Int::Item.new('a', {}, '/a.md'),
|
75
|
+
Nanoc::Int::Item.new('b', {}, '/b.md'),
|
76
|
+
Nanoc::Int::Item.new('c', {}, '/c.md'),
|
77
|
+
]
|
62
78
|
|
63
79
|
# Create
|
64
80
|
store = Nanoc::Int::DependencyStore.new(items)
|
@@ -73,7 +89,11 @@ class Nanoc::Int::DependencyTrackerTest < Nanoc::TestCase
|
|
73
89
|
|
74
90
|
def test_objects_outdated_due_to
|
75
91
|
# Mock items
|
76
|
-
items = [
|
92
|
+
items = [
|
93
|
+
Nanoc::Int::Item.new('a', {}, '/a.md'),
|
94
|
+
Nanoc::Int::Item.new('b', {}, '/b.md'),
|
95
|
+
Nanoc::Int::Item.new('c', {}, '/c.md'),
|
96
|
+
]
|
77
97
|
|
78
98
|
# Create
|
79
99
|
store = Nanoc::Int::DependencyStore.new(items)
|
@@ -88,12 +108,12 @@ class Nanoc::Int::DependencyTrackerTest < Nanoc::TestCase
|
|
88
108
|
|
89
109
|
def test_store_graph_and_load_graph_simple
|
90
110
|
# Mock items
|
91
|
-
items = [
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
111
|
+
items = [
|
112
|
+
Nanoc::Int::Item.new('a', {}, '/a.md'),
|
113
|
+
Nanoc::Int::Item.new('b', {}, '/b.md'),
|
114
|
+
Nanoc::Int::Item.new('c', {}, '/c.md'),
|
115
|
+
Nanoc::Int::Item.new('d', {}, '/d.md'),
|
116
|
+
]
|
97
117
|
|
98
118
|
# Create
|
99
119
|
store = Nanoc::Int::DependencyStore.new(items)
|
@@ -122,12 +142,12 @@ class Nanoc::Int::DependencyTrackerTest < Nanoc::TestCase
|
|
122
142
|
|
123
143
|
def test_store_graph_and_load_graph_with_removed_items
|
124
144
|
# Mock items
|
125
|
-
items = [
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
145
|
+
items = [
|
146
|
+
Nanoc::Int::Item.new('a', {}, '/a.md'),
|
147
|
+
Nanoc::Int::Item.new('b', {}, '/b.md'),
|
148
|
+
Nanoc::Int::Item.new('c', {}, '/c.md'),
|
149
|
+
Nanoc::Int::Item.new('d', {}, '/d.md'),
|
150
|
+
]
|
131
151
|
|
132
152
|
# Create new and old lists
|
133
153
|
old_items = [items[0], items[1], items[2], items[3]]
|
@@ -159,11 +179,11 @@ class Nanoc::Int::DependencyTrackerTest < Nanoc::TestCase
|
|
159
179
|
|
160
180
|
def test_store_graph_with_nils_in_dst
|
161
181
|
# Mock items
|
162
|
-
items = [
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
182
|
+
items = [
|
183
|
+
Nanoc::Int::Item.new('a', {}, '/a.md'),
|
184
|
+
Nanoc::Int::Item.new('b', {}, '/b.md'),
|
185
|
+
Nanoc::Int::Item.new('c', {}, '/c.md'),
|
186
|
+
]
|
167
187
|
|
168
188
|
# Create
|
169
189
|
store = Nanoc::Int::DependencyStore.new(items)
|
@@ -189,11 +209,11 @@ class Nanoc::Int::DependencyTrackerTest < Nanoc::TestCase
|
|
189
209
|
|
190
210
|
def test_store_graph_with_nils_in_src
|
191
211
|
# Mock items
|
192
|
-
items = [
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
212
|
+
items = [
|
213
|
+
Nanoc::Int::Item.new('a', {}, '/a.md'),
|
214
|
+
Nanoc::Int::Item.new('b', {}, '/b.md'),
|
215
|
+
Nanoc::Int::Item.new('c', {}, '/c.md'),
|
216
|
+
]
|
197
217
|
|
198
218
|
# Create
|
199
219
|
store = Nanoc::Int::DependencyStore.new(items)
|
@@ -219,7 +239,11 @@ class Nanoc::Int::DependencyTrackerTest < Nanoc::TestCase
|
|
219
239
|
|
220
240
|
def test_forget_dependencies_for
|
221
241
|
# Mock items
|
222
|
-
items = [
|
242
|
+
items = [
|
243
|
+
Nanoc::Int::Item.new('a', {}, '/a.md'),
|
244
|
+
Nanoc::Int::Item.new('b', {}, '/b.md'),
|
245
|
+
Nanoc::Int::Item.new('c', {}, '/c.md'),
|
246
|
+
]
|
223
247
|
|
224
248
|
# Create
|
225
249
|
store = Nanoc::Int::DependencyStore.new(items)
|
@@ -279,7 +279,7 @@ class Nanoc::Int::DirectedGraphTest < Nanoc::TestCase
|
|
279
279
|
end
|
280
280
|
|
281
281
|
def test_example
|
282
|
-
YARD.parse(LIB_DIR + '/nanoc/base/directed_graph.rb')
|
282
|
+
YARD.parse(LIB_DIR + '/nanoc/base/entities/directed_graph.rb')
|
283
283
|
assert_examples_correct 'Nanoc::Int::DirectedGraph'
|
284
284
|
end
|
285
285
|
end
|
@@ -72,7 +72,7 @@ class Nanoc::Int::OutdatednessCheckerTest < Nanoc::TestCase
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
-
def
|
75
|
+
def test_outdated_if_item_content_checksum_is_different
|
76
76
|
# Compile once
|
77
77
|
with_site(name: 'foo') do |site|
|
78
78
|
File.open('content/index.html', 'w') { |io| io.write('o hello') }
|
@@ -83,7 +83,7 @@ class Nanoc::Int::OutdatednessCheckerTest < Nanoc::TestCase
|
|
83
83
|
site.compile
|
84
84
|
end
|
85
85
|
|
86
|
-
#
|
86
|
+
# Update item
|
87
87
|
FileUtils.cd('foo') do
|
88
88
|
File.open('content/new.html', 'w') { |io| io.write('o hello DIFFERENT!!!') }
|
89
89
|
end
|
@@ -95,7 +95,34 @@ class Nanoc::Int::OutdatednessCheckerTest < Nanoc::TestCase
|
|
95
95
|
site.compiler.load_stores
|
96
96
|
outdatedness_checker = site.compiler.send :outdatedness_checker
|
97
97
|
rep = site.compiler.reps[site.items.find { |i| i.identifier == '/new/' }][0]
|
98
|
-
assert_equal ::Nanoc::Int::OutdatednessReasons::
|
98
|
+
assert_equal ::Nanoc::Int::OutdatednessReasons::ContentModified, outdatedness_checker.outdatedness_reason_for(rep)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_outdated_if_item_attributes_checksum_is_different
|
103
|
+
# Compile once
|
104
|
+
with_site(name: 'foo') do |site|
|
105
|
+
File.open('content/index.html', 'w') { |io| io.write('o hello') }
|
106
|
+
File.open('content/new.html', 'w') { |io| io.write('o hello too') }
|
107
|
+
File.open('lib/stuff.rb', 'w') { |io| io.write('$foo = 123') }
|
108
|
+
|
109
|
+
site = Nanoc::Int::SiteLoader.new.new_from_cwd
|
110
|
+
site.compile
|
111
|
+
end
|
112
|
+
|
113
|
+
# Update item
|
114
|
+
FileUtils.cd('foo') do
|
115
|
+
File.open('content/new.html', 'w') { |io| io.write("---\ntitle: donkey\n---\no hello too") }
|
116
|
+
end
|
117
|
+
|
118
|
+
# Check
|
119
|
+
with_site(name: 'foo') do |site|
|
120
|
+
site = Nanoc::Int::SiteLoader.new.new_from_cwd
|
121
|
+
site.compiler.build_reps
|
122
|
+
site.compiler.load_stores
|
123
|
+
outdatedness_checker = site.compiler.send :outdatedness_checker
|
124
|
+
rep = site.compiler.reps[site.items.find { |i| i.identifier == '/new/' }][0]
|
125
|
+
assert_equal ::Nanoc::Int::OutdatednessReasons::AttributesModified, outdatedness_checker.outdatedness_reason_for(rep)
|
99
126
|
end
|
100
127
|
end
|
101
128
|
|
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.
|
4
|
+
version: 4.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Denis Defreyne
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-11-
|
11
|
+
date: 2016-11-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cri
|
@@ -124,25 +124,21 @@ files:
|
|
124
124
|
- bin/nanoc
|
125
125
|
- lib/nanoc.rb
|
126
126
|
- lib/nanoc/base.rb
|
127
|
-
- lib/nanoc/base/checksummer.rb
|
128
127
|
- lib/nanoc/base/compilation/compiler.rb
|
129
|
-
- lib/nanoc/base/compilation/dependency_tracker.rb
|
130
|
-
- lib/nanoc/base/compilation/filter.rb
|
131
|
-
- lib/nanoc/base/compilation/item_rep_repo.rb
|
132
128
|
- lib/nanoc/base/compilation/outdatedness_checker.rb
|
133
129
|
- lib/nanoc/base/compilation/outdatedness_reasons.rb
|
134
|
-
- lib/nanoc/base/context.rb
|
135
130
|
- lib/nanoc/base/contracts_support.rb
|
136
131
|
- lib/nanoc/base/core_ext.rb
|
137
132
|
- lib/nanoc/base/core_ext/array.rb
|
138
133
|
- lib/nanoc/base/core_ext/hash.rb
|
139
134
|
- lib/nanoc/base/core_ext/pathname.rb
|
140
135
|
- lib/nanoc/base/core_ext/string.rb
|
141
|
-
- lib/nanoc/base/directed_graph.rb
|
142
136
|
- lib/nanoc/base/entities.rb
|
143
137
|
- lib/nanoc/base/entities/code_snippet.rb
|
144
138
|
- lib/nanoc/base/entities/configuration.rb
|
145
139
|
- lib/nanoc/base/entities/content.rb
|
140
|
+
- lib/nanoc/base/entities/context.rb
|
141
|
+
- lib/nanoc/base/entities/directed_graph.rb
|
146
142
|
- lib/nanoc/base/entities/document.rb
|
147
143
|
- lib/nanoc/base/entities/identifiable_collection.rb
|
148
144
|
- lib/nanoc/base/entities/identifier.rb
|
@@ -151,12 +147,12 @@ files:
|
|
151
147
|
- lib/nanoc/base/entities/layout.rb
|
152
148
|
- lib/nanoc/base/entities/lazy_value.rb
|
153
149
|
- lib/nanoc/base/entities/pattern.rb
|
150
|
+
- lib/nanoc/base/entities/processing_action.rb
|
151
|
+
- lib/nanoc/base/entities/processing_actions.rb
|
152
|
+
- lib/nanoc/base/entities/processing_actions/filter.rb
|
153
|
+
- lib/nanoc/base/entities/processing_actions/layout.rb
|
154
|
+
- lib/nanoc/base/entities/processing_actions/snapshot.rb
|
154
155
|
- lib/nanoc/base/entities/rule_memory.rb
|
155
|
-
- lib/nanoc/base/entities/rule_memory_action.rb
|
156
|
-
- lib/nanoc/base/entities/rule_memory_actions.rb
|
157
|
-
- lib/nanoc/base/entities/rule_memory_actions/filter.rb
|
158
|
-
- lib/nanoc/base/entities/rule_memory_actions/layout.rb
|
159
|
-
- lib/nanoc/base/entities/rule_memory_actions/snapshot.rb
|
160
156
|
- lib/nanoc/base/entities/site.rb
|
161
157
|
- lib/nanoc/base/entities/snapshot_def.rb
|
162
158
|
- lib/nanoc/base/error.rb
|
@@ -170,13 +166,17 @@ files:
|
|
170
166
|
- lib/nanoc/base/repos/config_loader.rb
|
171
167
|
- lib/nanoc/base/repos/data_source.rb
|
172
168
|
- lib/nanoc/base/repos/dependency_store.rb
|
169
|
+
- lib/nanoc/base/repos/item_rep_repo.rb
|
173
170
|
- lib/nanoc/base/repos/rule_memory_store.rb
|
174
171
|
- lib/nanoc/base/repos/site_loader.rb
|
175
172
|
- lib/nanoc/base/repos/store.rb
|
176
173
|
- lib/nanoc/base/services.rb
|
177
174
|
- lib/nanoc/base/services/action_provider.rb
|
175
|
+
- lib/nanoc/base/services/checksummer.rb
|
178
176
|
- lib/nanoc/base/services/compiler_loader.rb
|
177
|
+
- lib/nanoc/base/services/dependency_tracker.rb
|
179
178
|
- lib/nanoc/base/services/executor.rb
|
179
|
+
- lib/nanoc/base/services/filter.rb
|
180
180
|
- lib/nanoc/base/services/item_rep_builder.rb
|
181
181
|
- lib/nanoc/base/services/item_rep_router.rb
|
182
182
|
- lib/nanoc/base/services/item_rep_selector.rb
|