nanoc-core 4.11.12 → 4.11.13

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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/lib/nanoc/core.rb +37 -0
  3. data/lib/nanoc/core/basic_item_rep_collection_view.rb +88 -0
  4. data/lib/nanoc/core/basic_item_rep_view.rb +83 -0
  5. data/lib/nanoc/core/basic_item_view.rb +54 -0
  6. data/lib/nanoc/core/checksummer.rb +2 -0
  7. data/lib/nanoc/core/compilation_item_rep_collection_view.rb +12 -0
  8. data/lib/nanoc/core/compilation_item_rep_view.rb +51 -0
  9. data/lib/nanoc/core/compilation_item_view.rb +47 -0
  10. data/lib/nanoc/core/compilation_phases/abstract.rb +48 -0
  11. data/lib/nanoc/core/compilation_phases/cache.rb +43 -0
  12. data/lib/nanoc/core/compilation_phases/mark_done.rb +23 -0
  13. data/lib/nanoc/core/compilation_phases/notify.rb +19 -0
  14. data/lib/nanoc/core/compilation_phases/recalculate.rb +49 -0
  15. data/lib/nanoc/core/compilation_phases/resume.rb +52 -0
  16. data/lib/nanoc/core/compilation_phases/write.rb +84 -0
  17. data/lib/nanoc/core/compilation_stages/build_reps.rb +36 -0
  18. data/lib/nanoc/core/compilation_stages/calculate_checksums.rb +42 -0
  19. data/lib/nanoc/core/compilation_stages/cleanup.rb +43 -0
  20. data/lib/nanoc/core/compilation_stages/compile_reps.rb +96 -0
  21. data/lib/nanoc/core/compilation_stages/determine_outdatedness.rb +49 -0
  22. data/lib/nanoc/core/compilation_stages/forget_outdated_dependencies.rb +20 -0
  23. data/lib/nanoc/core/compilation_stages/load_stores.rb +35 -0
  24. data/lib/nanoc/core/compilation_stages/postprocess.rb +21 -0
  25. data/lib/nanoc/core/compilation_stages/preprocess.rb +32 -0
  26. data/lib/nanoc/core/compilation_stages/prune.rb +30 -0
  27. data/lib/nanoc/core/compilation_stages/store_post_compilation_state.rb +20 -0
  28. data/lib/nanoc/core/compilation_stages/store_pre_compilation_state.rb +32 -0
  29. data/lib/nanoc/core/compiler.rb +214 -0
  30. data/lib/nanoc/core/compiler_loader.rb +48 -0
  31. data/lib/nanoc/core/config_loader.rb +95 -0
  32. data/lib/nanoc/core/config_view.rb +67 -0
  33. data/lib/nanoc/core/configuration.rb +2 -4
  34. data/lib/nanoc/core/document_view_mixin.rb +87 -0
  35. data/lib/nanoc/core/errors.rb +97 -0
  36. data/lib/nanoc/core/executor.rb +134 -0
  37. data/lib/nanoc/core/feature.rb +92 -0
  38. data/lib/nanoc/core/filter.rb +269 -0
  39. data/lib/nanoc/core/identifiable_collection_view.rb +111 -0
  40. data/lib/nanoc/core/item_collection_with_reps_view.rb +12 -0
  41. data/lib/nanoc/core/item_collection_without_reps_view.rb +12 -0
  42. data/lib/nanoc/core/item_rep_builder.rb +54 -0
  43. data/lib/nanoc/core/item_rep_selector.rb +67 -0
  44. data/lib/nanoc/core/item_rep_writer.rb +85 -0
  45. data/lib/nanoc/core/layout_collection_view.rb +12 -0
  46. data/lib/nanoc/core/layout_view.rb +9 -0
  47. data/lib/nanoc/core/mutable_config_view.rb +16 -0
  48. data/lib/nanoc/core/mutable_document_view_mixin.rb +60 -0
  49. data/lib/nanoc/core/mutable_identifiable_collection_view.rb +19 -0
  50. data/lib/nanoc/core/mutable_item_collection_view.rb +34 -0
  51. data/lib/nanoc/core/mutable_item_view.rb +9 -0
  52. data/lib/nanoc/core/mutable_layout_collection_view.rb +26 -0
  53. data/lib/nanoc/core/mutable_layout_view.rb +9 -0
  54. data/lib/nanoc/core/outdatedness_checker.rb +222 -0
  55. data/lib/nanoc/core/outdatedness_rules/attributes_modified.rb +41 -0
  56. data/lib/nanoc/core/outdatedness_rules/code_snippets_modified.rb +31 -0
  57. data/lib/nanoc/core/outdatedness_rules/content_modified.rb +21 -0
  58. data/lib/nanoc/core/outdatedness_rules/item_collection_extended.rb +20 -0
  59. data/lib/nanoc/core/outdatedness_rules/layout_collection_extended.rb +20 -0
  60. data/lib/nanoc/core/outdatedness_rules/not_written.rb +17 -0
  61. data/lib/nanoc/core/outdatedness_rules/rules_modified.rb +45 -0
  62. data/lib/nanoc/core/outdatedness_rules/uses_always_outdated_filter.rb +26 -0
  63. data/lib/nanoc/core/post_compile_item_collection_view.rb +12 -0
  64. data/lib/nanoc/core/post_compile_item_rep_collection_view.rb +12 -0
  65. data/lib/nanoc/core/post_compile_item_rep_view.rb +33 -0
  66. data/lib/nanoc/core/post_compile_item_view.rb +20 -0
  67. data/lib/nanoc/core/pruner.rb +119 -0
  68. data/lib/nanoc/core/site_loader.rb +102 -0
  69. data/lib/nanoc/core/trivial_error.rb +10 -0
  70. data/lib/nanoc/core/version.rb +1 -1
  71. data/lib/nanoc/core/view.rb +43 -0
  72. data/lib/nanoc/core/view_context_for_compilation.rb +6 -6
  73. metadata +95 -2
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nanoc
4
+ module Core
5
+ module CompilationStages
6
+ class DetermineOutdatedness < Nanoc::Core::CompilationStage
7
+ include Nanoc::Core::ContractsSupport
8
+
9
+ def initialize(reps:, outdatedness_checker:, outdatedness_store:)
10
+ @reps = reps
11
+ @outdatedness_checker = outdatedness_checker
12
+ @outdatedness_store = outdatedness_store
13
+ end
14
+
15
+ contract C::None => C::Any
16
+ def run
17
+ outdated_items = select_outdated_items
18
+ outdated_reps = reps_of_items(outdated_items)
19
+
20
+ store_outdated_reps(outdated_reps)
21
+
22
+ outdated_items
23
+ end
24
+
25
+ private
26
+
27
+ def store_outdated_reps(reps)
28
+ @outdatedness_store.clear
29
+ reps.each { |r| @outdatedness_store.add(r) }
30
+ end
31
+
32
+ def select_outdated_items
33
+ @reps
34
+ .select { |r| outdated?(r) }
35
+ .map(&:item)
36
+ .uniq
37
+ end
38
+
39
+ def reps_of_items(items)
40
+ Set.new(items.flat_map { |i| @reps[i] })
41
+ end
42
+
43
+ def outdated?(rep)
44
+ @outdatedness_store.include?(rep) || @outdatedness_checker.outdated?(rep)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nanoc
4
+ module Core
5
+ module CompilationStages
6
+ class ForgetOutdatedDependencies < Nanoc::Core::CompilationStage
7
+ include Nanoc::Core::ContractsSupport
8
+
9
+ def initialize(dependency_store:)
10
+ @dependency_store = dependency_store
11
+ end
12
+
13
+ contract C::IterOf[Nanoc::Core::Item] => C::Any
14
+ def run(outdated_items)
15
+ outdated_items.each { |i| @dependency_store.forget_dependencies_for(i) }
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nanoc
4
+ module Core
5
+ module CompilationStages
6
+ class LoadStores < Nanoc::Core::CompilationStage
7
+ include Nanoc::Core::ContractsSupport
8
+
9
+ def initialize(checksum_store:, compiled_content_cache:, dependency_store:, action_sequence_store:, outdatedness_store:)
10
+ @checksum_store = checksum_store
11
+ @compiled_content_cache = compiled_content_cache
12
+ @dependency_store = dependency_store
13
+ @action_sequence_store = action_sequence_store
14
+ @outdatedness_store = outdatedness_store
15
+ end
16
+
17
+ contract C::None => C::Any
18
+ def run
19
+ load_store(@checksum_store)
20
+ load_store(@compiled_content_cache)
21
+ load_store(@dependency_store)
22
+ load_store(@action_sequence_store)
23
+ load_store(@outdatedness_store)
24
+ end
25
+
26
+ contract Nanoc::Core::Store => C::Any
27
+ def load_store(store)
28
+ Nanoc::Core::Instrumentor.call(:store_loaded, store.class) do
29
+ store.load
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nanoc
4
+ module Core
5
+ module CompilationStages
6
+ class Postprocess < Nanoc::Core::CompilationStage
7
+ include Nanoc::Core::ContractsSupport
8
+
9
+ def initialize(action_provider:, site:)
10
+ @action_provider = action_provider
11
+ @site = site
12
+ end
13
+
14
+ contract Nanoc::Core::Compiler => C::Any
15
+ def run(compiler)
16
+ @action_provider.postprocess(@site, compiler)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nanoc
4
+ module Core
5
+ module CompilationStages
6
+ class Preprocess < Nanoc::Core::CompilationStage
7
+ def initialize(action_provider:, site:, dependency_store:, checksum_store:)
8
+ @action_provider = action_provider
9
+ @site = site
10
+ @dependency_store = dependency_store
11
+ @checksum_store = checksum_store
12
+ end
13
+
14
+ def run
15
+ return if @site.preprocessed?
16
+
17
+ if @action_provider.need_preprocessing?
18
+ @site.data_source = Nanoc::Core::InMemoryDataSource.new(@site.items, @site.layouts, @site.data_source)
19
+ @action_provider.preprocess(@site)
20
+
21
+ @dependency_store.items = @site.items
22
+ @dependency_store.layouts = @site.layouts
23
+ @checksum_store.objects = @site.items.to_a + @site.layouts.to_a + @site.code_snippets + [@site.config]
24
+ end
25
+
26
+ @site.mark_as_preprocessed
27
+ @site.freeze
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nanoc
4
+ module Core
5
+ module CompilationStages
6
+ class Prune < Nanoc::Core::CompilationStage
7
+ def initialize(config:, reps:)
8
+ @config = config
9
+ @reps = reps
10
+ end
11
+
12
+ def run
13
+ if @config[:prune][:auto_prune]
14
+ Nanoc::Core::Pruner.new(@config, @reps, exclude: prune_config_exclude).run
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def prune_config
21
+ @config[:prune] || {}
22
+ end
23
+
24
+ def prune_config_exclude
25
+ prune_config[:exclude] || {}
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nanoc
4
+ module Core
5
+ module CompilationStages
6
+ class StorePostCompilationState < Nanoc::Core::CompilationStage
7
+ include Nanoc::Core::ContractsSupport
8
+
9
+ def initialize(dependency_store:)
10
+ @dependency_store = dependency_store
11
+ end
12
+
13
+ contract C::None => C::Any
14
+ def run
15
+ @dependency_store.store
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nanoc
4
+ module Core
5
+ module CompilationStages
6
+ class StorePreCompilationState < Nanoc::Core::CompilationStage
7
+ include Nanoc::Core::ContractsSupport
8
+
9
+ def initialize(reps:, layouts:, checksum_store:, action_sequence_store:, action_sequences:)
10
+ @reps = reps
11
+ @layouts = layouts
12
+ @checksum_store = checksum_store
13
+ @action_sequence_store = action_sequence_store
14
+ @action_sequences = action_sequences
15
+ end
16
+
17
+ contract Nanoc::Core::ChecksumCollection => C::Any
18
+ def run(checksums)
19
+ # Calculate action sequence
20
+ (@reps.to_a + @layouts.to_a).each do |obj|
21
+ @action_sequence_store[obj] = @action_sequences[obj].serialize
22
+ end
23
+ @action_sequence_store.store
24
+
25
+ # Set checksums
26
+ @checksum_store.checksums = checksums.to_h
27
+ @checksum_store.store
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,214 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nanoc
4
+ module Core
5
+ class Compiler
6
+ include Nanoc::Core::ContractsSupport
7
+
8
+ def initialize(site, compiled_content_cache:, checksum_store:, action_sequence_store:, action_provider:, dependency_store:, outdatedness_store:)
9
+ @site = site
10
+
11
+ # Needed because configuration is mutable :(
12
+ @output_dirs = @site.config.output_dirs
13
+
14
+ @compiled_content_cache = compiled_content_cache
15
+ @checksum_store = checksum_store
16
+ @action_sequence_store = action_sequence_store
17
+ @dependency_store = dependency_store
18
+ @action_provider = action_provider
19
+ @outdatedness_store = outdatedness_store
20
+
21
+ @compiled_content_store = Nanoc::Core::CompiledContentStore.new
22
+ end
23
+
24
+ contract Nanoc::Core::Site => C::Any
25
+ def self.compile(site)
26
+ new_for(site).run_until_end
27
+ end
28
+
29
+ contract Nanoc::Core::Site => Nanoc::Core::Compiler
30
+ def self.new_for(site)
31
+ Nanoc::Core::CompilerLoader.new.load(site)
32
+ end
33
+
34
+ def run_until_preprocessed
35
+ @_res_preprocessed ||= begin
36
+ preprocess_stage.call
37
+ {}
38
+ end
39
+ end
40
+
41
+ def run_until_reps_built
42
+ @_res_reps_built ||= begin
43
+ prev = run_until_preprocessed
44
+
45
+ res = build_reps_stage.call
46
+
47
+ prev.merge(
48
+ reps: res.fetch(:reps),
49
+ action_sequences: res.fetch(:action_sequences),
50
+ )
51
+ end
52
+ end
53
+
54
+ def run_until_precompiled
55
+ @_res_precompiled ||= begin
56
+ prev = run_until_reps_built
57
+ action_sequences = prev.fetch(:action_sequences)
58
+ reps = prev.fetch(:reps)
59
+
60
+ load_stores_stage.call
61
+ checksums = calculate_checksums_stage.call
62
+ outdatedness_checker = create_outdatedness_checker(
63
+ checksums: checksums,
64
+ action_sequences: action_sequences,
65
+ reps: reps,
66
+ )
67
+ outdated_items = determine_outdatedness_stage(outdatedness_checker, reps).call
68
+
69
+ prev.merge(
70
+ checksums: checksums,
71
+ dependency_store: @dependency_store,
72
+ outdatedness_checker: outdatedness_checker,
73
+ outdated_items: outdated_items,
74
+ )
75
+ end
76
+ end
77
+
78
+ def run_until_end
79
+ res = run_until_precompiled
80
+ action_sequences = res.fetch(:action_sequences)
81
+ reps = res.fetch(:reps)
82
+ checksums = res.fetch(:checksums)
83
+ outdated_items = res.fetch(:outdated_items)
84
+
85
+ forget_outdated_dependencies_stage.call(outdated_items)
86
+ store_pre_compilation_state_stage(action_sequences, reps).call(checksums)
87
+ prune_stage(reps).call
88
+ compile_reps_stage(action_sequences, reps).call
89
+ store_post_compilation_state_stage.call
90
+ postprocess_stage.call(self)
91
+ ensure
92
+ cleanup_stage.call
93
+ end
94
+
95
+ def compilation_context(reps:)
96
+ Nanoc::Core::CompilationContext.new(
97
+ action_provider: @action_provider,
98
+ reps: reps,
99
+ site: @site,
100
+ compiled_content_cache: @compiled_content_cache,
101
+ compiled_content_store: @compiled_content_store,
102
+ )
103
+ end
104
+
105
+ private
106
+
107
+ def create_outdatedness_checker(checksums:, action_sequences:, reps:)
108
+ Nanoc::Core::OutdatednessChecker.new(
109
+ site: @site,
110
+ checksum_store: @checksum_store,
111
+ dependency_store: @dependency_store,
112
+ action_sequence_store: @action_sequence_store,
113
+ action_sequences: action_sequences,
114
+ checksums: checksums,
115
+ reps: reps,
116
+ )
117
+ end
118
+
119
+ def preprocess_stage
120
+ @_preprocess_stage ||= ::Nanoc::Core::CompilationStages::Preprocess.new(
121
+ action_provider: @action_provider,
122
+ site: @site,
123
+ dependency_store: @dependency_store,
124
+ checksum_store: @checksum_store,
125
+ )
126
+ end
127
+
128
+ def build_reps_stage
129
+ @_build_reps_stage ||= ::Nanoc::Core::CompilationStages::BuildReps.new(
130
+ site: @site,
131
+ action_provider: @action_provider,
132
+ )
133
+ end
134
+
135
+ def prune_stage(reps)
136
+ @_prune_stage ||= ::Nanoc::Core::CompilationStages::Prune.new(
137
+ config: @site.config,
138
+ reps: reps,
139
+ )
140
+ end
141
+
142
+ def load_stores_stage
143
+ @_load_stores_stage ||= ::Nanoc::Core::CompilationStages::LoadStores.new(
144
+ checksum_store: @checksum_store,
145
+ compiled_content_cache: @compiled_content_cache,
146
+ dependency_store: @dependency_store,
147
+ action_sequence_store: @action_sequence_store,
148
+ outdatedness_store: @outdatedness_store,
149
+ )
150
+ end
151
+
152
+ def calculate_checksums_stage
153
+ @_calculate_checksums_stage ||= ::Nanoc::Core::CompilationStages::CalculateChecksums.new(
154
+ items: @site.items,
155
+ layouts: @site.layouts,
156
+ code_snippets: @site.code_snippets,
157
+ config: @site.config,
158
+ )
159
+ end
160
+
161
+ def determine_outdatedness_stage(outdatedness_checker, reps)
162
+ @_determine_outdatedness_stage ||= ::Nanoc::Core::CompilationStages::DetermineOutdatedness.new(
163
+ reps: reps,
164
+ outdatedness_checker: outdatedness_checker,
165
+ outdatedness_store: @outdatedness_store,
166
+ )
167
+ end
168
+
169
+ def store_pre_compilation_state_stage(action_sequences, reps)
170
+ @_store_pre_compilation_state_stage ||= ::Nanoc::Core::CompilationStages::StorePreCompilationState.new(
171
+ reps: reps,
172
+ layouts: @site.layouts,
173
+ checksum_store: @checksum_store,
174
+ action_sequence_store: @action_sequence_store,
175
+ action_sequences: action_sequences,
176
+ )
177
+ end
178
+
179
+ def compile_reps_stage(action_sequences, reps)
180
+ @_compile_reps_stage ||= ::Nanoc::Core::CompilationStages::CompileReps.new(
181
+ reps: reps,
182
+ outdatedness_store: @outdatedness_store,
183
+ dependency_store: @dependency_store,
184
+ action_sequences: action_sequences,
185
+ compilation_context: compilation_context(reps: reps),
186
+ compiled_content_cache: @compiled_content_cache,
187
+ )
188
+ end
189
+
190
+ def store_post_compilation_state_stage
191
+ @_store_post_compilation_state_stage ||= ::Nanoc::Core::CompilationStages::StorePostCompilationState.new(
192
+ dependency_store: @dependency_store,
193
+ )
194
+ end
195
+
196
+ def postprocess_stage
197
+ @_postprocess_stage ||= ::Nanoc::Core::CompilationStages::Postprocess.new(
198
+ action_provider: @action_provider,
199
+ site: @site,
200
+ )
201
+ end
202
+
203
+ def cleanup_stage
204
+ @_cleanup_stage ||= ::Nanoc::Core::CompilationStages::Cleanup.new(@output_dirs)
205
+ end
206
+
207
+ def forget_outdated_dependencies_stage
208
+ @_forget_outdated_dependencies_stage ||= ::Nanoc::Core::CompilationStages::ForgetOutdatedDependencies.new(
209
+ dependency_store: @dependency_store,
210
+ )
211
+ end
212
+ end
213
+ end
214
+ end