nanoc 4.0.0b3 → 4.0.0b4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/Gemfile.lock +4 -2
  4. data/NEWS.md +10 -0
  5. data/TODO.md +15 -0
  6. data/lib/nanoc/base.rb +4 -27
  7. data/lib/nanoc/base/checksummer.rb +69 -19
  8. data/lib/nanoc/base/compilation/compiler.rb +14 -12
  9. data/lib/nanoc/base/compilation/compiler_dsl.rb +2 -0
  10. data/lib/nanoc/base/compilation/filter.rb +4 -2
  11. data/lib/nanoc/base/compilation/outdatedness_checker.rb +7 -7
  12. data/lib/nanoc/base/compilation/rule.rb +5 -6
  13. data/lib/nanoc/base/compilation/rule_context.rb +16 -34
  14. data/lib/nanoc/base/compilation/rule_memory_calculator.rb +3 -3
  15. data/lib/nanoc/base/compilation/rules_collection.rb +4 -10
  16. data/lib/nanoc/base/context.rb +2 -0
  17. data/lib/nanoc/base/core_ext/array.rb +0 -10
  18. data/lib/nanoc/base/core_ext/hash.rb +0 -10
  19. data/lib/nanoc/base/core_ext/pathname.rb +0 -9
  20. data/lib/nanoc/base/core_ext/string.rb +0 -10
  21. data/lib/nanoc/base/entities.rb +5 -0
  22. data/lib/nanoc/base/entities/content.rb +86 -0
  23. data/lib/nanoc/base/entities/document.rb +56 -0
  24. data/lib/nanoc/base/{source_data → entities}/identifier.rb +12 -1
  25. data/lib/nanoc/base/entities/layout.rb +8 -0
  26. data/lib/nanoc/base/{pattern.rb → entities/pattern.rb} +0 -0
  27. data/lib/nanoc/base/errors.rb +2 -1
  28. data/lib/nanoc/base/result_data/item_rep.rb +13 -278
  29. data/lib/nanoc/base/services.rb +5 -0
  30. data/lib/nanoc/base/services/executor.rb +141 -0
  31. data/lib/nanoc/base/services/item_rep_writer.rb +40 -0
  32. data/lib/nanoc/base/{notification_center.rb → services/notification_center.rb} +0 -0
  33. data/lib/nanoc/base/services/recording_executor.rb +41 -0
  34. data/lib/nanoc/base/{temp_filename_factory.rb → services/temp_filename_factory.rb} +0 -0
  35. data/lib/nanoc/base/source_data/code_snippet.rb +0 -6
  36. data/lib/nanoc/base/source_data/data_source.rb +4 -3
  37. data/lib/nanoc/base/source_data/item.rb +23 -213
  38. data/lib/nanoc/base/source_data/site.rb +0 -1
  39. data/lib/nanoc/base/views.rb +18 -0
  40. data/lib/nanoc/base/views/config.rb +1 -1
  41. data/lib/nanoc/base/views/item.rb +8 -73
  42. data/lib/nanoc/base/views/item_rep.rb +9 -0
  43. data/lib/nanoc/base/views/item_rep_collection.rb +17 -0
  44. data/lib/nanoc/base/views/layout.rb +1 -40
  45. data/lib/nanoc/base/views/mixins/document.rb +76 -0
  46. data/lib/nanoc/base/views/mixins/mutable_document.rb +22 -0
  47. data/lib/nanoc/base/views/mutable_identifiable_collection.rb +1 -1
  48. data/lib/nanoc/base/views/mutable_item.rb +1 -18
  49. data/lib/nanoc/base/views/mutable_item_collection.rb +6 -2
  50. data/lib/nanoc/base/views/mutable_layout.rb +1 -8
  51. data/lib/nanoc/cli/commands/compile.rb +1 -2
  52. data/lib/nanoc/cli/commands/create-site.rb +5 -5
  53. data/lib/nanoc/cli/commands/show-data.rb +11 -1
  54. data/lib/nanoc/data_sources/filesystem.rb +17 -10
  55. data/lib/nanoc/helpers/capturing.rb +1 -2
  56. data/lib/nanoc/helpers/filtering.rb +13 -1
  57. data/lib/nanoc/helpers/rendering.rb +4 -2
  58. data/lib/nanoc/version.rb +1 -1
  59. data/test/base/core_ext/array_spec.rb +0 -7
  60. data/test/base/core_ext/hash_spec.rb +0 -13
  61. data/test/base/core_ext/pathname_spec.rb +0 -33
  62. data/test/base/core_ext/string_spec.rb +0 -10
  63. data/test/base/test_compiler_dsl.rb +3 -3
  64. data/test/base/test_data_source.rb +2 -2
  65. data/test/base/test_item.rb +5 -129
  66. data/test/base/test_item_rep.rb +26 -558
  67. data/test/base/test_layout.rb +2 -26
  68. data/test/base/test_rule.rb +3 -3
  69. data/test/base/test_rule_context.rb +34 -15
  70. data/test/data_sources/test_filesystem.rb +2 -2
  71. data/test/data_sources/test_filesystem_unified.rb +39 -33
  72. data/test/extra/checking/checks/test_html.rb +0 -1
  73. data/test/extra/checking/checks/test_mixed_content.rb +3 -3
  74. data/test/extra/deployers/test_fog.rb +24 -24
  75. data/test/filters/test_less.rb +4 -4
  76. data/test/filters/test_sass.rb +10 -5
  77. data/test/filters/test_xsl.rb +6 -0
  78. data/test/helpers/test_capturing.rb +0 -1
  79. data/test/helpers/test_filtering.rb +5 -19
  80. data/test/helpers/test_tagging.rb +6 -6
  81. metadata +18 -11
  82. data/lib/nanoc/base/compilation/item_rep_proxy.rb +0 -109
  83. data/lib/nanoc/base/compilation/item_rep_recorder_proxy.rb +0 -97
  84. data/lib/nanoc/base/source_data/layout.rb +0 -111
  85. data/test/base/checksummer_spec.rb +0 -256
  86. data/test/base/test_item_rep_recorder_proxy.rb +0 -17
