nanoc 3.6.9 → 3.6.10

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +15 -8
  3. data/Gemfile.lock +27 -14
  4. data/NEWS.md +14 -0
  5. data/lib/nanoc/base.rb +2 -0
  6. data/lib/nanoc/base/checksummer.rb +82 -0
  7. data/lib/nanoc/base/compilation/compiler.rb +4 -3
  8. data/lib/nanoc/base/compilation/filter.rb +3 -10
  9. data/lib/nanoc/base/compilation/rules_collection.rb +6 -1
  10. data/lib/nanoc/base/core_ext/array.rb +1 -1
  11. data/lib/nanoc/base/core_ext/hash.rb +1 -2
  12. data/lib/nanoc/base/core_ext/pathname.rb +1 -2
  13. data/lib/nanoc/base/core_ext/string.rb +1 -3
  14. data/lib/nanoc/base/errors.rb +9 -0
  15. data/lib/nanoc/base/result_data/item_rep.rb +2 -7
  16. data/lib/nanoc/base/source_data/code_snippet.rb +1 -1
  17. data/lib/nanoc/base/source_data/item.rb +1 -16
  18. data/lib/nanoc/base/source_data/layout.rb +1 -3
  19. data/lib/nanoc/base/source_data/site.rb +14 -0
  20. data/lib/nanoc/base/temp_filename_factory.rb +53 -0
  21. data/lib/nanoc/cli/commands/compile.rb +6 -2
  22. data/lib/nanoc/cli/commands/create-site.rb +3 -0
  23. data/lib/nanoc/cli/error_handler.rb +9 -5
  24. data/lib/nanoc/extra.rb +9 -8
  25. data/lib/nanoc/extra/jruby_nokogiri_warner.rb +48 -0
  26. data/lib/nanoc/extra/link_collector.rb +2 -0
  27. data/lib/nanoc/extra/piper.rb +1 -1
  28. data/lib/nanoc/filters/colorize_syntax.rb +2 -0
  29. data/lib/nanoc/filters/pandoc.rb +2 -2
  30. data/lib/nanoc/filters/relativize_paths.rb +2 -0
  31. data/lib/nanoc/filters/xsl.rb +2 -0
  32. data/lib/nanoc/version.rb +1 -1
  33. data/tasks/rubocop.rake +7 -3
  34. data/test/base/checksummer_spec.rb +274 -0
  35. data/test/base/core_ext/array_spec.rb +2 -2
  36. data/test/base/core_ext/hash_spec.rb +7 -4
  37. data/test/base/core_ext/pathname_spec.rb +6 -6
  38. data/test/base/core_ext/string_spec.rb +2 -2
  39. data/test/base/temp_filename_factory_spec.rb +72 -0
  40. data/test/base/test_site.rb +26 -0
  41. data/test/cli/commands/test_prune.rb +4 -0
  42. data/test/extra/checking/checks/test_css.rb +28 -24
  43. data/test/extra/checking/checks/test_html.rb +28 -24
  44. data/test/extra/test_piper.rb +12 -0
  45. data/test/filters/test_colorize_syntax.rb +6 -6
  46. data/test/filters/test_erb.rb +4 -0
  47. data/test/filters/test_pandoc.rb +15 -0
  48. data/test/filters/test_relativize_paths.rb +27 -65
  49. data/test/filters/test_xsl.rb +7 -35
  50. data/test/fixtures/vcr_cassettes/css_run_error.yml +65 -0
  51. data/test/fixtures/vcr_cassettes/css_run_ok.yml +55 -0
  52. data/test/fixtures/vcr_cassettes/html_run_error.yml +94 -0
  53. data/test/fixtures/vcr_cassettes/html_run_ok.yml +56 -0
  54. data/test/helper.rb +19 -9
  55. metadata +11 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e57a92e04d4e25dba882d2e0953820b5ea5cc713
4
- data.tar.gz: 9046eec0428c852a64c41199cdb3582c828a9420
3
+ metadata.gz: 606b38f2b3f74c3c2b091322bf96d0e31838d9be
4
+ data.tar.gz: 004240ce9c783bd2a7edcb3a3ea28f4bb4f719bf
5
5
  SHA512:
