nanoc 4.1.6 → 4.2.0b1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/Gemfile.lock +2 -1
  4. data/NEWS.md +11 -4
  5. data/lib/nanoc/base/checksummer.rb +135 -46
  6. data/lib/nanoc/base/compilation/compiler.rb +18 -28
  7. data/lib/nanoc/base/compilation/dependency_tracker.rb +22 -32
  8. data/lib/nanoc/base/compilation/filter.rb +2 -4
  9. data/lib/nanoc/base/entities.rb +1 -0
  10. data/lib/nanoc/base/entities/content.rb +14 -3
  11. data/lib/nanoc/base/entities/document.rb +14 -6
  12. data/lib/nanoc/base/entities/item.rb +0 -31
  13. data/lib/nanoc/base/entities/item_rep.rb +1 -1
  14. data/lib/nanoc/base/entities/lazy_value.rb +36 -0
  15. data/lib/nanoc/base/entities/pattern.rb +3 -2
  16. data/lib/nanoc/base/entities/site.rb +2 -0
  17. data/lib/nanoc/base/memoization.rb +17 -10
  18. data/lib/nanoc/base/repos/compiled_content_cache.rb +1 -1
  19. data/lib/nanoc/base/repos/data_source.rb +10 -6
  20. data/lib/nanoc/base/services/executor.rb +22 -22
  21. data/lib/nanoc/base/services/item_rep_router.rb +4 -5
  22. data/lib/nanoc/base/views.rb +0 -1
  23. data/lib/nanoc/base/views/item_rep_view.rb +3 -9
  24. data/lib/nanoc/base/views/mixins/document_view_mixin.rb +4 -11
  25. data/lib/nanoc/base/views/view.rb +1 -0
  26. data/lib/nanoc/base/views/view_context.rb +5 -1
  27. data/lib/nanoc/cli/commands/compile.rb +0 -6
  28. data/lib/nanoc/data_sources.rb +5 -5
  29. data/lib/nanoc/data_sources/filesystem.rb +219 -90
  30. data/lib/nanoc/extra/checking/check.rb +1 -2
  31. data/lib/nanoc/extra/checking/checks.rb +2 -0
  32. data/lib/nanoc/extra/checking/checks/css.rb +6 -14
  33. data/lib/nanoc/extra/checking/checks/html.rb +6 -14
  34. data/lib/nanoc/extra/checking/checks/internal_links.rb +14 -3
  35. data/lib/nanoc/extra/checking/checks/w3c_validator.rb +28 -0
  36. data/lib/nanoc/extra/deployers/fog.rb +134 -78
  37. data/lib/nanoc/extra/link_collector.rb +14 -18
  38. data/lib/nanoc/filters/sass.rb +3 -3
  39. data/lib/nanoc/helpers.rb +1 -0
  40. data/lib/nanoc/helpers/capturing.rb +16 -58
  41. data/lib/nanoc/helpers/child_parent.rb +51 -0
  42. data/lib/nanoc/helpers/filtering.rb +0 -1
  43. data/lib/nanoc/helpers/html_escape.rb +5 -0
  44. data/lib/nanoc/helpers/link_to.rb +2 -0
  45. data/lib/nanoc/helpers/rendering.rb +3 -4
  46. data/lib/nanoc/rule_dsl/action_provider.rb +20 -4
  47. data/lib/nanoc/rule_dsl/recording_executor.rb +3 -1
  48. data/lib/nanoc/rule_dsl/rule_context.rb +0 -1
  49. data/lib/nanoc/rule_dsl/rule_memory_calculator.rb +4 -1
  50. data/lib/nanoc/spec.rb +217 -0
  51. data/lib/nanoc/version.rb +1 -1
  52. data/test/base/test_data_source.rb +4 -2
  53. data/test/base/test_dependency_tracker.rb +5 -11
  54. data/test/data_sources/test_filesystem.rb +605 -69
  55. data/test/extra/checking/checks/test_internal_links.rb +25 -0
  56. data/test/extra/deployers/test_fog.rb +0 -177
  57. data/test/filters/test_less.rb +9 -4
  58. data/test/helpers/test_capturing.rb +38 -212
  59. data/test/helpers/test_link_to.rb +0 -205
  60. data/test/helpers/test_xml_sitemap.rb +2 -1
  61. metadata +7 -12
  62. data/lib/nanoc/base/views/site_view.rb +0 -14
  63. data/lib/nanoc/data_sources/filesystem_unified.rb +0 -101
  64. data/test/data_sources/test_filesystem_unified.rb +0 -559
  65. data/test/helpers/test_breadcrumbs.rb +0 -60
  66. data/test/helpers/test_filtering.rb +0 -112
  67. data/test/helpers/test_html_escape.rb +0 -26
  68. data/test/helpers/test_rendering.rb +0 -147
  69. data/test/helpers/test_tagging.rb +0 -92
  70. data/test/helpers/test_text.rb +0 -18