@@ -330,7 +330,6 @@ module Nanoc::Int
330
330
  items_in_ds = ds.items
331
331
  items_in_ds.each do |i|
332
332
  i.identifier = i.identifier.prefix(ds.items_root)
333
- i.site = self
334
333
  end
335
334
  @items.concat(items_in_ds)
336
335
  end
@@ -0,0 +1,18 @@
1
+ require_relative 'views/mixins/document'
2
+ require_relative 'views/mixins/mutable_document'
3
+
4
+ require_relative 'views/config'
5
+ require_relative 'views/identifiable_collection'
6
+ require_relative 'views/item'
7
+ require_relative 'views/item_collection'
8
+ require_relative 'views/item_rep'
9
+ require_relative 'views/item_rep_collection'
10
+ require_relative 'views/layout'
11
+ require_relative 'views/layout_collection'
12
+ require_relative 'views/mutable_config'
13
+ require_relative 'views/mutable_identifiable_collection'
14
+ require_relative 'views/mutable_item'
15
+ require_relative 'views/mutable_item_collection'
16
+ require_relative 'views/mutable_layout'
17
+ require_relative 'views/mutable_layout_collection'
18
+ require_relative 'views/site'
@@ -14,7 +14,7 @@ module Nanoc
14
14
  end
15
15
 
16
16
  # @see Hash#fetch
17
- def fetch(key, fallback=NONE, &block)
17
+ def fetch(key, fallback = NONE, &_block)
18
18
  @config.fetch(key) do
19
19
  if !fallback.equal?(NONE)
20
20
  fallback
@@ -1,61 +1,6 @@
1
1
  module Nanoc
2
2
  class ItemView
