nanoc 3.3.2 → 3.3.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -12,36 +12,35 @@ GEM
12
12
  posix-spawn (>= 0.3.6)
13
13
  bluecloth (2.2.0)
14
14
  builder (3.0.0)
15
- coderay (1.0.5)
15
+ coderay (1.0.6)
16
16
  coffee-script (2.2.0)
17
17
  coffee-script-source
18
18
  execjs
19
19
  coffee-script-source (1.2.0)
20
- commonjs (0.2.0)
21
- therubyracer (~> 0.9.9)
22
- cri (2.2.0)
20
+ commonjs (0.2.5)
21
+ cri (2.2.1)
23
22
  erubis (2.7.0)
24
23
  execjs (1.3.0)
25
24
  multi_json (~> 1.0)
26
25
  haml (3.1.4)
27
- json (1.6.5)
26
+ json (1.6.6)
28
27
  kramdown (0.13.5)
29
- less (2.0.9)
28
+ less (2.1.0)
30
29
  commonjs (~> 0.2.0)
31
- therubyracer (~> 0.9.9)
30
+ therubyracer (~> 0.10.0)
32
31
  libv8 (3.3.10.4)
33
32
  markaby (0.7.2)
34
33
  builder (>= 2.0.0)
35
34
  maruku (0.6.0)
36
35
  syntax (>= 1.0.0)
37
36
  metaclass (0.0.1)
38
- mime-types (1.17.2)
39
- minitest (2.11.3)
37
+ mime-types (1.18)
38
+ minitest (2.12.0)
40
39
  mocha (0.10.5)
41
40
  metaclass (~> 0.0.1)
42
- multi_json (1.1.0)
41
+ multi_json (1.2.0)
43
42
  mustache (0.99.4)
44
- nokogiri (1.5.0)
43
+ nokogiri (1.5.2)
45
44
  posix-spawn (0.3.6)
46
45
  rack (1.4.1)
47
46
  rainpress (1.0)
@@ -49,21 +48,21 @@ GEM
49
48
  rdiscount (1.6.8)
50
49
  rdoc (3.12)
51
50
  json (~> 1.4)
52
- redcarpet (2.1.0)
51
+ redcarpet (2.1.1)
53
52
  rubypants (0.2.0)
54
53
  sass (3.1.15)
55
- slim (1.1.1)
54
+ slim (1.2.0)
56
55
  temple (~> 0.4.0)
57
- tilt (~> 1.3.2)
56
+ tilt (~> 1.3.3)
58
57
  syntax (1.0.0)
59
- systemu (2.4.2)
58
+ systemu (2.5.0)
60
59
  temple (0.4.0)
61
- therubyracer (0.9.9)
60
+ therubyracer (0.10.1)
62
61
  libv8 (~> 3.3.10)
63
62
  tilt (1.3.3)
64
- typogruby (1.0.14)
63
+ typogruby (1.0.15)
65
64
  rubypants
66
- uglifier (1.2.3)
65
+ uglifier (1.2.4)
67
66
  execjs (>= 0.3.0)
68
67
  multi_json (>= 1.0.2)
69
68
  w3c_validators (1.2)
data/NEWS.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # nanoc news
2
2
 
3
+ ## 3.3.3 (2012-04-11)
4
+
5
+ * Fixed directed graph implementation on Rubinius
6
+ * Made capturing helper not remember content between runs
7
+ * Fixed Date#freeze issue on Ruby 1.8.x
8
+ * Made it possible to have any kind of object as parameters in the Rules file
9
+ * Fixed bug which caused changes routes not to cause a recompile
10
+
3
11
  ## 3.3.2 (2012-03-16)
4
12
 
5
13
  * Removed bin/nanoc3 (use nanoc3 gem if you want it)
@@ -3,7 +3,7 @@
3
3
  module Nanoc
4
4
 
5
5
  # The current nanoc version.
6
- VERSION = '3.3.2'
6
+ VERSION = '3.3.3'
7
7
 
8
8
  # @return [String] A string containing information about this nanoc version
9
9
  # and its environment (Ruby engine and version, Rubygems version if any).