@@ -63,6 +63,31 @@ class Nanoc::Extra::Checking::Checks::InternalLinksTest < Nanoc::TestCase
63
63
  end
64
64
  end
65
65
 
66
+ def test_exclude_targets
67
+ with_site do |site|
68
+ # Create check
69
+ check = Nanoc::Extra::Checking::Checks::InternalLinks.create(site)
70
+ site.config.update({ checks: { internal_links: { exclude_targets: ['^/excluded\d+'] } } })
71
+
72
+ # Test
73
+ assert check.send(:valid?, '/excluded1', 'output/origin')
74
+ assert check.send(:valid?, '/excluded2', 'output/origin')
75
+ assert !check.send(:valid?, '/excluded_not', 'output/origin')
76
+ end
77
+ end
78
+
79
+ def test_exclude_origins
80
+ with_site do |site|
81
+ # Create check
82
+ check = Nanoc::Extra::Checking::Checks::InternalLinks.create(site)
83
+ site.config.update({ checks: { internal_links: { exclude_origins: ['^/excluded'] } } })
84
+
85
+ # Test
86
+ assert check.send(:valid?, '/foo', 'output/excluded')
87
+ assert !check.send(:valid?, '/foo', 'output/not_excluded')
88
+ end
89
+ end
90
+
66
91
  def test_unescape_url
67
92
  with_site do |site|
68
93
  FileUtils.mkdir_p('output/stuff')
@@ -1,181 +1,4 @@
1
1
  class Nanoc::Extra::Deployers::FogTest < Nanoc::TestCase