6
- metadata.gz: d81d19a33e83db6c091062d3df87e9f2393f8363049f255ee8fd08c51b5835f204aeb03bb2bfec71d9c97649313196415af378860b3fadfbbb0524fc0c9a0328
7
- data.tar.gz: 49b337ebf2aaf1a1fb745a82ff3d0af62a87d074620b89b2b5017e8b679e42825cb8d5aa32d4a7ebf2b496b2e9126a25d8d88b34f345e830b871be1737f9fcc8
6
+ metadata.gz: 83ba1d9e5c6490a7354731241929bf372268b0ecfd33cde43cc7255e6cbe95174cabd85ea4683e4e84e8eb659efba791eca1328daa0f15976ac38ff53be8b95a
7
+ data.tar.gz: 74130a78b27dbd7b23b59e97232f1568161894343c1546fd1af6c54a68db8ef8ae23a618708c98bb5d2bd81ceaa523c2b2e81fbc0728532a67eec83216a4aa39
data/Gemfile CHANGED
@@ -2,6 +2,11 @@ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
+ # FIXME we may be missing some mswin dependencies here
6
+ all_rubies = Bundler::Dependency::PLATFORM_MAP.keys
7
+ ruby_19_plus = [:ruby_19, :ruby_20, :ruby_21, :jruby] & all_rubies
8
+ ruby_19_plus_without_jruby = [:ruby_19, :ruby_20, :ruby_21] & all_rubies
9
+
5
10
  gem 'adsf'
6
11
  gem 'bluecloth', :platforms => :ruby
7
12
  gem 'builder'
@@ -9,19 +14,19 @@ gem 'coderay'
9
14
  gem 'compass'
10
15
  gem 'coffee-script'
11
16
  gem 'erubis'
12
- gem 'fog'
17
+ gem 'fog', :platforms => ruby_19_plus
13
18
  gem 'haml'
14
- gem 'handlebars', :platforms => :ruby
19
+ gem 'handlebars', :platforms => ruby_19_plus_without_jruby
15
20
  gem 'kramdown'
16
21
  gem 'less', '~> 2.0', :platforms => :ruby
17
- gem 'listen'
22
+ gem 'listen', :platforms => ruby_19_plus
18
23
  gem 'markaby'
19
24
  gem 'maruku'
20
- gem 'mime-types'
25
+ gem 'mime-types', :platforms => ruby_19_plus
21
26
  gem 'minitest', '~> 4.0'
22
27
  gem 'mocha'
23
28
  gem 'mustache'
24
- gem 'nokogiri', '~> 1.5.5'
29
+ gem 'nokogiri', '~> 1.6'
25
30
  gem 'pandoc-ruby'
26
31
  gem 'pry'
27
32
  gem 'pygments.rb', :platforms => [:ruby, :mswin]
@@ -30,14 +35,16 @@ gem 'rake'
30
35
  gem 'rainpress'
31
36
  gem 'rdiscount', :platforms => [:ruby, :mswin]
32
37
  gem 'rdoc'
33
- gem 'redcarpet', :platforms => [:ruby, :mswin]
38
+ gem 'redcarpet', :platforms => ruby_19_plus_without_jruby + [:mswin]
34
39
  gem 'RedCloth'
35
- gem 'rubocop'
40
+ gem 'rubocop', :platforms => ruby_19_plus
36
41
  gem 'rubypants'
37
42
  gem 'sass', '~> 3.2.2'
38
43
  gem 'slim'
39
44
  gem 'typogruby'
40
45
  gem 'uglifier'
46
+ gem 'vcr'
41
47
  gem 'w3c_validators'
42
- gem 'yuicompressor'
48
+ gem 'webmock'
49
+ gem 'yuicompressor', :platforms => ruby_19_plus
43
50
  gem 'yard'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nanoc (3.6.9)
4
+ nanoc (3.6.10)
5
5
  cri (~> 2.3)
6
6
 
7
7
  GEM
@@ -9,9 +9,10 @@ GEM
9
9
  specs:
10
10
  RedCloth (4.2.9)
11
11
  RedCloth (4.2.9-java)
12
+ addressable (2.3.6)
12
13
  adsf (1.2.0)
13
14
  rack (>= 1.0.0)
14
- ast (1.1.0)
15
+ ast (2.0.0)
15
16
  bluecloth (2.2.0)
16
17
  builder (3.2.2)
17
18
  celluloid (0.15.2)
@@ -27,18 +28,20 @@ GEM
27
28
  coffee-script-source (1.7.0)
28
29
  colored (1.2)
29
30
  commonjs (0.2.7)
30
- compass (0.12.5)
31
+ compass (0.12.6)
31
32
  chunky_png (~> 1.2)
32
33
  fssm (>= 0.2.7)
33
34
  sass (~> 3.2.19)
35
+ crack (0.4.2)
36
+ safe_yaml (~> 1.0.0)
34
37
  cri (2.6.0)