@@ -195,10 +195,28 @@ module Nanoc
195
195
  def new_rule_memory_for_rep(rep)
196
196
  recording_proxy = rep.to_recording_proxy
197
197
  compilation_rule_for(rep).apply_to(recording_proxy, :compiler => @compiler)
198
- recording_proxy.rule_memory
198
+ recording_proxy.rule_memory << [ :write, rep.path ]
199
+ make_rule_memory_serializable(recording_proxy.rule_memory)
199
200
  end
200
201
  memoize :new_rule_memory_for_rep
201
202
 
203
+ # Makes the given rule memory serializable by calling `#inspect` on the
204
+ # filter arguments, so that objects such as classes and filenames can be
205
+ # serialized.
206
+ #
207
+ # @param [Array] rs The rule memory for a certain item rep
208
+ #
209
+ # @return [Array] The serializable rule memory
210
+ def make_rule_memory_serializable(rs)
211
+ rs.map do |r|
212
+ if r[0] == :filter
213
+ [ r[0], r[1], r[2].to_a.sort.map { |a| a.inspect } ]
214
+ else
215
+ r
216
+ end
217
+ end
218
+ end
219
+
202
220
  # @param [Nanoc::Layout] layout The layout to get the rule memory for
203
221
  #
204
222
  # @return [Array] The rule memory for the given layout
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'nanoc/base/core_ext/array'
4
+ require 'nanoc/base/core_ext/date'
4
5
  require 'nanoc/base/core_ext/hash'
5
6
  require 'nanoc/base/core_ext/pathname'
6
7
  require 'nanoc/base/core_ext/string'
@@ -0,0 +1,27 @@
1
+ require 'date'
2
+
3
+ begin
4
+ d = ::Date.today
5
+ d.freeze
6
+ d.year
7
+ needs_patch = false
8
+ rescue => e
9
+ needs_patch = true
10
+ end
11
+
12
+ if needs_patch
13
+
14
+ class ::Date
15
+
16
+ [ :amjd, :jd, :day_fraction, :mjd, :ld, :civil, :ordinal, :commercial, :weeknum0, :weeknum1, :time, :wday, :julian?, :gregorian?, :leap? ].each do |m|
17
+ module_eval <<EOS
18
+ alias_method :__orig_#{m}, :#{m}
19
+ def #{m}
20
+ self.frozen? ? self.dup.#{m} : self.send(:__orig_#{m})
21
+ end
22
+ EOS
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -31,26 +31,19 @@ module Nanoc
31
31
  # # => %w( b c )
32
32
  class DirectedGraph
33
33
 
34
- # The set of vertices in this graph.
35
- #
36
- # @return [Set]
37
- attr_reader :vertices
38
-
39
34
  # @group Creating a graph
40
35
 
41
36
  # Creates a new directed graph with the given vertices.
42
37
  def initialize(vertices)
43
- @vertices = Set.new(vertices)
38
+ @vertices = {}
39
+ vertices.each_with_index do |v,i|
40
+ @vertices[v] = i
41
+ end
44
42
 
45
43
  @from_graph = {}
46
44
  @to_graph = {}
47
45
 
48
- @vertice_indexes = {}
49
- @vertices.each_with_index do |v, i|
50
- @vertice_indexes[v] = i
51
- end
52
-
53
- @roots = Set.new(@vertices)
46
+ @roots = Set.new(@vertices.keys)
54
47
 
55
48
  invalidate_caches
56
49
  end
@@ -72,7 +65,7 @@ module Nanoc
72
65
  @from_graph[from] << to
73
66
 
74
67
  @to_graph[to] ||= Set.new
75
- @to_graph[to] << from
68
+ @to_graph[to] << from
76
69
 
77
70
  @roots.delete(to)
78
71
 
@@ -109,12 +102,11 @@ module Nanoc
109
102
  #
110
103
  # @since 3.2.0
111
104
  def add_vertex(v)
112
- return if @vertices.include?(v)
105
+ return if @vertices.has_key?(v)
113
106
 
114
- @vertices << v
115
- @vertice_indexes[v] = @vertices.size-1
107
+ @vertices[v] = @vertices.size
116
108
 
