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
@@ -50,7 +50,7 @@ module Nanoc
50
50
  # @return [String] The checksum for this object. If its contents change,
51
51
  # the checksum will change as well.
52
52
  def checksum
53
- @data.checksum
53
+ Nanoc::Checksummer.calc(self)
54
54
  end
55
55
 
56
56
  end
@@ -247,22 +247,7 @@ module Nanoc
247
247
  # @return [String] The checksum for this object. If its contents change,
248
248
  # the checksum will change as well.
249
249
  def checksum
250
- content_checksum =
251
- if binary?
252
- if File.exist?(raw_filename)
253
- Pathname.new(raw_filename).checksum
254
- else
255
- ''.checksum
256
- end
257
- else
258
- @raw_content.checksum
259
- end
260
-
261
- attributes = @attributes.dup
262
- attributes.delete(:file)
263
- attributes_checksum = attributes.checksum
264
-
265
- content_checksum + ',' + attributes_checksum
250
+ Nanoc::Checksummer.calc(self)
266
251
  end
267
252
  memoize :checksum
268
253
 
@@ -88,9 +88,7 @@ module Nanoc
88
88
  # @return [String] The checksum for this object. If its contents change,
89
89
  # the checksum will change as well.
90
90
  def checksum
91
- attributes = @attributes.dup
92
- attributes.delete(:file)
93
- @raw_content.checksum + ',' + attributes.checksum
91
+ Nanoc::Checksummer.calc(self)
94
92
  end
95
93
  memoize :checksum
96
94
 
@@ -245,6 +245,10 @@ module Nanoc
245
245
  data_sources.each { |ds| ds.unuse }
246
246
  setup_child_parent_links
247
247
 
248
+ # Ensure unique
249
+ ensure_identifier_uniqueness(@items, 'item')
250
+ ensure_identifier_uniqueness(@layouts, 'layout')
251
+
248
252
  # Load compiler too
249
253
  # FIXME this should not be necessary
250
254
  compiler.load
@@ -346,6 +350,16 @@ module Nanoc
346
350
  end
347
351
  end
348
352
 
353
+ def ensure_identifier_uniqueness(objects, type)
354
+ seen = Set.new
355
+ objects.each do |obj|
356
+ if seen.include?(obj.identifier)
357
+ raise Nanoc::Errors::DuplicateIdentifier.new(obj.identifier, type)
358
+ end
359
+ seen << obj.identifier
360
+ end
361
+ end
362
+
349
363
  # Builds the configuration hash based on the given argument. Also see
350
364
  # {#initialize} for details.
351
365
  def build_config(dir_or_config_hash)
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+
3
+ require 'tmpdir'
4
+
5
+ module Nanoc
6
+
7
+ class TempFilenameFactory
8
+
9
+ # @return [String] The root directory for all temporary filenames
10
+ attr_reader :root_dir
11
+
12
+ # @return [Nanoc::TempFilenameFactory] A common instance
13
+ def self.instance
14
+ @instance ||= new
15
+ end
16
+
17
+ def initialize
18
+ @counts = {}
19
+ @root_dir = Dir.mktmpdir('nanoc')
20
+ end
21
+
22
+ # @param [String] prefix A string prefix to include in the temporary
23
+ # filename, often the type of filename being provided.
24
+ #
25
+ # @return [String] A new unused filename
26
+ def create(prefix)
27
+ count = @counts.fetch(prefix, 0)
28
+ @counts[prefix] = count + 1
29
+
30
+ dirname = File.join(@root_dir, prefix)
31
+ filename = File.join(@root_dir, prefix, count.to_s)
32
+
33
+ FileUtils.mkdir_p(dirname)
34
+
35
+ filename
36
+ end
37
+
38
+ # @param [String] prefix A string prefix that indicates which temporary
39
+ # filenames should be deleted.
40
+ #
41
+ # @return [void]
42
+ def cleanup(prefix)
43
+ path = File.join(@root_dir, prefix)
44
+ if File.exist?(path)
45
+ FileUtils.remove_entry_secure(path)
46
+ end
47
+
48
+ @counts.delete(prefix)
49
+ end
50
+
51
+ end
52
+
53
+ end
@@ -233,21 +233,25 @@ module Nanoc::CLI::Commands
233
233
 
234
234
  def durations_per_filter
235
235
  @_durations_per_filter ||= begin
236
- @times.keys.each_with_object({}) do |filter_name, result|
236
+ result = {}
237
+ @times.keys.each do |filter_name|
237
238
  durations = durations_for_filter(filter_name)
