nanoc 4.0.0a1 → 4.0.0a2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +9 -4
- data/NEWS.md +13 -0
- data/lib/nanoc/base.rb +2 -0
- data/lib/nanoc/base/compilation/compiler.rb +0 -1
- data/lib/nanoc/base/compilation/compiler_dsl.rb +21 -7
- data/lib/nanoc/base/compilation/item_rep_proxy.rb +10 -1
- data/lib/nanoc/base/compilation/rule.rb +10 -12
- data/lib/nanoc/base/compilation/rules_collection.rb +2 -2
- data/lib/nanoc/base/pattern.rb +63 -0
- data/lib/nanoc/base/source_data/data_source.rb +33 -18
- data/lib/nanoc/base/source_data/identifier.rb +65 -3
- data/lib/nanoc/base/source_data/item.rb +1 -1
- data/lib/nanoc/base/source_data/item_array.rb +17 -2
- data/lib/nanoc/base/source_data/layout.rb +1 -1
- data/lib/nanoc/base/source_data/site.rb +4 -3
- data/lib/nanoc/base/views/config.rb +22 -0
- data/lib/nanoc/base/views/item.rb +76 -0
- data/lib/nanoc/base/views/item_collection.rb +46 -4
- data/lib/nanoc/base/views/item_rep.rb +23 -0
- data/lib/nanoc/base/views/layout.rb +4 -0
- data/lib/nanoc/base/views/layout_collection.rb +7 -1
- data/lib/nanoc/base/views/mutable_config.rb +5 -0
- data/lib/nanoc/base/views/mutable_item.rb +15 -0
- data/lib/nanoc/base/views/mutable_item_collection.rb +25 -0
- data/lib/nanoc/base/views/mutable_layout.rb +5 -0
- data/lib/nanoc/base/views/mutable_layout_collection.rb +20 -2
- data/lib/nanoc/cli/cleaning_stream.rb +15 -0
- data/lib/nanoc/cli/commands/create-site.rb +17 -35
- data/lib/nanoc/cli/commands/shell.rb +7 -4
- data/lib/nanoc/data_sources.rb +0 -1
- data/lib/nanoc/data_sources/filesystem.rb +75 -76
- data/lib/nanoc/data_sources/filesystem_unified.rb +4 -27
- data/lib/nanoc/data_sources/filesystem_verbose.rb +4 -21
- data/lib/nanoc/version.rb +1 -1
- data/nanoc.gemspec +1 -1
- data/test/base/test_compiler.rb +35 -15
- data/test/base/test_compiler_dsl.rb +32 -30
- data/test/base/test_data_source.rb +2 -2
- data/test/base/test_item_array.rb +10 -1
- data/test/base/test_rule.rb +2 -2
- data/test/base/test_site.rb +32 -0
- data/test/cli/commands/test_create_site.rb +7 -1
- data/test/cli/commands/test_prune.rb +2 -2
- data/test/data_sources/test_filesystem.rb +29 -9
- data/test/data_sources/test_filesystem_unified.rb +48 -68
- data/test/helper.rb +1 -0
- data/test/helpers/test_breadcrumbs.rb +4 -4
- data/test/test_gem.rb +0 -1
- metadata +4 -5
- data/lib/nanoc/data_sources/static.rb +0 -62
- data/test/data_sources/test_static.rb +0 -93
@@ -45,27 +45,6 @@ module Nanoc::DataSources
|
|
45
45
|
|
46
46
|
private
|
47
47
|
|
48
|
-
# See {Nanoc::DataSources::Filesystem#create_object}.
|
49
|
-
def create_object(dir_name, content, attributes, identifier, params = {})
|
50
|
-
# Determine base path
|
51
|
-
last_component = identifier.split('/')[-1] || dir_name
|
52
|
-
|
53
|
-
# Get filenames
|
54
|
-
ext = params[:extension] || '.html'
|
55
|
-
dir_path = dir_name + identifier
|
56
|
-
meta_filename = dir_name + identifier + last_component + '.yaml'
|
57
|
-
content_filename = dir_name + identifier + last_component + ext
|
58
|
-
|
59
|
-
# Notify
|
60
|
-
Nanoc::Int::NotificationCenter.post(:file_created, meta_filename)
|
61
|
-
Nanoc::Int::NotificationCenter.post(:file_created, content_filename)
|
62
|
-
|
63
|
-
# Create files
|
64
|
-
FileUtils.mkdir_p(dir_path)
|
65
|
-
File.open(meta_filename, 'w') { |io| io.write(YAML.dump(attributes.__nanoc_stringify_keys_recursively)) }
|
66
|
-
File.open(content_filename, 'w') { |io| io.write(content) }
|
67
|
-
end
|
68
|
-
|
69
48
|
# See {Nanoc::DataSources::Filesystem#filename_for}.
|
70
49
|
def filename_for(base_filename, ext)
|
71
50
|
return nil if ext.nil?
|
@@ -82,6 +61,10 @@ module Nanoc::DataSources
|
|
82
61
|
|
83
62
|
# See {Nanoc::DataSources::Filesystem#identifier_for_filename}.
|
84
63
|
def identifier_for_filename(filename)
|
64
|
+
if config[:identifier_style] == 'full'
|
65
|
+
return Nanoc::Identifier.new(filename, style: :full)
|
66
|
+
end
|
67
|
+
|
85
68
|
filename.sub(/[^\/]+\.yaml$/, '')
|
86
69
|
end
|
87
70
|
end
|
data/lib/nanoc/version.rb
CHANGED
data/nanoc.gemspec
CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.rdoc_options = ['--main', 'README.md']
|
26
26
|
s.extra_rdoc_files = ['ChangeLog', 'LICENSE', 'README.md', 'NEWS.md']
|
27
27
|
|
28
|
-
s.required_ruby_version = '>=
|
28
|
+
s.required_ruby_version = '>= 2.0.0'
|
29
29
|
|
30
30
|
s.add_runtime_dependency('cri', '~> 2.3')
|
31
31
|
|
data/test/base/test_compiler.rb
CHANGED
@@ -53,7 +53,7 @@ class Nanoc::Int::CompilerTest < Nanoc::TestCase
|
|
53
53
|
|
54
54
|
# Create compiler
|
55
55
|
compiler = Nanoc::Int::Compiler.new(site)
|
56
|
-
compiler.rules_collection.layout_filter_mapping[/.*/] = [:erb, { foo: 'bar' }]
|
56
|
+
compiler.rules_collection.layout_filter_mapping[Nanoc::Int::Pattern.from(/.*/)] = [:erb, { foo: 'bar' }]
|
57
57
|
|
58
58
|
# Mock layout
|
59
59
|
layout = MiniTest::Mock.new
|
@@ -69,7 +69,7 @@ class Nanoc::Int::CompilerTest < Nanoc::TestCase
|
|
69
69
|
|
70
70
|
# Create compiler
|
71
71
|
compiler = Nanoc::Int::Compiler.new(site)
|
72
|
-
compiler.rules_collection.layout_filter_mapping[/.*/] = [:some_unknown_filter, { foo: 'bar' }]
|
72
|
+
compiler.rules_collection.layout_filter_mapping[Nanoc::Int::Pattern.from(/.*/)] = [:some_unknown_filter, { foo: 'bar' }]
|
73
73
|
|
74
74
|
# Mock layout
|
75
75
|
layout = MiniTest::Mock.new
|
@@ -85,7 +85,7 @@ class Nanoc::Int::CompilerTest < Nanoc::TestCase
|
|
85
85
|
|
86
86
|
# Create compiler
|
87
87
|
compiler = Nanoc::Int::Compiler.new(site)
|
88
|
-
compiler.rules_collection.layout_filter_mapping[%r{^/foo/$}] = [:erb, { foo: 'bar' }]
|
88
|
+
compiler.rules_collection.layout_filter_mapping[Nanoc::Int::Pattern.from(%r{^/foo/$})] = [:erb, { foo: 'bar' }]
|
89
89
|
|
90
90
|
# Mock layout
|
91
91
|
layout = MiniTest::Mock.new
|
@@ -101,10 +101,10 @@ class Nanoc::Int::CompilerTest < Nanoc::TestCase
|
|
101
101
|
|
102
102
|
# Create compiler
|
103
103
|
compiler = Nanoc::Int::Compiler.new(site)
|
104
|
-
compiler.rules_collection.layout_filter_mapping[%r{^/a/b/c/.*/$}] = [:erb, { char: 'd' }]
|
105
|
-
compiler.rules_collection.layout_filter_mapping[%r{^/a/.*/$}] = [:erb, { char: 'b' }]
|
106
|
-
compiler.rules_collection.layout_filter_mapping[%r{^/a/b/.*/$}] = [:erb, { char: 'c' }] # never used!
|
107
|
-
compiler.rules_collection.layout_filter_mapping[%r{^/.*/$}] = [:erb, { char: 'a' }]
|
104
|
+
compiler.rules_collection.layout_filter_mapping[Nanoc::Int::Pattern.from(%r{^/a/b/c/.*/$})] = [:erb, { char: 'd' }]
|
105
|
+
compiler.rules_collection.layout_filter_mapping[Nanoc::Int::Pattern.from(%r{^/a/.*/$})] = [:erb, { char: 'b' }]
|
106
|
+
compiler.rules_collection.layout_filter_mapping[Nanoc::Int::Pattern.from(%r{^/a/b/.*/$})] = [:erb, { char: 'c' }] # never used!
|
107
|
+
compiler.rules_collection.layout_filter_mapping[Nanoc::Int::Pattern.from(%r{^/.*/$})] = [:erb, { char: 'a' }]
|
108
108
|
|
109
109
|
# Mock layout
|
110
110
|
layouts = [mock, mock, mock, mock]
|
@@ -149,7 +149,7 @@ class Nanoc::Int::CompilerTest < Nanoc::TestCase
|
|
149
149
|
layout '/blah/'
|
150
150
|
filter :erb
|
151
151
|
end
|
152
|
-
rule = Nanoc::Int::Rule.new(/blah
|
152
|
+
rule = Nanoc::Int::Rule.new(Nanoc::Int::Pattern.from(/blah/), :meh, rule_block)
|
153
153
|
|
154
154
|
# Create layout
|
155
155
|
layout = Nanoc::Int::Layout.new('head <%= yield %> foot', {}, '/blah/')
|
@@ -163,7 +163,7 @@ class Nanoc::Int::CompilerTest < Nanoc::TestCase
|
|
163
163
|
# Create compiler
|
164
164
|
compiler = Nanoc::Int::Compiler.new(site)
|
165
165
|
compiler.rules_collection.expects(:compilation_rule_for).times(2).with(rep).returns(rule)
|
166
|
-
compiler.rules_collection.layout_filter_mapping[%r{^/blah/$}] = [:erb, {}]
|
166
|
+
compiler.rules_collection.layout_filter_mapping[Nanoc::Int::Pattern.from(%r{^/blah/$})] = [:erb, {}]
|
167
167
|
site.stubs(:compiler).returns(compiler)
|
168
168
|
|
169
169
|
# Compile
|
@@ -256,15 +256,15 @@ class Nanoc::Int::CompilerTest < Nanoc::TestCase
|
|
256
256
|
FileUtils.cd('bar') do
|
257
257
|
# Create routes
|
258
258
|
File.open('Rules', 'w') do |io|
|
259
|
-
io.write "compile '
|
259
|
+
io.write "compile '/**/*' do\n"
|
260
260
|
io.write " layout 'default'\n"
|
261
261
|
io.write "end\n"
|
262
262
|
io.write "\n"
|
263
|
-
io.write "route '
|
263
|
+
io.write "route '/**/*' do\n"
|
264
264
|
io.write " 'index.html'\n"
|
265
265
|
io.write "end\n"
|
266
266
|
io.write "\n"
|
267
|
-
io.write "layout '
|
267
|
+
io.write "layout '/**/*', :erb\n"
|
268
268
|
end
|
269
269
|
|
270
270
|
# Create site
|
@@ -317,16 +317,16 @@ class Nanoc::Int::CompilerTest < Nanoc::TestCase
|
|
317
317
|
FileUtils.cd('bar') do
|
318
318
|
# Create routes
|
319
319
|
File.open('Rules', 'w') do |io|
|
320
|
-
io.write "compile '
|
320
|
+
io.write "compile '/**/*' do\n"
|
321
321
|
io.write " snapshot :aaa\n"
|
322
322
|
io.write " snapshot :aaa\n"
|
323
323
|
io.write "end\n"
|
324
324
|
io.write "\n"
|
325
|
-
io.write "route '
|
325
|
+
io.write "route '/**/*' do\n"
|
326
326
|
io.write " '/index.html'\n"
|
327
327
|
io.write "end\n"
|
328
328
|
io.write "\n"
|
329
|
-
io.write "layout '
|
329
|
+
io.write "layout '/**/*', :erb\n"
|
330
330
|
end
|
331
331
|
|
332
332
|
# Compile
|
@@ -588,4 +588,24 @@ class Nanoc::Int::CompilerTest < Nanoc::TestCase
|
|
588
588
|
assert_empty stack
|
589
589
|
end
|
590
590
|
end
|
591
|
+
|
592
|
+
def test_find_layouts_by_glob
|
593
|
+
Nanoc::CLI.run %w( create_site bar )
|
594
|
+
FileUtils.cd('bar') do
|
595
|
+
File.open('Rules', 'w') do |io|
|
596
|
+
io.write "compile '/**/*' do\n"
|
597
|
+
io.write " layout '/default.*'\n"
|
598
|
+
io.write "end\n"
|
599
|
+
io.write "\n"
|
600
|
+
io.write "route '/**/*' do\n"
|
601
|
+
io.write " '/index.html'\n"
|
602
|
+
io.write "end\n"
|
603
|
+
io.write "\n"
|
604
|
+
io.write "layout '/**/*', :erb\n"
|
605
|
+
end
|
606
|
+
|
607
|
+
site = Nanoc::Int::Site.new('.')
|
608
|
+
site.compile
|
609
|
+
end
|
610
|
+
end
|
591
611
|
end
|
@@ -141,36 +141,6 @@ EOS
|
|
141
141
|
end
|
142
142
|
end
|
143
143
|
|
144
|
-
def test_passthrough_with_ext_from_static_data_source
|
145
|
-
with_site do
|
146
|
-
# Create config
|
147
|
-
File.open('nanoc.yaml', 'w') do |io|
|
148
|
-
io.write "data_sources:\n"
|
149
|
-
io.write " - type: static\n"
|
150
|
-
end
|
151
|
-
|
152
|
-
# Create rules
|
153
|
-
File.open('Rules', 'w') do |io|
|
154
|
-
io.write <<EOS
|
155
|
-
passthrough "/foo.txt/"
|
156
|
-
EOS
|
157
|
-
end
|
158
|
-
|
159
|
-
# Create items
|
160
|
-
FileUtils.mkdir_p('static')
|
161
|
-
File.open('static/foo.txt', 'w') do |io|
|
162
|
-
io.write 'Hello I am foo'
|
163
|
-
end
|
164
|
-
|
165
|
-
# Compile
|
166
|
-
site = Nanoc::Int::Site.new('.')
|
167
|
-
site.compile
|
168
|
-
|
169
|
-
# Check paths
|
170
|
-
assert_equal ['output/foo.txt'], Dir['output/*']
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
144
|
def test_passthrough_priority
|
175
145
|
with_site do
|
176
146
|
# Create rules
|
@@ -267,6 +237,38 @@ EOS
|
|
267
237
|
end
|
268
238
|
end
|
269
239
|
|
240
|
+
def test_create_pattern_with_string
|
241
|
+
compiler_dsl = Nanoc::Int::CompilerDSL.new(nil, {})
|
242
|
+
|
243
|
+
pattern = compiler_dsl.create_pattern('/foo/*')
|
244
|
+
assert pattern.match?('/foo/a/a/a/a')
|
245
|
+
end
|
246
|
+
|
247
|
+
def test_create_pattern_with_string_with_glob_pattern_syntax
|
248
|
+
compiler_dsl = Nanoc::Int::CompilerDSL.new(nil, { pattern_syntax: 'glob' })
|
249
|
+
|
250
|
+
pattern = compiler_dsl.create_pattern('/foo/*')
|
251
|
+
assert pattern.match?('/foo/aaaa')
|
252
|
+
refute pattern.match?('/foo/aaaa/')
|
253
|
+
refute pattern.match?('/foo/a/a/a/a')
|
254
|
+
end
|
255
|
+
|
256
|
+
def test_create_pattern_with_regex
|
257
|
+
compiler_dsl = Nanoc::Int::CompilerDSL.new(nil, {})
|
258
|
+
|
259
|
+
pattern = compiler_dsl.create_pattern(%r<\A/foo/a*/>)
|
260
|
+
assert pattern.match?('/foo/aaaa/')
|
261
|
+
end
|
262
|
+
|
263
|
+
def test_create_pattern_with_string_with_unknown_pattern_syntax
|
264
|
+
compiler_dsl = Nanoc::Int::CompilerDSL.new(nil, { pattern_syntax: 'donkey' })
|
265
|
+
|
266
|
+
err = assert_raises(Nanoc::Int::Errors::GenericTrivial) do
|
267
|
+
compiler_dsl.create_pattern('/foo/*')
|
268
|
+
end
|
269
|
+
assert_equal 'Invalid pattern_syntax: donkey', err.message
|
270
|
+
end
|
271
|
+
|
270
272
|
def test_identifier_to_regex_without_wildcards
|
271
273
|
# Create compiler DSL
|
272
274
|
compiler_dsl = Nanoc::Int::CompilerDSL.new(nil, {})
|
@@ -28,8 +28,8 @@ class Nanoc::DataSourceTest < Nanoc::TestCase
|
|
28
28
|
data_source.down
|
29
29
|
|
30
30
|
# Test methods - loading data
|
31
|
-
assert_equal [],
|
32
|
-
assert_equal [],
|
31
|
+
assert_equal [], data_source.items
|
32
|
+
assert_equal [], data_source.layouts
|
33
33
|
end
|
34
34
|
|
35
35
|
def test_new_item
|
@@ -7,7 +7,7 @@ class Nanoc::Int::ItemArrayTest < Nanoc::TestCase
|
|
7
7
|
@one = Nanoc::Int::Item.new('Item One', {}, '/one/')
|
8
8
|
@two = Nanoc::Int::Item.new('Item Two', {}, '/two/')
|
9
9
|
|
10
|
-
@items = Nanoc::Int::ItemArray.new
|
10
|
+
@items = Nanoc::Int::ItemArray.new({})
|
11
11
|
@items << @one
|
12
12
|
@items << @two
|
13
13
|
end
|
@@ -44,6 +44,15 @@ class Nanoc::Int::ItemArrayTest < Nanoc::TestCase
|
|
44
44
|
assert_equal @two, @items.at(-1)
|
45
45
|
end
|
46
46
|
|
47
|
+
def test_brackets_with_glob
|
48
|
+
@items = Nanoc::Int::ItemArray.new({ pattern_syntax: 'glob' })
|
49
|
+
@items << @one
|
50
|
+
@items << @two
|
51
|
+
|
52
|
+
assert_equal @one, @items['/on*/']
|
53
|
+
assert_equal @two, @items['/*wo/']
|
54
|
+
end
|
55
|
+
|
47
56
|
def test_brackets_and_slice_with_range
|
48
57
|
assert_equal [@one, @two], @items[0..1]
|
49
58
|
assert_equal [@one, @two], @items[0, 2]
|
data/test/base/test_rule.rb
CHANGED
@@ -14,11 +14,11 @@ class Nanoc::Int::RuleTest < Nanoc::TestCase
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def test_matches
|
17
|
-
|
17
|
+
pattern = Nanoc::Int::Pattern.from(%r</(.*)/(.*)/>)
|
18
18
|
identifier = '/anything/else/'
|
19
19
|
expected = ['anything', 'else']
|
20
20
|
|
21
|
-
rule = Nanoc::Int::Rule.new(
|
21
|
+
rule = Nanoc::Int::Rule.new(pattern, :string, Proc.new {})
|
22
22
|
|
23
23
|
assert_equal expected, rule.send(:matches, identifier)
|
24
24
|
end
|
data/test/base/test_site.rb
CHANGED
@@ -185,6 +185,9 @@ EOF
|
|
185
185
|
FileUtils.mkdir_p('content/parent')
|
186
186
|
FileUtils.mkdir_p('content/parent/bar')
|
187
187
|
|
188
|
+
data = File.read('nanoc.yaml').sub('identifier_style: full', 'identifier_style: stripped')
|
189
|
+
File.open('nanoc.yaml', 'w') { |io| io << data }
|
190
|
+
|
188
191
|
File.open('content/parent.md', 'w') { |io| io << 'asdf' }
|
189
192
|
File.open('content/parent/foo.md', 'w') { |io| io << 'asdf' }
|
190
193
|
File.open('content/parent/bar.md', 'w') { |io| io << 'asdf' }
|
@@ -211,6 +214,35 @@ EOF
|
|
211
214
|
end
|
212
215
|
end
|
213
216
|
|
217
|
+
def test_setup_child_parent_links_for_full_style_identifiers
|
218
|
+
Nanoc::CLI.run %w( create_site bar)
|
219
|
+
FileUtils.cd('bar') do
|
220
|
+
FileUtils.mkdir_p('content/parent')
|
221
|
+
FileUtils.mkdir_p('content/parent/bar')
|
222
|
+
|
223
|
+
File.open('content/parent.md', 'w') { |io| io << 'asdf' }
|
224
|
+
File.open('content/parent/foo.md', 'w') { |io| io << 'asdf' }
|
225
|
+
File.open('content/parent/bar/qux.md', 'w') { |io| io << 'asdf' }
|
226
|
+
|
227
|
+
site = Nanoc::Int::Site.new('.')
|
228
|
+
|
229
|
+
root = site.items.find { |i| i.identifier == '/index.html' }
|
230
|
+
parent = site.items.find { |i| i.identifier == '/parent.md' }
|
231
|
+
foo = site.items.find { |i| i.identifier == '/parent/foo.md' }
|
232
|
+
qux = site.items.find { |i| i.identifier == '/parent/bar/qux.md' }
|
233
|
+
|
234
|
+
assert_equal Set.new([]), Set.new(root.children)
|
235
|
+
assert_equal Set.new([]), Set.new(parent.children)
|
236
|
+
assert_equal Set.new([]), Set.new(foo.children)
|
237
|
+
assert_equal Set.new([]), Set.new(qux.children)
|
238
|
+
|
239
|
+
assert_equal nil, root.parent
|
240
|
+
assert_equal nil, parent.parent
|
241
|
+
assert_equal nil, foo.parent
|
242
|
+
assert_equal nil, qux.parent
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
214
246
|
def test_multiple_items_with_same_identifier
|
215
247
|
with_site do
|
216
248
|
File.open('content/sam.html', 'w') { |io| io.write('I am Sam!') }
|
@@ -50,7 +50,13 @@ class Nanoc::CLI::Commands::CreateSiteTest < Nanoc::TestCase
|
|
50
50
|
assert_equal 'Could not read content/index.html because the file is not valid UTF-8.', exception.message
|
51
51
|
|
52
52
|
# Try with encoding = specific
|
53
|
-
File.open('nanoc.yaml', 'w')
|
53
|
+
File.open('nanoc.yaml', 'w') do |io|
|
54
|
+
io.write("pattern_syntax: glob\n")
|
55
|
+
io.write("data_sources:\n")
|
56
|
+
io.write(" -\n")
|
57
|
+
io.write(" type: filesystem_unified\n")
|
58
|
+
io.write(" identifier_style: full\n")
|
59
|
+
end
|
54
60
|
site = Nanoc::Int::Site.new('.')
|
55
61
|
site.compile
|
56
62
|
end
|
@@ -93,8 +93,8 @@ class Nanoc::CLI::Commands::PruneTest < Nanoc::TestCase
|
|
93
93
|
|
94
94
|
def test_run_with_symlink_to_output_dir
|
95
95
|
skip_unless_symlinks_supported
|
96
|
-
if defined?(JRUBY_VERSION)
|
97
|
-
skip 'JRuby
|
96
|
+
if defined?(JRUBY_VERSION)
|
97
|
+
skip 'JRuby has buggy File.find behavior (see https://github.com/jruby/jruby/issues/1647)'
|
98
98
|
end
|
99
99
|
|
100
100
|
with_site do |_site|
|
@@ -40,9 +40,9 @@ class Nanoc::DataSources::FilesystemTest < Nanoc::TestCase
|
|
40
40
|
|
41
41
|
# Get all files
|
42
42
|
output_expected = {
|
43
|
-
'./foo' =>
|
44
|
-
'./bar.entry' => [nil, 'html'],
|
45
|
-
'./foo/qux' => ['yaml', nil]
|
43
|
+
'./foo' => ['yaml', ['html']],
|
44
|
+
'./bar.entry' => [nil, ['html']],
|
45
|
+
'./foo/qux' => ['yaml', [nil]]
|
46
46
|
}
|
47
47
|
output_actual = data_source.send :all_split_files_in, '.'
|
48
48
|
|
@@ -67,9 +67,9 @@ class Nanoc::DataSources::FilesystemTest < Nanoc::TestCase
|
|
67
67
|
|
68
68
|
# Get all files
|
69
69
|
output_expected = {
|
70
|
-
'./foo' =>
|
71
|
-
'./bar' => [nil, 'html.erb'],
|
72
|
-
'./foo/qux' => ['yaml', nil]
|
70
|
+
'./foo' => ['yaml', ['html']],
|
71
|
+
'./bar' => [nil, ['html.erb']],
|
72
|
+
'./foo/qux' => ['yaml', [nil]]
|
73
73
|
}
|
74
74
|
output_actual = data_source.send :all_split_files_in, '.'
|
75
75
|
|
@@ -89,13 +89,33 @@ class Nanoc::DataSources::FilesystemTest < Nanoc::TestCase
|
|
89
89
|
|
90
90
|
# Check
|
91
91
|
expected = {
|
92
|
-
'./aaa/foo' => [nil, 'html'],
|
93
|
-
'./bbb/foo' => [nil, 'html'],
|
94
|
-
'./ccc/foo' => [nil, 'html']
|
92
|
+
'./aaa/foo' => [nil, ['html']],
|
93
|
+
'./bbb/foo' => [nil, ['html']],
|
94
|
+
'./ccc/foo' => [nil, ['html']]
|
95
95
|
}
|
96
96
|
assert_equal expected, data_source.send(:all_split_files_in, '.')
|
97
97
|
end
|
98
98
|
|
99
|
+
def test_all_split_files_in_with_same_extensions
|
100
|
+
# Create data source
|
101
|
+
config = { identifier_style: 'full' }
|
102
|
+
data_source = Nanoc::DataSources::FilesystemUnified.new(nil, nil, nil, config)
|
103
|
+
|
104
|
+
# Write sample files
|
105
|
+
%w( stuff/foo.html stuff/foo.md stuff/foo.yaml ).each do |filename|
|
106
|
+
FileUtils.mkdir_p(File.dirname(filename))
|
107
|
+
File.open(filename, 'w') { |io| io.write('test') }
|
108
|
+
end
|
109
|
+
|
110
|
+
# Check - { './stuff/foo' => ['yaml', ['html', 'md']] }
|
111
|
+
res = data_source.send(:all_split_files_in, '.')
|
112
|
+
assert_equal ['./stuff/foo'], res.keys
|
113
|
+
assert_equal 2, res.values[0].size
|
114
|
+
assert_equal 'yaml', res.values[0][0]
|
115
|
+
assert_equal Array, res.values[0][1].class
|
116
|
+
assert_equal ['html', 'md'], res.values[0][1].sort
|
117
|
+
end
|
118
|
+
|
99
119
|
def test_all_split_files_in_with_multiple_content_files
|
100
120
|
# Create data source
|
101
121
|
data_source = Nanoc::DataSources::FilesystemUnified.new(nil, nil, nil, nil)
|
@@ -12,38 +12,6 @@ class Nanoc::DataSources::FilesystemUnifiedTest < Nanoc::TestCase
|
|
12
12
|
data_source
|
13
13
|
end
|
14
14
|
|
15
|
-
def test_create_object_not_at_root
|
16
|
-
# Create item
|
17
|
-
data_source = new_data_source
|
18
|
-
data_source.send(:create_object, 'foobar', 'content here', { foo: 'bar' }, '/asdf/')
|
19
|
-
|
20
|
-
# Check file existance
|
21
|
-
assert File.directory?('foobar')
|
22
|
-
assert !File.directory?('foobar/content')
|
23
|
-
assert !File.directory?('foobar/asdf')
|
24
|
-
assert File.file?('foobar/asdf.html')
|
25
|
-
|
26
|
-
# Check file content
|
27
|
-
expected = /^--- ?\nfoo: bar\n---\ncontent here$/
|
28
|
-
assert_match expected, File.read('foobar/asdf.html')
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_create_object_at_root
|
32
|
-
# Create item
|
33
|
-
data_source = new_data_source
|
34
|
-
data_source.send(:create_object, 'foobar', 'content here', { foo: 'bar' }, '/')
|
35
|
-
|
36
|
-
# Check file existance
|
37
|
-
assert File.directory?('foobar')
|
38
|
-
assert !File.directory?('foobar/index')
|
39
|
-
assert !File.directory?('foobar/foobar')
|
40
|
-
assert File.file?('foobar/index.html')
|
41
|
-
|
42
|
-
# Check file content
|
43
|
-
expected = /^--- ?\nfoo: bar\n---\ncontent here$/
|
44
|
-
assert_match expected, File.read('foobar/index.html')
|
45
|
-
end
|
46
|
-
|
47
15
|
def test_load_objects
|
48
16
|
# Create data source
|
49
17
|
data_source = new_data_source
|
@@ -105,6 +73,32 @@ class Nanoc::DataSources::FilesystemUnifiedTest < Nanoc::TestCase
|
|
105
73
|
end
|
106
74
|
end
|
107
75
|
|
76
|
+
def test_load_objects_with_same_extensions
|
77
|
+
# Create data source
|
78
|
+
data_source = new_data_source({ identifier_style: 'full' })
|
79
|
+
|
80
|
+
# Create a fake class
|
81
|
+
klass = Class.new do
|
82
|
+
attr_reader :stuff
|
83
|
+
def initialize(*stuff)
|
84
|
+
@stuff = stuff
|
85
|
+
end
|
86
|
+
|
87
|
+
def ==(other)
|
88
|
+
@stuff == other.stuff
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# Create sample files
|
93
|
+
FileUtils.mkdir_p('foo')
|
94
|
+
File.open('foo/bar.html', 'w') { |io| io.write("---\nnum: 1\n---\ntest 1") }
|
95
|
+
File.open('foo/bar.md', 'w') { |io| io.write("---\nnum: 1\n---\ntest 1") }
|
96
|
+
|
97
|
+
# Check
|
98
|
+
actual_out = data_source.send(:load_objects, 'foo', 'The Foo', klass)
|
99
|
+
assert_equal 2, actual_out.size
|
100
|
+
end
|
101
|
+
|
108
102
|
def test_load_binary_objects
|
109
103
|
# Create data source
|
110
104
|
data_source = new_data_source
|
@@ -137,6 +131,28 @@ class Nanoc::DataSources::FilesystemUnifiedTest < Nanoc::TestCase
|
|
137
131
|
end
|
138
132
|
end
|
139
133
|
|
134
|
+
def test_identifier_for_filename_with_full_style_identifier
|
135
|
+
# Create data source
|
136
|
+
data_source = new_data_source({ identifier_style: 'full' })
|
137
|
+
|
138
|
+
# Get input and expected output
|
139
|
+
expected = {
|
140
|
+
'/foo' => Nanoc::Identifier.new('/foo', style: :full),
|
141
|
+
'/foo.html' => Nanoc::Identifier.new('/foo.html', style: :full),
|
142
|
+
'/foo/index.html' => Nanoc::Identifier.new('/foo/index.html', style: :full),
|
143
|
+
'/foo.html.erb' => Nanoc::Identifier.new('/foo.html.erb', style: :full),
|
144
|
+
}
|
145
|
+
|
146
|
+
# Check
|
147
|
+
expected.each_pair do |input, expected_output|
|
148
|
+
actual_output = data_source.send(:identifier_for_filename, input)
|
149
|
+
assert_equal(
|
150
|
+
expected_output, actual_output,
|
151
|
+
"identifier_for_filename(#{input.inspect}) should equal #{expected_output.inspect}, not #{actual_output.inspect}"
|
152
|
+
)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
140
156
|
def test_identifier_for_filename_allowing_periods_in_identifiers
|
141
157
|
# Create data source
|
142
158
|
data_source = new_data_source(allow_periods_in_identifiers: true)
|
@@ -439,42 +455,6 @@ class Nanoc::DataSources::FilesystemUnifiedTest < Nanoc::TestCase
|
|
439
455
|
end
|
440
456
|
end
|
441
457
|
|
442
|
-
def test_create_object_allowing_periods_in_identifiers
|
443
|
-
# Create data source
|
444
|
-
data_source = new_data_source(allow_periods_in_identifiers: true)
|
445
|
-
|
446
|
-
# Create object without period
|
447
|
-
data_source.send(:create_object, 'foo', 'some content', { some: 'attributes' }, '/asdf/')
|
448
|
-
assert File.file?('foo/asdf.html')
|
449
|
-
data = data_source.send(:parse, 'foo/asdf.html', nil, 'moo')
|
450
|
-
assert_equal({ 'some' => 'attributes' }, data[0])
|
451
|
-
assert_equal('some content', data[1])
|
452
|
-
|
453
|
-
# Create object with period
|
454
|
-
data_source.send(:create_object, 'foo', 'some content', { some: 'attributes' }, '/as.df/')
|
455
|
-
assert File.file?('foo/as.df.html')
|
456
|
-
data = data_source.send(:parse, 'foo/as.df.html', nil, 'moo')
|
457
|
-
assert_equal({ 'some' => 'attributes' }, data[0])
|
458
|
-
assert_equal('some content', data[1])
|
459
|
-
end
|
460
|
-
|
461
|
-
def test_create_object_disallowing_periods_in_identifiers
|
462
|
-
# Create data source
|
463
|
-
data_source = new_data_source
|
464
|
-
|
465
|
-
# Create object without period
|
466
|
-
data_source.send(:create_object, 'foo', 'some content', { some: 'attributes' }, '/asdf/')
|
467
|
-
assert File.file?('foo/asdf.html')
|
468
|
-
data = data_source.send(:parse, 'foo/asdf.html', nil, 'moo')
|
469
|
-
assert_equal({ 'some' => 'attributes' }, data[0])
|
470
|
-
assert_equal('some content', data[1])
|
471
|
-
|
472
|
-
# Create object with period
|
473
|
-
assert_raises(RuntimeError) do
|
474
|
-
data_source.send(:create_object, 'foo', 'some content', { some: 'attributes' }, '/as.df/')
|
475
|
-
end
|
476
|
-
end
|
477
|
-
|
478
458
|
def test_filename_for
|
479
459
|
data_source = new_data_source
|
480
460
|
|