117
- @roots << v
109
+ @roots << v
118
110
  end
119
111
 
120
112
  # Deletes all edges coming from the given vertex.
@@ -206,15 +198,20 @@ module Nanoc
206
198
  @successors[from] ||= recursively_find_vertices(from, :direct_successors_of)
207
199
  end
208
200
 
201
+ # @return [Array] The list of all vertices in this graph.
202
+ def vertices
203
+ @vertices.keys.sort_by { |v| @vertices[v] }
204
+ end
205
+
209
206
  # Returns an array of tuples representing the edges. The result of this
210
207
  # method may take a while to compute and should be cached if possible.
211
208
  #
212
209
  # @return [Array] The list of all edges in this graph.
213
210
  def edges
214
211
  result = []
215
- @vertices.each_with_index do |v, i|
216
- direct_successors_of(v).map { |v2| @vertice_indexes[v2] }.each do |i2|
217
- result << [ i, i2 ]
212
+ @vertices.each_pair do |v1, i1|
213
+ direct_successors_of(v1).map { |v2| @vertices[v2] }.each do |i2|
214
+ result << [ i1, i2 ]
218
215
  end
219
216
  end
220
217
  result
@@ -36,6 +36,9 @@ module Nanoc
36
36
  # item’s content (only available for binary items)
37
37
  attr_reader :raw_filename
38
38
 
39
+ # @return [Nanoc::Site] The site this item belongs to
40
+ attr_accessor :site
41
+
39
42
  # @return [Nanoc::Item, nil] The parent item of this item. This can be
40
43
  # nil even for non-root items.
41
44
  attr_accessor :parent
@@ -311,7 +311,10 @@ module Nanoc
311
311
  @items = []
312
312
  data_sources.each do |ds|
313
313
  items_in_ds = ds.items
314
- items_in_ds.each { |i| i.identifier = File.join(ds.items_root, i.identifier) }
314
+ items_in_ds.each do |i|
315
+ i.identifier = File.join(ds.items_root, i.identifier)
316
+ i.site = self
317
+ end
315
318
  @items.concat(items_in_ds)
316
319
  end
317
320
  end
@@ -159,7 +159,7 @@ module Nanoc::CLI
159
159
  'rainpress' => 'rainpress',
160
160
  'rdiscount' => 'rdiscount',
161
161
  'redcarpet' => 'redcarpet',
162
- 'redcloth' => 'redcloth',
162
+ 'redcloth' => 'RedCloth',
163
163
  'rubypants' => 'rubypants',
164
164
  'sass' => 'sass',
165
165
  'systemu' => 'systemu',
@@ -34,7 +34,7 @@ module Nanoc::Extra::Deployers
34
34
  require 'systemu'
35
35
 
36
36
  # Get params
37
- src = File.expand_path(self.source_path) + '/'
37
+ src = self.source_path + '/'
38
38
  dst = self.config[:dst]
39
39
  options = self.config[:options] || DEFAULT_OPTIONS
40
40
 
@@ -143,24 +143,6 @@ module Nanoc::Filters
143
143
  doc.send(method, :encoding => 'UTF-8')
144
144
  end
145
145
 
146
- private
147
-
148
- KNOWN_COLORIZERS = [ :coderay, :dummy, :pygmentize, :pygmentsrb, :simon_highlight ]
149
-
150
- # Removes the first blank lines and any whitespace at the end.
151
- def strip(s)
152
- s.lines.drop_while { |line| line.strip.empty? }.join.rstrip
153
- end
154
-
155
- def highlight(code, language, params={})
156
- colorizer = @colorizers[language.to_sym]
157
- if KNOWN_COLORIZERS.include?(colorizer)
158
- send(colorizer, code, language, params[colorizer] || {})
159
- else
160
- raise RuntimeError, "I don’t know how to highlight code using the “#{colorizer}” colorizer"
161
- end
162
- end
163
-
164
146
  # Runs the code through [CodeRay](http://coderay.rubychan.de/).
165
147
  #
166
148
  # @api private
@@ -254,13 +236,15 @@ module Nanoc::Filters
254
236
  #
255
237
  # @api private
256
238
  #