238
239
  if durations
239
240
  result[filter_name] = durations
240
241
  end
241
242
  end
243
+ result
242
244
  end
243
245
  end
244
246
 
245
247
  def durations_for_filter(filter_name)
246
- @times[filter_name].each_with_object([]) do |sample, result|
248
+ result = []
249
+ @times[filter_name].each do |sample|
247
250
  if sample[:start] && sample[:stop]
248
251
  result << sample[:stop] - sample[:start]
249
252
  end
250
253
  end
254
+ result
251
255
  end
252
256
 
253
257
  end
@@ -84,6 +84,9 @@ data_sources:
84
84
  # will have the identifier “/about/” when turned off, but when turned on
85
85
  # it will become “/about.html/” instead.
86
86
  allow_periods_in_identifiers: false
87
+
88
+ # The default encoding for all files in `content/` and `layouts/`.
89
+ encoding: utf-8
87
90
  EOS
88
91
 
89
92
  DEFAULT_RULES = <<EOS unless defined? DEFAULT_RULES
@@ -58,12 +58,16 @@ module Nanoc::CLI
58
58
  exit!(0)
59
59
  end
60
60
  end
61
- begin
62
- Signal.trap('USR1') do
63
- puts 'Caught USR1; dumping a stack trace'
64
- puts caller.map { |i| " #{i}" }.join("\n")
61
+
62
+ # Set stack trace dump handler
63
+ if !defined?(RUBY_ENGINE) || RUBY_ENGINE != 'jruby'
64
+ begin
65
+ Signal.trap('USR1') do
66
+ puts 'Caught USR1; dumping a stack trace'
67
+ puts caller.map { |i| " #{i}" }.join("\n")
68
+ end
69
+ rescue ArgumentError
65
70
  end
66
- rescue ArgumentError
67
71
  end
68
72
 
69
73
  # Run
data/lib/nanoc/extra.rb CHANGED
@@ -2,14 +2,15 @@
2
2
 
3
3
  module Nanoc::Extra
4
4
 
5
- autoload 'AutoCompiler', 'nanoc/extra/auto_compiler'
6
- autoload 'Checking', 'nanoc/extra/checking'
7
- autoload 'CHiCk', 'nanoc/extra/chick'
8
- autoload 'FilesystemTools', 'nanoc/extra/filesystem_tools'
9
- autoload 'LinkCollector', 'nanoc/extra/link_collector.rb'
10
- autoload 'Pruner', 'nanoc/extra/pruner'
11
- autoload 'Validators', 'nanoc/extra/validators'
12
- autoload 'Piper', 'nanoc/extra/piper'
5
+ autoload 'AutoCompiler', 'nanoc/extra/auto_compiler'
6
+ autoload 'Checking', 'nanoc/extra/checking'
7
+ autoload 'CHiCk', 'nanoc/extra/chick'
8
+ autoload 'FilesystemTools', 'nanoc/extra/filesystem_tools'
9
+ autoload 'LinkCollector', 'nanoc/extra/link_collector.rb'
10
+ autoload 'Pruner', 'nanoc/extra/pruner'
11
+ autoload 'Validators', 'nanoc/extra/validators'
12
+ autoload 'Piper', 'nanoc/extra/piper'
13
+ autoload 'JRubyNokogiriWarner', 'nanoc/extra/jruby_nokogiri_warner'
13
14
 
14
15
  # Deprecated; use {Nanoc::Context} instead
15
16
  # TODO [in nanoc 4.0] remove me
@@ -0,0 +1,48 @@
1
+ # encoding: utf-8
2
+
3
+ require 'singleton'
4
+
5
+ module Nanoc::Extra
6
+
7
+ class JRubyNokogiriWarner
8
+
9
+ include Singleton
10
+
11
+ TEXT = <<EOS
12
+ --------------------------------------------------------------------------------
13
+ Note:
14
+
15
+ The behavior of Pure Java Nokogiri differs from the Nokogiri used on the
16
+ standard Ruby interpreter (MRI) due to differences in underlying libraries.
17
+
18
+ These sometimes problematic behavioral differences can cause nanoc filters not
19
+ to function properly, if at all. If you need reliable (X)HTML and XML handling
20
+ functionality, consider not using Nokogiri on JRuby for the time being.
21
+
22
+ These issues are being worked on both from the Nokogiri and the nanoc side. Keep
23
+ your Nokogiri and nanoc versions up to date!
24
+
25
+ For details, see https://github.com/nanoc/nanoc/pull/422.
26
+ --------------------------------------------------------------------------------
27
+ EOS
28
+
29
+ def self.check_and_warn
30
+ instance.check_and_warn
31
+ end
32
+
33
+ def initialize
34
+ @warned = false
35
+ end
36
+
37
+ def check_and_warn
38
+ return if !defined?(RUBY_ENGINE)
39
+ return if RUBY_ENGINE != 'jruby'
40
+ return if @warned
41
+
42
+ $stderr.puts TEXT
43
+ @warned = true
44
+ end
45
+
46
+ end
47
+
48
+ end
@@ -7,6 +7,8 @@ module ::Nanoc::Extra
7
7
  class LinkCollector
