nanoc 4.7.4 → 4.7.5
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 +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
|