239
+ # @since 3.2.0
240
+ #
257
241
  # @param [String] code The code to colorize
258
242
  #
259
243
  # @param [String] language The language the code is written in
260
244
  #
261
245
  # @option params [String] :style The style to use
262
246
  #
263
- # @since 3.2.0
247
+ # @return [String] The colorized output
264
248
  def simon_highlight(code, language, params={})
265
249
  require 'systemu'
266
250
 
@@ -289,6 +273,24 @@ module Nanoc::Filters
289
273
  stdout.read
290
274
  end
291
275
 
276
+ private
277
+
278
+ KNOWN_COLORIZERS = [ :coderay, :dummy, :pygmentize, :pygmentsrb, :simon_highlight ]
279
+
280
+ # Removes the first blank lines and any whitespace at the end.
281
+ def strip(s)
282
+ s.lines.drop_while { |line| line.strip.empty? }.join.rstrip
283
+ end
284
+
285
+ def highlight(code, language, params={})
286
+ colorizer = @colorizers[language.to_sym]
287
+ if KNOWN_COLORIZERS.include?(colorizer)
288
+ send(colorizer, code, language, params[colorizer] || {})
289
+ else
290
+ raise RuntimeError, "I don’t know how to highlight code using the “#{colorizer}” colorizer"
291
+ end
292
+ end
293
+
292
294
  def check_availability(*cmd)
293
295
  systemu cmd
294
296
  raise "Could not spawn #{cmd.join(' ')}" if $?.exitstatus != 0
@@ -39,9 +39,6 @@ module Nanoc::Helpers
39
39
  # @api private
40
40
  class CapturesStore
41
41
 
42
- require 'singleton'
43
- include Singleton
44
-
45
42
  def initialize
46
43
  @store = {}
47
44
  end
@@ -58,6 +55,15 @@ module Nanoc::Helpers
58
55
 
59
56
  end
60
57
 
58
+ class ::Nanoc::Site
59
+
60
+ # @api private
61
+ def captures_store
62
+ @captures_store ||= CapturesStore.new
63
+ end
64
+
65
+ end
66
+
61
67
  # @overload content_for(name, &block)
62
68
  #
63
69
  # Captures the content inside the block and stores it so that it can be
@@ -96,7 +102,7 @@ module Nanoc::Helpers
96
102
 
97
103
  # Capture and store
98
104
  content = capture(&block)
99
- CapturesStore.instance[@item, name.to_sym] = content
105
+ @site.captures_store[@item, name.to_sym] = content
100
106
  else # Get content
101
107
  # Get args
102
108
  if args.size != 2
@@ -107,7 +113,7 @@ module Nanoc::Helpers
107
113
  name = args[1]
108
114
 
109
115
  # Get content
110
- CapturesStore.instance[item, name.to_sym]
116
+ @site.captures_store[item, name.to_sym]
111
117
  end
112
118
  end
113
119
 
@@ -31,7 +31,7 @@ module Nanoc::Helpers
31
31
  #
32
32
  # @example Excluding binary items from the sitemap
33
33
  #
34
- # <%= xml_sitemap :items => @items.reject{ |i| i[:is_hidden] || i[:binary] } %>
34
+ # <%= xml_sitemap :items => @items.reject{ |i| i[:is_hidden] || i.binary? } %>
35
35
  #
36
36
  # @option params [Array] :items A list of items to include in the sitemap
37
37
  #
@@ -31,7 +31,7 @@ describe 'Array#freeze_recursively' do
31
31
  array[0] = 123
32
32
  rescue => e
33
33
  raised = true