8
8
 
9
9
  def initialize(filenames, mode = nil)
10
+ Nanoc::Extra::JRubyNokogiriWarner.check_and_warn
11
+
10
12
  @filenames = filenames
11
13
  @filter =
12
14
  case mode
@@ -44,7 +44,7 @@ module Nanoc::Extra
44
44
 
45
45
  exit_status = wait_thr.value
46
46
  if !exit_status.success?
47
- raise Error.new(exit_status.to_i, cmd)
47
+ raise Error.new(cmd, exit_status.to_i)
48
48
  end
49
49
  end
50
50
  end
@@ -83,6 +83,8 @@ module Nanoc::Filters
83
83
  #
84
84
  # @return [String] The filtered content
85
85
  def run(content, params = {})
86
+ Nanoc::Extra::JRubyNokogiriWarner.check_and_warn
87
+
86
88
  # Take colorizers from parameters
87
89
  @colorizers = Hash.new(params[:default_colorizer] || DEFAULT_COLORIZER)
88
90
  (params[:colorizers] || {}).each_pair do |language, colorizer|
@@ -12,8 +12,8 @@ module Nanoc::Filters
12
12
  # @param [String] content The content to filter
13
13
  #
14
14
  # @return [String] The filtered content
15
- def run(content, params = {})
16
- PandocRuby.convert(content, params)
15
+ def run(content, *params)
16
+ PandocRuby.convert(content, *params)
17
17
  end
18
18
 
19
19
  end
@@ -29,6 +29,8 @@ module Nanoc::Filters
29
29
  #
30
30
  # @return [String] The filtered content
31
31
  def run(content, params = {})
32
+ Nanoc::Extra::JRubyNokogiriWarner.check_and_warn
33
+
32
34
  # Set assigns so helper function can be used
33
35
  @item_rep = assigns[:item_rep] if @item_rep.nil?
34
36
 
@@ -34,6 +34,8 @@ module Nanoc::Filters
34
34
  #
35
35
  # @return [String] The transformed content
36
36
  def run(content, params = {})
37
+ Nanoc::Extra::JRubyNokogiriWarner.check_and_warn
38
+
37
39
  if assigns[:layout].nil?
38
40
  raise 'The XSL filter can only be run as a layout'
39
41
  end
data/lib/nanoc/version.rb CHANGED
@@ -3,6 +3,6 @@
3
3
  module Nanoc
4
4
 
5
5
  # The current nanoc version.
6
- VERSION = '3.6.9'
6
+ VERSION = '3.6.10'
7
7
 
8
8
  end
data/tasks/rubocop.rake CHANGED
@@ -1,5 +1,9 @@
1
- require 'rubocop/rake_task'
1
+ begin
2
+ require 'rubocop/rake_task'
2
3
 
3
- Rubocop::RakeTask.new(:rubocop) do |task|
4
- task.patterns = ['lib/**/*.rb']
4
+ Rubocop::RakeTask.new(:rubocop) do |task|
5
+ task.patterns = ['lib/**/*.rb']
6
+ end
7
+ rescue LoadError
8
+ warn "Could not load Rubocop. Rubocop rake tasks will be unavailable."
5
9
  end