2
- def test_run
3
- if_have 'fog' do
4
- # Create deployer
5
- fog = Nanoc::Extra::Deployers::Fog.new(
6
- 'output/',
7
- {
8
- bucket: 'mybucket',
9
- provider: 'local',
10
- local_root: 'mylocalcloud' })
11
-
12
- # Create site
13
- FileUtils.mkdir_p('output')
14
- File.open('output/meow', 'w') { |io| io.write 'I am a cat!' }
15
- File.open('output/bark', 'w') { |io| io.write 'I am a dog!' }
16
-
17
- # Create local cloud (but not bucket)
18
- FileUtils.mkdir_p('mylocalcloud')
19
-
20
- # Run
21
- fog.run
22
-
23
- # Check
24
- assert File.file?('mylocalcloud/mybucket/meow')
25
- assert File.file?('mylocalcloud/mybucket/bark')
26
- assert_equal 'I am a cat!', File.read('mylocalcloud/mybucket/meow')
27
- assert_equal 'I am a dog!', File.read('mylocalcloud/mybucket/bark')
28
- end
29
- end
30
-
31
- def test_run_with_dry_run
32
- if_have 'fog' do
33
- begin
34
- # Create deployer
35
- fog = Nanoc::Extra::Deployers::Fog.new(
36
- 'output/',
37
- {
38
- provider: 'aws',
39
- # FIXME: bucket is necessary for deployer but fog doesn't like it
40
- bucket_name: 'doesntmatter',
41
- aws_access_key_id: 'meh',
42
- aws_secret_access_key: 'dontcare',
43
- },
44
- dry_run: true,
45
- )
46
-
47
- # Create site
48
- FileUtils.mkdir_p('output')
49
- File.open('output/meow', 'w') { |io| io.write 'I am a cat!' }
50
- File.open('output/bark', 'w') { |io| io.write 'I am a dog!' }
51
-
52
- # Create local cloud (but not bucket)
53
- FileUtils.mkdir_p('mylocalcloud')
54
-
55
- # Run
56
- fog.run
57
- ensure
58
- # FIXME: ugly hack
59
- ::Fog.instance_eval { @mocking = false }
60
- end
61
- end
62
- end
63
-
64
- def test_run_cdn_with_dry_run
65
- if_have 'fog' do
66
- begin
67
- # Create deployer
68
- fog = Nanoc::Extra::Deployers::Fog.new(
69
- 'output/',
70
- {
71
- provider: 'aws',
72
- cdn_id: 'id-cdn',
73
- # FIXME: bucket is necessary for deployer but fog doesn't like it
74
- bucket_name: 'doesntmatter',
75
- aws_access_key_id: 'meh',
76
- aws_secret_access_key: 'dontcare',
77
- },
78
- dry_run: true,
79
- )
80
-
81
- # Create site
82
- FileUtils.mkdir_p('output')
83
- File.open('output/meow', 'w') { |io| io.write 'I am a cat!' }
84
- File.open('output/bark', 'w') { |io| io.write 'I am a dog!' }
85
-
86
- # Create local cloud (but not bucket)
87
- FileUtils.mkdir_p('mylocalcloud')
88
-
89
- # Run
90
- fog.run
91
- ensure
92
- # HACK: (
93
- ::Fog.instance_eval { @mocking = false }
94
- end
95
- end
96
- end
97
-
98
- def test_run_delete_stray
99
- if_have 'fog' do
100
- # Create deployer
101
- fog = Nanoc::Extra::Deployers::Fog.new(
102
- 'output/',
103
- {
104
- bucket: 'mybucket',
105
- provider: 'local',
106
- local_root: 'mylocalcloud',
107
- },
108
- )
109
-
110
- # Setup fake local cloud
111
- FileUtils.mkdir_p('mylocalcloud/mybucket')
112
- File.open('mylocalcloud/mybucket/etc', 'w') { |io| io.write('meh-etc') }
113
- File.open('mylocalcloud/mybucket/meow', 'w') { |io| io.write('meh-meow') }
114
- File.open('mylocalcloud/mybucket/bark', 'w') { |io| io.write('meh-bark') }
115
-
116
- # Create site
117
- FileUtils.mkdir_p('output')
118
- File.open('output/meow', 'w') { |io| io.write 'I am a cat!' }
119
- File.open('output/bark', 'w') { |io| io.write 'I am a dog!' }
120
-
121
- # Create local cloud (but not bucket)
122
- FileUtils.mkdir_p('mylocalcloud')
123
-
124
- # Run
125
- fog.run
126
-
127
- # Check
128
- refute File.file?('mylocalcloud/mybucket/etc')
129
- assert File.file?('mylocalcloud/mybucket/meow')
130
- assert File.file?('mylocalcloud/mybucket/bark')
131
- assert_equal 'I am a cat!', File.read('mylocalcloud/mybucket/meow')
132
- assert_equal 'I am a dog!', File.read('mylocalcloud/mybucket/bark')
133
- end
134
- end
135
-
136
- def test_upload
137
- if_have 'fog' do
138
- fog = Nanoc::Extra::Deployers::Fog.new(
139
- 'output/', provider: 'aws')
140
-
141
- key_old = '__old'
142
- key_same = '__same'
143
- key_new = '__new'
144
-
145
- File.write(key_same, 'hallo')
146
- File.write(key_new, 'hallo new')
147
-
148
- etags = {
149
- key_same => '598d4c200461b81522a3328565c25f7c',
150
- key_new => '598d4c200461b81522a3328565c25f7c',
151
- }
152
-
153
- keys_to_destroy = [key_old, key_same, key_new]
154
- keys_to_invalidate = []
155
-
156
- s3_files = mock
157
- s3_files.stubs(:create)
158
- s3_directory = mock
159
- s3_directory.stubs(:files).returns(s3_files)
160
-
161
- # key_same
162
- refute fog.send(:needs_upload?, key_same, key_same, etags)
163
- fog.send(
164
- :upload, key_same, key_same, etags, keys_to_destroy, keys_to_invalidate, s3_directory)
165
-
166
- assert_equal([key_old, key_new], keys_to_destroy)
167
- assert_equal([], keys_to_invalidate)
168
-
169
- # key_new
170
- assert fog.send(:needs_upload?, key_new, key_new, etags)
171
- fog.send(
172
- :upload, key_new, key_new, etags, keys_to_destroy, keys_to_invalidate, s3_directory)
173
-
174
- assert_equal([key_old], keys_to_destroy)
175
- assert_equal([key_new], keys_to_invalidate)
176
- end
177
- end
178
-
179
2
  def test_read_etags_with_local_provider
