nanoc 4.7.4 → 4.7.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -2
- data/Gemfile.lock +19 -29
- data/NEWS.md +11 -0
- data/lib/nanoc/base/entities/identifiable_collection.rb +21 -0
- data/lib/nanoc/base/services/compilation_context.rb +54 -0
- data/lib/nanoc/base/services/compiler/stages/build_reps.rb +27 -0
- data/lib/nanoc/base/services/compiler/stages/determine_outdatedness.rb +4 -6
- data/lib/nanoc/base/services/compiler/stages/forget_outdated_dependencies.rb +14 -0
- data/lib/nanoc/base/services/compiler/stages/load_stores.rb +22 -0
- data/lib/nanoc/base/services/compiler/stages/postprocess.rb +16 -0
- data/lib/nanoc/base/services/compiler/stages/store_post_compilation_state.rb +14 -0
- data/lib/nanoc/base/services/compiler/stages/store_pre_compilation_state.rb +33 -0
- data/lib/nanoc/base/services/compiler/stages.rb +6 -0
- data/lib/nanoc/base/services/compiler.rb +85 -142
- data/lib/nanoc/base/services/compiler_loader.rb +0 -11
- data/lib/nanoc/base/services/outdatedness_checker.rb +19 -40
- data/lib/nanoc/base/services.rb +1 -0
- data/lib/nanoc/base/views/identifiable_collection_view.rb +1 -2
- data/lib/nanoc/cli/commands/compile_listeners/timing_recorder.rb +2 -2
- data/lib/nanoc/cli/commands/show-data.rb +14 -12
- data/lib/nanoc/version.rb +1 -1
- data/spec/nanoc/base/compiler_spec.rb +0 -5
- data/spec/nanoc/base/entities/identifiable_collection_spec.rb +34 -0
- data/spec/nanoc/base/services/compiler/stages/compile_reps_spec.rb +1 -1
- data/spec/nanoc/base/services/executor_spec.rb +1 -1
- data/spec/nanoc/base/services/outdatedness_checker_spec.rb +21 -8
- data/spec/nanoc/base/services/outdatedness_rules_spec.rb +6 -9
- data/spec/nanoc/cli/commands/show_data_spec.rb +147 -0
- data/spec/nanoc/integration/outdatedness_integration_spec.rb +14 -14
- data/spec/nanoc/integration/partial_recompilation_spec.rb +4 -4
- data/spec/nanoc/regressions/gh_1145_spec.rb +16 -0
- data/spec/nanoc/regressions/gh_970b_spec.rb +3 -3
- data/spec/spec_helper.rb +1 -1
- metadata +10 -3
- data/test/base/test_outdatedness_checker.rb +0 -491
@@ -1,77 +1,5 @@
|
|
1
1
|
module Nanoc::Int
|
2
|
-
# Responsible for compiling a site’s item representations.
|
3
|
-
#
|
4
|
-
# The compilation process makes use of notifications (see
|
5
|
-
# {Nanoc::Int::NotificationCenter}) to track dependencies between items,
|
6
|
-
# layouts, etc. The following notifications are used:
|
7
|
-
#
|
8
|
-
# * `compilation_started` — indicates that the compiler has started
|
9
|
-
# compiling this item representation. Has one argument: the item
|
10
|
-
# representation itself. Only one item can be compiled at a given moment;
|
11
|
-
# therefore, it is not possible to get two consecutive
|
12
|
-
# `compilation_started` notifications without also getting a
|
13
|
-
# `compilation_ended` notification in between them.
|
14
|
-
#
|
15
|
-
# * `compilation_ended` — indicates that the compiler has finished compiling
|
16
|
-
# this item representation (either successfully or with failure). Has one
|
17
|
-
# argument: the item representation itself.
|
18
|
-
#
|
19
|
-
# @api private
|
20
2
|
class Compiler
|
21
|
-
# Provides common functionality for accesing “context” of an item that is being compiled.
|
22
|
-
class CompilationContext
|
23
|
-
attr_reader :site
|
24
|
-
attr_reader :compiled_content_cache
|
25
|
-
attr_reader :snapshot_repo
|
26
|
-
|
27
|
-
def initialize(action_provider:, reps:, site:, compiled_content_cache:, snapshot_repo:)
|
28
|
-
@action_provider = action_provider
|
29
|
-
@reps = reps
|
30
|
-
@site = site
|
31
|
-
@compiled_content_cache = compiled_content_cache
|
32
|
-
@snapshot_repo = snapshot_repo
|
33
|
-
end
|
34
|
-
|
35
|
-
def filter_name_and_args_for_layout(layout)
|
36
|
-
mem = @action_provider.action_sequence_for(layout)
|
37
|
-
if mem.nil? || mem.size != 1 || !mem[0].is_a?(Nanoc::Int::ProcessingActions::Filter)
|
38
|
-
raise Nanoc::Int::Errors::UndefinedFilterForLayout.new(layout)
|
39
|
-
end
|
40
|
-
[mem[0].filter_name, mem[0].params]
|
41
|
-
end
|
42
|
-
|
43
|
-
def create_view_context(dependency_tracker)
|
44
|
-
Nanoc::ViewContext.new(
|
45
|
-
reps: @reps,
|
46
|
-
items: @site.items,
|
47
|
-
dependency_tracker: dependency_tracker,
|
48
|
-
compilation_context: self,
|
49
|
-
snapshot_repo: @snapshot_repo,
|
50
|
-
)
|
51
|
-
end
|
52
|
-
|
53
|
-
def assigns_for(rep, dependency_tracker)
|
54
|
-
last_content = @snapshot_repo.get(rep, :last)
|
55
|
-
content_or_filename_assigns =
|
56
|
-
if last_content.binary?
|
57
|
-
{ filename: last_content.filename }
|
58
|
-
else
|
59
|
-
{ content: last_content.string }
|
60
|
-
end
|
61
|
-
|
62
|
-
view_context = create_view_context(dependency_tracker)
|
63
|
-
|
64
|
-
content_or_filename_assigns.merge(
|
65
|
-
item: Nanoc::ItemWithRepsView.new(rep.item, view_context),
|
66
|
-
rep: Nanoc::ItemRepView.new(rep, view_context),
|
67
|
-
item_rep: Nanoc::ItemRepView.new(rep, view_context),
|
68
|
-
items: Nanoc::ItemCollectionWithRepsView.new(@site.items, view_context),
|
69
|
-
layouts: Nanoc::LayoutCollectionView.new(@site.layouts, view_context),
|
70
|
-
config: Nanoc::ConfigView.new(@site.config, view_context),
|
71
|
-
)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
3
|
include Nanoc::Int::ContractsSupport
|
76
4
|
|
77
5
|
# @api private
|
@@ -92,9 +20,6 @@ module Nanoc::Int
|
|
92
20
|
# @api private
|
93
21
|
attr_reader :dependency_store
|
94
22
|
|
95
|
-
# @api private
|
96
|
-
attr_reader :outdatedness_checker
|
97
|
-
|
98
23
|
# @api private
|
99
24
|
attr_reader :reps
|
100
25
|
|
@@ -104,14 +29,13 @@ module Nanoc::Int
|
|
104
29
|
# @api private
|
105
30
|
attr_reader :snapshot_repo
|
106
31
|
|
107
|
-
def initialize(site, compiled_content_cache:, checksum_store:, action_sequence_store:, action_provider:, dependency_store:,
|
32
|
+
def initialize(site, compiled_content_cache:, checksum_store:, action_sequence_store:, action_provider:, dependency_store:, reps:, outdatedness_store:)
|
108
33
|
@site = site
|
109
34
|
|
110
35
|
@compiled_content_cache = compiled_content_cache
|
111
36
|
@checksum_store = checksum_store
|
112
37
|
@action_sequence_store = action_sequence_store
|
113
38
|
@dependency_store = dependency_store
|
114
|
-
@outdatedness_checker = outdatedness_checker
|
115
39
|
@reps = reps
|
116
40
|
@action_provider = action_provider
|
117
41
|
@outdatedness_store = outdatedness_store
|
@@ -120,55 +44,34 @@ module Nanoc::Int
|
|
120
44
|
@snapshot_repo = Nanoc::Int::SnapshotRepo.new
|
121
45
|
end
|
122
46
|
|
123
|
-
def
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
time_stage(:store_output_state) { store_output_state }
|
133
|
-
time_stage(:postprocess) { @action_provider.postprocess(@site, @reps) }
|
134
|
-
ensure
|
135
|
-
time_stage(:cleanup) { cleanup_stage.run }
|
136
|
-
end
|
137
|
-
|
138
|
-
def load_stores
|
139
|
-
stores.each(&:load)
|
140
|
-
end
|
141
|
-
|
142
|
-
# TODO: rename to store_preprocessed_state
|
143
|
-
def store
|
144
|
-
# Calculate action sequence
|
145
|
-
(@reps.to_a + @site.layouts.to_a).each do |obj|
|
146
|
-
action_sequence_store[obj] = action_provider.action_sequence_for(obj).serialize
|
147
|
-
end
|
148
|
-
|
149
|
-
# Calculate checksums
|
150
|
-
objects_to_checksum =
|
151
|
-
site.items.to_a + site.layouts.to_a + site.code_snippets + [site.config]
|
152
|
-
objects_to_checksum.each { |obj| checksum_store.add(obj) }
|
153
|
-
|
154
|
-
# Store
|
155
|
-
checksum_store.store
|
156
|
-
action_sequence_store.store
|
157
|
-
end
|
158
|
-
|
159
|
-
def store_output_state
|
160
|
-
@dependency_store.store
|
47
|
+
def create_outdatedness_checker
|
48
|
+
Nanoc::Int::OutdatednessChecker.new(
|
49
|
+
site: @site,
|
50
|
+
checksum_store: @checksum_store,
|
51
|
+
dependency_store: @dependency_store,
|
52
|
+
action_sequence_store: @action_sequence_store,
|
53
|
+
action_sequences: @action_sequences,
|
54
|
+
reps: reps,
|
55
|
+
)
|
161
56
|
end
|
162
57
|
|
163
|
-
def
|
164
|
-
|
165
|
-
|
166
|
-
)
|
167
|
-
|
58
|
+
def run_all
|
59
|
+
run_stage(preprocess_stage)
|
60
|
+
@action_sequences = run_stage(build_reps_stage)
|
61
|
+
run_stage(prune_stage)
|
62
|
+
run_stage(load_stores_stage)
|
63
|
+
outdated_items = run_stage(determine_outdatedness_stage)
|
64
|
+
run_stage(forget_outdated_dependencies_stage, outdated_items)
|
65
|
+
run_stage(store_pre_compilation_state_stage)
|
66
|
+
run_stage(compile_reps_stage)
|
67
|
+
run_stage(store_post_compilation_state_stage)
|
68
|
+
run_stage(postprocess_stage)
|
69
|
+
ensure
|
70
|
+
run_stage(cleanup_stage)
|
168
71
|
end
|
169
72
|
|
170
73
|
def compilation_context
|
171
|
-
@_compilation_context ||= CompilationContext.new(
|
74
|
+
@_compilation_context ||= Nanoc::Int::CompilationContext.new(
|
172
75
|
action_provider: action_provider,
|
173
76
|
reps: @reps,
|
174
77
|
site: @site,
|
@@ -177,11 +80,22 @@ module Nanoc::Int
|
|
177
80
|
)
|
178
81
|
end
|
179
82
|
|
83
|
+
# TODO: remove
|
84
|
+
def load_stores
|
85
|
+
load_stores_stage.run
|
86
|
+
end
|
87
|
+
|
88
|
+
# TODO: remove
|
89
|
+
def build_reps
|
90
|
+
@action_sequences = build_reps_stage.run
|
91
|
+
end
|
92
|
+
|
180
93
|
private
|
181
94
|
|
182
|
-
def
|
95
|
+
def run_stage(stage, *args)
|
96
|
+
name = stage.class.to_s
|
183
97
|
Nanoc::Int::NotificationCenter.post(:stage_started, name)
|
184
|
-
|
98
|
+
stage.run(*args)
|
185
99
|
ensure
|
186
100
|
Nanoc::Int::NotificationCenter.post(:stage_ended, name)
|
187
101
|
end
|
@@ -195,6 +109,14 @@ module Nanoc::Int
|
|
195
109
|
)
|
196
110
|
end
|
197
111
|
|
112
|
+
def build_reps_stage
|
113
|
+
@_build_reps_stage ||= Stages::BuildReps.new(
|
114
|
+
site: site,
|
115
|
+
action_provider: action_provider,
|
116
|
+
reps: @reps,
|
117
|
+
)
|
118
|
+
end
|
119
|
+
|
198
120
|
def prune_stage
|
199
121
|
@_prune_stage ||= Stages::Prune.new(
|
200
122
|
config: site.config,
|
@@ -202,14 +124,37 @@ module Nanoc::Int
|
|
202
124
|
)
|
203
125
|
end
|
204
126
|
|
127
|
+
def load_stores_stage
|
128
|
+
@_load_stores_stage ||= Stages::LoadStores.new(
|
129
|
+
checksum_store: checksum_store,
|
130
|
+
compiled_content_cache: compiled_content_cache,
|
131
|
+
dependency_store: @dependency_store,
|
132
|
+
action_sequence_store: action_sequence_store,
|
133
|
+
outdatedness_store: @outdatedness_store,
|
134
|
+
)
|
135
|
+
end
|
136
|
+
|
205
137
|
def determine_outdatedness_stage
|
206
138
|
@_determine_outdatedness_stage ||= Stages::DetermineOutdatedness.new(
|
207
139
|
reps: reps,
|
208
|
-
outdatedness_checker:
|
140
|
+
outdatedness_checker: create_outdatedness_checker,
|
209
141
|
outdatedness_store: outdatedness_store,
|
210
142
|
)
|
211
143
|
end
|
212
144
|
|
145
|
+
def store_pre_compilation_state_stage
|
146
|
+
@_store_pre_compilation_state_stage ||= Stages::StorePreCompilationState.new(
|
147
|
+
reps: @reps,
|
148
|
+
layouts: site.layouts,
|
149
|
+
items: site.items,
|
150
|
+
code_snippets: site.code_snippets,
|
151
|
+
config: site.config,
|
152
|
+
checksum_store: checksum_store,
|
153
|
+
action_sequence_store: action_sequence_store,
|
154
|
+
action_sequences: @action_sequences,
|
155
|
+
)
|
156
|
+
end
|
157
|
+
|
213
158
|
def compile_reps_stage
|
214
159
|
@_compile_reps_stage ||= Stages::CompileReps.new(
|
215
160
|
outdatedness_store: @outdatedness_store,
|
@@ -220,30 +165,28 @@ module Nanoc::Int
|
|
220
165
|
)
|
221
166
|
end
|
222
167
|
|
223
|
-
def
|
224
|
-
@
|
168
|
+
def store_post_compilation_state_stage
|
169
|
+
@_store_post_compilation_state_stage ||= Stages::StorePostCompilationState.new(
|
170
|
+
dependency_store: dependency_store,
|
171
|
+
)
|
225
172
|
end
|
226
173
|
|
227
|
-
def
|
228
|
-
|
229
|
-
@
|
230
|
-
|
174
|
+
def postprocess_stage
|
175
|
+
@_postprocess_stage ||= Stages::Postprocess.new(
|
176
|
+
action_provider: @action_provider,
|
177
|
+
site: @site,
|
178
|
+
reps: @reps,
|
179
|
+
)
|
231
180
|
end
|
232
181
|
|
233
|
-
def
|
234
|
-
@
|
182
|
+
def cleanup_stage
|
183
|
+
@_cleanup_stage ||= Stages::Cleanup.new(site.config)
|
235
184
|
end
|
236
185
|
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
checksum_store,
|
242
|
-
compiled_content_cache,
|
243
|
-
@dependency_store,
|
244
|
-
action_sequence_store,
|
245
|
-
@outdatedness_store,
|
246
|
-
]
|
186
|
+
def forget_outdated_dependencies_stage
|
187
|
+
@_forget_outdated_dependencies_stage ||= Stages::ForgetOutdatedDependencies.new(
|
188
|
+
dependency_store: @dependency_store,
|
189
|
+
)
|
247
190
|
end
|
248
191
|
end
|
249
192
|
end
|
@@ -19,16 +19,6 @@ module Nanoc::Int
|
|
19
19
|
outdatedness_store =
|
20
20
|
Nanoc::Int::OutdatednessStore.new(site: site, reps: item_rep_repo)
|
21
21
|
|
22
|
-
outdatedness_checker =
|
23
|
-
Nanoc::Int::OutdatednessChecker.new(
|
24
|
-
site: site,
|
25
|
-
checksum_store: checksum_store,
|
26
|
-
dependency_store: dependency_store,
|
27
|
-
action_sequence_store: action_sequence_store,
|
28
|
-
action_provider: action_provider,
|
29
|
-
reps: item_rep_repo,
|
30
|
-
)
|
31
|
-
|
32
22
|
compiled_content_cache =
|
33
23
|
Nanoc::Int::CompiledContentCache.new(
|
34
24
|
site: site,
|
@@ -40,7 +30,6 @@ module Nanoc::Int
|
|
40
30
|
checksum_store: checksum_store,
|
41
31
|
action_sequence_store: action_sequence_store,
|
42
32
|
dependency_store: dependency_store,
|
43
|
-
outdatedness_checker: outdatedness_checker,
|
44
33
|
reps: item_rep_repo,
|
45
34
|
action_provider: action_provider,
|
46
35
|
outdatedness_store: outdatedness_store,
|
@@ -82,61 +82,46 @@ module Nanoc::Int
|
|
82
82
|
attr_reader :checksum_store
|
83
83
|
attr_reader :dependency_store
|
84
84
|
attr_reader :action_sequence_store
|
85
|
-
attr_reader :
|
85
|
+
attr_reader :action_sequences
|
86
86
|
attr_reader :site
|
87
87
|
|
88
88
|
Reasons = Nanoc::Int::OutdatednessReasons
|
89
89
|
|
90
90
|
C_OBJ = C::Or[Nanoc::Int::Item, Nanoc::Int::ItemRep, Nanoc::Int::Layout]
|
91
|
+
C_ACTION_SEQUENCES = C::HashOf[C_OBJ => Nanoc::Int::ActionSequence]
|
91
92
|
|
92
|
-
|
93
|
-
|
94
|
-
def initialize(site:, checksum_store:, dependency_store:, action_sequence_store:, action_provider:, reps:)
|
93
|
+
contract C::KeywordArgs[site: Nanoc::Int::Site, checksum_store: Nanoc::Int::ChecksumStore, dependency_store: Nanoc::Int::DependencyStore, action_sequence_store: Nanoc::Int::ActionSequenceStore, action_sequences: C_ACTION_SEQUENCES, reps: Nanoc::Int::ItemRepRepo] => C::Any
|
94
|
+
def initialize(site:, checksum_store:, dependency_store:, action_sequence_store:, action_sequences:, reps:)
|
95
95
|
@site = site
|
96
96
|
@checksum_store = checksum_store
|
97
97
|
@dependency_store = dependency_store
|
98
98
|
@action_sequence_store = action_sequence_store
|
99
|
-
@
|
99
|
+
@action_sequences = action_sequences
|
100
100
|
@reps = reps
|
101
101
|
|
102
102
|
@objects_outdated_due_to_dependencies = {}
|
103
103
|
end
|
104
104
|
|
105
105
|
def action_sequence_for(rep)
|
106
|
-
|
107
|
-
@action_provider.action_sequence_for(rep)
|
106
|
+
@action_sequences.fetch(rep)
|
108
107
|
end
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
# recompiled.
|
114
|
-
#
|
115
|
-
# @param [Nanoc::Int::Item, Nanoc::Int::ItemRep, Nanoc::Int::Layout] obj The object
|
116
|
-
# whose outdatedness should be checked.
|
117
|
-
#
|
118
|
-
# @return [Boolean] true if the object is outdated, false otherwise
|
119
|
-
def outdated?(obj, _action_sequences = nil)
|
120
|
-
# TODO: use action_sequences
|
121
|
-
!outdatedness_reason_for(obj).nil?
|
108
|
+
|
109
|
+
contract C_OBJ => C::Bool
|
110
|
+
def outdated?(obj)
|
111
|
+
outdatedness_reasons_for(obj).any?
|
122
112
|
end
|
123
113
|
|
124
|
-
contract C::Or[Nanoc::Int::Item, Nanoc::Int::ItemRep, Nanoc::Int::Layout] => C::
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
reason = basic_outdatedness_reason_for(obj)
|
134
|
-
if reason.nil? && outdated_due_to_dependencies?(obj)
|
135
|
-
reason = Reasons::DependenciesOutdated
|
114
|
+
contract C::Or[Nanoc::Int::Item, Nanoc::Int::ItemRep, Nanoc::Int::Layout] => C::IterOf[Reasons::Generic]
|
115
|
+
def outdatedness_reasons_for(obj)
|
116
|
+
reasons = basic.outdatedness_status_for(obj).reasons
|
117
|
+
if reasons.any?
|
118
|
+
reasons
|
119
|
+
elsif outdated_due_to_dependencies?(obj)
|
120
|
+
[Reasons::DependenciesOutdated]
|
121
|
+
else
|
122
|
+
[]
|
136
123
|
end
|
137
|
-
reason
|
138
124
|
end
|
139
|
-
memoize :outdatedness_reason_for
|
140
125
|
|
141
126
|
private
|
142
127
|
|
@@ -145,12 +130,6 @@ module Nanoc::Int
|
|
145
130
|
@_basic ||= Basic.new(outdatedness_checker: self, reps: @reps)
|
146
131
|
end
|
147
132
|
|
148
|
-
contract C::Or[Nanoc::Int::Item, Nanoc::Int::ItemRep, Nanoc::Int::Layout] => C::Maybe[Reasons::Generic]
|
149
|
-
def basic_outdatedness_reason_for(obj)
|
150
|
-
# FIXME: Stop using this; it is no longer accurate, as there can be >1 reasons
|
151
|
-
basic.outdatedness_status_for(obj).reasons.first
|
152
|
-
end
|
153
|
-
|
154
133
|
contract C::Or[Nanoc::Int::Item, Nanoc::Int::ItemRep, Nanoc::Int::Layout], Hamster::Set => C::Bool
|
155
134
|
def outdated_due_to_dependencies?(obj, processed = Hamster::Set.new)
|
156
135
|
# Convert from rep to item if necessary
|
data/lib/nanoc/base/services.rb
CHANGED
@@ -3,8 +3,8 @@ module Nanoc::CLI::Commands::CompileListeners
|
|
3
3
|
attr_reader :telemetry
|
4
4
|
|
5
5
|
# @see Listener#enable_for?
|
6
|
-
def self.enable_for?(
|
7
|
-
|
6
|
+
def self.enable_for?(_command_runner)
|
7
|
+
Nanoc::CLI.verbosity >= 1
|
8
8
|
end
|
9
9
|
|
10
10
|
# @param [Enumerable<Nanoc::Int::ItemRep>] reps
|
@@ -129,12 +129,7 @@ module Nanoc::CLI::Commands
|
|
129
129
|
sorted_reps_with_prev(items) do |rep, prev|
|
130
130
|
puts if prev
|
131
131
|
puts "item #{rep.item.identifier}, rep #{rep.name}:"
|
132
|
-
|
133
|
-
if outdatedness_reason
|
134
|
-
puts " is outdated: #{outdatedness_reason.message}"
|
135
|
-
else
|
136
|
-
puts ' is not outdated'
|
137
|
-
end
|
132
|
+
print_outdatedness_reasons_for(rep, compiler)
|
138
133
|
end
|
139
134
|
end
|
140
135
|
|
@@ -144,13 +139,20 @@ module Nanoc::CLI::Commands
|
|
144
139
|
sorted_with_prev(layouts) do |layout, prev|
|
145
140
|
puts if prev
|
146
141
|
puts "layout #{layout.identifier}:"
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
142
|
+
print_outdatedness_reasons_for(layout, compiler)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def print_outdatedness_reasons_for(obj, compiler)
|
147
|
+
outdatedness_checker = compiler.create_outdatedness_checker
|
148
|
+
reasons = outdatedness_checker.outdatedness_reasons_for(obj)
|
149
|
+
if reasons.any?
|
150
|
+
puts ' is outdated:'
|
151
|
+
reasons.each do |reason|
|
152
|
+
puts " - #{reason.message}"
|
152
153
|
end
|
153
|
-
|
154
|
+
else
|
155
|
+
puts ' is not outdated'
|
154
156
|
end
|
155
157
|
end
|
156
158
|
end
|
data/lib/nanoc/version.rb
CHANGED
@@ -7,7 +7,6 @@ describe Nanoc::Int::Compiler do
|
|
7
7
|
action_sequence_store: action_sequence_store,
|
8
8
|
action_provider: action_provider,
|
9
9
|
dependency_store: dependency_store,
|
10
|
-
outdatedness_checker: outdatedness_checker,
|
11
10
|
reps: reps,
|
12
11
|
outdatedness_store: outdatedness_store,
|
13
12
|
)
|
@@ -19,7 +18,6 @@ describe Nanoc::Int::Compiler do
|
|
19
18
|
let(:dependency_store) { Nanoc::Int::DependencyStore.new(items.to_a) }
|
20
19
|
let(:reps) { Nanoc::Int::ItemRepRepo.new }
|
21
20
|
|
22
|
-
let(:outdatedness_checker) { double(:outdatedness_checker) }
|
23
21
|
let(:outdatedness_store) { Nanoc::Int::OutdatednessStore.new(site: site, reps: reps) }
|
24
22
|
let(:action_provider) { double(:action_provider) }
|
25
23
|
|
@@ -65,9 +63,6 @@ describe Nanoc::Int::Compiler do
|
|
65
63
|
rep.snapshot_defs << Nanoc::Int::SnapshotDef.new(:last, binary: false)
|
66
64
|
end
|
67
65
|
|
68
|
-
allow(outdatedness_checker).to receive(:outdated?).with(rep).and_return(true)
|
69
|
-
allow(outdatedness_checker).to receive(:outdated?).with(other_rep).and_return(true)
|
70
|
-
|
71
66
|
# FIXME: eww
|
72
67
|
action_sequences = { rep => memory, other_rep => memory }
|
73
68
|
compiler.instance_variable_set(:@action_sequences, action_sequences)
|
@@ -9,4 +9,38 @@ describe Nanoc::Int::IdentifiableCollection do
|
|
9
9
|
|
10
10
|
it { is_expected.to be_a(described_class) }
|
11
11
|
end
|
12
|
+
|
13
|
+
describe '#find_all' do
|
14
|
+
let(:objects) do
|
15
|
+
[
|
16
|
+
double(:identifiable, identifier: Nanoc::Identifier.new('/about.css')),
|
17
|
+
double(:identifiable, identifier: Nanoc::Identifier.new('/about.md')),
|
18
|
+
double(:identifiable, identifier: Nanoc::Identifier.new('/style.css')),
|
19
|
+
]
|
20
|
+
end
|
21
|
+
|
22
|
+
let(:arg) { raise 'override me' }
|
23
|
+
|
24
|
+
subject { identifiable_collection.find_all(arg) }
|
25
|
+
|
26
|
+
context 'with string' do
|
27
|
+
let(:arg) { '/*.css' }
|
28
|
+
|
29
|
+
it 'contains objects' do
|
30
|
+
expect(subject.size).to eql(2)
|
31
|
+
expect(subject.find { |iv| iv.identifier == '/about.css' }).to eq(objects[0])
|
32
|
+
expect(subject.find { |iv| iv.identifier == '/style.css' }).to eq(objects[2])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'with regex' do
|
37
|
+
let(:arg) { %r{\.css\z} }
|
38
|
+
|
39
|
+
it 'contains objects' do
|
40
|
+
expect(subject.size).to eql(2)
|
41
|
+
expect(subject.find { |iv| iv.identifier == '/about.css' }).to eq(objects[0])
|
42
|
+
expect(subject.find { |iv| iv.identifier == '/style.css' }).to eq(objects[2])
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
12
46
|
end
|
@@ -2,7 +2,7 @@ describe Nanoc::Int::Executor do
|
|
2
2
|
let(:executor) { described_class.new(rep, compilation_context, dependency_tracker) }
|
3
3
|
|
4
4
|
let(:compilation_context) do
|
5
|
-
Nanoc::Int::
|
5
|
+
Nanoc::Int::CompilationContext.new(
|
6
6
|
action_provider: action_provider,
|
7
7
|
reps: reps,
|
8
8
|
site: site,
|
@@ -5,7 +5,7 @@ describe Nanoc::Int::OutdatednessChecker do
|
|
5
5
|
checksum_store: checksum_store,
|
6
6
|
dependency_store: dependency_store,
|
7
7
|
action_sequence_store: action_sequence_store,
|
8
|
-
|
8
|
+
action_sequences: action_sequences,
|
9
9
|
reps: reps,
|
10
10
|
)
|
11
11
|
end
|
@@ -38,7 +38,9 @@ describe Nanoc::Int::OutdatednessChecker do
|
|
38
38
|
|
39
39
|
let(:new_action_sequence_for_item_rep) { old_action_sequence_for_item_rep }
|
40
40
|
|
41
|
-
let(:
|
41
|
+
let(:action_sequences) do
|
42
|
+
{ item_rep => new_action_sequence_for_item_rep }
|
43
|
+
end
|
42
44
|
|
43
45
|
let(:reps) do
|
44
46
|
Nanoc::Int::ItemRepRepo.new
|
@@ -52,12 +54,10 @@ describe Nanoc::Int::OutdatednessChecker do
|
|
52
54
|
before do
|
53
55
|
reps << item_rep
|
54
56
|
action_sequence_store[item_rep] = old_action_sequence_for_item_rep.serialize
|
55
|
-
|
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
|
-
describe '
|
60
|
-
subject { outdatedness_checker.send(:
|
59
|
+
describe 'basic outdatedness reasons' do
|
60
|
+
subject { outdatedness_checker.send(:basic).outdatedness_status_for(obj).reasons.first }
|
61
61
|
|
62
62
|
let(:checksum_store) { Nanoc::Int::ChecksumStore.new(objects: objects) }
|
63
63
|
|
@@ -131,6 +131,13 @@ describe Nanoc::Int::OutdatednessChecker do
|
|
131
131
|
|
132
132
|
let(:new_action_sequence_for_other_item_rep) { old_action_sequence_for_other_item_rep }
|
133
133
|
|
134
|
+
let(:action_sequences) do
|
135
|
+
{
|
136
|
+
item_rep => new_action_sequence_for_item_rep,
|
137
|
+
other_item_rep => new_action_sequence_for_other_item_rep,
|
138
|
+
}
|
139
|
+
end
|
140
|
+
|
134
141
|
before do
|
135
142
|
reps << other_item_rep
|
136
143
|
action_sequence_store[other_item_rep] = old_action_sequence_for_other_item_rep.serialize
|
@@ -138,7 +145,6 @@ describe Nanoc::Int::OutdatednessChecker do
|
|
138
145
|
checksum_store.add(other_item)
|
139
146
|
checksum_store.add(config)
|
140
147
|
|
141
|
-
allow(action_provider).to receive(:action_sequence_for).with(other_item_rep).and_return(new_action_sequence_for_other_item_rep)
|
142
148
|
allow(site).to receive(:code_snippets).and_return([])
|
143
149
|
allow(site).to receive(:config).and_return(config)
|
144
150
|
end
|
@@ -147,11 +153,18 @@ describe Nanoc::Int::OutdatednessChecker do
|
|
147
153
|
let(:distant_item) { Nanoc::Int::Item.new('distant stuff', {}, '/distant.md') }
|
148
154
|
let(:distant_item_rep) { Nanoc::Int::ItemRep.new(distant_item, :default) }
|
149
155
|
|
156
|
+
let(:action_sequences) do
|
157
|
+
{
|
158
|
+
item_rep => new_action_sequence_for_item_rep,
|
159
|
+
other_item_rep => new_action_sequence_for_other_item_rep,
|
160
|
+
distant_item_rep => new_action_sequence_for_other_item_rep,
|
161
|
+
}
|
162
|
+
end
|
163
|
+
|
150
164
|
before do
|
151
165
|
reps << distant_item_rep
|
152
166
|
checksum_store.add(distant_item)
|
153
167
|
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
168
|
end
|
156
169
|
|
157
170
|
context 'on attribute + attribute' do
|