nanoc-core 4.11.11 → 4.11.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/nanoc/core/compilation_context.rb +65 -0
- data/lib/nanoc/core/dependency_tracker.rb +27 -4
- data/lib/nanoc/core/in_memory_data_source.rb +3 -0
- data/lib/nanoc/core/item_rep_router.rb +99 -0
- data/lib/nanoc/core/processing_actions/filter.rb +2 -0
- data/lib/nanoc/core/store.rb +1 -0
- data/lib/nanoc/core/version.rb +1 -1
- data/lib/nanoc/core/view_context_for_compilation.rb +50 -0
- data/lib/nanoc/core/view_context_for_pre_compilation.rb +19 -0
- data/lib/nanoc/core/view_context_for_shell.rb +24 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf201905e79de9d9711910668d228863a48b53e13a78694a50122932960d6189
|
4
|
+
data.tar.gz: ffae70af266ec5c189b0d09976bfb9ebada587f5ea1eeb73b12dfeaebeb07d36
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf812e2fc282b019b2d907ee39a84fe7999b2b2f8565139cc442e3ca38cb75949ea70f27b07058ef4bd52af9a1291c0ca73e6db53790e431976a729f6a4dd3c8
|
7
|
+
data.tar.gz: ef670404975dfde21013d6878afbf272e7bd41d7dee120e124cb2c61e37e1ad1f5ac64ccc1f4554f57dcde1d1303cac32ef6e088853d569c24f1c070c72abc7c
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nanoc
|
4
|
+
module Core
|
5
|
+
class CompilationContext
|
6
|
+
class FilterNameAndArgs
|
7
|
+
include Nanoc::Core::ContractsSupport
|
8
|
+
|
9
|
+
attr_reader :name
|
10
|
+
attr_reader :args
|
11
|
+
|
12
|
+
contract C::KeywordArgs[name: C::Maybe[Symbol], args: Hash] => C::Any
|
13
|
+
def initialize(name:, args:)
|
14
|
+
@name = name
|
15
|
+
@args = args
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class UndefinedFilterForLayoutError < ::Nanoc::Core::Error
|
20
|
+
def initialize(layout)
|
21
|
+
super("There is no filter defined for the layout #{layout.identifier}")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
include Nanoc::Core::ContractsSupport
|
26
|
+
|
27
|
+
attr_reader :site
|
28
|
+
attr_reader :reps
|
29
|
+
attr_reader :compiled_content_cache
|
30
|
+
attr_reader :compiled_content_store
|
31
|
+
|
32
|
+
C_COMPILED_CONTENT_CACHE =
|
33
|
+
C::Or[
|
34
|
+
Nanoc::Core::CompiledContentCache,
|
35
|
+
Nanoc::Core::TextualCompiledContentCache,
|
36
|
+
Nanoc::Core::BinaryCompiledContentCache,
|
37
|
+
]
|
38
|
+
|
39
|
+
contract C::KeywordArgs[
|
40
|
+
action_provider: Nanoc::Core::ActionProvider,
|
41
|
+
reps: Nanoc::Core::ItemRepRepo,
|
42
|
+
site: Nanoc::Core::Site,
|
43
|
+
compiled_content_cache: C_COMPILED_CONTENT_CACHE,
|
44
|
+
compiled_content_store: Nanoc::Core::CompiledContentStore,
|
45
|
+
] => C::Any
|
46
|
+
def initialize(action_provider:, reps:, site:, compiled_content_cache:, compiled_content_store:)
|
47
|
+
@action_provider = action_provider
|
48
|
+
@reps = reps
|
49
|
+
@site = site
|
50
|
+
@compiled_content_cache = compiled_content_cache
|
51
|
+
@compiled_content_store = compiled_content_store
|
52
|
+
end
|
53
|
+
|
54
|
+
contract Nanoc::Core::Layout => FilterNameAndArgs
|
55
|
+
def filter_name_and_args_for_layout(layout)
|
56
|
+
seq = @action_provider.action_sequence_for(layout)
|
57
|
+
if seq.nil? || seq.size != 1 || !seq[0].is_a?(Nanoc::Core::ProcessingActions::Filter)
|
58
|
+
raise UndefinedFilterForLayoutError.new(layout)
|
59
|
+
end
|
60
|
+
|
61
|
+
FilterNameAndArgs.new(name: seq[0].filter_name, args: seq[0].params)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -6,10 +6,33 @@ module Nanoc
|
|
6
6
|
class DependencyTracker
|
7
7
|
include Nanoc::Core::ContractsSupport
|
8
8
|
|
9
|
-
C_OBJ =
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
C_OBJ =
|
10
|
+
C::Or[
|
11
|
+
Nanoc::Core::Item,
|
12
|
+
Nanoc::Core::Layout,
|
13
|
+
Nanoc::Core::Configuration,
|
14
|
+
Nanoc::Core::IdentifiableCollection
|
15
|
+
]
|
16
|
+
|
17
|
+
C_RAW_CONTENT =
|
18
|
+
C::Or[
|
19
|
+
C::IterOf[C::Or[String, Regexp]],
|
20
|
+
C::Bool
|
21
|
+
]
|
22
|
+
|
23
|
+
C_ATTR =
|
24
|
+
C::Or[
|
25
|
+
C::IterOf[Symbol],
|
26
|
+
C::Bool
|
27
|
+
]
|
28
|
+
|
29
|
+
C_ARGS =
|
30
|
+
C::KeywordArgs[
|
31
|
+
raw_content: C::Optional[C_RAW_CONTENT],
|
32
|
+
attributes: C::Optional[C_ATTR],
|
33
|
+
compiled_content: C::Optional[C::Bool],
|
34
|
+
path: C::Optional[C::Bool]
|
35
|
+
]
|
13
36
|
|
14
37
|
attr_reader :dependency_store
|
15
38
|
|
@@ -3,9 +3,12 @@
|
|
3
3
|
module Nanoc
|
4
4
|
module Core
|
5
5
|
class InMemoryDataSource < Nanoc::Core::DataSource
|
6
|
+
include Nanoc::Core::ContractsSupport
|
7
|
+
|
6
8
|
attr_reader :items
|
7
9
|
attr_reader :layouts
|
8
10
|
|
11
|
+
contract Nanoc::Core::ItemCollection, Nanoc::Core::LayoutCollection, C::Maybe[Nanoc::Core::DataSource] => C::Any
|
9
12
|
def initialize(items, layouts, orig_data_source = nil)
|
10
13
|
super({}, '/', '/', {})
|
11
14
|
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nanoc
|
4
|
+
module Core
|
5
|
+
# Assigns paths to reps.
|
6
|
+
#
|
7
|
+
# @api private
|
8
|
+
class ItemRepRouter
|
9
|
+
include Nanoc::Core::ContractsSupport
|
10
|
+
|
11
|
+
class IdenticalRoutesError < ::Nanoc::Core::Error
|
12
|
+
def initialize(output_path, rep_a, rep_b)
|
13
|
+
super("The item representations #{rep_a} and #{rep_b} are both routed to #{output_path}.")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class RouteWithoutSlashError < ::Nanoc::Core::Error
|
18
|
+
def initialize(output_path, rep)
|
19
|
+
super("The item representation #{rep} is routed to #{output_path}, which does not start with a slash, as required.")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
contract Nanoc::Core::ItemRepRepo, Nanoc::Core::ActionProvider, Nanoc::Core::Site => C::Any
|
24
|
+
def initialize(reps, action_provider, site)
|
25
|
+
@reps = reps
|
26
|
+
@action_provider = action_provider
|
27
|
+
@site = site
|
28
|
+
end
|
29
|
+
|
30
|
+
def run
|
31
|
+
action_sequences = {}
|
32
|
+
assigned_paths = {}
|
33
|
+
@reps.each do |rep|
|
34
|
+
# Sigh. We route reps twice, because the first time, the paths might not have converged
|
35
|
+
# yet. This isn’t ideal, but it’s the only way to work around the divergence issues that
|
36
|
+
# I can think of. For details, see
|
37
|
+
# https://github.com/nanoc/nanoc/pull/1085#issuecomment-280628426.
|
38
|
+
|
39
|
+
@action_provider.action_sequence_for(rep).paths.each do |(snapshot_names, paths)|
|
40
|
+
route_rep(rep, paths, snapshot_names, {})
|
41
|
+
end
|
42
|
+
|
43
|
+
seq = @action_provider.action_sequence_for(rep)
|
44
|
+
action_sequences[rep] = seq
|
45
|
+
seq.paths.each do |(snapshot_names, paths)|
|
46
|
+
route_rep(rep, paths, snapshot_names, assigned_paths)
|
47
|
+
end
|
48
|
+
|
49
|
+
# TODO: verify that paths converge
|
50
|
+
end
|
51
|
+
|
52
|
+
action_sequences
|
53
|
+
end
|
54
|
+
|
55
|
+
contract Nanoc::Core::ItemRep, C::IterOf[String], C::IterOf[Symbol], C::HashOf[String => Nanoc::Core::ItemRep] => C::Any
|
56
|
+
def route_rep(rep, paths, snapshot_names, assigned_paths)
|
57
|
+
# Encode
|
58
|
+
paths = paths.map { |path| path.encode('UTF-8') }
|
59
|
+
|
60
|
+
# Validate format
|
61
|
+
paths.each do |path|
|
62
|
+
unless path.start_with?('/')
|
63
|
+
raise RouteWithoutSlashError.new(path, rep)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# Validate uniqueness
|
68
|
+
paths.each do |path|
|
69
|
+
if assigned_paths.include?(path)
|
70
|
+
# TODO: Include snapshot names in error message
|
71
|
+
reps = [assigned_paths[path], rep].sort_by { |r| [r.item.identifier, r.name] }
|
72
|
+
raise IdenticalRoutesError.new(path, *reps)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
paths.each do |path|
|
76
|
+
assigned_paths[path] = rep
|
77
|
+
end
|
78
|
+
|
79
|
+
# Assign
|
80
|
+
snapshot_names.each do |snapshot_name|
|
81
|
+
rep.raw_paths[snapshot_name] = paths.map { |path| @site.config.output_dir + path }
|
82
|
+
rep.paths[snapshot_name] = paths.map { |path| strip_index_filename(path) }
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
contract String => String
|
87
|
+
def strip_index_filename(basic_path)
|
88
|
+
@site.config[:index_filenames].each do |index_filename|
|
89
|
+
slashed_index_filename = '/' + index_filename
|
90
|
+
if basic_path.end_with?(slashed_index_filename)
|
91
|
+
return basic_path[0..-index_filename.length - 1]
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
basic_path
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
data/lib/nanoc/core/store.rb
CHANGED
data/lib/nanoc/core/version.rb
CHANGED
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nanoc
|
4
|
+
module Core
|
5
|
+
class ViewContextForCompilation
|
6
|
+
include Nanoc::Core::ContractsSupport
|
7
|
+
|
8
|
+
attr_reader :reps
|
9
|
+
attr_reader :items
|
10
|
+
attr_reader :dependency_tracker
|
11
|
+
attr_reader :compilation_context
|
12
|
+
attr_reader :compiled_content_store
|
13
|
+
|
14
|
+
contract C::KeywordArgs[
|
15
|
+
reps: Nanoc::Core::ItemRepRepo,
|
16
|
+
items: Nanoc::Core::IdentifiableCollection,
|
17
|
+
dependency_tracker: Nanoc::Core::DependencyTracker,
|
18
|
+
compilation_context: Nanoc::Core::CompilationContext,
|
19
|
+
compiled_content_store: Nanoc::Core::CompiledContentStore,
|
20
|
+
] => C::Any
|
21
|
+
def initialize(reps:, items:, dependency_tracker:, compilation_context:, compiled_content_store:)
|
22
|
+
@reps = reps
|
23
|
+
@items = items
|
24
|
+
@dependency_tracker = dependency_tracker
|
25
|
+
@compilation_context = compilation_context
|
26
|
+
@compiled_content_store = compiled_content_store
|
27
|
+
end
|
28
|
+
|
29
|
+
contract Nanoc::Core::ItemRep, C::KeywordArgs[site: Nanoc::Core::Site] => Hash
|
30
|
+
def assigns_for(rep, site:)
|
31
|
+
last_content = @compiled_content_store.get_current(rep)
|
32
|
+
content_or_filename_assigns =
|
33
|
+
if last_content.binary?
|
34
|
+
{ filename: last_content.filename }
|
35
|
+
else
|
36
|
+
{ content: last_content.string }
|
37
|
+
end
|
38
|
+
|
39
|
+
content_or_filename_assigns.merge(
|
40
|
+
item: Nanoc::CompilationItemView.new(rep.item, self),
|
41
|
+
rep: Nanoc::CompilationItemRepView.new(rep, self),
|
42
|
+
item_rep: Nanoc::CompilationItemRepView.new(rep, self),
|
43
|
+
items: Nanoc::ItemCollectionWithRepsView.new(site.items, self),
|
44
|
+
layouts: Nanoc::LayoutCollectionView.new(site.layouts, self),
|
45
|
+
config: Nanoc::ConfigView.new(site.config, self),
|
46
|
+
)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nanoc
|
4
|
+
module Core
|
5
|
+
class ViewContextForPreCompilation
|
6
|
+
include Nanoc::Core::ContractsSupport
|
7
|
+
|
8
|
+
attr_reader :items
|
9
|
+
attr_reader :dependency_tracker
|
10
|
+
|
11
|
+
contract C::KeywordArgs[items: Nanoc::Core::IdentifiableCollection] => C::Any
|
12
|
+
def initialize(items:)
|
13
|
+
@items = items
|
14
|
+
|
15
|
+
@dependency_tracker = Nanoc::Core::DependencyTracker::Null.new
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nanoc
|
4
|
+
module Core
|
5
|
+
class ViewContextForShell
|
6
|
+
include Nanoc::Core::ContractsSupport
|
7
|
+
|
8
|
+
attr_reader :items
|
9
|
+
attr_reader :reps
|
10
|
+
attr_reader :dependency_tracker
|
11
|
+
|
12
|
+
contract C::KeywordArgs[
|
13
|
+
items: Nanoc::Core::IdentifiableCollection,
|
14
|
+
reps: Nanoc::Core::ItemRepRepo,
|
15
|
+
] => C::Any
|
16
|
+
def initialize(items:, reps:)
|
17
|
+
@items = items
|
18
|
+
@reps = reps
|
19
|
+
|
20
|
+
@dependency_tracker = Nanoc::Core::DependencyTracker::Null.new
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nanoc-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.11.
|
4
|
+
version: 4.11.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Denis Defreyne
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-09-
|
11
|
+
date: 2019-09-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ddmemoize
|
@@ -130,6 +130,7 @@ files:
|
|
130
130
|
- lib/nanoc/core/checksum_store.rb
|
131
131
|
- lib/nanoc/core/checksummer.rb
|
132
132
|
- lib/nanoc/core/code_snippet.rb
|
133
|
+
- lib/nanoc/core/compilation_context.rb
|
133
134
|
- lib/nanoc/core/compilation_stage.rb
|
134
135
|
- lib/nanoc/core/compiled_content_cache.rb
|
135
136
|
- lib/nanoc/core/compiled_content_store.rb
|
@@ -158,6 +159,7 @@ files:
|
|
158
159
|
- lib/nanoc/core/item_collection.rb
|
159
160
|
- lib/nanoc/core/item_rep.rb
|
160
161
|
- lib/nanoc/core/item_rep_repo.rb
|
162
|
+
- lib/nanoc/core/item_rep_router.rb
|
161
163
|
- lib/nanoc/core/layout.rb
|
162
164
|
- lib/nanoc/core/layout_collection.rb
|
163
165
|
- lib/nanoc/core/lazy_value.rb
|
@@ -182,6 +184,9 @@ files:
|
|
182
184
|
- lib/nanoc/core/textual_compiled_content_cache.rb
|
183
185
|
- lib/nanoc/core/textual_content.rb
|
184
186
|
- lib/nanoc/core/version.rb
|
187
|
+
- lib/nanoc/core/view_context_for_compilation.rb
|
188
|
+
- lib/nanoc/core/view_context_for_pre_compilation.rb
|
189
|
+
- lib/nanoc/core/view_context_for_shell.rb
|
185
190
|
homepage: https://nanoc.ws/
|
186
191
|
licenses:
|
187
192
|
- MIT
|