34
- assert_match /^can't modify frozen /, e.message
34
+ assert_match /(^can't modify frozen |^unable to modify frozen object$)/, e.message
35
35
  end
36
36
  assert raised
37
37
  end
@@ -45,7 +45,7 @@ describe 'Array#freeze_recursively' do
45
45
  array[1][0] = 123
46
46
  rescue => e
47
47
  raised = true
48
- assert_match /^can't modify frozen /, e.message
48
+ assert_match /(^can't modify frozen |^unable to modify frozen object$)/, e.message
49
49
  end
50
50
  assert raised
51
51
  end
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ describe 'Date' do
4
+
5
+ it 'should not crash when requesting frozen attributes' do
6
+ # This test will pass without patch on MRI 1.9.x, but on MRI 1.8.x it
7
+ # crashes. (Untested on other Ruby implementations such as Rubinius and
8
+ # JRuby).
9
+ d = Date.today
10
+ d.freeze
11
+ d.year
12
+ end
13
+
14
+ end
15
+
@@ -49,7 +49,7 @@ describe 'Hash#freeze_recursively' do
49
49
  hash[:a] = 123
50
50
  rescue => e
51
51
  raised = true
52
- assert_match /^can't modify frozen /, e.message
52
+ assert_match /(^can't modify frozen |^unable to modify frozen object$)/, e.message
53
53
  end
54
54
  assert raised
55
55
  end
@@ -63,7 +63,7 @@ describe 'Hash#freeze_recursively' do
63
63
  hash[:a][:b] = 123
64
64
  rescue => e
65
65
  raised = true
66
- assert_match /^can't modify frozen /, e.message
66
+ assert_match /(^can't modify frozen |^unable to modify frozen object$)/, e.message
67
67
  end
68
68
  assert raised
69
69
  end
@@ -434,4 +434,58 @@ class Nanoc::CompilerTest < MiniTest::Unit::TestCase
434
434
  end
435
435
  end
436
436
 
437
+ def test_change_routing_rule_and_recompile
438
+ with_site do |site|
439
+ # Create items
440
+ File.open('content/a.html', 'w') do |io|
441
+ io.write('<h1>A</h1>')
442
+ end
443
+ File.open('content/b.html', 'w') do |io|
444
+ io.write('<h1>B</h1>')
445
+ end
446
+
447
+ # Create routes
448
+ File.open('Rules', 'w') do |io|
449
+ io.write "compile '*' do\n"
450
+ io.write "end\n"
451
+ io.write "\n"
452
+ io.write "route '/a/' do\n"
453
+ io.write " '/index.html'\n"
454
+ io.write "end\n"
455
+ io.write "\n"
456
+ io.write "route '*' do\n"
457
+ io.write " nil\n"
458
+ io.write "end\n"
459
+ end
460
+
461
+ # Compile
462
+ site = Nanoc::Site.new('.')
463
+ site.compile
464
+
465
+ # Check
466
+ assert_equal '<h1>A</h1>', File.read('output/index.html')
467
+
468
+ # Create routes
469
+ File.open('Rules', 'w') do |io|
470
+ io.write "compile '*' do\n"
471
+ io.write "end\n"
472
+ io.write "\n"
473
+ io.write "route '/b/' do\n"
474
+ io.write " '/index.html'\n"
475
+ io.write "end\n"
476
+ io.write "\n"
477
+ io.write "route '*' do\n"
478
+ io.write " nil\n"
479
+ io.write "end\n"
480
+ end
481
+
482
+ # Compile
483
+ site = Nanoc::Site.new('.')
484
+ site.compile
485
+
486
+ # Check
487
+ assert_equal '<h1>B</h1>', File.read('output/index.html')
488
+ end
489
+ end
490
+
437
491
  end
@@ -54,8 +54,11 @@ class Nanoc::DirectedGraphTest < MiniTest::Unit::TestCase
54
54
 
55
55
  def test_edges_with_new_vertices
56
56
  graph = Nanoc::DirectedGraph.new([ 1 ])
57
+ assert_equal [ 1 ], graph.vertices
57
58
  graph.add_edge(1, 2)
59
+ assert_equal [ 1, 2 ], graph.vertices
58
60
  graph.add_edge(3, 2)
61
+ assert_equal [ 1, 2, 3 ], graph.vertices
59
62
 
60
63
  assert_equal [ [ 0, 1 ], [ 2, 1 ] ], graph.edges.sort
61
64
  end
@@ -25,7 +25,7 @@ class Nanoc::ItemTest < MiniTest::Unit::TestCase
25
25
  item.identifier.chop!
26
26
  rescue => error
27
27
  raised = true
28
- assert_match /^can't modify frozen [Ss]tring$/, error.message
28
+ assert_match /(^can't modify frozen [Ss]tring|^unable to modify frozen object$)/, error.message
29
29
  end
30
30
  assert raised, 'Should have raised when trying to modify a frozen string'
31
31
  end
@@ -149,7 +149,7 @@ class Nanoc::ItemTest < MiniTest::Unit::TestCase
149
149
  item[:abc] = '123'
150
150
  rescue => e
151
151
  raised = true
152
- assert_match /^can't modify frozen /, e.message
152
+ assert_match /(^can't modify frozen |^unable to modify frozen object$)/, e.message
153
153
  end
154
154
  assert raised
155
155
 
@@ -158,7 +158,7 @@ class Nanoc::ItemTest < MiniTest::Unit::TestCase
158
158
  item[:a][:b] = '456'
159
159
  rescue => e
160
160
  raised = true
161
- assert_match /^can't modify frozen /, e.message
161
+ assert_match /(^can't modify frozen |^unable to modify frozen object$)/, e.message
162
162
  end
163
163
  assert raised
164
164
  end
@@ -459,7 +459,7 @@ class Nanoc::ItemRepTest < MiniTest::Unit::TestCase
459
459
  rep.filter(:whatever)
460
460
  rescue => e
461
461
  raised = true
462
- assert_match /^can't modify frozen /, e.message
462
+ assert_match /(^can't modify frozen |^unable to modify frozen object$)/, e.message
463
463
  end
464
464
  assert raised
465
465
  end
@@ -483,7 +483,7 @@ class Nanoc::ItemRepTest < MiniTest::Unit::TestCase
483
483
  rep.filter(:whatever)
484
484
  rescue => e
485
485
  raised = true
486
- assert_match /^can't modify frozen /, e.message
486
+ assert_match /(^can't modify frozen |^unable to modify frozen object$)/, e.message
487
487
  end
488
488
  assert raised
489
489
  end
@@ -22,7 +22,7 @@ class Nanoc::LayoutTest < MiniTest::Unit::TestCase
22
22
  layout.identifier.chop!
23
23
  rescue => error
24
24
  raised = true
25
- assert_match /^can't modify frozen [Ss]tring$/, error.message
25
+ assert_match /(^can't modify frozen [Ss]tring|^unable to modify frozen object$)/, error.message
26
26
  end
27
27
  assert raised, 'Should have raised when trying to modify a frozen string'
28
28
  end
@@ -391,4 +391,37 @@ class Nanoc::OutdatednessCheckerTest < MiniTest::Unit::TestCase
391
391
  end
392
392
  end
393
393
 
394
+ def test_non_serializable_parameters_in_rules_should_be_allowed
395
+ # Create site
396
+ with_site(:name => 'foo') do |site|
397
+ File.open('content/index.html', 'w') { |io| io.write('o hello') }
398
+ File.open('Rules', 'w') do |io|
399
+ io.write("compile '/' do\n")
400
+ io.write(" c = Class.new {}\n")
401
+ io.write(" def c.inspect ; 'I am so classy' ; end\n")
402
+ io.write(" filter :erb, :stuff => c\n")
403
+ io.write("end\n")
404
+ io.write("\n")
405
+ io.write("route '/' do\n")
406
+ io.write(" '/index.html'\n")
407
+ io.write("end\n")
408
+ end
409
+ end
410
+
411
+ # Compile
412
+ FileUtils.cd('foo') do
413
+ site = Nanoc::Site.new('.')
414
+ site.compile
415
+ end
416
+
417
+ # Assert not outdated
418
+ FileUtils.cd('foo') do
419
+ site = Nanoc::Site.new('.')
420
+ outdatedness_checker = site.compiler.outdatedness_checker
421
+ site.items.each do |item|
422
+ refute outdatedness_checker.outdated?(item), "item should not be outdated"
423
+ end
424
+ end
425
+ end
426
+
394
427
  end
@@ -52,7 +52,7 @@ class Nanoc::Extra::Deployers::RsyncTest < MiniTest::Unit::TestCase
52
52
  if_have 'systemu' do
53
53
  # Create deployer
54
54
  rsync = Nanoc::Extra::Deployers::Rsync.new(
55
- 'output/',
55
+ 'output',
56
56
  { :dst => 'asdf' })
57
57
 
58
58
  # Mock run_shell_cmd
@@ -66,7 +66,7 @@ class Nanoc::Extra::Deployers::RsyncTest < MiniTest::Unit::TestCase
66
66
  # Check args
67
67
  opts = Nanoc::Extra::Deployers::Rsync::DEFAULT_OPTIONS
68
68
  assert_equal(
69
- [ 'rsync', opts, File.expand_path('output') + '/', 'asdf' ].flatten,
69
+ [ 'rsync', opts, 'output/', 'asdf' ].flatten,
70
70
  rsync.instance_eval { @shell_cms_args }
71
71
  )
72
72
  end
@@ -76,7 +76,7 @@ class Nanoc::Extra::Deployers::RsyncTest < MiniTest::Unit::TestCase
76
76
  if_have 'systemu' do
77
77
  # Create deployer
78
78
  rsync = Nanoc::Extra::Deployers::Rsync.new(
79
- 'output/',
79
+ 'output',
80
80
  { :dst => 'asdf' },
81
81
  :dry_run => true)
82
82
 
@@ -91,7 +91,7 @@ class Nanoc::Extra::Deployers::RsyncTest < MiniTest::Unit::TestCase
91
91
  # Check args
92
92
  opts = Nanoc::Extra::Deployers::Rsync::DEFAULT_OPTIONS
93
93
  assert_equal(
94
- [ 'echo', 'rsync', opts, File.expand_path('output') + '/', 'asdf' ].flatten,
94
+ [ 'echo', 'rsync', opts, 'output/', 'asdf' ].flatten,
95
95
  rsync.instance_eval { @shell_cms_args }
96
96
  )
97
97
  end
@@ -53,10 +53,9 @@ class Nanoc::Extra::Validators::LinksTest < MiniTest::Unit::TestCase
53
53
  validator = Nanoc::Extra::Validators::Links.new('output', [ 'index.html' ])
54
54
 
55
55
  # Test
56
- assert validator.send(:fetch_http_status_for, URI.parse('http://heise.de/'), 200)
57
- assert validator.send(:fetch_http_status_for, URI.parse('https://www.google.com/'), 200)
58
- assert validator.send(:fetch_http_status_for, URI.parse('https://google.com/'), 200)
59
- assert validator.send(:fetch_http_status_for, URI.parse('http://google.com/foo/bar'), 404)
56
+ assert_equal 200, validator.send(:fetch_http_status_for, URI.parse('http://www.apple.com/'))
57
+ assert_equal 200, validator.send(:fetch_http_status_for, URI.parse('https://www.apple.com/'))
58
+ assert_equal 404, validator.send(:fetch_http_status_for, URI.parse('http://www.apple.com/sdfghgfdsdfgh'))
60
59
  end
61
60
 
62
61
  end
@@ -14,8 +14,12 @@ class Nanoc::Helpers::CapturingTest < MiniTest::Unit::TestCase
14
14
  " <%= 1+2 %>\n" +
15
15
  "<% end %> foot"
16
16
 
17
- # Evaluate content
17
+ # Build site
18
+ @site = Nanoc3::Site.new({})
18
19
  @item = Nanoc::Item.new('moo', {}, '/blah/')
20
+ @item.site = @site
21
+
22
+ # Evaluate content
19
23
  result = ::ERB.new(content).result(binding)
20
24
 
21
25
  # Check
@@ -27,6 +31,10 @@ class Nanoc::Helpers::CapturingTest < MiniTest::Unit::TestCase
27
31
  def test_capture
28
32
  require 'erb'
29
33
 
34
+ # Build site
35
+ @site = Nanoc3::Site.new({})
36
+ @item = Nanoc::Item.new('moo', {}, '/blah/')
37
+
30
38
  # Capture
31
39
  _erbout = 'foo'
32
40
  captured_content = capture do
@@ -38,4 +46,49 @@ class Nanoc::Helpers::CapturingTest < MiniTest::Unit::TestCase
38
46
  assert_equal 'bar', captured_content
39
47
  end
40
48
 
49
+ def test_content_for_recursively
50
+ require 'erb'
51
+
52
+ content = <<EOS
53
+ head
54
+ <% content_for :box do %>
55
+ basic
56
+ <% end %>
57
+ <% content_for :box do %>
58
+ before <%= content_for @item, :box %> after
59
+ <% end %>
60
+ <%= content_for @item, :box %>
61
+ foot
62
+ EOS
63
+
64
+ @site = Nanoc3::Site.new({})
65
+ @item = Nanoc::Item.new('content', {}, '/')
66
+
67
+ result = ::ERB.new(content).result(binding)
68
+
69
+ expected = %w( head before basic after foot )
70
+ actual = result.scan(/[a-z]+/)
71
+ assert_equal expected, actual
72
+ end
73
+
74
+ def test_different_sites
75
+ require 'erb'
76
+
77
+ @site = Nanoc3::Site.new({})
78
+ @item = Nanoc::Item.new('content', {}, '/')
79
+ content = "<% content_for :a do %>Content One<% end %>"
80
+ ::ERB.new(content).result(binding)
81
+
82
+ assert_equal 'Content One', content_for(@item, :a)
83
+ assert_equal nil, content_for(@item, :b)
84
+
85
+ @site = Nanoc3::Site.new({})
86
+ @item = Nanoc::Item.new('content', {}, '/')
87
+ content = "<% content_for :b do %>Content Two<% end %>"
88
+ ::ERB.new(content).result(binding)
89
+
90
+ assert_equal nil, content_for(@item, :a)
91
+ assert_equal 'Content Two', content_for(@item, :b)
92
+ end
93
+
41
94
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nanoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.2
4
+ version: 3.3.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-16 00:00:00.000000000 Z
12
+ date: 2012-04-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cri
16
- requirement: &70355075174180 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: '2.2'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70355075174180
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '2.2'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: minitest
27
- requirement: &70355075173560 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: '0'
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *70355075173560
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: mocha
38
- requirement: &70355075172820 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: '0'
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *70355075172820
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: rake
49
- requirement: &70355075309900 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: '0'
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *70355075309900
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: rdiscount
60
- requirement: &70355075308600 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ! '>='
@@ -65,10 +85,15 @@ dependencies:
65
85
  version: '0'
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *70355075308600
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: yard
71
- requirement: &70355075306460 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
72
97
  none: false
73
98
  requirements:
74
99
  - - ! '>='
@@ -76,7 +101,12 @@ dependencies:
76
101
  version: '0'
77
102
  type: :development
78
103
  prerelease: false
79
- version_requirements: *70355075306460
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
80
110
  description: nanoc is a simple but very flexible static site generator written in
81
111
  Ruby. It operates on local files, and therefore does not run on the server. nanoc
82
112
  “compiles” the local source files into HTML (usually), by evaluating eRuby, Markdown,
@@ -117,6 +147,7 @@ files:
117
147
  - lib/nanoc/base/compilation/rules_collection.rb
118
148
  - lib/nanoc/base/context.rb
119
149
  - lib/nanoc/base/core_ext/array.rb
150
+ - lib/nanoc/base/core_ext/date.rb
120
151
  - lib/nanoc/base/core_ext/hash.rb
121
152
  - lib/nanoc/base/core_ext/pathname.rb
122
153
  - lib/nanoc/base/core_ext/string.rb
@@ -233,6 +264,7 @@ files:
233
264
  - tasks/doc.rake
234
265
  - tasks/test.rake
235
266
  - test/base/core_ext/array_spec.rb
267
+ - test/base/core_ext/date_spec.rb
236
268
  - test/base/core_ext/hash_spec.rb
237
269
  - test/base/core_ext/pathname_spec.rb
238
270
  - test/base/core_ext/string_spec.rb
@@ -368,7 +400,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
368
400
  version: '0'
369
401
  requirements: []
370
402
  rubyforge_project:
371
- rubygems_version: 1.8.17
403
+ rubygems_version: 1.8.21
372
404
  signing_key:
373
405
  specification_version: 3
374
406
  summary: a web publishing system written in Ruby for building small to medium-sized