nanoc 4.4.0 → 4.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 25161ec9b45e6f1a49b7eb87b64eeff9a6640b8f
4
- data.tar.gz: d4b23a01bbdfc6846fbcf5b1c128c0fcba5b06b3
3
+ metadata.gz: d2b9d8ce47580844e86624db8a37b07a0cb016a8
4
+ data.tar.gz: 378d2207727e627067221f9aeb53fa6cbd75401e
5
5
  SHA512:
6
- metadata.gz: fd3b4caa69b4e48ae48bfb35f2553a1ff6e88eb722a7056f268aa7138984b7e6114f6cfa40328bd41bf8803b8788fb27a491b5195e00b9bd09876d9af05a6c65
7
- data.tar.gz: 868162e517d1711878df3d9027617e55b96be2040e36c14497fcea3a8f8f057c4e69ab7aac0b1947a5c513a002e0d378cd612ad263842b5d53986d95e2be91eb
6
+ metadata.gz: a5da522b136025a8c2a114b3e59197879290f57d1879998dafbd2130ed3b1ed1374034d524a25d17c7143f5058b4cfed06558fccedaed71deeb140f00130f30d
7
+ data.tar.gz: b4f5e54d978ea6da8b805adfaa24e5f143e4ad6d3ffb7ec3248ceaabe5f9b35ffac0a53a0332ac3d4ee25ebe6a699c20a43022902618ca153481f0ba2f9427b0
data/Gemfile.lock CHANGED
@@ -9,7 +9,7 @@ GIT
9
9
  PATH
10
10
  remote: .
11
11
  specs:
12
- nanoc (4.4.0)
12
+ nanoc (4.4.1)
13
13
  cri (~> 2.3)
14
14
  hamster (~> 3.0)
15
15
  parallel (~> 1.9)
@@ -224,10 +224,10 @@ GEM
224
224
  inflecto (0.0.2)
225
225
  ipaddress (0.8.3)
226
226
  json (2.0.2)
227
- kramdown (1.12.0)
227
+ kramdown (1.13.0)
228
228
  less (2.6.0)
229
229
  commonjs (~> 0.2.7)
230
- libv8 (3.16.14.15)
230
+ libv8 (3.16.14.17)
231
231
  listen (3.1.5)
232
232
  rb-fsevent (~> 0.9, >= 0.9.4)
233
233
  rb-inotify (~> 0.9, >= 0.9.7)
@@ -255,7 +255,7 @@ GEM
255
255
  shellany (~> 0.0)
256
256
  pandoc-ruby (2.0.1)
257
257
  parallel (1.9.0)
258
- parser (2.3.1.4)
258
+ parser (2.3.2.0)
259
259
  ast (~> 2.2)
260
260
  posix-spawn (0.3.12)
261
261
  powerpack (0.1.1)
data/NEWS.md CHANGED
@@ -1,6 +1,16 @@
1
1
  # Nanoc news
2
2
 