3
- # @api private
4
- NONE = Object.new
5
-
6
- # @api private
7
- def initialize(item)
8
- @item = item
9
- end
10
-
11
- # @api private
12
- def unwrap
13
- @item
14
- end
15
-
16
- # @see Object#==
17
- def ==(other)
18
- identifier == other.identifier
19
- end
20
- alias_method :eql?, :==
21
-
22
- # @see Object#hash
23
- def hash
24
- self.class.hash ^ identifier.hash
25
- end
26
-
27
- # @return [Nanoc::Identifier]
28
- def identifier
29
- @item.identifier
30
- end
31
-
32
- # @see Hash#fetch
33
- def fetch(key, fallback=NONE, &block)
34
- res = @item[key] # necessary for dependency tracking
35
-
36
- if @item.attributes.key?(key)
37
- res
38
- else
39
- if !fallback.equal?(NONE)
40
- fallback
41
- elsif block_given?
42
- yield(key)
43
- else
44
- raise KeyError, "key not found: #{key.inspect}"
45
- end
46
- end
47
- end
48
-
49
- # @see Hash#key?
50
- def key?(key)
51
- _res = @item[key] # necessary for dependency tracking
52
- @item.attributes.key?(key)
53
- end
54
-
55
- # @see Hash#[]
56
- def [](key)
57
- @item[key]
58
- end
3
+ include Nanoc::DocumentViewMixin
59
4
 
60
5
  # Returns the compiled content.
61
6
  #
@@ -70,7 +15,7 @@ module Nanoc
70
15
  #
71
16
  # @return [String] The content of the given rep at the given snapshot.
72
17
  def compiled_content(params = {})
73
- @item.compiled_content(params)
18
+ reps.fetch(params.fetch(:rep, :default)).compiled_content(params)
74
19
  end
75
20
 
76
21
  # Returns the item path, as used when being linked to. It starts
@@ -87,7 +32,7 @@ module Nanoc
87
32
  #
88
33
  # @return [String] The item’s path.
89
34
  def path(params = {})
90
- @item.path(params)
35
+ reps.fetch(params.fetch(:rep, :default)).path(params)
91
36
  end
92
37
 
93
38
  # Returns the children of this item. For items with identifiers that have
@@ -95,7 +40,7 @@ module Nanoc
95
40
  #
96
41
  # @return [Enumerable<Nanoc::ItemView>]
97
42
  def children
98
- @item.children.map { |i| Nanoc::ItemView.new(i) }
43
+ unwrap.children.map { |i| Nanoc::ItemView.new(i) }
99
44
  end
100
45
 
101
46
  # Returns the parent of this item, if one exists. For items with identifiers
@@ -105,34 +50,24 @@ module Nanoc
105
50
  #
106
51
  # @return [nil] if the item has no parent
107
52
  def parent
108
- @item.parent && Nanoc::ItemView.new(@item.parent)
53
+ unwrap.parent && Nanoc::ItemView.new(unwrap.parent)
109
54
  end
110
55
 
111
56
  # @return [Boolean] True if the item is binary, false otherwise
112
57
  def binary?
113
- @item.binary?
114
- end
115
-
116
- # For textual items, returns the raw (source) content of this item; for
117
- # binary items, returns `nil`.
118
- #
119
- # @return [String] if the item is textual
120
- #
121
- # @return [nil] if the item is binary
122
- def raw_content
123
- @item.raw_content
58
+ unwrap.content.binary?
124
59
  end
125
60
 
126
61
  # Returns the representations of this item.
127
62
  #
128
63
  # @return [Nanoc::ItemRepCollectionView]
129
64
  def reps
130
- Nanoc::ItemRepCollectionView.new(@item.reps)
65
+ Nanoc::ItemRepCollectionView.new(unwrap.reps)
131
66
  end
132
67
 
133
68
  # @api private
134
69
  def raw_filename
135
- @item.raw_filename
70
+ unwrap.content.filename
136
71
  end
137
72
  end
138
73
  end
@@ -35,6 +35,9 @@ module Nanoc
35
35
  #
36
36
  # @return [String] The content at the given snapshot.
37
37
  def compiled_content(params = {})
38
+ Nanoc::Int::NotificationCenter.post(:visit_started, unwrap.item)
39
+ Nanoc::Int::NotificationCenter.post(:visit_ended, unwrap.item)
40
+
38
41
  @item_rep.compiled_content(params)
39
42
  end
40
43
 
@@ -48,6 +51,9 @@ module Nanoc
48
51
  #
49
52
  # @return [String] The item rep’s path.
50
53
  def path(params = {})
54
+ Nanoc::Int::NotificationCenter.post(:visit_started, unwrap.item)
55
+ Nanoc::Int::NotificationCenter.post(:visit_ended, unwrap.item)
56
+
51
57
  @item_rep.path(params)