35
38
  colored (~> 1.2)
36
39
  erubis (2.7.0)
37
- excon (0.32.1)
40
+ excon (0.33.0)
38
41
  execjs (2.0.2)
39
42
  ffi (1.9.3)
40
43
  ffi (1.9.3-java)
41
- fog (1.21.0)
44
+ fog (1.22.0)
42
45
  fog-brightbox
43
46
  fog-core (~> 1.21, >= 1.21.1)
44
47
  fog-json
@@ -46,10 +49,10 @@ GEM
46
49
  fog-brightbox (0.0.2)
47
50
  fog-core
48
51
  fog-json
49
- fog-core (1.21.1)
52
+ fog-core (1.22.0)
50
53
  builder
51
- excon (~> 0.32)
52
- formatador (~> 0.2.0)
54
+ excon (~> 0.33)
55
+ formatador (~> 0.2)
53
56
  mime-types
54
57
  net-scp (~> 1.1)
55
58
  net-ssh (>= 2.1.3)
@@ -80,6 +83,7 @@ GEM
80
83
  metaclass (0.0.4)
81
84
  method_source (0.8.2)
82
85
  mime-types (2.2)
86
+ mini_portile (0.5.3)
83
87
  minitest (4.7.5)
84
88
  mocha (1.0.0)
85
89
  metaclass (~> 0.0.1)
@@ -90,11 +94,13 @@ GEM
90
94
  net-ssh (2.8.0)
91
95
  nio4r (1.0.0)
92
96
  nio4r (1.0.0-java)
93
- nokogiri (1.5.11)
94
- nokogiri (1.5.11-java)
97
+ nokogiri (1.6.1)
98
+ mini_portile (~> 0.5.0)
99
+ nokogiri (1.6.1-java)
100
+ mini_portile (~> 0.5.0)
95
101
  pandoc-ruby (0.7.5)
96
- parser (2.1.7)
97
- ast (~> 1.1)
102
+ parser (2.1.9)
103
+ ast (>= 1.1, < 3.0)
98
104
  slop (~> 3.4, >= 3.4.5)
99
105
  posix-spawn (0.3.8)
100
106
  powerpack (0.0.9)
@@ -113,7 +119,7 @@ GEM
113
119
  rack (1.5.2)
114
120
  rainbow (2.0.0)
115
121
  rainpress (1.0)
116
- rake (10.2.2)
122
+ rake (10.3.1)
117
123
  rb-fsevent (0.9.4)
118
124
  rb-inotify (0.9.3)
119
125
  ffi (>= 0.5.0)
@@ -130,6 +136,7 @@ GEM
130
136
  ruby-progressbar (~> 1.4)
131
137
  ruby-progressbar (1.4.2)
132
138
  rubypants (0.2.0)
139
+ safe_yaml (1.0.3)
133
140
  sass (3.2.19)
134
141
  slim (2.0.2)
135
142
  temple (~> 0.6.6)
@@ -148,9 +155,13 @@ GEM
148
155
  uglifier (2.5.0)
149
156
  execjs (>= 0.3.0)
150
157
  json (>= 1.8.0)
158
+ vcr (2.9.0)
151
159
  w3c_validators (1.2)
152
160
  json
153
161
  nokogiri
162
+ webmock (1.17.4)
163
+ addressable (>= 2.2.7)
164
+ crack (>= 0.3.2)
154
165
  yajl-ruby (1.1.0)
155
166
  yard (0.8.7.4)
156
167
  yuicompressor (1.3.3)
@@ -182,7 +193,7 @@ DEPENDENCIES
182
193
  mocha
183
194
  mustache
184
195
  nanoc!
185
- nokogiri (~> 1.5.5)
196
+ nokogiri (~> 1.6)
186
197
  pandoc-ruby
187
198
  pry
188
199
  pygments.rb
@@ -198,6 +209,8 @@ DEPENDENCIES
198
209
  slim
199
210
  typogruby
200
211
  uglifier
212
+ vcr
201
213
  w3c_validators
214
+ webmock
202
215
  yard
203
216
  yuicompressor
data/NEWS.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # nanoc news
2
2
 