@@ -0,0 +1,274 @@
1
+ # encoding: utf-8
2
+
3
+ require 'tempfile'
4
+
5
+ describe Nanoc::Checksummer do
6
+
7
+ subject { Nanoc::Checksummer }
8
+
9
+ CHECKSUM_REGEX = /\A[0-9a-zA-Z\/+]+=*\Z/
10
+
11
+ describe 'for String' do
12
+
13
+ it 'should checksum strings' do
14
+ subject.calc('foo').must_equal('+5k/BWvkYc6T1qhGaSyf3861CyE=')
15
+ end
16
+
17
+ end
18
+
19
+ describe 'for Array' do
20
+
21
+ it 'should checksum arrays' do
22
+ subject.calc([1, 'a', :a]).must_equal 'YtWOEFUAMQritkY38KXHFZM/n2E='
23
+ end
24
+
25
+ it 'should take order into account when checksumming arrays' do
26
+ subject.calc([:a, 'a', 1]).wont_equal(subject.calc([1, 'a', :a]))
27
+ end
28
+
29
+ it 'should checksum non-serializable arrays' do
30
+ subject.calc([-> {}]).must_match(CHECKSUM_REGEX)
31
+ end
32
+
33
+ end
34
+
35
+ describe 'for Hash' do
36
+
37
+ it 'should checksum hashes' do
38
+ subject.calc({ a: 1, b: 2 }).must_equal 'qY8fW6gWK7F1XQ9MLrx3Gru/RTY='
39
+ end
40
+
41
+ it 'should take order into account when checksumming hashes' do
42
+ subject.calc({ a: 1, b: 2 }).wont_equal(subject.calc({ b: 2, a: 1 }))
43
+ end
44
+
45
+ it 'should checksum non-serializable hashes' do
46
+ subject.calc({ a: ->{} }).must_match(CHECKSUM_REGEX)
47
+ end
48
+
49
+ end
50
+
51
+ describe 'for Pathname' do
52
+
53
+ let(:file) { Tempfile.new('foo') }
54
+ let(:filename) { file.path }
55
+ let(:pathname) { Pathname.new(filename) }
56
+ let(:atime) { 1234567890 }
57
+ let(:mtime) { 1234567890 }
58
+ let(:data) { 'stuffs' }
59
+ let(:normal_checksum) { 'THy7Y28oroov/KvPxT6wcMnXr/s=' }
60
+
61
+ before do
62
+ file.write(data)
63
+ file.close
64
+ File.utime(atime, mtime, filename)
65
+ end
66
+
67
+ after do
68
+ file.unlink
69
+ end
70
+
71
+ describe 'does not exist' do
72
+
73
+ let(:non_existing_filename) { 'askldjfklaslasdfkjsajdf' }
74
+ let(:pathname) { Pathname.new(filename) }
75
+
76
+ it 'should still checksum' do
77
+ subject.calc(pathname).must_equal(normal_checksum)
78
+ end
79
+
80
+ end
81
+
82
+ it 'should get the mtime right' do
83
+ stat = File.stat(filename)
84
+ stat.mtime.to_i.must_equal(mtime)
85
+ end
86
+
87
+ it 'should get the file size right' do
88
+ stat = File.stat(filename)
89
+ stat.size.must_equal(6)
90
+ end
91
+
92
+ it 'should checksum binary content' do
93
+ subject.calc(pathname).must_equal(normal_checksum)
94
+ end
95
+
96
+ describe 'if the mtime changes' do
97
+
98
+ let(:mtime) { 1333333333 }
99
+
100
+ it 'should have a different checksum' do
101
+ subject.calc(pathname).must_match(CHECKSUM_REGEX)
102
+ subject.calc(pathname).wont_equal(normal_checksum)
103
+ end
104
+
105
+ end
106
+
107
+ describe 'if the content changes, but not the file size' do
108
+
109
+ let(:data) { 'STUFF!' }
110
+
111
+ it 'should have the same checksum' do
112
+ subject.calc(pathname).must_equal(normal_checksum)
113
+ end
114
+
115
+ end
116
+
117
+ describe 'if the file size changes' do
118
+
119
+ let(:data) { 'stuff and stuff and stuff!!!' }
120
+
121
+ it 'should have a different checksum' do
122
+ subject.calc(pathname).must_match(CHECKSUM_REGEX)
123
+ subject.calc(pathname).wont_equal(normal_checksum)
124
+ end
125
+
126
+ end
127
+
128
+ end
129
+
130
+ it 'should not have the same checksum for same content but different class'
131
+
132
+ describe 'for Nanoc::RulesCollection' do
133
+
134
+ let(:data) { 'STUFF!' }
135
+ let(:normal_checksum) { 'r4SwDpCp5saBPeZk2gQOJcipTZU=' }
136
+
137
+ let(:rules_collection) do
138
+ coll = Nanoc::RulesCollection.new(nil)
139
+ coll.data = data
140
+ coll
141
+ end
142
+
143
+ it 'should calculate' do
144
+ subject.calc(rules_collection).must_equal(normal_checksum)
145
+ end
146
+
147
+ describe 'if the content changes' do
148
+
149
+ let(:data) { 'Other stuff!' }
150
+
151
+ it 'should have a different checksum' do
152
+ subject.calc(rules_collection).must_match(CHECKSUM_REGEX)
153
+ subject.calc(rules_collection).wont_equal(normal_checksum)
154
+ end
155
+
156
+ end
157
+
158
+ end
159
+
160
+ describe 'for Nanoc::CodeSnippet' do
161
+
162
+ let(:data) { 'asdf' }
163
+ let(:filename) { File.expand_path('bob.txt') }
164
+ let(:code_snippet) { Nanoc::CodeSnippet.new(data, filename) }
165
+ let(:normal_checksum) { 'ZSo56CFoBcNgiDsWOfLLquH2sF0=' }
166
+
167
+ it 'should checksum the data' do
168
+ subject.calc(code_snippet).must_equal(normal_checksum)
169
+ end
170
+
171
+ describe 'if the filename changes' do
172
+
173
+ let(:filename) { File.expand_path('george.txt') }
174
+
175
+ it 'should have the same checksum' do
176
+ subject.calc(code_snippet).must_equal(normal_checksum)
177
+ end
178
+
179
+ end
180
+
181
+ describe 'if the content changes' do
182
+
183
+ let(:data) { 'Other stuff!' }
184
+
185
+ it 'should have a different checksum' do
186
+ subject.calc(code_snippet).must_match(CHECKSUM_REGEX)
187
+ subject.calc(code_snippet).wont_equal(normal_checksum)
188
+ end
189
+
190
+ end
191
+
192
+ end
193
+
194
+ describe 'for Nanoc::Configuration' do
195
+
196
+ let(:wrapped) { { a: 1, b: 2 } }
197
+ let(:configuration) { Nanoc::Configuration.new(wrapped) }
198
+ let(:normal_checksum) { 'eYYQ74x29njbtXMtuKZX/ogD8JA=' }
199
+
200
+ it 'should checksum the hash' do
201
+ subject.calc(configuration).must_equal('eYYQ74x29njbtXMtuKZX/ogD8JA=')
202
+ end
203
+
204
+ describe 'if the content changes' do
205
+
206
+ let(:wrapped) { { a: 666, b: 2 } }
207
+
208
+ it 'should have a different checksum' do
209
+ subject.calc(configuration).must_match(CHECKSUM_REGEX)
210
+ subject.calc(configuration).wont_equal(normal_checksum)
211
+ end
212
+
213
+ end
214
+
215
+ end
216
+
217
+ describe 'for Nanoc::Item' do
218
+
219
+ let(:content) { 'asdf' }
220
+ let(:filename) { File.expand_path('bob.txt') }
221
+ let(:attributes) { { a: 1, b: 2 } }
222
+ let(:identifier) { '/foo/' }
223
+ let(:item) { Nanoc::Item.new(content, attributes, identifier) }
224
+ let(:normal_checksum) { 'eTPdmaG7UAuPzH210HM1JvJaWDo=' }
225
+
226
+ it 'should checksum item' do
227
+ subject.calc(item).must_equal(normal_checksum)
228
+ end
229
+
230
+ describe 'with changed attributes' do
231
+
232
+ let(:attributes) { { x: 4, y: 5 } }
233
+
234
+ it 'should have a different checksum' do
235
+ subject.calc(item).must_match(CHECKSUM_REGEX)
236
+ subject.calc(item).wont_equal(normal_checksum)
237
+ end
238
+
239
+ end
240
+
241
+ describe 'with changed content' do
242
+
243
+ let(:content) { 'something drastically different' }
244
+
245
+ it 'should have a different checksum' do
246
+ subject.calc(item).must_match(CHECKSUM_REGEX)
247
+ subject.calc(item).wont_equal(normal_checksum)
248
+ end
249
+
250
+ end
251
+
252
+ end
253
+
254
+ describe 'for other marshal-able classes' do
255
+
256
+ let(:obj) { :foobar }
257
+
258
+ it 'should checksum' do
259
+ subject.calc(obj).must_match(CHECKSUM_REGEX)
260
+ end
261
+
262
+ end
263
+
264
+ describe 'for other non-marshal-able classes' do
265
+
266
+ let(:obj) { proc {} }
267
+
268
+ it 'should checksum' do
269
+ subject.calc(obj).must_match(CHECKSUM_REGEX)
270
+ end
271
+
272
+ end
273
+
274
+ end