52
58
  end
53
59
 
@@ -60,6 +66,9 @@ module Nanoc
60
66
 
61
67
  # @api private
62
68
  def raw_path(params = {})
69
+ Nanoc::Int::NotificationCenter.post(:visit_started, unwrap.item)
70
+ Nanoc::Int::NotificationCenter.post(:visit_ended, unwrap.item)
71
+
63
72
  @item_rep.raw_path(params)
64
73
  end
65
74
 
@@ -44,5 +44,22 @@ module Nanoc
44
44
  res = @item_reps.find { |ir| ir.name == rep_name }
45
45
  res && Nanoc::ItemRepView.new(res)
46
46
  end
47
+
48
+ # Return the item rep with the given name, or raises an exception if there
49
+ # is no rep with the given name.
50
+ #
51
+ # @param [Symbol] rep_name
52
+ #
53
+ # @return [Nanoc::ItemRepView]
54
+ #
55
+ # @raise if no rep was found
56
+ def fetch(rep_name)
57
+ res = @item_reps.find { |ir| ir.name == rep_name }
58
+ if res
59
+ Nanoc::ItemRepView.new(res)
60
+ else
61
+ raise Nanoc::Int::Errors::Generic, "No rep named #{rep_name.inspect} was found."
62
+ end
63
+ end
47
64
  end
48
65
  end
@@ -1,44 +1,5 @@
1
1
  module Nanoc
2
2
  class LayoutView
3
- # @api private
4
- def initialize(layout)
5
- @layout = layout
6
- end
7
-
8
- # @api private
9
- def unwrap
10
- @layout
11
- end
12
-
13
- # @see Object#==
14
- def ==(other)
15
- identifier == other.identifier
16
- end
17
- alias_method :eql?, :==
18
-
19
- # @see Object#hash
20
- def hash
21
- self.class.hash ^ identifier.hash
22
- end
23
-
24
- # @return [Nanoc::Identifier]
25
- def identifier
26
- @layout.identifier
27
- end
28
-
29
- # @see Hash#[]
30
- def [](key)
31
- @layout[key]
32
- end
33
-
34
- # @api private
35
- def reference
36
- @layout.reference
37
- end
38
-
39
- # @api private
40
- def raw_content
41
- @layout.raw_content
42
- end
3
+ include Nanoc::DocumentViewMixin
43
4
  end
44
5
  end
@@ -0,0 +1,76 @@
1
+ module Nanoc
2
+ module DocumentViewMixin
3
+ # @api private
4
+ NONE = Object.new
5
+
6
+ # @api private
7
+ def initialize(document)
8
+ @document = document
9
+ end
10
+
11
+ # @api private
12
+ def unwrap
13
+ @document
14
+ end
15
+
16
+ # @see Object#==
17
+ def ==(other)
18
+ identifier == other.identifier
19
+ end
20
+ alias_method :eql?, :==
21
+
22
+ # @see Object#hash
23
+ def hash
24
+ self.class.hash ^ identifier.hash
25
+ end
26
+
27
+ # @return [Nanoc::Identifier]
28
+ def identifier
29
+ unwrap.identifier
30
+ end
31
+
32
+ # @see Hash#[]
33
+ def [](key)
34
+ Nanoc::Int::NotificationCenter.post(:visit_started, unwrap)
35
+ Nanoc::Int::NotificationCenter.post(:visit_ended, unwrap)
36
+
37
+ unwrap.attributes[key]
38
+ end
39
+
40
+ # @see Hash#fetch
41
+ def fetch(key, fallback = NONE, &_block)
42
+ Nanoc::Int::NotificationCenter.post(:visit_started, unwrap)
43
+ Nanoc::Int::NotificationCenter.post(:visit_ended, unwrap)
44
+
45
+ if unwrap.attributes.key?(key)
46
+ unwrap.attributes[key]
47
+ else
48
+ if !fallback.equal?(NONE)
49
+ fallback
50
+ elsif block_given?
51
+ yield(key)
52
+ else
53
+ raise KeyError, "key not found: #{key.inspect}"
54
+ end
55
+ end
56
+ end
57
+
58
+ # @see Hash#key?
59
+ def key?(key)
60
+ Nanoc::Int::NotificationCenter.post(:visit_started, unwrap)
61
+ Nanoc::Int::NotificationCenter.post(:visit_ended, unwrap)
62
+
63
+ unwrap.attributes.key?(key)
64
+ end
65
+
66
+ # @api private
67
+ def reference
68
+ unwrap.reference
69
+ end
70
+
71
+ # @api private
72
+ def raw_content
73
+ unwrap.content.string
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,22 @@
1
+ module Nanoc
2
+ module MutableDocumentViewMixin
3
+ # Sets the value for the given attribute.
4
+ #
5
+ # @param [Symbol] key
6
+ #
7
+ # @see Hash#[]=
8
+ def []=(key, value)
9
+ unwrap.attributes[key] = value
10
+ end
11
+
12
+ # Updates the attributes based on the given hash.
13
+ #
14
+ # @param [Hash] hash
15
+ #
16
+ # @return [self]
17
+ def update_attributes(hash)
18
+ hash.each { |k, v| unwrap.attributes[k] = v }
19
+ self
20
+ end
21
+ end
22
+ end
@@ -7,7 +7,7 @@ module Nanoc
7
7
  # @yieldreturn [Boolean]