3
+ ## 3.6.10 (???)
4
+
5
+ Fixes:
6
+
7
+ * Fixed occasional "no such file" error on JRuby (#422)
8
+ * Prevented multiple items and layouts from having the same identifier (#434, #435)
9
+
10
+ Enhancements:
11
+
12
+ * Set default encoding to UTF-8 (#428)
13
+ * Improved checksummer to reduce number of unnecessary recompiles (#310, #431)
14
+ * Disabled USR1 on JRuby in order to suppress warning (#425, #426)
15
+ * Made pandoc filter argument passing more generic (#210, #433)
16
+
3
17
  ## 3.6.9 (2014-04-15)
4
18
 
5
19
  Fixes:
data/lib/nanoc/base.rb CHANGED
@@ -7,12 +7,14 @@ module Nanoc
7
7
 
8
8
  # Load helper classes
9
9
  autoload 'Context', 'nanoc/base/context'
10
+ autoload 'Checksummer', 'nanoc/base/checksummer'
10
11
  autoload 'DirectedGraph', 'nanoc/base/directed_graph'
11
12
  autoload 'Errors', 'nanoc/base/errors'
12
13
  autoload 'Memoization', 'nanoc/base/memoization'
13
14
  autoload 'NotificationCenter', 'nanoc/base/notification_center'
14
15
  autoload 'PluginRegistry', 'nanoc/base/plugin_registry'
15
16
  autoload 'Store', 'nanoc/base/store'
17
+ autoload 'TempFilenameFactory', 'nanoc/base/temp_filename_factory'
16
18
 
17
19
  # Load source data classes
18
20
  autoload 'CodeSnippet', 'nanoc/base/source_data/code_snippet'
@@ -0,0 +1,82 @@
1
+ # encoding: utf-8
2
+
3
+ module Nanoc
4
+
5
+ # Creates checksums for given objects.
6
+ #
7
+ # A checksum is a string, such as “mL+TaqNsEeiPkWloPgCtAofT1yg=”, that is used
8
+ # to determine whether a piece of data has changed.
9
+ class Checksummer
10
+
11
+ class << self
12
+
13
+ # @param obj The object to create a checksum for
14
+ #
15
+ # @return [String] The digest
16
+ def calc(obj)
17
+ digest = Digest::SHA1.new
18
+ update(obj, digest)
19
+ digest.base64digest
20
+ end
21
+
22
+ private
23
+
24
+ def update(obj, digest)
25
+ digest.update(obj.class.to_s)
26
+
27
+ case obj
28
+ when String
29
+ digest.update(obj)
30
+ when Array
31
+ obj.each do |el|
32
+ digest.update('elem')
33
+ update(el, digest)
34
+ end
35
+ when Hash
36
+ obj.each do |key, value|
37
+ digest.update('key')
38
+ update(key, digest)
39
+ digest.update('value')
40
+ update(value, digest)
41
+ end
42
+ when Pathname
43
+ filename = obj.to_s
44
+ if File.exist?(filename)
45
+ stat = File.stat(filename)
46
+ digest.update(stat.size.to_s + '-' + stat.mtime.utc.to_s)
47
+ else
48
+ digest.update('???')
49
+ end
50
+ when Nanoc::RulesCollection
51
+ update(obj.data, digest)
52
+ when Nanoc::CodeSnippet
53
+ update(obj.data, digest)
54
+ when Nanoc::Item, Nanoc::Layout
55
+ digest.update('content')
56
+ if obj.respond_to?(:binary?) && obj.binary?
57
+ update(Pathname.new(obj.raw_filename), digest)
58
+ else
59
+ update(obj.raw_content, digest)
60
+ end
61
+
62
+ digest.update('attributes')
63
+ attributes = obj.attributes.dup
64
+ attributes.delete(:file)
65
+ update(attributes, digest)
66
+ else
67
+ data = begin
68
+ Marshal.dump(obj)
69
+ rescue
70
+ obj.inspect
71
+ end
72
+
73
+ digest.update(data)
74
+ end
75
+
76
+ end
77
+
78
+ end
79
+
80
+ end
81
+
82
+ end
@@ -90,9 +90,10 @@ module Nanoc
90
90
  dependency_tracker.stop
91
91
  store
92
92
  ensure
93
- # Cleanup
94
- FileUtils.rm_rf(Nanoc::Filter::TMP_BINARY_ITEMS_DIR)
95
- FileUtils.rm_rf(Nanoc::ItemRep::TMP_TEXT_ITEMS_DIR)
93
+ Nanoc::TempFilenameFactory.instance.cleanup(
94
+ Nanoc::Filter::TMP_BINARY_ITEMS_DIR)
95
+ Nanoc::TempFilenameFactory.instance.cleanup(
96
+ Nanoc::ItemRep::TMP_TEXT_ITEMS_DIR)
96
97
  end
97
98
 
98
99
  # @group Private instance methods
@@ -28,8 +28,7 @@ module Nanoc
28
28
  # @abstract Subclass and override {#run} to implement a custom filter.
29
29
  class Filter < Context
30
30
 
31
- # The path to the directory where temporary binary items are stored
32
- TMP_BINARY_ITEMS_DIR = 'tmp/binary_items'
31
+ TMP_BINARY_ITEMS_DIR = 'binary_items'
33
32
 
34
33
  # A hash containing variables that will be made available during
35
34
  # filtering.
@@ -149,14 +148,8 @@ module Nanoc
149
148
  #
150
149
  # @return [String] The output filename
151
150
  def output_filename
152
- @output_filename ||= begin
153
- FileUtils.mkdir_p(TMP_BINARY_ITEMS_DIR)
154
- tempfile = Tempfile.new('', TMP_BINARY_ITEMS_DIR)
155
- new_filename = tempfile.path
156
- tempfile.close!
157
-
158
- File.expand_path(new_filename)
159
- end
151
+ @output_filename ||=
152
+ Nanoc::TempFilenameFactory.instance.create(TMP_BINARY_ITEMS_DIR)
160
153
  end
161
154
 
162
155
  # Returns the filename associated with the item that is being filtered.
@@ -7,6 +7,11 @@ module Nanoc
7
7
  # @api private
8
8
  class RulesCollection
9
9
 
10
+ # @return [String] the contents of the Rules file
11
+ #
12
+ # @api private
13
+ attr_accessor :data
14
+
10
15
  extend Nanoc::Memoization
11
16
 
12
17
  # @return [Array<Nanoc::Rule>] The list of item compilation rules that
@@ -161,7 +166,7 @@ module Nanoc
161
166
  # @return [String] The checksum for this object. If its contents change,
162
167
  # the checksum will change as well.
163
168
  def checksum
164
- @data.checksum
169
+ Nanoc::Checksummer.calc(self)
165
170
  end
166
171
 
167
172
  def inspect
@@ -64,7 +64,7 @@ module Nanoc::ArrayExtensions
64
64
  #
65
65
  # @api private
66
66
  def checksum
67
- Marshal.dump(self).checksum
67
+ Nanoc::Checksummer.calc(self)
68
68
  end
69
69
 
70
70
  end
@@ -66,8 +66,7 @@ module Nanoc::HashExtensions
66
66
  #
67
67
  # @api private
68
68
  def checksum
69
- array = to_a.sort_by { |kv| kv[0].to_s }
70
- array.checksum
69
+ Nanoc::Checksummer.calc(self)
71
70
  end
72
71
 
73
72
  end
@@ -9,8 +9,7 @@ module Nanoc::PathnameExtensions
9
9
  #
10
10
  # @api private
11
11
  def checksum
12
- stat = File.stat(to_s)
13
- stat.size.to_s + '-' + stat.mtime.to_s
12
+ Nanoc::Checksummer.calc(self)
14
13
  end
15
14
 
16
15
  end
@@ -16,9 +16,7 @@ module Nanoc::StringExtensions
16
16
  #
17
17
  # @api private
18
18
  def checksum
19
- digest = Digest::SHA1.new
20
- digest.update(self)
21
- digest.hexdigest
19
+ Nanoc::Checksummer.calc(self)
22
20
  end
23
21
 
24
22
  end
@@ -221,6 +221,15 @@ module Nanoc
221
221
 
222
222
  end
223
223
 
224
+ # Error that is raised when multiple items or layouts with the same identifier exist.
225
+ class DuplicateIdentifier < Generic
226
+
227
+ def initialize(identifier, type)
228
+ super("There are multiple #{type}s with the #{identifier} identifier.")
229
+ end
230
+
231
+ end
232
+
224
233
  end
225
234
 
226
235
  end
@@ -149,15 +149,10 @@ module Nanoc
149
149
  Nanoc::NotificationCenter.post(:rep_written, self, raw_path, is_created, is_modified)
150
150
  end
151
151
 
152
- TMP_TEXT_ITEMS_DIR = 'tmp/text_items'
152
+ TMP_TEXT_ITEMS_DIR = 'text_items'
153
153
 
154
154
  def temp_filename
155
- FileUtils.mkdir_p(TMP_TEXT_ITEMS_DIR)
156
- tempfile = Tempfile.new('', TMP_TEXT_ITEMS_DIR)
157
- new_filename = tempfile.path
158
- tempfile.close!
159
-
160
- File.expand_path(new_filename)
155
+ Nanoc::TempFilenameFactory.instance.create(TMP_TEXT_ITEMS_DIR)
161
156
  end
162
157
 
163
158
  # Resets the compilation progress for this item representation. This is