nanoc 4.6.1 → 4.6.2
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/Appraisals +1 -1
- data/Gemfile.lock +22 -22
- data/NEWS.md +12 -0
- data/lib/nanoc/base/entities/document.rb +7 -0
- data/lib/nanoc/base/entities/identifiable_collection.rb +12 -9
- data/lib/nanoc/base/entities/item_rep.rb +24 -28
- data/lib/nanoc/base/entities/processing_actions/snapshot.rb +15 -11
- data/lib/nanoc/base/entities/rule_memory.rb +15 -5
- data/lib/nanoc/base/entities/site.rb +15 -10
- data/lib/nanoc/base/entities/snapshot_def.rb +8 -2
- data/lib/nanoc/base/repos.rb +3 -0
- data/lib/nanoc/base/repos/aggregate_data_source.rb +20 -0
- data/lib/nanoc/base/repos/in_mem_data_source.rb +13 -0
- data/lib/nanoc/base/repos/prefixed_data_source.rb +19 -0
- data/lib/nanoc/base/repos/site_loader.rb +8 -16
- data/lib/nanoc/base/repos/snapshot_repo.rb +10 -5
- data/lib/nanoc/base/services/action_provider.rb +12 -0
- data/lib/nanoc/base/services/compiler/phases/recalculate.rb +5 -2
- data/lib/nanoc/base/services/compiler/phases/write.rb +1 -3
- data/lib/nanoc/base/services/compiler/stages/preprocess.rb +6 -3
- data/lib/nanoc/base/services/executor.rb +2 -4
- data/lib/nanoc/base/services/filter.rb +7 -12
- data/lib/nanoc/base/services/item_rep_router.rb +40 -16
- data/lib/nanoc/base/services/item_rep_writer.rb +19 -3
- data/lib/nanoc/base/services/pruner.rb +1 -1
- data/lib/nanoc/base/views/item_rep_view.rb +12 -3
- data/lib/nanoc/base/views/mutable_identifiable_collection_view.rb +1 -1
- data/lib/nanoc/base/views/mutable_item_collection_view.rb +1 -1
- data/lib/nanoc/base/views/mutable_layout_collection_view.rb +1 -1
- data/lib/nanoc/checking/checks/html.rb +1 -1
- data/lib/nanoc/checking/checks/stale.rb +2 -1
- data/lib/nanoc/checking/checks/w3c_validator.rb +1 -0
- data/lib/nanoc/cli/commands/compile.rb +3 -2
- data/lib/nanoc/cli/commands/show-data.rb +4 -2
- data/lib/nanoc/data_sources/filesystem.rb +1 -1
- data/lib/nanoc/helpers/filtering.rb +1 -2
- data/lib/nanoc/helpers/rendering.rb +1 -2
- data/lib/nanoc/helpers/xml_sitemap.rb +2 -2
- data/lib/nanoc/rule_dsl/action_provider.rb +7 -0
- data/lib/nanoc/rule_dsl/rule_context.rb +4 -1
- data/lib/nanoc/rule_dsl/rule_memory_calculator.rb +33 -13
- data/lib/nanoc/spec.rb +5 -6
- data/lib/nanoc/version.rb +1 -1
- data/spec/nanoc/base/checksummer_spec.rb +19 -9
- data/spec/nanoc/base/compiler_spec.rb +4 -8
- data/spec/nanoc/base/entities/document_spec.rb +20 -0
- data/spec/nanoc/base/entities/identifiable_collection_spec.rb +12 -0
- data/spec/nanoc/base/entities/item_rep_spec.rb +1 -1
- data/spec/nanoc/base/entities/processing_actions/snapshot_spec.rb +19 -13
- data/spec/nanoc/base/entities/rule_memory_spec.rb +39 -3
- data/spec/nanoc/base/entities/site_spec.rb +15 -10
- data/spec/nanoc/base/filter_spec.rb +28 -1
- data/spec/nanoc/base/item_rep_writer_spec.rb +4 -2
- data/spec/nanoc/base/repos/outdatedness_store_spec.rb +1 -2
- data/spec/nanoc/base/repos/snapshot_repo_spec.rb +4 -4
- data/spec/nanoc/base/repos/store_spec.rb +5 -1
- data/spec/nanoc/base/services/compiler/stages/compile_reps_spec.rb +9 -10
- data/spec/nanoc/base/services/executor_spec.rb +2 -2
- data/spec/nanoc/base/services/item_rep_router_spec.rb +83 -39
- data/spec/nanoc/base/services/outdatedness_checker_spec.rb +1 -2
- data/spec/nanoc/base/services/outdatedness_rules_spec.rb +2 -3
- data/spec/nanoc/base/services/pruner_spec.rb +2 -2
- data/spec/nanoc/base/views/identifiable_collection_view_spec.rb +46 -28
- data/spec/nanoc/base/views/item_rep_view_spec.rb +72 -15
- data/spec/nanoc/base/views/item_view_spec.rb +20 -14
- data/spec/nanoc/base/views/mutable_identifiable_collection_view_spec.rb +10 -4
- data/spec/nanoc/base/views/mutable_item_collection_view_spec.rb +10 -5
- data/spec/nanoc/base/views/mutable_layout_collection_view_spec.rb +10 -5
- data/spec/nanoc/cli/commands/compile/file_action_printer_spec.rb +1 -1
- data/spec/nanoc/cli/commands/compile/timing_recorder_spec.rb +1 -1
- data/spec/nanoc/cli/commands/show_data_spec.rb +9 -7
- data/spec/nanoc/cli/commands/show_rules_spec.rb +16 -10
- data/spec/nanoc/regressions/gh_1037a_spec.rb +29 -0
- data/spec/nanoc/regressions/gh_1037b_spec.rb +18 -0
- data/spec/nanoc/regressions/gh_1082a_spec.rb +18 -0
- data/spec/nanoc/regressions/gh_1082b_spec.rb +20 -0
- data/spec/nanoc/regressions/gh_1082c_spec.rb +19 -0
- data/spec/nanoc/regressions/gh_1082d_spec.rb +17 -0
- data/spec/nanoc/regressions/gh_1093_spec.rb +49 -0
- data/spec/nanoc/regressions/gh_1097_spec.rb +21 -0
- data/spec/nanoc/regressions/gh_1100_spec.rb +20 -0
- data/spec/nanoc/regressions/gh_1102_spec.rb +26 -0
- data/spec/nanoc/regressions/gh_776_spec.rb +1 -5
- data/spec/nanoc/rule_dsl/recording_executor_spec.rb +14 -14
- data/spec/nanoc/rule_dsl/rule_context_spec.rb +22 -13
- data/spec/nanoc/rule_dsl/rule_memory_calculator_spec.rb +38 -54
- data/spec/spec_helper.rb +1 -1
- data/test/base/test_compiler.rb +3 -4
- data/test/base/test_item_array.rb +4 -15
- data/test/checking/checks/test_html.rb +4 -3
- data/test/cli/commands/test_compile.rb +2 -2
- data/test/filters/test_relativize_paths.rb +28 -28
- data/test/fixtures/vcr_cassettes/html_run_error.yml +25 -76
- data/test/helpers/test_xml_sitemap.rb +22 -19
- metadata +16 -2
|
@@ -4,10 +4,16 @@ module Nanoc
|
|
|
4
4
|
include Nanoc::Int::ContractsSupport
|
|
5
5
|
|
|
6
6
|
attr_reader :name
|
|
7
|
+
attr_reader :binary
|
|
7
8
|
|
|
8
|
-
contract Symbol => C::Any
|
|
9
|
-
def initialize(name)
|
|
9
|
+
contract Symbol, C::KeywordArgs[binary: C::Optional[C::Bool]] => C::Any
|
|
10
|
+
def initialize(name, binary:)
|
|
10
11
|
@name = name
|
|
12
|
+
@binary = binary
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def binary?
|
|
16
|
+
@binary
|
|
11
17
|
end
|
|
12
18
|
end
|
|
13
19
|
end
|
data/lib/nanoc/base/repos.rb
CHANGED
|
@@ -10,3 +10,6 @@ require_relative 'repos/outdatedness_store'
|
|
|
10
10
|
require_relative 'repos/rule_memory_store'
|
|
11
11
|
require_relative 'repos/site_loader'
|
|
12
12
|
require_relative 'repos/snapshot_repo'
|
|
13
|
+
require_relative 'repos/in_mem_data_source'
|
|
14
|
+
require_relative 'repos/aggregate_data_source'
|
|
15
|
+
require_relative 'repos/prefixed_data_source'
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Nanoc::Int
|
|
2
|
+
class AggregateDataSource < Nanoc::DataSource
|
|
3
|
+
def initialize(data_sources, config)
|
|
4
|
+
super({}, '/', '/', {})
|
|
5
|
+
|
|
6
|
+
@data_sources = data_sources
|
|
7
|
+
@config = config
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def items
|
|
11
|
+
objs = @data_sources.flat_map(&:items)
|
|
12
|
+
@_items ||= Nanoc::Int::IdentifiableCollection.from(objs, @config)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def layouts
|
|
16
|
+
objs = @data_sources.flat_map(&:layouts)
|
|
17
|
+
@_layouts ||= Nanoc::Int::IdentifiableCollection.from(objs, @config)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Nanoc::Int
|
|
2
|
+
class PrefixedDataSource < Nanoc::DataSource
|
|
3
|
+
def initialize(data_source, items_prefix, layouts_prefix)
|
|
4
|
+
super({}, '/', '/', {})
|
|
5
|
+
|
|
6
|
+
@data_source = data_source
|
|
7
|
+
@items_prefix = items_prefix
|
|
8
|
+
@layouts_prefix = layouts_prefix
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def items
|
|
12
|
+
@data_source.items.map { |d| d.with_identifier_prefix(@items_prefix) }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def layouts
|
|
16
|
+
@data_source.layouts.map { |d| d.with_identifier_prefix(@layouts_prefix) }
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -23,27 +23,19 @@ module Nanoc::Int
|
|
|
23
23
|
code_snippets = code_snippets_from_config(config)
|
|
24
24
|
code_snippets.each(&:load)
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
items_in_ds = ds.items
|
|
32
|
-
layouts_in_ds = ds.layouts
|
|
33
|
-
|
|
34
|
-
items_in_ds.each { |i| i.identifier = i.identifier.prefix(ds.items_root) }
|
|
35
|
-
layouts_in_ds.each { |l| l.identifier = l.identifier.prefix(ds.layouts_root) }
|
|
36
|
-
|
|
37
|
-
items.concat(items_in_ds)
|
|
38
|
-
layouts.concat(layouts_in_ds)
|
|
26
|
+
data_sources_to_aggregate =
|
|
27
|
+
with_data_sources(config) do |data_sources|
|
|
28
|
+
data_sources.map do |ds|
|
|
29
|
+
Nanoc::Int::PrefixedDataSource.new(ds, ds.items_root, ds.layouts_root)
|
|
30
|
+
end
|
|
39
31
|
end
|
|
40
|
-
|
|
32
|
+
|
|
33
|
+
data_source = Nanoc::Int::AggregateDataSource.new(data_sources_to_aggregate, config)
|
|
41
34
|
|
|
42
35
|
Nanoc::Int::Site.new(
|
|
43
36
|
config: config,
|
|
44
37
|
code_snippets: code_snippets,
|
|
45
|
-
|
|
46
|
-
layouts: layouts,
|
|
38
|
+
data_source: data_source,
|
|
47
39
|
)
|
|
48
40
|
end
|
|
49
41
|
|
|
@@ -29,8 +29,8 @@ module Nanoc::Int
|
|
|
29
29
|
@contents[rep] = contents_per_snapshot
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
contract C::KeywordArgs[rep: Nanoc::Int::ItemRep, snapshot: C::Optional[C::Maybe[Symbol]]] =>
|
|
33
|
-
def
|
|
32
|
+
contract C::KeywordArgs[rep: Nanoc::Int::ItemRep, snapshot: C::Optional[C::Maybe[Symbol]]] => Nanoc::Int::Content
|
|
33
|
+
def raw_compiled_content(rep:, snapshot: nil)
|
|
34
34
|
# Get name of last pre-layout snapshot
|
|
35
35
|
snapshot_name = snapshot || (get(rep, :pre) ? :pre : :last)
|
|
36
36
|
|
|
@@ -45,11 +45,16 @@ module Nanoc::Int
|
|
|
45
45
|
is_usable_snapshot = get(rep, snapshot_name) && stopped_moving
|
|
46
46
|
unless is_usable_snapshot
|
|
47
47
|
Fiber.yield(Nanoc::Int::Errors::UnmetDependency.new(rep))
|
|
48
|
-
return
|
|
48
|
+
return raw_compiled_content(rep: rep, snapshot: snapshot)
|
|
49
49
|
end
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
get(rep, snapshot_name)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
contract C::KeywordArgs[rep: Nanoc::Int::ItemRep, snapshot: C::Optional[C::Maybe[Symbol]]] => String
|
|
55
|
+
def compiled_content(rep:, snapshot: nil)
|
|
56
|
+
snapshot_content = raw_compiled_content(rep: rep, snapshot: snapshot)
|
|
57
|
+
|
|
53
58
|
if snapshot_content.binary?
|
|
54
59
|
raise Nanoc::Int::Errors::CannotGetCompiledContentOfBinaryItem.new(rep)
|
|
55
60
|
end
|
|
@@ -22,5 +22,17 @@ module Nanoc::Int
|
|
|
22
22
|
def paths_for(rep)
|
|
23
23
|
memory_for(rep).paths
|
|
24
24
|
end
|
|
25
|
+
|
|
26
|
+
def need_preprocessing?
|
|
27
|
+
raise NotImplementedError
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def preprocess(_site)
|
|
31
|
+
raise NotImplementedError
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def postprocess(_site, _reps)
|
|
35
|
+
raise NotImplementedError
|
|
36
|
+
end
|
|
25
37
|
end
|
|
26
38
|
end
|
|
@@ -19,14 +19,17 @@ module Nanoc::Int::Compiler::Phases
|
|
|
19
19
|
|
|
20
20
|
@compilation_context.snapshot_repo.set(rep, :last, rep.item.content)
|
|
21
21
|
|
|
22
|
-
@action_provider.memory_for(rep)
|
|
22
|
+
actions = @action_provider.memory_for(rep)
|
|
23
|
+
actions.each do |action|
|
|
23
24
|
case action
|
|
24
25
|
when Nanoc::Int::ProcessingActions::Filter
|
|
25
26
|
executor.filter(action.filter_name, action.params)
|
|
26
27
|
when Nanoc::Int::ProcessingActions::Layout
|
|
27
28
|
executor.layout(action.layout_identifier, action.params)
|
|
28
29
|
when Nanoc::Int::ProcessingActions::Snapshot
|
|
29
|
-
|
|
30
|
+
action.snapshot_names.each do |snapshot_name|
|
|
31
|
+
executor.snapshot(snapshot_name)
|
|
32
|
+
end
|
|
30
33
|
else
|
|
31
34
|
raise Nanoc::Int::Errors::InternalInconsistency, "unknown action #{action.inspect}"
|
|
32
35
|
end
|
|
@@ -11,9 +11,7 @@ module Nanoc::Int::Compiler::Phases
|
|
|
11
11
|
def run(rep, is_outdated:)
|
|
12
12
|
@wrapped.run(rep, is_outdated: is_outdated)
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
Nanoc::Int::ItemRepWriter.new.write(rep, @snapshot_repo, sdef.name)
|
|
16
|
-
end
|
|
14
|
+
Nanoc::Int::ItemRepWriter.new.write_all(rep, @snapshot_repo)
|
|
17
15
|
end
|
|
18
16
|
end
|
|
19
17
|
end
|
|
@@ -8,10 +8,13 @@ module Nanoc::Int::Compiler::Stages
|
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
def run
|
|
11
|
-
@action_provider.
|
|
11
|
+
if @action_provider.need_preprocessing?
|
|
12
|
+
@site.data_source = Nanoc::Int::InMemDataSource.new(@site.items, @site.layouts)
|
|
13
|
+
@action_provider.preprocess(@site)
|
|
12
14
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
+
@dependency_store.objects = @site.items.to_a + @site.layouts.to_a
|
|
16
|
+
@checksum_store.objects = @site.items.to_a + @site.layouts.to_a + @site.code_snippets + [@site.config]
|
|
17
|
+
end
|
|
15
18
|
|
|
16
19
|
@site.freeze
|
|
17
20
|
end
|
|
@@ -57,8 +57,7 @@ module Nanoc
|
|
|
57
57
|
raise Nanoc::Int::Errors::CannotLayoutBinaryItem.new(@rep) if last.binary?
|
|
58
58
|
|
|
59
59
|
# Create filter
|
|
60
|
-
klass = Nanoc::Filter.named(filter_name)
|
|
61
|
-
raise Nanoc::Int::Errors::UnknownFilter.new(filter_name) if klass.nil?
|
|
60
|
+
klass = Nanoc::Filter.named!(filter_name)
|
|
62
61
|
view_context = @compilation_context.create_view_context(@dependency_tracker)
|
|
63
62
|
layout_view = Nanoc::LayoutView.new(layout, view_context)
|
|
64
63
|
filter = klass.new(assigns_for(@rep).merge(layout: layout_view))
|
|
@@ -110,8 +109,7 @@ module Nanoc
|
|
|
110
109
|
end
|
|
111
110
|
|
|
112
111
|
def filter_for_filtering(rep, filter_name)
|
|
113
|
-
klass = Nanoc::Filter.named(filter_name)
|
|
114
|
-
raise Nanoc::Int::Errors::UnknownFilter.new(filter_name) if klass.nil?
|
|
112
|
+
klass = Nanoc::Filter.named!(filter_name)
|
|
115
113
|
|
|
116
114
|
last = @compilation_context.snapshot_repo.get(@rep, :last)
|
|
117
115
|
if klass.from_binary? && !last.binary?
|
|
@@ -45,6 +45,12 @@ module Nanoc
|
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
+
def named!(name)
|
|
49
|
+
klass = named(name)
|
|
50
|
+
raise Nanoc::Int::Errors::UnknownFilter.new(name) if klass.nil?
|
|
51
|
+
klass
|
|
52
|
+
end
|
|
53
|
+
|
|
48
54
|
# Sets the new type for the filter. The type can be `:binary` (default)
|
|
49
55
|
# or `:text`. The given argument can either be a symbol indicating both
|
|
50
56
|
# “from” and “to” types, or a hash where the only key is the “from” type
|
|
@@ -195,18 +201,7 @@ module Nanoc
|
|
|
195
201
|
#
|
|
196
202
|
# @return [void]
|
|
197
203
|
def depend_on(items)
|
|
198
|
-
|
|
199
|
-
items = items.map { |i| i.is_a?(Nanoc::ItemWithRepsView) ? i.unwrap : i }
|
|
200
|
-
|
|
201
|
-
# Notify
|
|
202
|
-
dependency_tracker = @assigns[:item]._context.dependency_tracker
|
|
203
|
-
items.each { |item| dependency_tracker.bounce(item, compiled_content: true) }
|
|
204
|
-
|
|
205
|
-
# Raise unmet dependency error if necessary
|
|
206
|
-
items.each do |item|
|
|
207
|
-
rep = orig_items.sample._context.reps[item].find { |r| !r.compiled? }
|
|
208
|
-
Fiber.yield(Nanoc::Int::Errors::UnmetDependency.new(rep)) if rep
|
|
209
|
-
end
|
|
204
|
+
items.flat_map(&:reps).flat_map(&:raw_path)
|
|
210
205
|
end
|
|
211
206
|
end
|
|
212
207
|
end
|
|
@@ -3,6 +3,8 @@ module Nanoc::Int
|
|
|
3
3
|
#
|
|
4
4
|
# @api private
|
|
5
5
|
class ItemRepRouter
|
|
6
|
+
include Nanoc::Int::ContractsSupport
|
|
7
|
+
|
|
6
8
|
class IdenticalRoutesError < ::Nanoc::Error
|
|
7
9
|
def initialize(output_path, rep_a, rep_b)
|
|
8
10
|
super("The item representations #{rep_a.inspect} and #{rep_b.inspect} are both routed to #{output_path}.")
|
|
@@ -22,34 +24,56 @@ module Nanoc::Int
|
|
|
22
24
|
end
|
|
23
25
|
|
|
24
26
|
def run
|
|
25
|
-
|
|
27
|
+
assigned_paths = {}
|
|
26
28
|
@reps.each do |rep|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
# Sigh. We route reps twice, because the first time, the paths might not have converged
|
|
30
|
+
# yet. This isn’t ideal, but it’s the only way to work around the divergence issues that
|
|
31
|
+
# I can think of. For details, see
|
|
32
|
+
# https://github.com/nanoc/nanoc/pull/1085#issuecomment-280628426.
|
|
33
|
+
|
|
34
|
+
@action_provider.paths_for(rep).each do |(snapshot_names, paths)|
|
|
35
|
+
route_rep(rep, paths, snapshot_names, {})
|
|
29
36
|
end
|
|
37
|
+
|
|
38
|
+
@action_provider.paths_for(rep).each do |(snapshot_names, paths)|
|
|
39
|
+
route_rep(rep, paths, snapshot_names, assigned_paths)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# TODO: verify that paths converge
|
|
30
43
|
end
|
|
31
44
|
end
|
|
32
45
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
46
|
+
contract Nanoc::Int::ItemRep, C::IterOf[String], C::IterOf[Symbol], C::HashOf[String => Nanoc::Int::ItemRep] => C::Any
|
|
47
|
+
def route_rep(rep, paths, snapshot_names, assigned_paths)
|
|
48
|
+
# Encode
|
|
49
|
+
paths = paths.map { |path| path.encode('UTF-8') }
|
|
37
50
|
|
|
38
|
-
|
|
39
|
-
|
|
51
|
+
# Validate format
|
|
52
|
+
paths.each do |path|
|
|
53
|
+
unless path.start_with?('/')
|
|
54
|
+
raise RouteWithoutSlashError.new(path, rep)
|
|
55
|
+
end
|
|
40
56
|
end
|
|
41
57
|
|
|
42
|
-
#
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
58
|
+
# Validate uniqueness
|
|
59
|
+
paths.each do |path|
|
|
60
|
+
if assigned_paths.include?(path)
|
|
61
|
+
# TODO: Include snapshot names in error message
|
|
62
|
+
raise IdenticalRoutesError.new(path, assigned_paths[path], rep)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
paths.each do |path|
|
|
66
|
+
assigned_paths[path] = rep
|
|
47
67
|
end
|
|
48
68
|
|
|
49
|
-
|
|
50
|
-
|
|
69
|
+
# Assign
|
|
70
|
+
snapshot_names.each do |snapshot_name|
|
|
71
|
+
rep.raw_paths[snapshot_name] = paths.map { |path| @site.config[:output_dir] + path }
|
|
72
|
+
rep.paths[snapshot_name] = paths.map { |path| strip_index_filename(path) }
|
|
73
|
+
end
|
|
51
74
|
end
|
|
52
75
|
|
|
76
|
+
contract String => String
|
|
53
77
|
def strip_index_filename(basic_path)
|
|
54
78
|
@site.config[:index_filenames].each do |index_filename|
|
|
55
79
|
slashed_index_filename = '/' + index_filename
|
|
@@ -3,9 +3,25 @@ module Nanoc::Int
|
|
|
3
3
|
class ItemRepWriter
|
|
4
4
|
TMP_TEXT_ITEMS_DIR = 'text_items'.freeze
|
|
5
5
|
|
|
6
|
-
def
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
def write_all(item_rep, snapshot_repo)
|
|
7
|
+
written_paths = Set.new
|
|
8
|
+
|
|
9
|
+
item_rep.snapshot_defs.map(&:name).each do |snapshot_name|
|
|
10
|
+
write(item_rep, snapshot_repo, snapshot_name, written_paths)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def write(item_rep, snapshot_repo, snapshot_name, written_paths)
|
|
15
|
+
item_rep.raw_paths.fetch(snapshot_name, []).each do |raw_path|
|
|
16
|
+
write_single(item_rep, snapshot_repo, snapshot_name, raw_path, written_paths)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def write_single(item_rep, snapshot_repo, snapshot_name, raw_path, written_paths)
|
|
21
|
+
# Don’t write twice
|
|
22
|
+
# TODO: test written_paths behavior
|
|
23
|
+
return if written_paths.include?(raw_path)
|
|
24
|
+
written_paths << raw_path
|
|
9
25
|
|
|
10
26
|
# Create parent directory
|
|
11
27
|
FileUtils.mkdir_p(File.dirname(raw_path))
|
|
@@ -28,7 +28,7 @@ module Nanoc
|
|
|
28
28
|
def run
|
|
29
29
|
return unless File.directory?(@config[:output_dir])
|
|
30
30
|
|
|
31
|
-
compiled_files = @reps.flat_map { |r| r.raw_paths.values }.compact
|
|
31
|
+
compiled_files = @reps.flat_map { |r| r.raw_paths.values.flatten }.compact
|
|
32
32
|
present_files, present_dirs = files_and_dirs_in(@config[:output_dir] + '/')
|
|
33
33
|
|
|
34
34
|
remove_stray_files(present_files, compiled_files)
|
|
@@ -74,13 +74,22 @@ module Nanoc
|
|
|
74
74
|
|
|
75
75
|
# @api private
|
|
76
76
|
def raw_path(snapshot: :last)
|
|
77
|
-
@context.dependency_tracker.bounce(unwrap.item,
|
|
78
|
-
|
|
77
|
+
@context.dependency_tracker.bounce(unwrap.item, compiled_content: true)
|
|
78
|
+
|
|
79
|
+
res = @item_rep.raw_path(snapshot: snapshot)
|
|
80
|
+
|
|
81
|
+
unless @item_rep.compiled?
|
|
82
|
+
Fiber.yield(Nanoc::Int::Errors::UnmetDependency.new(@item_rep))
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
res
|
|
79
86
|
end
|
|
80
87
|
|
|
81
88
|
# @api private
|
|
82
89
|
def binary?
|
|
83
|
-
|
|
90
|
+
snapshot_def = unwrap.snapshot_defs.find { |sd| sd.name == :last }
|
|
91
|
+
raise Nanoc::Int::Errors::NoSuchSnapshot.new(unwrap, :last) if snapshot_def.nil?
|
|
92
|
+
snapshot_def.binary?
|
|
84
93
|
end
|
|
85
94
|
|
|
86
95
|
def inspect
|
|
@@ -23,7 +23,7 @@ module Nanoc
|
|
|
23
23
|
# @return [self]
|
|
24
24
|
def create(content, attributes, identifier, binary: false, filename: nil)
|
|
25
25
|
content = Nanoc::Int::Content.create(content, binary: binary, filename: filename)
|
|
26
|
-
@objects
|
|
26
|
+
@objects = @objects.add(Nanoc::Int::Item.new(content, attributes, identifier))
|
|
27
27
|
self
|
|
28
28
|
end
|
|
29
29
|
end
|