3
- ## 4.4.0 (2015-11-19)
3
+ ## 4.4.1 (2016-11-21)
4
+
5
+ Fixes:
6
+
7
+ * Fixed an issue where the `xsl` filter would not generate a correct dependency on the layout (#996)
8
+
9
+ Enhancements:
10
+
11
+ * Made `view` command use index filenames specified in the `index_filenames` site configuration attribute (#998)
12
+
13
+ ## 4.4.0 (2016-11-19)
4
14
 
5
15
  Features:
6
16
 
data/Rakefile CHANGED
@@ -10,7 +10,7 @@ end
10
10
 
11
11
  Coveralls::RakeTask.new
12
12
 
13
- SUBDIRS = %w(* base cli data_sources extra filters helpers).freeze
13
+ SUBDIRS = %w(* base checking cli data_sources deploying extra filters helpers).freeze
14
14
 
15
15
  namespace :test do
16
16
  SUBDIRS.each do |dir|
@@ -41,6 +41,8 @@ module Nanoc::Int
41
41
  @from_graph = {}
42
42
  @to_graph = {}
43
43
 
44
+ @edge_props = {}
45
+
44
46
  @roots = Set.new(@vertices.keys)
45
47
 
46
48
  invalidate_caches
@@ -55,7 +57,7 @@ module Nanoc::Int
55
57
  # @param to Vertex where the edge should end
56
58
  #
57
59
  # @return [void]
58
- def add_edge(from, to)
60
+ def add_edge(from, to, props: nil)
59
61
  add_vertex(from)
60
62
  add_vertex(to)
61
63
 
@@ -65,6 +67,10 @@ module Nanoc::Int
65
67
  @to_graph[to] ||= Set.new
66
68
  @to_graph[to] << from
67
69
 
70
+ if props
71
+ @edge_props[[from, to]] = props
72
+ end
73
+
68
74
  @roots.delete(to)
69
75
 
70
76
  invalidate_caches
@@ -87,6 +93,8 @@ module Nanoc::Int
87
93
  @to_graph[to] ||= Set.new
88
94
  @to_graph[to].delete(from)
89
95
 
96
+ @edge_props.delete([from, to])
97
+
90
98
  @roots.add(to) if @to_graph[to].empty?
91
99
 
92
100
  invalidate_caches
@@ -119,6 +127,7 @@ module Nanoc::Int
119
127
 
120
128
  @from_graph[from].each do |to|
121
129
  @to_graph[to].delete(from)
130
+ @edge_props.delete([from, to])
122
131
  @roots.add(to) if @to_graph[to].empty?
123
132
  end
124
133
  @from_graph.delete(from)
@@ -134,6 +143,7 @@ module Nanoc::Int
134
143
 
135
144
  @to_graph[to].each do |from|
136
145
  @from_graph[from].delete(to)
146
+ @edge_props.delete([from, to])
137
147
  end
138
148
  @to_graph.delete(to)
139
149
  @roots.add(to)
@@ -196,6 +206,10 @@ module Nanoc::Int
196
206
  @successors[from] ||= recursively_find_vertices(from, :direct_successors_of)
197
207
  end
198
208
 
209
+ def props_for(from, to)
210
+ @edge_props[[from, to]]
211
+ end
212
+
199
213
  # @return [Array] The list of all vertices in this graph.
200
214
  def vertices
201
215
  @vertices.keys.sort_by { |v| @vertices[v] }
@@ -208,8 +222,8 @@ module Nanoc::Int
208
222
  def edges
209
223
  result = []
210
224
  @vertices.each_pair do |v1, i1|
211
- direct_successors_of(v1).map { |v2| @vertices[v2] }.each do |i2|
212
- result << [i1, i2]
225
+ direct_successors_of(v1).map { |v2| [@vertices[v2], v2] }.each do |i2, v2|
226
+ result << [i1, i2, @edge_props[[v1, v2]]]
213
227
  end
214
228
  end
215
229
  result
@@ -1,6 +1,50 @@
1
1
  module Nanoc::Int
2
2
  # @api private
3
3
  class DependencyStore < ::Nanoc::Int::Store
4
+ # A dependency between two items/layouts.
5
+ class Dependency
6
+ include Nanoc::Int::ContractsSupport
7
+
8
+ contract C::None => C::Or[Nanoc::Int::Item, Nanoc::Int::Layout]
9
+ attr_reader :from
10
+
11
+ contract C::None => C::Or[Nanoc::Int::Item, Nanoc::Int::Layout]
12
+ attr_reader :to
13
+
14
+ contract C::Maybe[C::Or[Nanoc::Int::Item, Nanoc::Int::Layout]], C::Maybe[C::Or[Nanoc::Int::Item, Nanoc::Int::Layout]], C::KeywordArgs[raw_content: C::Optional[C::Bool], attributes: C::Optional[C::Bool], compiled_content: C::Optional[C::Bool], path: C::Optional[C::Bool]] => C::Any
15
+ def initialize(from, to, raw_content:, attributes:, compiled_content:, path:)
16
+ @from = from
17
+ @to = to
18
+
19
+ @raw_content = raw_content
20
+ @attributes = attributes
21
+ @compiled_content = compiled_content
22
+ @path = path
23
+ end
24
+
25
+ contract C::None => C::Bool
26
+ def raw_content?
27
+ @raw_content
28
+ end
29
+
30
+ contract C::None => C::Bool
31
+ def attributes?
32
+ @attributes
33
+ end
34
+
35
+ contract C::None => C::Bool
36
+ def compiled_content?
37
+ @compiled_content
38
+ end
39
+
40
+ contract C::None => C::Bool
41
+ def path?
42
+ @path
43
+ end
44
+ end
45
+
46
+ include Nanoc::Int::ContractsSupport
47
+
4
48
  # @return [Array<Nanoc::Int::Item, Nanoc::Int::Layout>]
5
49
  attr_accessor :objects
6
50
 
@@ -12,6 +56,22 @@ module Nanoc::Int
12
56
  @graph = Nanoc::Int::DirectedGraph.new([nil] + @objects)
13
57
  end
14
58
 
59
+ contract C::Or[Nanoc::Int::Item, Nanoc::Int::ItemRep, Nanoc::Int::Layout] => C::ArrayOf[Dependency]
60
+ def dependencies_causing_outdatedness_of(object)
61
+ objects_causing_outdatedness_of(object).map do |other_object|
62
+ props = @graph.props_for(other_object, object) || {}
63
+
64
+ Dependency.new(
65
+ other_object,
66
+ object,
67
+ raw_content: props.fetch(:raw_content, false),
68
+ attributes: props.fetch(:attributes, false),
69
+ compiled_content: props.fetch(:compiled_content, false),
70
+ path: props.fetch(:path, false),
71
+ )
72
+ end
73
+ end
74
+
15
75
  # Returns the direct dependencies for the given object.
16
76
  #
17
77
  # The direct dependencies of the given object include the items and
@@ -50,6 +110,7 @@ module Nanoc::Int
50
110
  @graph.direct_successors_of(object).compact
51
111
  end
52
112
 
113
+ contract C::Maybe[C::Or[Nanoc::Int::Item, Nanoc::Int::Layout]], C::Maybe[C::Or[Nanoc::Int::Item, Nanoc::Int::Layout]], C::KeywordArgs[raw_content: C::Optional[C::Bool], attributes: C::Optional[C::Bool], compiled_content: C::Optional[C::Bool], path: C::Optional[C::Bool]] => C::Any
53
114
  # Records a dependency from `src` to `dst` in the dependency graph. When
54
115
  # `dst` is oudated, `src` will also become outdated.
55
116
  #
@@ -61,9 +122,13 @@ module Nanoc::Int
61
122
  # outdated if the destination is outdated
62
123
  #
63
124
  # @return [void]
64
- def record_dependency(src, dst)
125
+ def record_dependency(src, dst, raw_content: false, attributes: false, compiled_content: false, path: false)
126
+ existing_props = @graph.props_for(dst, src) || {}
127
+ new_props = { raw_content: raw_content, attributes: attributes, compiled_content: compiled_content, path: path }
128
+ props = merge_props(existing_props, new_props)
129
+
65
130
  # Warning! dst and src are *reversed* here!
66
- @graph.add_edge(dst, src) unless src == dst
131
+ @graph.add_edge(dst, src, props: props) unless src == dst
67
132
  end
68
133
 
69
134
  # Empties the list of dependencies for the given object. This is necessary
@@ -81,6 +146,13 @@ module Nanoc::Int
81
146
 
82
147
  protected
83
148
 
149
+ def merge_props(p1, p2)
150
+ keys = (p1.keys + p2.keys).uniq
151
+ keys.each_with_object({}) do |key, memo|
152
+ memo[key] = p1.fetch(key, false) || p2.fetch(key, false)
153
+ end
154
+ end
155
+
84
156
  def data
85
157
  {
86
158
  edges: @graph.edges,
@@ -99,10 +171,10 @@ module Nanoc::Int
99
171
 
100
172
  # Load edges
101
173
  new_data[:edges].each do |edge|
102
- from_index, to_index = *edge
174
+ from_index, to_index, props = *edge
103
175
  from = from_index && previous_objects[from_index]
104
176
  to = to_index && previous_objects[to_index]
105
- @graph.add_edge(from, to)
177
+ @graph.add_edge(from, to, props: props)
106
178
  end
107
179
 
108
180
  # Record dependency from all items on new items
@@ -4,16 +4,16 @@ module Nanoc::Int
4
4
  class Null
5
5
  include Nanoc::Int::ContractsSupport
6
6
 
7
- contract C::Or[Nanoc::Int::Item, Nanoc::Int::Layout] => C::Any
8
- def enter(_obj)
7
+ contract C::Or[Nanoc::Int::Item, Nanoc::Int::Layout], C::KeywordArgs[raw_content: C::Optional[C::Bool], attributes: C::Optional[C::Bool], compiled_content: C::Optional[C::Bool], path: C::Optional[C::Bool]] => C::Any
8
+ def enter(_obj, raw_content: false, attributes: false, compiled_content: false, path: false)
9
9
  end
10
10
 
11
11
  contract C::None => C::Any
12
12
  def exit
13
13
  end
14
14
 
15
- contract C::Or[Nanoc::Int::Item, Nanoc::Int::Layout] => C::Any
16
- def bounce(_obj)
15
+ contract C::Or[Nanoc::Int::Item, Nanoc::Int::Layout], C::KeywordArgs[raw_content: C::Optional[C::Bool], attributes: C::Optional[C::Bool], compiled_content: C::Optional[C::Bool], path: C::Optional[C::Bool]] => C::Any
16
+ def bounce(_obj, raw_content: false, attributes: false, compiled_content: false, path: false)
17
17
  end
18
18
  end
19
19
 
@@ -24,11 +24,18 @@ module Nanoc::Int
24
24
  @stack = []
25
25
  end
26
26
 
27
- contract C::Or[Nanoc::Int::Item, Nanoc::Int::Layout] => C::Any
28
- def enter(obj)
27
+ contract C::Or[Nanoc::Int::Item, Nanoc::Int::Layout], C::KeywordArgs[raw_content: C::Optional[C::Bool], attributes: C::Optional[C::Bool], compiled_content: C::Optional[C::Bool], path: C::Optional[C::Bool]] => C::Any
28
+ def enter(obj, raw_content: false, attributes: false, compiled_content: false, path: false)
29
29
  unless @stack.empty?
30
30
  Nanoc::Int::NotificationCenter.post(:dependency_created, @stack.last, obj)
31
- @dependency_store.record_dependency(@stack.last, obj)
31
+ @dependency_store.record_dependency(
32
+ @stack.last,
33
+ obj,
34
+ raw_content: raw_content,
35
+ attributes: attributes,
36
+ compiled_content: compiled_content,
37
+ path: path,
38
+ )
32
39
  end
33
40
 
34
41
  @stack.push(obj)
@@ -39,9 +46,9 @@ module Nanoc::Int
39
46
  @stack.pop
40
47
  end
41
48
 
42
- contract C::Or[Nanoc::Int::Item, Nanoc::Int::Layout] => C::Any
43
- def bounce(obj)
44
- enter(obj)
49
+ contract C::Or[Nanoc::Int::Item, Nanoc::Int::Layout], C::KeywordArgs[raw_content: C::Optional[C::Bool], attributes: C::Optional[C::Bool], compiled_content: C::Optional[C::Bool], path: C::Optional[C::Bool]] => C::Any
50
+ def bounce(obj, raw_content: false, attributes: false, compiled_content: false, path: false)
51
+ enter(obj, raw_content: raw_content, attributes: attributes, compiled_content: compiled_content, path: path)
45
52
  exit
46
53
  end
47
54
  end
@@ -67,7 +67,7 @@ module Nanoc
67
67
  filter = klass.new(assigns_for(rep).merge({ layout: layout_view }))
68
68
 
69
69
  # Visit
70
- @dependency_tracker.bounce(layout)
70
+ @dependency_tracker.bounce(layout, raw_content: true)
71
71
 
72
72
  begin
73
73
  # Notify start
@@ -195,7 +195,7 @@ module Nanoc
195
195
 
196
196
  # Notify
197
197
  dependency_tracker = @assigns[:item]._context.dependency_tracker
198
- items.each { |item| dependency_tracker.bounce(item) }
198
+ items.each { |item| dependency_tracker.bounce(item, compiled_content: true) }
199
199
 
200
200
  # Raise unmet dependency error if necessary
201
201
  items.each do |item|
@@ -42,7 +42,7 @@ module Nanoc
42
42
  #
43
43
  # @return [String] The content at the given snapshot.
44
44
  def compiled_content(snapshot: nil)
45
- @context.dependency_tracker.bounce(unwrap.item)
45
+ @context.dependency_tracker.bounce(unwrap.item, compiled_content: true)
46
46
  @item_rep.compiled_content(snapshot: snapshot)
47
47
  end
48
48
 
@@ -56,7 +56,7 @@ module Nanoc
56
56
  #
57
57
  # @return [String] The item rep’s path.
58
58
  def path(snapshot: :last)
59
- @context.dependency_tracker.bounce(unwrap.item)
59
+ @context.dependency_tracker.bounce(unwrap.item, path: true)
60
60
  @item_rep.path(snapshot: snapshot)
61
61
  end
62
62
 
@@ -69,7 +69,7 @@ module Nanoc
69
69
 
70
70
  # @api private
71
71
  def raw_path(snapshot: :last)
72
- @context.dependency_tracker.bounce(unwrap.item)
72
+ @context.dependency_tracker.bounce(unwrap.item, path: true)
73
73
  @item_rep.raw_path(snapshot: snapshot)
74
74
  end
75
75
 
@@ -36,19 +36,19 @@ module Nanoc
36
36
 
37
37
  # @see Hash#[]
38
38
  def [](key)
39
- @context.dependency_tracker.bounce(unwrap)
39
+ @context.dependency_tracker.bounce(unwrap, attributes: true)
40
40
  unwrap.attributes[key]
41
41
  end
42
42
 
43
43
  # @return [Hash]
44
44
  def attributes
45
- @context.dependency_tracker.bounce(unwrap)
45
+ @context.dependency_tracker.bounce(unwrap, attributes: true)
46
46
  unwrap.attributes
47
47
  end
48
48
 
49
49
  # @see Hash#fetch
50
50
  def fetch(key, fallback = NONE, &_block)
51
- @context.dependency_tracker.bounce(unwrap)
51
+ @context.dependency_tracker.bounce(unwrap, attributes: true)
52
52
 
53
53
  if unwrap.attributes.key?(key)
54
54
  unwrap.attributes[key]
@@ -63,7 +63,7 @@ module Nanoc
63
63
 
64
64
  # @see Hash#key?
65
65
  def key?(key)
66
- @context.dependency_tracker.bounce(unwrap)
66
+ @context.dependency_tracker.bounce(unwrap, attributes: true)
67
67
  unwrap.attributes.key?(key)
68
68
  end
69
69
 
@@ -74,6 +74,7 @@ module Nanoc
74
74
 
75
75
  # @api private
76
76
  def raw_content
77
+ @context.dependency_tracker.bounce(unwrap, raw_content: true)
77
78
  unwrap.content.string
78
79
  end
79
80
 
@@ -62,11 +62,23 @@ module Nanoc::CLI::Commands
62
62
  def print_item_dependencies(items, dependency_store)
63
63
  print_header('Item dependencies')
64
64
 
65
+ puts 'Legend:'
66
+ puts ' r = dependency on raw content'
67
+ puts ' a = dependency on attributes'
68
+ puts ' c = dependency on compiled content'
69
+ puts ' p = dependency on the path'
70
+ puts
71
+
65
72
  sorted_with_prev(items) do |item, prev|
66
73
  puts if prev
67
74
  puts "item #{item.identifier} depends on:"
68
- predecessors = dependency_store.objects_causing_outdatedness_of(item).sort_by { |i| i ? i.identifier : '' }
69
- predecessors.each do |pred|
75
+ dependencies =
76
+ dependency_store
77
+ .dependencies_causing_outdatedness_of(item)
78
+ .sort_by { |dep| dep.from ? dep.from.identifier : '' }
79
+ dependencies.each do |dep|
80
+ pred = dep.from
81
+
70
82
  type =
71
83
  case pred
72
84
  when Nanoc::Int::Layout
@@ -77,13 +89,19 @@ module Nanoc::CLI::Commands
77
89
  'item'
78
90
  end
79
91
 
92
+ props = ''
93
+ props << (dep.raw_content? ? 'r' : '_')
94
+ props << (dep.attributes? ? 'a' : '_')
95
+ props << (dep.compiled_content? ? 'c' : '_')
96
+ props << (dep.path? ? 'p' : '_')
97
+
80
98
  if pred
81
- puts " [ #{format '%6s', type} ] #{pred.identifier}"
99
+ puts " [ #{format '%6s', type} ] (#{props}) #{pred.identifier}"
82
100
  else
83
101
  puts ' ( removed item )'
84
102
  end
85
103
  end
86
- puts ' (nothing)' if predecessors.empty?
104
+ puts ' (nothing)' if dependencies.empty?
87
105
  end
88
106
  end
89
107
 
@@ -46,7 +46,7 @@ module Nanoc::CLI::Commands
46
46
  use Rack::Head
47
47
  use Adsf::Rack::IndexFileFinder,
48
48
  root: site.config[:output_dir],
49
- index_filenames: %w(index.html index.xhtml)
49
+ index_filenames: site.config[:index_filenames]
50
50
  run Rack::File.new(site.config[:output_dir])
51
51
  end.to_app
52
52
 
@@ -64,7 +64,7 @@ module Nanoc::Helpers
64
64
  # Create dependency
65
65
  if @item.nil? || item != @item.unwrap
66
66
  dependency_tracker = @config._context.dependency_tracker
67
- dependency_tracker.bounce(item.unwrap)
67
+ dependency_tracker.bounce(item.unwrap, compiled_content: true)
68
68
 
69
69
  unless rep.compiled?
70
70
  Fiber.yield(Nanoc::Int::Errors::UnmetDependency.new(rep))
@@ -20,7 +20,7 @@ module Nanoc::Helpers
20
20
 
21
21
  # Visit
22
22
  dependency_tracker = @config._context.dependency_tracker
23
- dependency_tracker.bounce(layout)
23
+ dependency_tracker.bounce(layout, raw_content: true)
24
24
 
25
25
  # Capture content, if any
26
26
  captured_content = block_given? ? capture(&block) : nil
data/lib/nanoc/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Nanoc
2
2
  # The current Nanoc version.
3
- VERSION = '4.4.0'.freeze
3
+ VERSION = '4.4.1'.freeze
4
4
  end
@@ -44,7 +44,7 @@ class Nanoc::Int::DirectedGraphTest < Nanoc::TestCase
44
44
  graph.add_edge(1, 2)
45
45
  graph.add_edge(2, 3)
46
46
 
47
- assert_equal [[0, 1], [1, 2]], graph.edges.sort
47
+ assert_equal [[0, 1, nil], [1, 2, nil]], graph.edges.sort
48
48
  end
49
49
 
50
50
  def test_edges_with_new_vertices
@@ -55,7 +55,50 @@ class Nanoc::Int::DirectedGraphTest < Nanoc::TestCase
55
55
  graph.add_edge(3, 2)
56
56
  assert_equal [1, 2, 3], graph.vertices
57
57
 
58
- assert_equal [[0, 1], [2, 1]], graph.edges.sort
58
+ assert_equal [[0, 1, nil], [2, 1, nil]], graph.edges.sort
59
+ end
60
+
61
+ def test_edge_with_props
62
+ graph = Nanoc::Int::DirectedGraph.new([1, 2, 3])
63
+ graph.add_edge(1, 2, props: { donkey: 14 })
64
+ graph.add_edge(2, 3, props: { giraffe: 3 })
65
+
66
+ assert_equal [[0, 1, { donkey: 14 }], [1, 2, { giraffe: 3 }]], graph.edges.sort
67
+ end
68
+
69
+ def test_props_for
70
+ graph = Nanoc::Int::DirectedGraph.new([1, 2, 3, 4])
71
+ graph.add_edge(1, 2, props: { donkey: 14 })
72
+ graph.add_edge(2, 3, props: { giraffe: 3 })
73
+ graph.add_edge(3, 4)
74
+
75
+ assert_equal({ donkey: 14 }, graph.props_for(1, 2))
76
+ assert_equal({ giraffe: 3 }, graph.props_for(2, 3))
77
+ assert_equal(nil, graph.props_for(3, 4))
78
+ end
79
+
80
+ def test_props_for_with_deleted_edge
81
+ graph = Nanoc::Int::DirectedGraph.new([1, 2])
82
+ graph.add_edge(1, 2, props: { donkey: 14 })
83
+ graph.delete_edge(1, 2)
84
+
85
+ assert_equal(nil, graph.props_for(1, 2))
86
+ end
87
+
88
+ def test_props_for_with_deleted_edges_from
89
+ graph = Nanoc::Int::DirectedGraph.new([1, 2])
90
+ graph.add_edge(1, 2, props: { donkey: 14 })
91
+ graph.delete_edges_from(1)
92
+
93
+ assert_equal(nil, graph.props_for(1, 2))
94
+ end
95
+
96
+ def test_props_for_with_deleted_edges_to
97
+ graph = Nanoc::Int::DirectedGraph.new([1, 2])
98
+ graph.add_edge(1, 2, props: { donkey: 14 })
99
+ graph.delete_edges_to(2)
100
+
101
+ assert_equal(nil, graph.props_for(1, 2))
59
102
  end
60
103
 
61
104
  def test_add_edge
@@ -81,13 +81,33 @@ EOS
81
81
 
82
82
  SAMPLE_XML_OUT_WITH_OMIT_XML_DECL = %r{\A<html>\s*<head>\s*<title>My Report</title>\s*</head>\s*<body>\s*<h1>My Report</h1>\s*</body>\s*</html>\s*\Z}m
83
83
 
84
+ def setup
85
+ super
86
+
87
+ @dependency_store = Nanoc::Int::DependencyStore.new([])
88
+ @dependency_tracker = Nanoc::Int::DependencyTracker.new(@dependency_store)
89
+
90
+ @base_item = Nanoc::Int::Item.new('base', {}, '/base.md')
91
+
92
+ @dependency_tracker.enter(@base_item)
93
+ end
94
+
95
+ def new_view_context
96
+ Nanoc::ViewContext.new(
97
+ reps: :__irrelevat_reps,
98
+ items: :__irrelevat_items,
99
+ dependency_tracker: @dependency_tracker,
100
+ compiler: :__irrelevat_compiler,
101
+ )
102
+ end
103
+
84
104
  def test_filter_as_layout
85
105
  if_have 'nokogiri' do
86
106
  # Create our data objects
87
107
  item = Nanoc::Int::Item.new(SAMPLE_XML_IN, {}, '/content/')
88
- item = Nanoc::ItemWithRepsView.new(item, nil)
108
+ item = Nanoc::ItemWithRepsView.new(item, new_view_context)
89
109
  layout = Nanoc::Int::Layout.new(SAMPLE_XSL, {}, '/layout/')
90
- layout = Nanoc::LayoutView.new(layout, nil)
110
+ layout = Nanoc::LayoutView.new(layout, new_view_context)
91
111
 
92
112
  # Create an instance of the filter
93
113
  assigns = {
@@ -100,6 +120,10 @@ EOS
100
120
  # Run the filter and validate the results
101
121
  result = filter.setup_and_run(layout.raw_content)
102
122
  assert_match SAMPLE_XML_OUT, result
123
+
124
+ # Verify dependencies
125
+ dep = @dependency_store.dependencies_causing_outdatedness_of(@base_item)[0]
126
+ refute_nil dep
103
127
  end
104
128
  end
105
129
 
@@ -107,9 +131,9 @@ EOS
107
131
  if_have 'nokogiri' do
108
132
  # Create our data objects
109
133
  item = Nanoc::Int::Item.new(SAMPLE_XML_IN_WITH_PARAMS, {}, '/content/')
110
- item = Nanoc::ItemWithRepsView.new(item, nil)
134
+ item = Nanoc::ItemWithRepsView.new(item, new_view_context)
111
135
  layout = Nanoc::Int::Layout.new(SAMPLE_XSL_WITH_PARAMS, {}, '/layout/')
112
- layout = Nanoc::LayoutView.new(layout, nil)
136
+ layout = Nanoc::LayoutView.new(layout, new_view_context)
113
137
 
114
138
  # Create an instance of the filter
115
139
  assigns = {
@@ -122,6 +146,10 @@ EOS
122
146
  # Run the filter and validate the results
123
147
  result = filter.setup_and_run(layout.raw_content, foo: 'bar')
124
148
  assert_match SAMPLE_XML_OUT_WITH_PARAMS, result
149
+
150
+ # Verify dependencies
151
+ dep = @dependency_store.dependencies_causing_outdatedness_of(@base_item)[0]
152
+ refute_nil dep
125
153
  end
126
154
  end
127
155
 
@@ -129,9 +157,9 @@ EOS
129
157
  if_have 'nokogiri' do
130
158
  # Create our data objects
131
159
  item = Nanoc::Int::Item.new(SAMPLE_XML_IN_WITH_OMIT_XML_DECL, {}, '/content/')
132
- item = Nanoc::ItemWithRepsView.new(item, nil)
160
+ item = Nanoc::ItemWithRepsView.new(item, new_view_context)
133
161
  layout = Nanoc::Int::Layout.new(SAMPLE_XSL_WITH_OMIT_XML_DECL, {}, '/layout/')
134
- layout = Nanoc::LayoutView.new(layout, nil)
162
+ layout = Nanoc::LayoutView.new(layout, new_view_context)
135
163
 
136
164
  # Create an instance of the filter
137
165
  assigns = {
@@ -144,6 +172,10 @@ EOS
144
172
  # Run the filter and validate the results
145
173
  result = filter.setup_and_run(layout.raw_content)
146
174
  assert_match SAMPLE_XML_OUT_WITH_OMIT_XML_DECL, result
175
+
176
+ # Verify dependencies
177
+ dep = @dependency_store.dependencies_causing_outdatedness_of(@base_item)[0]
178
+ refute_nil dep
147
179
  end
148
180
  end
149
181
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nanoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.4.0
4
+ version: 4.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Defreyne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-19 00:00:00.000000000 Z
11
+ date: 2016-11-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cri