180
3
  if_have 'fog' do
181
4
  fog = Nanoc::Extra::Deployers::Fog.new(
@@ -1,8 +1,13 @@
1
1
  class Nanoc::Filters::LessTest < Nanoc::TestCase
2
+ def view_context
3
+ dependency_tracker = Nanoc::Int::DependencyTracker.new(nil)
4
+ Nanoc::ViewContext.new(reps: nil, items: nil, dependency_tracker: dependency_tracker, compiler: nil)
5
+ end
6
+
2
7
  def test_filter
3
8
  if_have 'less' do
4
9
  # Create item
5
- @item = Nanoc::ItemWithRepsView.new(Nanoc::Int::Item.new('blah', { content_filename: 'content/foo/bar.txt' }, '/foo/bar/'), nil)
10
+ @item = Nanoc::ItemWithRepsView.new(Nanoc::Int::Item.new('blah', { content_filename: 'content/foo/bar.txt' }, '/foo/bar/'), view_context)
6
11
 
7
12
  # Create filter
8
13
  filter = ::Nanoc::Filters::Less.new(item: @item, items: [@item])
@@ -20,7 +25,7 @@ class Nanoc::Filters::LessTest < Nanoc::TestCase
20
25
  File.open('content/foo/bar/imported_file.less', 'w') { |io| io.write('p { color: red; }') }
21
26
 
22
27
  # Create item
23
- @item = Nanoc::ItemWithRepsView.new(Nanoc::Int::Item.new('blah', { content_filename: 'content/foo/bar.txt' }, '/foo/bar/'), nil)
28
+ @item = Nanoc::ItemWithRepsView.new(Nanoc::Int::Item.new('blah', { content_filename: 'content/foo/bar.txt' }, '/foo/bar/'), view_context)
24
29
 
25
30
  # Create filter
26
31
  filter = ::Nanoc::Filters::Less.new(item: @item, items: [@item])
@@ -39,7 +44,7 @@ class Nanoc::Filters::LessTest < Nanoc::TestCase
39
44
 
40
45
  # Create item
41
46
  File.open('content/foo/bar.txt', 'w') { |io| io.write('meh') }
42
- @item = Nanoc::ItemWithRepsView.new(Nanoc::Int::Item.new('blah', { content_filename: 'content/foo/bar.txt' }, '/foo/bar/'), nil)
47
+ @item = Nanoc::ItemWithRepsView.new(Nanoc::Int::Item.new('blah', { content_filename: 'content/foo/bar.txt' }, '/foo/bar/'), view_context)
43
48
 
44
49
  # Create filter
45
50
  filter = ::Nanoc::Filters::Less.new(item: @item, items: [@item])
@@ -108,7 +113,7 @@ class Nanoc::Filters::LessTest < Nanoc::TestCase
108
113
  def test_compression
109
114
  if_have 'less' do
110
115
  # Create item
111
- @item = Nanoc::ItemWithRepsView.new(Nanoc::Int::Item.new('blah', { content_filename: 'content/foo/bar.txt' }, '/foo/bar/'), nil)
116
+ @item = Nanoc::ItemWithRepsView.new(Nanoc::Int::Item.new('blah', { content_filename: 'content/foo/bar.txt' }, '/foo/bar/'), view_context)
112
117
 
113
118
  # Create filter
114
119
  filter = ::Nanoc::Filters::Less.new(item: @item, items: [@item])
@@ -1,49 +1,49 @@
1
1
  class Nanoc::Helpers::CapturingTest < Nanoc::TestCase
2
2
  include Nanoc::Helpers::Capturing
3
3
 
4
- def test_content_for
5
- require 'erb'
6
-
7
- File.open('Rules', 'w') do |io|
8
- io.write "compile '*' do ; filter :erb ; end\n"
9
- io.write "route '*' do ; item.identifier + 'index.html' ; end\n"
4
+ def item_rep_repo_for(item)
5
+ Nanoc::Int::ItemRepRepo.new.tap do |repo|
6
+ repo << Nanoc::Int::ItemRep.new(item, :default)
10
7
  end
8
+ end
11
9
 
12
- # Build content to be evaluated
13
- content = "head <% content_for :sidebar do %>\n" \
14
- " <%= 1+2 %>\n" \
15
- '<% end %> foot'
16
-
17
- # Build site
18
- site = Nanoc::Int::SiteLoader.new.new_empty
19
- item = Nanoc::Int::Item.new('moo', {}, '/blah/')
20
- @site = Nanoc::SiteView.new(Nanoc::Int::SiteLoader.new.new_empty, nil)
21
- @item = Nanoc::ItemWithRepsView.new(item, nil)
22
-
23
- # Evaluate content
24
- result = ::ERB.new(content).result(binding)
25
-
26
- # Check
27
- assert_equal '3', content_for(@item, :sidebar).strip
28
- assert_match(/^head\s+foot$/, result)
10
+ def view_context_for(item)
11
+ Nanoc::ViewContext.new(
12
+ reps: item_rep_repo_for(item),
13
+ items: :__irrelevant__,
14
+ dependency_tracker: :__irrelevant__,
15
+ compiler: :__irrelevant__,
16
+ )
29
17
  end
30
18
 
31
- def test_capture
32
- require 'erb'
19
+ def test_dependencies
20
+ with_site do |_site|
21
+ # Prepare
22
+ File.open('lib/helpers.rb', 'w') do |io|
23
+ io.write 'include Nanoc::Helpers::Capturing'
24
+ end
25
+ File.open('content/includer.erb', 'w') do |io|
26
+ io.write '[<%= content_for(@items.find { |i| i.identifier == \'/includee/\' }, :blah) %>]'
27
+ end
28
+ File.open('Rules', 'w') do |io|
29
+ io.write "compile '*' do ; filter :erb ; end\n"
30
+ io.write "route '*' do ; item.identifier + 'index.html' ; end\n"
31
+ end
33
32
 
34
- # Build site
35
- @site = Nanoc::SiteView.new(Nanoc::Int::SiteLoader.new.new_empty, nil)
36
- @item = Nanoc::ItemWithRepsView.new(Nanoc::Int::Item.new('moo', {}, '/blah/'), nil)
33
+ # Compile once
34
+ File.open('content/includee.erb', 'w') do |io|
35
+ io.write '{<% content_for :blah do %>Old content<% end %>}'
36
+ end
37
+ Nanoc::CLI.run(%w(compile))
38
+ assert_equal '[Old content]', File.read('output/includer/index.html')
37
39
 
38
- # Capture
39
- _erbout = 'foo'
40
- captured_content = capture do
41
- _erbout << 'bar'
40
+ # Compile again
41
+ File.open('content/includee.erb', 'w') do |io|
42
+ io.write '{<% content_for :blah do %>New content<% end %>}'
43
+ end
44
+ Nanoc::CLI.run(%w(compile))
45
+ assert_equal '[New content]', File.read('output/includer/index.html')
42
46
  end
43
-
44
- # Check
45
- assert_equal 'foo', _erbout
46
- assert_equal 'bar', captured_content
47
47
  end
48
48
 
49
49
  def test_content_for_recursively
@@ -66,8 +66,8 @@ head
66
66
  foot
67
67
  EOS
68
68
 
69
- @site = Nanoc::SiteView.new(Nanoc::Int::SiteLoader.new.new_empty, nil)
70
- @item = Nanoc::ItemWithRepsView.new(Nanoc::Int::Item.new('content', {}, '/'), nil)
69
+ item = Nanoc::Int::Item.new('content', {}, '/')
70
+ @item = Nanoc::ItemWithRepsView.new(item, view_context_for(item))
71
71
 
72
72
  result = ::ERB.new(content).result(binding)
73
73
 
@@ -76,180 +76,6 @@ EOS
76
76
  assert_equal expected, actual
77
77
  end
78
78
 
79
- def test_different_sites
80
- require 'erb'
81
-
82
- File.open('Rules', 'w') do |io|
83
- io.write "compile '*' do ; filter :erb ; end\n"
84
- io.write "route '*' do ; item.identifier + 'index.html' ; end\n"
85
- end
86
-
87
- @site = Nanoc::SiteView.new(Nanoc::Int::SiteLoader.new.new_empty, nil)
88
- @item = Nanoc::ItemWithRepsView.new(Nanoc::Int::Item.new('content', {}, '/'), nil)
89
- content = '<% content_for :a do %>Content One<% end %>'
90
- ::ERB.new(content).result(binding)
91
-
92
- assert_equal 'Content One', content_for(@item, :a)
93
- assert_equal nil, content_for(@item, :b)
94
-
95
- @site = Nanoc::SiteView.new(Nanoc::Int::SiteLoader.new.new_empty, nil)
96
- @item = Nanoc::ItemWithRepsView.new(Nanoc::Int::Item.new('content', {}, '/'), nil)
97
- content = '<% content_for :b do %>Content Two<% end %>'
98
- ::ERB.new(content).result(binding)
99
-
100
- assert_equal nil, content_for(@item, :a)
101
- assert_equal 'Content Two', content_for(@item, :b)
102
- end
103
-
104
- def test_content_for_with_existing_symbol
105
- with_site do |_site|
106
- # Prepare
107
- File.open('lib/helpers.rb', 'w') do |io|
108
- io.write 'include Nanoc::Helpers::Capturing'
109
- end
110
- File.open('content/includer.erb', 'w') do |io|
111
- io.write '[<%= content_for(@items["/includee/"], :blah) %>]'
112
- end
113
- File.open('Rules', 'w') do |io|
114
- io.write "compile '*' do ; filter :erb ; end\n"
115
- io.write "route '*' do ; item.identifier + 'index.html' ; end\n"
116
- end
117
-
118
- File.open('content/includee.erb', 'w') do |io|
119
- io.write '{<% content_for :blah do %>First content<% end %><% content_for :blah do %>Second content<% end %>}'
120
- end
121
-
122
- # Using the same symbols twice now raises an error, to be changed to concatenating in a future version
123
- assert_raises do
124
- Nanoc::CLI.run(%w(compile))
125
- end
126
- end
127
- end
128
-
129
- def test_content_for_with_existing_symbol_with_error_option
130
- with_site do |_site|
131
- # Prepare
132
- File.open('lib/helpers.rb', 'w') do |io|
133
- io.write 'include Nanoc::Helpers::Capturing'
134
- end
135
- File.open('content/includer.erb', 'w') do |io|
136
- io.write '[<%= content_for(@items["/includee/"], :blah) %>]'
137
- end
138
- File.open('Rules', 'w') do |io|
139
- io.write "compile '*' do ; filter :erb ; end\n"
140
- io.write "route '*' do ; item.identifier + 'index.html' ; end\n"
141
- end
142
-
143
- File.open('content/includee.erb', 'w') do |io|
144
- io.write '{<% content_for :blah do %>First content<% end %><% content_for :blah, existing: :error do %>Second content<% end %>}'
145
- end
146
-
147
- assert_raises do
148
- Nanoc::CLI.run(%w(compile))
149
- end
150
- end
151
- end
152
-
153
- def test_content_for_with_existing_symbol_with_overwrite_option
154
- with_site do |_site|
155
- # Prepare
156
- File.open('lib/helpers.rb', 'w') do |io|
157
- io.write 'include Nanoc::Helpers::Capturing'
158
- end
159
- File.open('content/includer.erb', 'w') do |io|
160
- io.write '[<%= content_for(@items["/includee/"], :blah) %>]'
161
- end
162
- File.open('Rules', 'w') do |io|
163
- io.write "compile '*' do ; filter :erb ; end\n"
164
- io.write "route '*' do ; item.identifier + 'index.html' ; end\n"
165
- end
166
-
167
- File.open('content/includee.erb', 'w') do |io|
168
- io.write '{<% content_for :blah do %>First content<% end %><% content_for :blah, existing: :overwrite do %>Second content<% end %>}'
169
- end
170
-
171
- Nanoc::CLI.run(%w(compile))
172
- assert_equal '[Second content]', File.read('output/includer/index.html')
173
- end
174
- end
175
-
176
- def test_content_for_with_existing_symbol_with_append_option
177
- with_site do |_site|
178
- # Prepare
179
- File.open('lib/helpers.rb', 'w') do |io|
180
- io.write 'include Nanoc::Helpers::Capturing'
181
- end
182
- File.open('content/includer.erb', 'w') do |io|
183
- io.write '[<%= content_for(@items["/includee/"], :blah) %>]'
184
- end
185
- File.open('Rules', 'w') do |io|
186
- io.write "compile '*' do ; filter :erb ; end\n"
187
- io.write "route '*' do ; item.identifier + 'index.html' ; end\n"
188
- end
189
-
190
- File.open('content/includee.erb', 'w') do |io|
191
- io.write '{<% content_for :blah do %>First content<% end %><% content_for :blah, existing: :append do %>Second content<% end %>}'
192
- end
193
-
194
- Nanoc::CLI.run(%w(compile))
195
- assert_equal '[First contentSecond content]', File.read('output/includer/index.html')
196
- end
197
- end
198
-
199
- def test_content_for_with_existing_symbol_with_unrecognised_option
200
- with_site do |_site|
201
- # Prepare
202
- File.open('lib/helpers.rb', 'w') do |io|
203
- io.write 'include Nanoc::Helpers::Capturing'
204
- end
205
- File.open('content/includer.erb', 'w') do |io|
206
- io.write '[<%= content_for(@items["/includee/"], :blah) %>]'
207
- end
208
- File.open('Rules', 'w') do |io|
209
- io.write "compile '*' do ; filter :erb ; end\n"
210
- io.write "route '*' do ; item.identifier + 'index.html' ; end\n"
211
- end
212
-
213
- File.open('content/includee.erb', 'w') do |io|
214
- io.write '{<% content_for :blah, existing: :donkey do %>First content<% end %>}'
215
- end
216
-
217
- assert_raises(ArgumentError) do
218
- Nanoc::CLI.run(%w(compile))
219
- end
220
- end
221
- end
222
-
223
- def test_dependencies
224
- with_site do |_site|
225
- # Prepare
226
- File.open('lib/helpers.rb', 'w') do |io|
227
- io.write 'include Nanoc::Helpers::Capturing'
228
- end
229
- File.open('content/includer.erb', 'w') do |io|
230
- io.write '[<%= content_for(@items.find { |i| i.identifier == \'/includee/\' }, :blah) %>]'
231
- end
232
- File.open('Rules', 'w') do |io|
233
- io.write "compile '*' do ; filter :erb ; end\n"
234
- io.write "route '*' do ; item.identifier + 'index.html' ; end\n"
235
- end
236
-
237
- # Compile once
238
- File.open('content/includee.erb', 'w') do |io|
239
- io.write '{<% content_for :blah do %>Old content<% end %>}'
240
- end
241
- Nanoc::CLI.run(%w(compile))
242
- assert_equal '[Old content]', File.read('output/includer/index.html')
243
-
244
- # Compile again
245
- File.open('content/includee.erb', 'w') do |io|
246
- io.write '{<% content_for :blah do %>New content<% end %>}'
247
- end
248
- Nanoc::CLI.run(%w(compile))
249
- assert_equal '[New content]', File.read('output/includer/index.html')
250
- end
251
- end
252
-
253
79
  def test_dependency_without_item_variable
254
80
  with_site do |_site|
255
81
  # Prepare