8
8
  #
9
9
  # @return [self]
10
- def delete_if(&block)
10
+ def delete_if(&_block)
11
11
  @objects.delete_if { |o| yield(view_class.new(o)) }
12
12
  self
13
13
  end
@@ -1,22 +1,5 @@
1
1
  module Nanoc
2
2
  class MutableItemView < Nanoc::ItemView
3
- # Sets the value for the given attribute.
4
- #
5
- # @param [Symbol] key
6
- #
7
- # @see Hash#[]=
8
- def []=(key, value)
9
- unwrap[key] = value
10
- end
11
-
12
- # Updates the attributes based on the given hash.
13
- #
14
- # @param [Hash] hash
15
- #
16
- # @return [self]
17
- def update_attributes(hash)
18
- hash.each { |k, v| unwrap[k] = v }
19
- self
20
- end
3
+ include Nanoc::MutableDocumentViewMixin
21
4
  end
22
5
  end
@@ -17,12 +17,16 @@ module Nanoc
17
17
  #
18
18
  # @param [Hash] params Extra parameters.
19
19
  #
20
- # @option params [Symbol, nil] :binary (true) Whether or not this item is
20
+ # @option params [Boolean] :binary (false) Whether or not this item is
21
21
  # binary
22
22
  #
23
+ # @option params [String] :filename (nil) Absolute path to the file
24
+ # containing this content (if any)
25
+ #
23
26
  # @return [self]
24
27
  def create(content, attributes, identifier, params = {})
25
- @objects << Nanoc::Int::Item.new(content, attributes, identifier, params)
28
+ content = Nanoc::Int::Content.create(content, params)
29
+ @objects << Nanoc::Int::Item.new(content, attributes, identifier)
26
30
  self
27
31
  end
28
32
  end
@@ -1,12 +1,5 @@
1
1
  module Nanoc
2
2
  class MutableLayoutView < Nanoc::LayoutView
3
- # Sets the value for the given attribute.
4
- #
5
- # @param [Symbol] key
6
- #
7
- # @see Hash#[]=
8
- def []=(key, value)
9
- unwrap[key] = value
10
- end
3
+ include Nanoc::MutableDocumentViewMixin
11
4
  end
12
5
  end
@@ -65,8 +65,7 @@ module Nanoc::CLI::Commands
65
65
  require 'tempfile'
66
66
  setup_diffs
67
67
  old_contents = {}
68
- Nanoc::Int::NotificationCenter.on(:will_write_rep) do |rep, snapshot|
69
- path = rep.raw_path(snapshot: snapshot)
68
+ Nanoc::Int::NotificationCenter.on(:will_write_rep) do |rep, path|
70
69
  old_contents[rep] = File.file?(path) ? File.read(path) : nil
71
70
  end
72
71
  Nanoc::Int::NotificationCenter.on(:rep_written) do |rep, path, _is_created, _is_modified|