nanoc 4.4.4 → 4.4.5
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/Gemfile +1 -0
- data/Gemfile.lock +9 -8
- data/NEWS.md +10 -0
- data/lib/nanoc/base.rb +0 -3
- data/lib/nanoc/base/contracts_support.rb +55 -2
- data/lib/nanoc/base/core_ext/array.rb +0 -2
- data/lib/nanoc/base/core_ext/hash.rb +0 -2
- data/lib/nanoc/base/entities.rb +1 -0
- data/lib/nanoc/base/entities/context.rb +1 -4
- data/lib/nanoc/base/entities/directed_graph.rb +0 -10
- data/lib/nanoc/base/entities/identifiable_collection.rb +1 -2
- data/lib/nanoc/base/entities/identifier.rb +6 -8
- data/lib/nanoc/base/entities/item_rep.rb +12 -18
- data/lib/nanoc/base/{compilation → entities}/outdatedness_reasons.rb +0 -0
- data/lib/nanoc/base/entities/site.rb +3 -19
- data/lib/nanoc/base/errors.rb +9 -0
- data/lib/nanoc/base/memoization.rb +0 -2
- data/lib/nanoc/base/repos/checksum_store.rb +21 -14
- data/lib/nanoc/base/repos/compiled_content_cache.rb +11 -15
- data/lib/nanoc/base/repos/dependency_store.rb +8 -27
- data/lib/nanoc/base/services.rb +3 -0
- data/lib/nanoc/base/services/compiler.rb +379 -0
- data/lib/nanoc/base/services/compiler_loader.rb +3 -1
- data/lib/nanoc/base/services/executor.rb +27 -41
- data/lib/nanoc/base/services/item_rep_builder.rb +4 -0
- data/lib/nanoc/base/services/item_rep_writer.rb +5 -2
- data/lib/nanoc/base/{compilation → services}/outdatedness_checker.rb +1 -1
- data/lib/nanoc/base/views/post_compile_item_rep_view.rb +1 -1
- data/lib/nanoc/base/views/view_context.rb +3 -3
- data/lib/nanoc/checking/check.rb +1 -1
- data/lib/nanoc/checking/checks/external_links.rb +1 -1
- data/lib/nanoc/cli.rb +0 -4
- data/lib/nanoc/cli/commands/compile.rb +2 -2
- data/lib/nanoc/cli/commands/shell.rb +1 -1
- data/lib/nanoc/data_sources/filesystem.rb +10 -20
- data/lib/nanoc/data_sources/filesystem/errors.rb +55 -0
- data/lib/nanoc/filters/asciidoc.rb +0 -2
- data/lib/nanoc/filters/coffeescript.rb +0 -2
- data/lib/nanoc/filters/colorize_syntax.rb +0 -2
- data/lib/nanoc/filters/handlebars.rb +0 -2
- data/lib/nanoc/filters/mustache.rb +0 -2
- data/lib/nanoc/filters/redcarpet.rb +0 -4
- data/lib/nanoc/filters/slim.rb +0 -2
- data/lib/nanoc/filters/typogruby.rb +0 -2
- data/lib/nanoc/filters/xsl.rb +0 -2
- data/lib/nanoc/filters/yui_compressor.rb +0 -2
- data/lib/nanoc/helpers/capturing.rb +22 -19
- data/lib/nanoc/helpers/link_to.rb +3 -7
- data/lib/nanoc/helpers/rendering.rb +1 -1
- data/lib/nanoc/rule_dsl/action_provider.rb +2 -2
- data/lib/nanoc/rule_dsl/compiler_dsl.rb +0 -2
- data/lib/nanoc/rule_dsl/recording_executor.rb +6 -6
- data/lib/nanoc/rule_dsl/rule.rb +0 -2
- data/lib/nanoc/rule_dsl/rule_context.rb +3 -3
- data/lib/nanoc/rule_dsl/rule_memory_calculator.rb +5 -5
- data/lib/nanoc/spec.rb +1 -1
- data/lib/nanoc/version.rb +1 -1
- data/test/base/test_compiler.rb +3 -1
- data/test/base/test_dependency_tracker.rb +0 -19
- data/test/base/test_item_rep.rb +3 -0
- data/test/cli/commands/test_create_site.rb +1 -1
- data/test/data_sources/test_filesystem.rb +5 -5
- data/test/filters/test_coffeescript.rb +2 -0
- data/test/filters/test_handlebars.rb +4 -0
- data/test/filters/test_uglify_js.rb +4 -0
- data/test/filters/test_xsl.rb +1 -1
- data/test/helper.rb +6 -0
- data/test/helpers/test_capturing.rb +6 -1
- data/test/helpers/test_xml_sitemap.rb +1 -1
- metadata +6 -6
- data/lib/nanoc/base/compilation/compiler.rb +0 -295
- data/test/base/test_checksum_store.rb +0 -28
@@ -250,8 +250,6 @@ module Nanoc::Filters
|
|
250
250
|
|
251
251
|
# Runs the content through [Highlight](http://www.andre-simon.de/doku/highlight/en/highlight.html).
|
252
252
|
#
|
253
|
-
# @since 3.2.0
|
254
|
-
#
|
255
253
|
# @param [String] code The code to colorize
|
256
254
|
#
|
257
255
|
# @param [String] language The language the code is written in
|
@@ -1,6 +1,4 @@
|
|
1
1
|
module Nanoc::Filters
|
2
|
-
# @since 3.2.0
|
3
|
-
#
|
4
2
|
# @api private
|
5
3
|
class Redcarpet < Nanoc::Filter
|
6
4
|
requires 'redcarpet'
|
@@ -23,8 +21,6 @@ module Nanoc::Filters
|
|
23
21
|
#
|
24
22
|
# For Redcarpet 2.x
|
25
23
|
#
|
26
|
-
# @since 3.2.4
|
27
|
-
#
|
28
24
|
# @param [String] content The content to filter
|
29
25
|
#
|
30
26
|
# @option params [Hash] :options ({}) A list of options to pass on to
|
data/lib/nanoc/filters/slim.rb
CHANGED
data/lib/nanoc/filters/xsl.rb
CHANGED
@@ -27,30 +27,32 @@ module Nanoc::Helpers
|
|
27
27
|
existing_behavior = params.fetch(:existing, :error)
|
28
28
|
|
29
29
|
# Capture
|
30
|
-
|
30
|
+
content_string = capture(&block)
|
31
31
|
|
32
|
-
#
|
32
|
+
# Get existing contents and prep for store
|
33
33
|
snapshot_contents = @item.reps[:default].unwrap.snapshot_contents
|
34
34
|
capture_name = "__capture_#{name}".to_sym
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
35
|
+
old_content_string =
|
36
|
+
case existing_behavior
|
37
|
+
when :overwrite
|
38
|
+
''
|
39
|
+
when :append
|
40
|
+
c = snapshot_contents[capture_name]
|
41
|
+
c ? c.string : ''
|
42
|
+
when :error
|
43
|
+
if snapshot_contents[capture_name] && snapshot_contents[capture_name].string != content_string
|
44
|
+
# FIXME: get proper exception
|
45
|
+
raise "a capture named #{name.inspect} for #{@item.identifier} already exists"
|
46
|
+
else
|
47
|
+
''
|
48
|
+
end
|
44
49
|
else
|
45
|
-
|
50
|
+
raise ArgumentError, 'expected :existing_behavior param to #content_for to be one of ' \
|
51
|
+
":overwrite, :append, or :error, but #{existing_behavior.inspect} was given"
|
46
52
|
end
|
47
|
-
else
|
48
|
-
raise ArgumentError, 'expected :existing_behavior param to #content_for to be one of ' \
|
49
|
-
":overwrite, :append, or :error, but #{existing_behavior.inspect} was given"
|
50
|
-
end
|
51
53
|
|
52
54
|
# Store
|
53
|
-
snapshot_contents[capture_name]
|
55
|
+
snapshot_contents[capture_name] = Nanoc::Int::TextualContent.new(old_content_string + content_string)
|
54
56
|
else # Get content
|
55
57
|
if args.size != 2
|
56
58
|
raise ArgumentError, 'expected 2 arguments (the item ' \
|
@@ -72,7 +74,8 @@ module Nanoc::Helpers
|
|
72
74
|
end
|
73
75
|
end
|
74
76
|
|
75
|
-
rep.snapshot_contents["__capture_#{name}".to_sym]
|
77
|
+
content = rep.snapshot_contents["__capture_#{name}".to_sym]
|
78
|
+
content ? content.string : nil
|
76
79
|
end
|
77
80
|
end
|
78
81
|
|
@@ -93,7 +96,7 @@ module Nanoc::Helpers
|
|
93
96
|
|
94
97
|
# Depending on how the filter outputs, the result might be a
|
95
98
|
# single string or an array of strings (slim outputs the latter).
|
96
|
-
erbout_addition = erbout_addition.join if erbout_addition.is_a? Array
|
99
|
+
erbout_addition = erbout_addition.join('') if erbout_addition.is_a? Array
|
97
100
|
|
98
101
|
# Done.
|
99
102
|
erbout_addition
|
@@ -78,15 +78,11 @@ module Nanoc::Helpers
|
|
78
78
|
|
79
79
|
# Calculate the relative path (method depends on whether destination is
|
80
80
|
# a directory or not).
|
81
|
-
|
82
|
-
|
83
|
-
dst_path.relative_path_from(src_path.dirname).to_s
|
84
|
-
else
|
85
|
-
dst_path.relative_path_from(src_path).to_s
|
86
|
-
end
|
81
|
+
from = src_path.to_s.end_with?('/') ? src_path : src_path.dirname
|
82
|
+
relative_path = dst_path.relative_path_from(from).to_s
|
87
83
|
|
88
84
|
# Add trailing slash if necessary
|
89
|
-
if dst_path.to_s
|
85
|
+
if dst_path.to_s.end_with?('/')
|
90
86
|
relative_path << '/'
|
91
87
|
end
|
92
88
|
|
@@ -37,7 +37,7 @@ module Nanoc::Helpers
|
|
37
37
|
}.merge(other_assigns)
|
38
38
|
|
39
39
|
# Get filter name
|
40
|
-
filter_name, filter_args = *@config._context.
|
40
|
+
filter_name, filter_args = *@config._context.compilation_context.filter_name_and_args_for_layout(layout)
|
41
41
|
raise Nanoc::Int::Errors::CannotDetermineFilter.new(layout.identifier) if filter_name.nil?
|
42
42
|
|
43
43
|
# Get filter class
|
@@ -55,7 +55,7 @@ module Nanoc::RuleDSL
|
|
55
55
|
reps: reps,
|
56
56
|
items: site.items,
|
57
57
|
dependency_tracker: dependency_tracker,
|
58
|
-
|
58
|
+
compilation_context: site.compiler.compilation_context,
|
59
59
|
)
|
60
60
|
ctx = new_postprocessor_context(site, view_context)
|
61
61
|
|
@@ -72,7 +72,7 @@ module Nanoc::RuleDSL
|
|
72
72
|
reps: nil,
|
73
73
|
items: nil,
|
74
74
|
dependency_tracker: dependency_tracker,
|
75
|
-
|
75
|
+
compilation_context: nil,
|
76
76
|
)
|
77
77
|
|
78
78
|
Nanoc::Int::Context.new(
|
@@ -19,11 +19,11 @@ module Nanoc
|
|
19
19
|
@rule_memory = Nanoc::Int::RuleMemory.new(item_rep)
|
20
20
|
end
|
21
21
|
|
22
|
-
def filter(
|
22
|
+
def filter(filter_name, filter_args = {})
|
23
23
|
@rule_memory.add_filter(filter_name, filter_args)
|
24
24
|
end
|
25
25
|
|
26
|
-
def layout(
|
26
|
+
def layout(layout_identifier, extra_filter_args = {})
|
27
27
|
unless layout_identifier.is_a?(String)
|
28
28
|
raise ArgumentError.new('The layout passed to #layout must be a string')
|
29
29
|
end
|
@@ -36,9 +36,9 @@ module Nanoc
|
|
36
36
|
end
|
37
37
|
|
38
38
|
Pathlike = C::Maybe[C::Or[String, Nanoc::Identifier]]
|
39
|
-
contract
|
40
|
-
def snapshot(
|
41
|
-
pathlike = final ? (path || basic_path_from_rules_for(
|
39
|
+
contract Symbol, C::KeywordArgs[path: C::Optional[Pathlike], final: C::Optional[C::Bool]] => nil
|
40
|
+
def snapshot(snapshot_name, final: true, path: nil)
|
41
|
+
pathlike = final ? (path || basic_path_from_rules_for(@item_rep, snapshot_name)) : nil
|
42
42
|
actual_path = pathlike && pathlike.to_s
|
43
43
|
@rule_memory.add_snapshot(snapshot_name, final, actual_path)
|
44
44
|
nil
|
@@ -50,7 +50,7 @@ module Nanoc
|
|
50
50
|
return nil if routing_rule.nil?
|
51
51
|
|
52
52
|
dependency_tracker = Nanoc::Int::DependencyTracker::Null.new
|
53
|
-
view_context = Nanoc::ViewContext.new(reps: nil, items: nil, dependency_tracker: dependency_tracker,
|
53
|
+
view_context = Nanoc::ViewContext.new(reps: nil, items: nil, dependency_tracker: dependency_tracker, compilation_context: nil)
|
54
54
|
basic_path = routing_rule.apply_to(rep, executor: nil, site: @site, view_context: view_context)
|
55
55
|
if basic_path && !basic_path.start_with?('/')
|
56
56
|
raise PathWithoutInitialSlashError.new(rep, basic_path)
|
data/lib/nanoc/rule_dsl/rule.rb
CHANGED
@@ -35,7 +35,7 @@ module Nanoc::RuleDSL
|
|
35
35
|
#
|
36
36
|
# @return [void]
|
37
37
|
def filter(filter_name, filter_args = {})
|
38
|
-
@_executor.filter(
|
38
|
+
@_executor.filter(filter_name, filter_args)
|
39
39
|
end
|
40
40
|
|
41
41
|
# Layouts the current representation (calls {Nanoc::Int::ItemRep#layout} with
|
@@ -48,7 +48,7 @@ module Nanoc::RuleDSL
|
|
48
48
|
#
|
49
49
|
# @return [void]
|
50
50
|
def layout(layout_identifier, extra_filter_args = nil)
|
51
|
-
@_executor.layout(
|
51
|
+
@_executor.layout(layout_identifier, extra_filter_args)
|
52
52
|
end
|
53
53
|
|
54
54
|
# Creates a snapshot of the current compiled item content. Calls
|
@@ -62,7 +62,7 @@ module Nanoc::RuleDSL
|
|
62
62
|
#
|
63
63
|
# @return [void]
|
64
64
|
def snapshot(snapshot_name, path: nil)
|
65
|
-
@_executor.snapshot(
|
65
|
+
@_executor.snapshot(snapshot_name, path: path)
|
66
66
|
end
|
67
67
|
|
68
68
|
# Creates a snapshot named :last the current compiled item content, with
|
@@ -66,7 +66,7 @@ module Nanoc::RuleDSL
|
|
66
66
|
# @return [Nanoc::Int::RuleMemory]
|
67
67
|
def new_rule_memory_for_rep(rep)
|
68
68
|
dependency_tracker = Nanoc::Int::DependencyTracker::Null.new
|
69
|
-
view_context = @site.compiler.create_view_context(dependency_tracker)
|
69
|
+
view_context = @site.compiler.compilation_context.create_view_context(dependency_tracker)
|
70
70
|
|
71
71
|
executor = Nanoc::RuleDSL::RecordingExecutor.new(rep, @rules_collection, @site)
|
72
72
|
rule = @rules_collection.compilation_rule_for(rep)
|
@@ -75,14 +75,14 @@ module Nanoc::RuleDSL
|
|
75
75
|
raise NoRuleMemoryForItemRepException.new(rep)
|
76
76
|
end
|
77
77
|
|
78
|
-
executor.snapshot(
|
79
|
-
executor.snapshot(
|
78
|
+
executor.snapshot(:raw)
|
79
|
+
executor.snapshot(:pre, final: false)
|
80
80
|
rule.apply_to(rep, executor: executor, site: @site, view_context: view_context)
|
81
81
|
if executor.rule_memory.any_layouts?
|
82
|
-
executor.snapshot(
|
82
|
+
executor.snapshot(:post)
|
83
83
|
end
|
84
84
|
unless executor.rule_memory.snapshot_actions.any? { |sa| sa.snapshot_name == :last }
|
85
|
-
executor.snapshot(
|
85
|
+
executor.snapshot(:last)
|
86
86
|
end
|
87
87
|
|
88
88
|
executor.rule_memory
|
data/lib/nanoc/spec.rb
CHANGED
data/lib/nanoc/version.rb
CHANGED
data/test/base/test_compiler.rb
CHANGED
@@ -11,9 +11,11 @@ class Nanoc::Int::CompilerTest < Nanoc::TestCase
|
|
11
11
|
|
12
12
|
action_provider = Nanoc::Int::ActionProvider.named(:rule_dsl).for(site)
|
13
13
|
|
14
|
+
objects = site.items.to_a + site.layouts.to_a
|
15
|
+
|
14
16
|
params = {
|
15
17
|
compiled_content_cache: Nanoc::Int::CompiledContentCache.new(items: site.items),
|
16
|
-
checksum_store: Nanoc::Int::ChecksumStore.new(site: site),
|
18
|
+
checksum_store: Nanoc::Int::ChecksumStore.new(site: site, objects: objects),
|
17
19
|
rule_memory_store: Nanoc::Int::RuleMemoryStore.new,
|
18
20
|
dependency_store: Nanoc::Int::DependencyStore.new(
|
19
21
|
site.items.to_a + site.layouts.to_a,
|
@@ -87,25 +87,6 @@ class Nanoc::Int::DependencyTrackerTest < Nanoc::TestCase
|
|
87
87
|
assert_contains_exactly [items[1]], store.objects_causing_outdatedness_of(items[0])
|
88
88
|
end
|
89
89
|
|
90
|
-
def test_objects_outdated_due_to
|
91
|
-
# Mock items
|
92
|
-
items = [
|
93
|
-
Nanoc::Int::Item.new('a', {}, '/a.md'),
|
94
|
-
Nanoc::Int::Item.new('b', {}, '/b.md'),
|
95
|
-
Nanoc::Int::Item.new('c', {}, '/c.md'),
|
96
|
-
]
|
97
|
-
|
98
|
-
# Create
|
99
|
-
store = Nanoc::Int::DependencyStore.new(items)
|
100
|
-
|
101
|
-
# Record some dependencies
|
102
|
-
store.record_dependency(items[0], items[1])
|
103
|
-
store.record_dependency(items[1], items[2])
|
104
|
-
|
105
|
-
# Verify dependencies
|
106
|
-
assert_contains_exactly [items[0]], store.objects_outdated_due_to(items[1])
|
107
|
-
end
|
108
|
-
|
109
90
|
def test_store_graph_and_load_graph_simple
|
110
91
|
# Mock items
|
111
92
|
items = [
|
data/test/base/test_item_rep.rb
CHANGED
@@ -139,7 +139,10 @@ class Nanoc::Int::ItemRepTest < Nanoc::TestCase
|
|
139
139
|
def test_access_compiled_content_of_binary_item
|
140
140
|
content = Nanoc::Int::BinaryContent.new(File.expand_path('content/somefile.dat'))
|
141
141
|
item = Nanoc::Int::Item.new(content, {}, '/somefile/')
|
142
|
+
|
142
143
|
item_rep = Nanoc::Int::ItemRep.new(item, :foo)
|
144
|
+
item_rep.expects(:compiled?).returns(true)
|
145
|
+
|
143
146
|
assert_raises(Nanoc::Int::Errors::CannotGetCompiledContentOfBinaryItem) do
|
144
147
|
item_rep.compiled_content
|
145
148
|
end
|
@@ -75,7 +75,7 @@ class Nanoc::CLI::Commands::CreateSiteTest < Nanoc::TestCase
|
|
75
75
|
FileUtils.cd('foo') do
|
76
76
|
# Try with encoding = default encoding = utf-8
|
77
77
|
File.open('content/index.html', 'w') { |io| io.write('Hello ' + 0xD6.chr + "!\n") }
|
78
|
-
exception = assert_raises(
|
78
|
+
exception = assert_raises(Nanoc::DataSources::Filesystem::Errors::InvalidEncoding) do
|
79
79
|
Nanoc::Int::SiteLoader.new.new_from_cwd
|
80
80
|
end
|
81
81
|
assert_equal 'Could not read content/index.html because the file is not valid UTF-8.', exception.message
|
@@ -135,7 +135,7 @@ class Nanoc::DataSources::FilesystemTest < Nanoc::TestCase
|
|
135
135
|
File.open('foo/stuff.dat', 'w') { |io| io.write('random binary data') }
|
136
136
|
|
137
137
|
# Load
|
138
|
-
assert_raises(
|
138
|
+
assert_raises(Nanoc::DataSources::Filesystem::Errors::BinaryLayout) do
|
139
139
|
data_source.send(:load_objects, 'foo', Nanoc::Int::Layout)
|
140
140
|
end
|
141
141
|
end
|
@@ -642,7 +642,7 @@ class Nanoc::DataSources::FilesystemTest < Nanoc::TestCase
|
|
642
642
|
end
|
643
643
|
|
644
644
|
# Check
|
645
|
-
assert_raises
|
645
|
+
assert_raises(Nanoc::DataSources::Filesystem::Errors::MultipleContentFiles) do
|
646
646
|
data_source.send(:all_split_files_in, '.')
|
647
647
|
end
|
648
648
|
end
|
@@ -829,7 +829,7 @@ class Nanoc::DataSources::FilesystemTest < Nanoc::TestCase
|
|
829
829
|
data_source = Nanoc::DataSources::Filesystem.new(nil, nil, nil, nil)
|
830
830
|
|
831
831
|
# Parse it
|
832
|
-
assert_raises(
|
832
|
+
assert_raises(Nanoc::DataSources::Filesystem::Errors::InvalidFormat) do
|
833
833
|
data_source.instance_eval { parse('test.html', nil) }
|
834
834
|
end
|
835
835
|
end
|
@@ -981,7 +981,7 @@ class Nanoc::DataSources::FilesystemTest < Nanoc::TestCase
|
|
981
981
|
|
982
982
|
data_source = Nanoc::DataSources::Filesystem.new(nil, nil, nil, nil)
|
983
983
|
|
984
|
-
assert_raises(Nanoc::DataSources::Filesystem::
|
984
|
+
assert_raises(Nanoc::DataSources::Filesystem::Errors::InvalidMetadata) do
|
985
985
|
data_source.instance_eval { parse('test.html', nil) }
|
986
986
|
end
|
987
987
|
end
|
@@ -992,7 +992,7 @@ class Nanoc::DataSources::FilesystemTest < Nanoc::TestCase
|
|
992
992
|
|
993
993
|
data_source = Nanoc::DataSources::Filesystem.new(nil, nil, nil, nil)
|
994
994
|
|
995
|
-
assert_raises(Nanoc::DataSources::Filesystem::
|
995
|
+
assert_raises(Nanoc::DataSources::Filesystem::Errors::InvalidMetadata) do
|
996
996
|
data_source.instance_eval { parse('test.html', 'test.yaml') }
|
997
997
|
end
|
998
998
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
class Nanoc::Filters::HandlebarsTest < Nanoc::TestCase
|
2
2
|
def test_filter
|
3
|
+
skip_v8_on_ruby24
|
4
|
+
|
3
5
|
if_have 'handlebars' do
|
4
6
|
# Create data
|
5
7
|
item = Nanoc::Int::Item.new(
|
@@ -34,6 +36,8 @@ class Nanoc::Filters::HandlebarsTest < Nanoc::TestCase
|
|
34
36
|
end
|
35
37
|
|
36
38
|
def test_filter_without_layout
|
39
|
+
skip_v8_on_ruby24
|
40
|
+
|
37
41
|
if_have 'handlebars' do
|
38
42
|
# Create data
|
39
43
|
item = Nanoc::Int::Item.new(
|