nanoc 4.6.1 → 4.6.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|