nanoc 4.11.0 → 4.11.1
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/NEWS.md +6 -0
- data/lib/nanoc.rb +4 -7
- data/lib/nanoc/base.rb +3 -3
- data/lib/nanoc/base/assertions.rb +1 -1
- data/lib/nanoc/base/entities.rb +2 -20
- data/lib/nanoc/base/entities/action_sequence.rb +60 -64
- data/lib/nanoc/base/entities/checksum_collection.rb +23 -21
- data/lib/nanoc/base/entities/dependency.rb +24 -22
- data/lib/nanoc/base/entities/outdatedness_reasons.rb +74 -72
- data/lib/nanoc/base/entities/outdatedness_status.rb +19 -17
- data/lib/nanoc/base/entities/props.rb +119 -117
- data/lib/nanoc/base/entities/site.rb +46 -50
- data/lib/nanoc/base/errors.rb +183 -198
- data/lib/nanoc/base/repos.rb +4 -2
- data/lib/nanoc/base/repos/action_sequence_store.rb +44 -42
- data/lib/nanoc/base/repos/aggregate_data_source.rb +24 -22
- data/lib/nanoc/base/repos/checksum_store.rb +51 -49
- data/lib/nanoc/base/repos/compiled_content_cache.rb +47 -45
- data/lib/nanoc/base/repos/compiled_content_store.rb +76 -0
- data/lib/nanoc/base/repos/config_loader.rb +74 -72
- data/lib/nanoc/base/repos/dependency_store.rb +174 -172
- data/lib/nanoc/base/repos/in_mem_data_source.rb +17 -15
- data/lib/nanoc/base/repos/item_rep_repo.rb +26 -24
- data/lib/nanoc/base/repos/outdatedness_store.rb +50 -48
- data/lib/nanoc/base/repos/prefixed_data_source.rb +21 -19
- data/lib/nanoc/base/repos/site_loader.rb +75 -73
- data/lib/nanoc/base/repos/store.rb +93 -91
- data/lib/nanoc/base/services.rb +7 -3
- data/lib/nanoc/base/services/action_provider.rb +23 -21
- data/lib/nanoc/base/services/action_sequence_builder.rb +42 -34
- data/lib/nanoc/base/services/compilation_context.rb +49 -47
- data/lib/nanoc/base/services/compiler.rb +177 -170
- data/lib/nanoc/base/services/compiler/phases.rb +8 -1
- data/lib/nanoc/base/services/compiler/phases/abstract.rb +44 -38
- data/lib/nanoc/base/services/compiler/phases/cache.rb +34 -28
- data/lib/nanoc/base/services/compiler/phases/mark_done.rb +17 -11
- data/lib/nanoc/base/services/compiler/phases/notify.rb +21 -0
- data/lib/nanoc/base/services/compiler/phases/recalculate.rb +37 -31
- data/lib/nanoc/base/services/compiler/phases/resume.rb +47 -48
- data/lib/nanoc/base/services/compiler/phases/write.rb +65 -59
- data/lib/nanoc/base/services/compiler/stage.rb +27 -8
- data/lib/nanoc/base/services/compiler/stages.rb +7 -1
- data/lib/nanoc/base/services/compiler/stages/build_reps.rb +25 -19
- data/lib/nanoc/base/services/compiler/stages/calculate_checksums.rb +34 -28
- data/lib/nanoc/base/services/compiler/stages/cleanup.rb +33 -27
- data/lib/nanoc/base/services/compiler/stages/compile_reps.rb +79 -69
- data/lib/nanoc/base/services/compiler/stages/determine_outdatedness.rb +46 -40
- data/lib/nanoc/base/services/compiler/stages/forget_outdated_dependencies.rb +15 -9
- data/lib/nanoc/base/services/compiler/stages/load_stores.rb +28 -22
- data/lib/nanoc/base/services/compiler/stages/postprocess.rb +16 -10
- data/lib/nanoc/base/services/compiler/stages/preprocess.rb +25 -19
- data/lib/nanoc/base/services/compiler/stages/prune.rb +23 -17
- data/lib/nanoc/base/services/compiler/stages/store_post_compilation_state.rb +15 -9
- data/lib/nanoc/base/services/compiler/stages/store_pre_compilation_state.rb +26 -20
- data/lib/nanoc/base/services/compiler_loader.rb +26 -24
- data/lib/nanoc/base/services/dependency_tracker.rb +47 -45
- data/lib/nanoc/base/services/executor.rb +16 -15
- data/lib/nanoc/base/services/filter.rb +37 -5
- data/lib/nanoc/base/services/instrumentor.rb +12 -10
- data/lib/nanoc/base/services/item_rep_builder.rb +21 -19
- data/lib/nanoc/base/services/item_rep_router.rb +72 -70
- data/lib/nanoc/base/services/item_rep_selector.rb +48 -46
- data/lib/nanoc/base/services/item_rep_writer.rb +58 -53
- data/lib/nanoc/base/services/outdatedness_checker.rb +181 -179
- data/lib/nanoc/base/services/outdatedness_rule.rb +23 -21
- data/lib/nanoc/base/services/outdatedness_rules.rb +5 -3
- data/lib/nanoc/base/services/outdatedness_rules/attributes_modified.rb +28 -24
- data/lib/nanoc/base/services/outdatedness_rules/code_snippets_modified.rb +20 -16
- data/lib/nanoc/base/services/outdatedness_rules/content_modified.rb +13 -9
- data/lib/nanoc/base/services/outdatedness_rules/item_collection_extended.rb +12 -8
- data/lib/nanoc/base/services/outdatedness_rules/layout_collection_extended.rb +12 -8
- data/lib/nanoc/base/services/outdatedness_rules/not_written.rb +10 -6
- data/lib/nanoc/base/services/outdatedness_rules/rules_modified.rb +39 -35
- data/lib/nanoc/base/services/outdatedness_rules/uses_always_outdated_filter.rb +19 -15
- data/lib/nanoc/base/services/pruner.rb +2 -2
- data/lib/nanoc/base/views.rb +7 -0
- data/lib/nanoc/base/views/basic_item_view.rb +1 -1
- data/lib/nanoc/base/views/compilation_item_rep_view.rb +2 -2
- data/lib/nanoc/base/views/identifiable_collection_view.rb +2 -2
- data/lib/nanoc/base/views/mixins/document_view_mixin.rb +1 -1
- data/lib/nanoc/base/views/mixins/mutable_document_view_mixin.rb +5 -5
- data/lib/nanoc/base/views/mutable_item_collection_view.rb +3 -3
- data/lib/nanoc/base/views/mutable_layout_collection_view.rb +2 -2
- data/lib/nanoc/base/views/view_context_for_compilation.rb +6 -6
- data/lib/nanoc/base/views/view_context_for_pre_compilation.rb +2 -2
- data/lib/nanoc/base/views/view_context_for_shell.rb +2 -2
- data/lib/nanoc/checking/check.rb +1 -1
- data/lib/nanoc/cli/commands/compile_listeners/abstract.rb +24 -7
- data/lib/nanoc/cli/commands/compile_listeners/debug_printer.rb +79 -15
- data/lib/nanoc/cli/commands/compile_listeners/diff_generator.rb +4 -7
- data/lib/nanoc/cli/commands/compile_listeners/file_action_printer.rb +15 -24
- data/lib/nanoc/cli/commands/compile_listeners/timing_recorder.rb +22 -18
- data/lib/nanoc/cli/commands/create-site.rb +2 -7
- data/lib/nanoc/cli/commands/shell.rb +1 -1
- data/lib/nanoc/cli/commands/show-data.rb +9 -9
- data/lib/nanoc/cli/logger.rb +1 -1
- data/lib/nanoc/data_sources/filesystem.rb +8 -8
- data/lib/nanoc/filters/erb.rb +1 -1
- data/lib/nanoc/filters/erubi.rb +1 -1
- data/lib/nanoc/filters/erubis.rb +1 -1
- data/lib/nanoc/filters/haml.rb +1 -1
- data/lib/nanoc/filters/sass.rb +1 -1
- data/lib/nanoc/filters/slim.rb +1 -1
- data/lib/nanoc/helpers/breadcrumbs.rb +2 -2
- data/lib/nanoc/helpers/capturing.rb +9 -8
- data/lib/nanoc/helpers/filtering.rb +2 -2
- data/lib/nanoc/helpers/rendering.rb +1 -1
- data/lib/nanoc/rule_dsl.rb +10 -0
- data/lib/nanoc/rule_dsl/action_provider.rb +3 -3
- data/lib/nanoc/rule_dsl/action_recorder.rb +3 -3
- data/lib/nanoc/rule_dsl/action_sequence_calculator.rb +7 -7
- data/lib/nanoc/rule_dsl/compilation_rule.rb +2 -2
- data/lib/nanoc/rule_dsl/compilation_rule_context.rb +9 -9
- data/lib/nanoc/rule_dsl/compiler_dsl.rb +4 -4
- data/lib/nanoc/rule_dsl/routing_rule.rb +3 -3
- data/lib/nanoc/rule_dsl/rule.rb +5 -5
- data/lib/nanoc/rule_dsl/rule_context.rb +3 -3
- data/lib/nanoc/rule_dsl/rules_collection.rb +4 -4
- data/lib/nanoc/spec.rb +15 -15
- data/lib/nanoc/version.rb +1 -1
- metadata +10 -111
- data/lib/nanoc/base/contracts_support.rb +0 -130
- data/lib/nanoc/base/core_ext.rb +0 -5
- data/lib/nanoc/base/core_ext/array.rb +0 -50
- data/lib/nanoc/base/core_ext/hash.rb +0 -54
- data/lib/nanoc/base/core_ext/string.rb +0 -16
- data/lib/nanoc/base/entities/code_snippet.rb +0 -53
- data/lib/nanoc/base/entities/configuration-schema.json +0 -122
- data/lib/nanoc/base/entities/configuration.rb +0 -206
- data/lib/nanoc/base/entities/content.rb +0 -112
- data/lib/nanoc/base/entities/context.rb +0 -70
- data/lib/nanoc/base/entities/directed_graph.rb +0 -195
- data/lib/nanoc/base/entities/document.rb +0 -125
- data/lib/nanoc/base/entities/identifiable_collection.rb +0 -141
- data/lib/nanoc/base/entities/identifier.rb +0 -222
- data/lib/nanoc/base/entities/item.rb +0 -10
- data/lib/nanoc/base/entities/item_collection.rb +0 -14
- data/lib/nanoc/base/entities/item_rep.rb +0 -91
- data/lib/nanoc/base/entities/layout.rb +0 -10
- data/lib/nanoc/base/entities/layout_collection.rb +0 -14
- data/lib/nanoc/base/entities/lazy_value.rb +0 -43
- data/lib/nanoc/base/entities/pattern.rb +0 -85
- data/lib/nanoc/base/entities/processing_action.rb +0 -21
- data/lib/nanoc/base/entities/processing_actions.rb +0 -5
- data/lib/nanoc/base/entities/processing_actions/filter.rb +0 -36
- data/lib/nanoc/base/entities/processing_actions/layout.rb +0 -36
- data/lib/nanoc/base/entities/processing_actions/snapshot.rb +0 -46
- data/lib/nanoc/base/entities/snapshot_def.rb +0 -22
- data/lib/nanoc/base/repos/data_source.rb +0 -168
- data/lib/nanoc/base/repos/snapshot_repo.rb +0 -67
- data/lib/nanoc/base/services/checksummer.rb +0 -274
- data/lib/nanoc/base/services/notification_center.rb +0 -87
- data/lib/nanoc/base/services/temp_filename_factory.rb +0 -52
@@ -1,14 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Nanoc::Int
|
4
|
-
# @api private
|
5
|
-
class LayoutCollection < IdentifiableCollection
|
6
|
-
def initialize(config, objects = [])
|
7
|
-
initialize_basic(config, objects, 'layouts')
|
8
|
-
end
|
9
|
-
|
10
|
-
def reference
|
11
|
-
'layouts'
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Nanoc::Int
|
4
|
-
# Holds a value that might be generated lazily.
|
5
|
-
#
|
6
|
-
# @api private
|
7
|
-
class LazyValue
|
8
|
-
include Nanoc::Int::ContractsSupport
|
9
|
-
|
10
|
-
# @param [Object, Proc] value_or_proc A value or a proc to generate the value
|
11
|
-
def initialize(value_or_proc)
|
12
|
-
@value = { raw: value_or_proc }
|
13
|
-
end
|
14
|
-
|
15
|
-
# @return [Object] The value, generated when needed
|
16
|
-
def value
|
17
|
-
if @value.key?(:raw)
|
18
|
-
value = @value.delete(:raw)
|
19
|
-
@value[:final] = value.respond_to?(:call) ? value.call : value
|
20
|
-
@value.__nanoc_freeze_recursively if frozen?
|
21
|
-
end
|
22
|
-
@value[:final]
|
23
|
-
end
|
24
|
-
|
25
|
-
contract C::Func[C::Any => C::Any] => self
|
26
|
-
# Returns a new lazy value that will apply the given transformation when the value is requested.
|
27
|
-
#
|
28
|
-
# @yield resolved value
|
29
|
-
#
|
30
|
-
# @return [Nanoc::Int::LazyValue]
|
31
|
-
def map
|
32
|
-
Nanoc::Int::LazyValue.new(-> { yield(value) })
|
33
|
-
end
|
34
|
-
|
35
|
-
contract C::None => self
|
36
|
-
# @return [void]
|
37
|
-
def freeze
|
38
|
-
super
|
39
|
-
@value.__nanoc_freeze_recursively unless @value[:raw]
|
40
|
-
self
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,85 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Nanoc::Int
|
4
|
-
# @api private
|
5
|
-
class Pattern
|
6
|
-
include Nanoc::Int::ContractsSupport
|
7
|
-
|
8
|
-
contract C::Any => self
|
9
|
-
def self.from(obj)
|
10
|
-
case obj
|
11
|
-
when Nanoc::Int::StringPattern, Nanoc::Int::RegexpPattern
|
12
|
-
obj
|
13
|
-
when String
|
14
|
-
Nanoc::Int::StringPattern.new(obj)
|
15
|
-
when Regexp
|
16
|
-
Nanoc::Int::RegexpPattern.new(obj)
|
17
|
-
when Symbol
|
18
|
-
Nanoc::Int::StringPattern.new(obj.to_s)
|
19
|
-
else
|
20
|
-
raise ArgumentError, "Do not know how to convert `#{obj.inspect}` into a Nanoc::Pattern"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def initialize(_obj)
|
25
|
-
raise NotImplementedError
|
26
|
-
end
|
27
|
-
|
28
|
-
def match?(_identifier)
|
29
|
-
raise NotImplementedError
|
30
|
-
end
|
31
|
-
|
32
|
-
def captures(_identifier)
|
33
|
-
raise NotImplementedError
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
# @api private
|
38
|
-
class StringPattern < Pattern
|
39
|
-
MATCH_OPTS = File::FNM_PATHNAME | File::FNM_EXTGLOB
|
40
|
-
|
41
|
-
contract String => C::Any
|
42
|
-
def initialize(string)
|
43
|
-
@string = string
|
44
|
-
end
|
45
|
-
|
46
|
-
contract C::Or[Nanoc::Identifier, String] => C::Bool
|
47
|
-
def match?(identifier)
|
48
|
-
File.fnmatch(@string, identifier.to_s, MATCH_OPTS)
|
49
|
-
end
|
50
|
-
|
51
|
-
contract C::Or[Nanoc::Identifier, String] => nil
|
52
|
-
def captures(_identifier)
|
53
|
-
nil
|
54
|
-
end
|
55
|
-
|
56
|
-
contract C::None => String
|
57
|
-
def to_s
|
58
|
-
@string
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
# @api private
|
63
|
-
class RegexpPattern < Pattern
|
64
|
-
contract Regexp => C::Any
|
65
|
-
def initialize(regexp)
|
66
|
-
@regexp = regexp
|
67
|
-
end
|
68
|
-
|
69
|
-
contract C::Or[Nanoc::Identifier, String] => C::Bool
|
70
|
-
def match?(identifier)
|
71
|
-
(identifier.to_s =~ @regexp) != nil
|
72
|
-
end
|
73
|
-
|
74
|
-
contract C::Or[Nanoc::Identifier, String] => C::Maybe[C::ArrayOf[String]]
|
75
|
-
def captures(identifier)
|
76
|
-
matches = @regexp.match(identifier.to_s)
|
77
|
-
matches&.captures
|
78
|
-
end
|
79
|
-
|
80
|
-
contract C::None => String
|
81
|
-
def to_s
|
82
|
-
@regexp.to_s
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Nanoc::Int
|
4
|
-
class ProcessingAction
|
5
|
-
def serialize
|
6
|
-
raise NotImplementedError.new('Nanoc::ProcessingAction subclasses must implement #serialize and #to_s')
|
7
|
-
end
|
8
|
-
|
9
|
-
def to_s
|
10
|
-
raise NotImplementedError.new('Nanoc::ProcessingAction subclasses must implement #serialize and #to_s')
|
11
|
-
end
|
12
|
-
|
13
|
-
def inspect
|
14
|
-
format(
|
15
|
-
'<%s %s>',
|
16
|
-
self.class.to_s,
|
17
|
-
serialize[1..-1].map(&:inspect).join(', '),
|
18
|
-
)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Nanoc::Int::ProcessingActions
|
4
|
-
class Filter < Nanoc::Int::ProcessingAction
|
5
|
-
# filter :foo
|
6
|
-
# filter :foo, params
|
7
|
-
|
8
|
-
attr_reader :filter_name
|
9
|
-
attr_reader :params
|
10
|
-
|
11
|
-
def initialize(filter_name, params)
|
12
|
-
@filter_name = filter_name
|
13
|
-
@params = params
|
14
|
-
end
|
15
|
-
|
16
|
-
def serialize
|
17
|
-
[:filter, @filter_name, Nanoc::Int::Checksummer.calc(@params)]
|
18
|
-
end
|
19
|
-
|
20
|
-
def to_s
|
21
|
-
"filter #{@filter_name.inspect}, #{@params.inspect}"
|
22
|
-
end
|
23
|
-
|
24
|
-
def hash
|
25
|
-
self.class.hash ^ filter_name.hash ^ params.hash
|
26
|
-
end
|
27
|
-
|
28
|
-
def ==(other)
|
29
|
-
self.class == other.class && filter_name == other.filter_name && params == other.params
|
30
|
-
end
|
31
|
-
|
32
|
-
def eql?(other)
|
33
|
-
self == other
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Nanoc::Int::ProcessingActions
|
4
|
-
class Layout < Nanoc::Int::ProcessingAction
|
5
|
-
# layout '/foo.erb'
|
6
|
-
# layout '/foo.erb', params
|
7
|
-
|
8
|
-
attr_reader :layout_identifier
|
9
|
-
attr_reader :params
|
10
|
-
|
11
|
-
def initialize(layout_identifier, params)
|
12
|
-
@layout_identifier = layout_identifier
|
13
|
-
@params = params
|
14
|
-
end
|
15
|
-
|
16
|
-
def serialize
|
17
|
-
[:layout, @layout_identifier, Nanoc::Int::Checksummer.calc(@params)]
|
18
|
-
end
|
19
|
-
|
20
|
-
def to_s
|
21
|
-
"layout #{@layout_identifier.inspect}, #{@params.inspect}"
|
22
|
-
end
|
23
|
-
|
24
|
-
def hash
|
25
|
-
self.class.hash ^ layout_identifier.hash ^ params.hash
|
26
|
-
end
|
27
|
-
|
28
|
-
def ==(other)
|
29
|
-
self.class == other.class && layout_identifier == other.layout_identifier && params == other.params
|
30
|
-
end
|
31
|
-
|
32
|
-
def eql?(other)
|
33
|
-
self == other
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Nanoc::Int::ProcessingActions
|
4
|
-
class Snapshot < Nanoc::Int::ProcessingAction
|
5
|
-
# snapshot :before_layout
|
6
|
-
# snapshot :before_layout, path: '/about.md'
|
7
|
-
|
8
|
-
include Nanoc::Int::ContractsSupport
|
9
|
-
|
10
|
-
attr_reader :snapshot_names
|
11
|
-
attr_reader :paths
|
12
|
-
|
13
|
-
contract C::IterOf[Symbol], C::IterOf[String] => C::Any
|
14
|
-
def initialize(snapshot_names, paths)
|
15
|
-
@snapshot_names = snapshot_names
|
16
|
-
@paths = paths
|
17
|
-
end
|
18
|
-
|
19
|
-
contract C::None => Array
|
20
|
-
def serialize
|
21
|
-
[:snapshot, @snapshot_names, true, @paths]
|
22
|
-
end
|
23
|
-
|
24
|
-
contract C::KeywordArgs[snapshot_names: C::Optional[C::IterOf[Symbol]], paths: C::Optional[C::IterOf[String]]] => self
|
25
|
-
def update(snapshot_names: [], paths: [])
|
26
|
-
self.class.new(@snapshot_names + snapshot_names.to_a, @paths + paths.to_a)
|
27
|
-
end
|
28
|
-
|
29
|
-
contract C::None => String
|
30
|
-
def to_s
|
31
|
-
"snapshot #{@snapshot_names.inspect}, paths: #{@paths.inspect}"
|
32
|
-
end
|
33
|
-
|
34
|
-
def hash
|
35
|
-
self.class.hash ^ snapshot_names.hash ^ paths.hash
|
36
|
-
end
|
37
|
-
|
38
|
-
def ==(other)
|
39
|
-
self.class == other.class && snapshot_names == other.snapshot_names && paths == other.paths
|
40
|
-
end
|
41
|
-
|
42
|
-
def eql?(other)
|
43
|
-
self == other
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Nanoc
|
4
|
-
module Int
|
5
|
-
class SnapshotDef
|
6
|
-
include Nanoc::Int::ContractsSupport
|
7
|
-
|
8
|
-
attr_reader :name
|
9
|
-
attr_reader :binary
|
10
|
-
|
11
|
-
contract Symbol, C::KeywordArgs[binary: C::Optional[C::Bool]] => C::Any
|
12
|
-
def initialize(name, binary:)
|
13
|
-
@name = name
|
14
|
-
@binary = binary
|
15
|
-
end
|
16
|
-
|
17
|
-
def binary?
|
18
|
-
@binary
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,168 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Nanoc
|
4
|
-
# Responsible for loading site data. It is the (abstract) superclass for all
|
5
|
-
# data sources. Subclasses must at least implement the data reading methods
|
6
|
-
# ({#items} and {#layouts}).
|
7
|
-
#
|
8
|
-
# Apart from the methods for loading and storing data, there are the {#up}
|
9
|
-
# and {#down} methods for bringing up and tearing down the connection to the
|
10
|
-
# data source. These should be overridden in subclasses. The {#loading}
|
11
|
-
# method wraps {#up} and {#down}. {#loading} is a convenience method for the
|
12
|
-
# more low-level methods {#use} and {#unuse}, which respectively increment
|
13
|
-
# and decrement the reference count; when the reference count goes from 0 to
|
14
|
-
# 1, the data source will be loaded ({#up} will be called) and when the
|
15
|
-
# reference count goes from 1 to 0, the data source will be unloaded
|
16
|
-
# ({#down} will be called).
|
17
|
-
#
|
18
|
-
# @abstract Subclasses should at least implement {#items} and {#layouts}.
|
19
|
-
class DataSource
|
20
|
-
# @return [String] The root path where items returned by this data source
|
21
|
-
# should be mounted.
|
22
|
-
attr_reader :items_root
|
23
|
-
|
24
|
-
# @return [String] The root path where layouts returned by this data
|
25
|
-
# source should be mounted.
|
26
|
-
attr_reader :layouts_root
|
27
|
-
|
28
|
-
# @return [Hash] The configuration for this data source. For example,
|
29
|
-
# online data sources could contain authentication details.
|
30
|
-
attr_reader :config
|
31
|
-
|
32
|
-
extend DDPlugin::Plugin
|
33
|
-
|
34
|
-
def initialize(site_config, items_root, layouts_root, config)
|
35
|
-
@site_config = site_config
|
36
|
-
@items_root = items_root
|
37
|
-
@layouts_root = layouts_root
|
38
|
-
@config = config || {}
|
39
|
-
|
40
|
-
@references = 0
|
41
|
-
end
|
42
|
-
|
43
|
-
# Marks the data source as used by the caller.
|
44
|
-
#
|
45
|
-
# Calling this method increases the internal reference count. When the
|
46
|
-
# data source is used for the first time (first {#use} call), the data
|
47
|
-
# source will be loaded ({#up} will be called).
|
48
|
-
#
|
49
|
-
# @return [void]
|
50
|
-
def use
|
51
|
-
up if @references.zero?
|
52
|
-
@references += 1
|
53
|
-
end
|
54
|
-
|
55
|
-
# Marks the data source as unused by the caller.
|
56
|
-
#
|
57
|
-
# Calling this method decreases the internal reference count. When the
|
58
|
-
# reference count reaches zero, i.e. when the data source is not used any
|
59
|
-
# more, the data source will be unloaded ({#down} will be called).
|
60
|
-
#
|
61
|
-
# @return [void]
|
62
|
-
def unuse
|
63
|
-
@references -= 1
|
64
|
-
down if @references.zero?
|
65
|
-
end
|
66
|
-
|
67
|
-
# Brings up the connection to the data. Depending on the way data is
|
68
|
-
# stored, this may not be necessary. This is the ideal place to connect to
|
69
|
-
# the database, for example.
|
70
|
-
#
|
71
|
-
# Subclasses may override this method, but are not required to do so; the
|
72
|
-
# default implementation simply does nothing.
|
73
|
-
#
|
74
|
-
# @return [void]
|
75
|
-
def up; end
|
76
|
-
|
77
|
-
# Brings down the connection to the data. This method should undo the
|
78
|
-
# effects of the {#up} method. For example, a database connection
|
79
|
-
# established in {#up} should be closed in this method.
|
80
|
-
#
|
81
|
-
# Subclasses may override this method, but are not required to do so; the
|
82
|
-
# default implementation simply does nothing.
|
83
|
-
#
|
84
|
-
# @return [void]
|
85
|
-
def down; end
|
86
|
-
|
87
|
-
# Returns the collection of items (represented by {Nanoc::Int::Item}) in
|
88
|
-
# this site. The default implementation simply returns an empty array.
|
89
|
-
#
|
90
|
-
# Subclasses should not prepend `items_root` to the item's identifiers, as
|
91
|
-
# this will be done automatically.
|
92
|
-
#
|
93
|
-
# Subclasses may override this method, but are not required to do so; the
|
94
|
-
# default implementation simply does nothing.
|
95
|
-
#
|
96
|
-
# @return [Enumerable] The collection of items
|
97
|
-
def items
|
98
|
-
[]
|
99
|
-
end
|
100
|
-
|
101
|
-
# @api private
|
102
|
-
def item_changes
|
103
|
-
warn "Caution: Data source #{self.class.identifier.inspect} does not implement #item_changes; live compilation will not pick up changes in this data source."
|
104
|
-
Enumerator.new { |_y| sleep }
|
105
|
-
end
|
106
|
-
|
107
|
-
# @api private
|
108
|
-
def layout_changes
|
109
|
-
warn "Caution: Data source #{self.class.identifier.inspect} does not implement #layout_changes; live compilation will not pick up changes in this data source."
|
110
|
-
Enumerator.new { |_y| sleep }
|
111
|
-
end
|
112
|
-
|
113
|
-
# Returns the collection of layouts (represented by {Nanoc::Int::Layout}) in
|
114
|
-
# this site. The default implementation simply returns an empty array.
|
115
|
-
#
|
116
|
-
# Subclasses should prepend `layout_root` to the layout's identifiers,
|
117
|
-
# since this is not done automatically.
|
118
|
-
#
|
119
|
-
# Subclasses may override this method, but are not required to do so; the
|
120
|
-
# default implementation simply does nothing.
|
121
|
-
#
|
122
|
-
# @return [Enumerable] The collection of layouts
|
123
|
-
def layouts
|
124
|
-
[]
|
125
|
-
end
|
126
|
-
|
127
|
-
# Creates a new in-memory item instance. This is intended for use within
|
128
|
-
# the {#items} method.
|
129
|
-
#
|
130
|
-
# @param [String, Proc] content The uncompiled item content
|
131
|
-
# (if it is a textual item) or the path to the filename containing the
|
132
|
-
# content (if it is a binary item).
|
133
|
-
#
|
134
|
-
# @param [Hash, Proc] attributes A hash containing this item's attributes.
|
135
|
-
#
|
136
|
-
# @param [String] identifier This item's identifier.
|
137
|
-
#
|
138
|
-
# @param [Boolean] binary Whether or not this item is binary
|
139
|
-
#
|
140
|
-
# @param [String, nil] checksum_data
|
141
|
-
#
|
142
|
-
# @param [String, nil] content_checksum_data
|
143
|
-
#
|
144
|
-
# @param [String, nil] attributes_checksum_data
|
145
|
-
def new_item(content, attributes, identifier, binary: false, checksum_data: nil, content_checksum_data: nil, attributes_checksum_data: nil)
|
146
|
-
content = Nanoc::Int::Content.create(content, binary: binary)
|
147
|
-
Nanoc::Int::Item.new(content, attributes, identifier, checksum_data: checksum_data, content_checksum_data: content_checksum_data, attributes_checksum_data: attributes_checksum_data)
|
148
|
-
end
|
149
|
-
|
150
|
-
# Creates a new in-memory layout instance. This is intended for use within
|
151
|
-
# the {#layouts} method.
|
152
|
-
#
|
153
|
-
# @param [String] raw_content The raw content of this layout.
|
154
|
-
#
|
155
|
-
# @param [Hash] attributes A hash containing this layout's attributes.
|
156
|
-
#
|
157
|
-
# @param [String] identifier This layout's identifier.
|
158
|
-
#
|
159
|
-
# @param [String, nil] checksum_data
|
160
|
-
#
|
161
|
-
# @param [String, nil] content_checksum_data
|
162
|
-
#
|
163
|
-
# @param [String, nil] attributes_checksum_data
|
164
|
-
def new_layout(raw_content, attributes, identifier, checksum_data: nil, content_checksum_data: nil, attributes_checksum_data: nil)
|
165
|
-
Nanoc::Int::Layout.new(raw_content, attributes, identifier, checksum_data: checksum_data, content_checksum_data: content_checksum_data, attributes_checksum_data: attributes_checksum_data)
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|