nanoc3 3.2.0a4 → 3.2.0b1

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 (141) hide show
  1. data/NEWS.md +20 -2
  2. data/README.md +7 -3
  3. data/bin/nanoc3 +1 -3
  4. data/lib/nanoc3.rb +1 -13
  5. data/lib/nanoc3/base/compilation/filter.rb +21 -0
  6. data/lib/nanoc3/base/compilation/item_rep_recorder_proxy.rb +1 -3
  7. data/lib/nanoc3/base/compilation/outdatedness_checker.rb +1 -1
  8. data/lib/nanoc3/base/compilation/rule_memory_calculator.rb +0 -2
  9. data/lib/nanoc3/base/compilation/rules_collection.rb +37 -13
  10. data/lib/nanoc3/base/directed_graph.rb +3 -3
  11. data/lib/nanoc3/base/memoization.rb +6 -9
  12. data/lib/nanoc3/base/source_data/code_snippet.rb +2 -1
  13. data/lib/nanoc3/base/source_data/configuration.rb +7 -3
  14. data/lib/nanoc3/base/source_data/item.rb +52 -10
  15. data/lib/nanoc3/base/source_data/layout.rb +28 -1
  16. data/lib/nanoc3/base/source_data/site.rb +14 -3
  17. data/lib/nanoc3/cli.rb +98 -6
  18. data/lib/nanoc3/cli/{base.rb → command.rb} +117 -153
  19. data/lib/nanoc3/cli/commands/autocompile.rb +20 -48
  20. data/lib/nanoc3/cli/commands/compile.rb +32 -48
  21. data/lib/nanoc3/cli/commands/create_item.rb +21 -37
  22. data/lib/nanoc3/cli/commands/create_layout.rb +18 -36
  23. data/lib/nanoc3/cli/commands/create_site.rb +15 -34
  24. data/lib/nanoc3/cli/commands/debug.rb +17 -31
  25. data/lib/nanoc3/cli/commands/info.rb +14 -29
  26. data/lib/nanoc3/cli/commands/nanoc.rb +37 -0
  27. data/lib/nanoc3/cli/commands/update.rb +21 -44
  28. data/lib/nanoc3/cli/commands/view.rb +18 -44
  29. data/lib/nanoc3/cli/commands/watch.rb +16 -31
  30. data/lib/nanoc3/data_sources/filesystem.rb +25 -6
  31. data/lib/nanoc3/data_sources/filesystem_unified.rb +5 -5
  32. data/lib/nanoc3/extra/auto_compiler.rb +1 -0
  33. data/lib/nanoc3/extra/file_proxy.rb +0 -1
  34. data/lib/nanoc3/filters.rb +2 -0
  35. data/lib/nanoc3/filters/asciidoc.rb +16 -36
  36. data/lib/nanoc3/filters/bluecloth.rb +2 -2
  37. data/lib/nanoc3/filters/coderay.rb +2 -2
  38. data/lib/nanoc3/filters/colorize_syntax.rb +18 -5
  39. data/lib/nanoc3/filters/erb.rb +2 -2
  40. data/lib/nanoc3/filters/erubis.rb +2 -2
  41. data/lib/nanoc3/filters/haml.rb +2 -2
  42. data/lib/nanoc3/filters/kramdown.rb +2 -2
  43. data/lib/nanoc3/filters/less.rb +32 -1
  44. data/lib/nanoc3/filters/markaby.rb +2 -2
  45. data/lib/nanoc3/filters/maruku.rb +2 -2
  46. data/lib/nanoc3/filters/mustache.rb +2 -2
  47. data/lib/nanoc3/filters/rainpress.rb +2 -2
  48. data/lib/nanoc3/filters/rdiscount.rb +4 -3
  49. data/lib/nanoc3/filters/rdoc.rb +10 -6
  50. data/lib/nanoc3/filters/redcarpet.rb +2 -2
  51. data/lib/nanoc3/filters/redcloth.rb +2 -2
  52. data/lib/nanoc3/filters/rubypants.rb +2 -2
  53. data/lib/nanoc3/filters/sass.rb +44 -52
  54. data/lib/nanoc3/filters/slim.rb +2 -2
  55. data/lib/nanoc3/filters/typogruby.rb +2 -2
  56. data/lib/nanoc3/filters/uglify_js.rb +42 -0
  57. data/nanoc3.gemspec +1 -1
  58. data/tasks/test.rake +6 -0
  59. data/test/base/core_ext/array_spec.rb +0 -2
  60. data/test/base/core_ext/hash_spec.rb +0 -2
  61. data/test/base/core_ext/pathname_spec.rb +0 -2
  62. data/test/base/core_ext/string_spec.rb +0 -2
  63. data/test/base/test_checksum_store.rb +0 -2
  64. data/test/base/test_code_snippet.rb +0 -2
  65. data/test/base/test_compiler.rb +2 -4
  66. data/test/base/test_compiler_dsl.rb +1 -3
  67. data/test/base/test_context.rb +0 -2
  68. data/test/base/test_data_source.rb +0 -2
  69. data/test/base/test_dependency_tracker.rb +0 -2
  70. data/test/base/test_directed_graph.rb +0 -2
  71. data/test/base/test_filter.rb +0 -2
  72. data/test/base/test_item.rb +19 -4
  73. data/test/base/test_item_rep.rb +0 -2
  74. data/test/base/test_layout.rb +19 -4
  75. data/test/base/test_memoization.rb +39 -2
  76. data/test/base/test_notification_center.rb +0 -2
  77. data/test/base/test_outdatedness_checker.rb +31 -2
  78. data/test/base/test_plugin.rb +0 -2
  79. data/test/base/test_rule.rb +0 -2
  80. data/test/base/test_rule_context.rb +0 -2
  81. data/test/base/test_site.rb +30 -3
  82. data/test/cli/commands/test_compile.rb +24 -3
  83. data/test/cli/commands/test_create_item.rb +5 -3
  84. data/test/cli/commands/test_create_layout.rb +4 -4
  85. data/test/cli/commands/test_create_site.rb +5 -5
  86. data/test/cli/commands/test_help.rb +3 -3
  87. data/test/cli/commands/test_info.rb +2 -3
  88. data/test/cli/commands/test_update.rb +0 -2
  89. data/test/cli/test_cli.rb +40 -0
  90. data/test/cli/test_logger.rb +0 -2
  91. data/test/data_sources/test_filesystem.rb +0 -2
  92. data/test/data_sources/test_filesystem_unified.rb +32 -58
  93. data/test/data_sources/test_filesystem_verbose.rb +0 -2
  94. data/test/extra/core_ext/test_enumerable.rb +0 -2
  95. data/test/extra/core_ext/test_time.rb +0 -2
  96. data/test/extra/deployers/test_rsync.rb +0 -2
  97. data/test/extra/test_auto_compiler.rb +5 -7
  98. data/test/extra/test_file_proxy.rb +0 -2
  99. data/test/extra/test_vcs.rb +0 -2
  100. data/test/extra/validators/test_links.rb +0 -2
  101. data/test/extra/validators/test_w3c.rb +0 -2
  102. data/test/filters/test_asciidoc.rb +0 -2
  103. data/test/filters/test_bluecloth.rb +0 -2
  104. data/test/filters/test_coderay.rb +0 -2
  105. data/test/filters/test_colorize_syntax.rb +49 -2
  106. data/test/filters/test_erb.rb +0 -2
  107. data/test/filters/test_erubis.rb +0 -2
  108. data/test/filters/test_haml.rb +0 -2
  109. data/test/filters/test_kramdown.rb +0 -2
  110. data/test/filters/test_less.rb +59 -5
  111. data/test/filters/test_markaby.rb +0 -2
  112. data/test/filters/test_maruku.rb +0 -2
  113. data/test/filters/test_mustache.rb +0 -2
  114. data/test/filters/test_rainpress.rb +0 -2
  115. data/test/filters/test_rdiscount.rb +0 -2
  116. data/test/filters/test_rdoc.rb +0 -2
  117. data/test/filters/test_redcarpet.rb +0 -2
  118. data/test/filters/test_redcloth.rb +0 -2
  119. data/test/filters/test_relativize_paths.rb +77 -24
  120. data/test/filters/test_rubypants.rb +0 -2
  121. data/test/filters/test_sass.rb +136 -10
  122. data/test/filters/test_slim.rb +0 -2
  123. data/test/filters/test_typogruby.rb +0 -2
  124. data/test/filters/test_uglify_js.rb +30 -0
  125. data/test/gem_loader.rb +11 -0
  126. data/test/helper.rb +3 -0
  127. data/test/helpers/test_blogging.rb +0 -2
  128. data/test/helpers/test_breadcrumbs.rb +0 -2
  129. data/test/helpers/test_capturing.rb +0 -2
  130. data/test/helpers/test_filtering.rb +0 -2
  131. data/test/helpers/test_html_escape.rb +0 -2
  132. data/test/helpers/test_link_to.rb +0 -2
  133. data/test/helpers/test_rendering.rb +0 -2
  134. data/test/helpers/test_tagging.rb +0 -2
  135. data/test/helpers/test_text.rb +0 -2
  136. data/test/helpers/test_xml_sitemap.rb +0 -2
  137. data/test/tasks/test_clean.rb +0 -2
  138. metadata +11 -9
  139. data/lib/nanoc3/cli/commands.rb +0 -16
  140. data/lib/nanoc3/cli/commands/help.rb +0 -71
  141. data/tasks/clean.rake +0 -11
data/NEWS.md CHANGED
@@ -10,18 +10,36 @@ Base:
10
10
  * Added --color option to force color on
11
11
  * Cleaned up internals, deprecating several parts and/or marking them as
12
12
  private in the progress
13
+ * Allowed custom commands in commands/
13
14
 
14
15
  Extensions:
15
16
 
16
17
  * Added AsciiDoc filter
17
18
  * Added Redcarpet filter [Peter Aronoff]
18
- * Added Typogruby filter
19
19
  * Added Slim filter [Zaiste de Grengolada]
20
- * Added :items parameter for the XML site map [Justin Hileman]
20
+ * Added Typogruby filter
21
+ * Added UglifyJS filter [Justin Hileman]
22
+ * Added `:items` parameter for the XML site map [Justin Hileman]
21
23
  * Added support for params to ERB
24
+ * Added `:default_colorizer` parameter to the `:colorize_syntax` filter
22
25
  * Allowed for passing arbitrary options to pygmentize [Matthias Vallentin]
23
26
  * Exposed RedCloth parameters in the filter [Vincent Driessen]
24
27
 
28
+ ## 3.1.9 (2011-06-30)
29
+
30
+ * Really fixed dependency generation between Sass partials this time
31
+ * Updated Less filter to 2.0
32
+ * Made colorize_syntax filter throw an error if pygmentize is not available
33
+
34
+ ## 3.1.8 (2011-06-25)
35
+
36
+ * Made link validator accept https: URLs
37
+ * Fixed erronous handling of layouts with names ending in index
38
+ * Fixed dependency generation between Sass partials
39
+ * Fixed errors related to thread requires
40
+ * Fixed crash while handling load errors
41
+ * Improved encoding handling while reading files
42
+
25
43
  ## 3.1.7 (2011-05-03)
26
44
 
27
45
  * Restored compatibility with Sass 3.1
data/README.md CHANGED
@@ -28,12 +28,14 @@ directories:
28
28
  * `cli` contains the commandline interface
29
29
  * `data_sources` contains the standard data sources ({Nanoc3::DataSource}
30
30
  subclasses), such as the filesystem data source
31
- * `helpers` contains helpers, which provide functionality some sites
32
- may find useful, such as the blogging and tagging helpers
33
31
  * `extra` contains stuff that is not needed by nanoc itself, but which may
34
32
  be used by helpers, data sources, filters or VCSes.
35
33
  * `filters` contains the standard filters ({Nanoc3::Filter} subclasses)
36
- such as ERB, Markdown, Haml, ...
34
+ such as ERB, Markdown, Haml,
35
+ * `helpers` contains helpers, which provide functionality some sites
36
+ may find useful, such as the blogging and tagging helpers
37
+ * `tasks` contains rake tasks that perform a variety of functions such as
38
+ validating HTML and CSS, uploading compiled files, …
37
39
 
38
40
  The namespaces (modules) are organised like this:
39
41
 
@@ -90,10 +92,12 @@ may be interested in the development dependencies:
90
92
  * Christian Plessl
91
93
  * Šime Ramov
92
94
  * Xavier Shay
95
+ * Arnau Siches
93
96
  * “Soryu”
94
97
  * Eric Sunshine
95
98
  * Dennis Sutch
96
99
  * Matthias Vallentin
100
+ * Toon Willems
97
101
 
98
102
  ## Contact
99
103
 
data/bin/nanoc3 CHANGED
@@ -1,8 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # encoding: utf-8
3
3
 
4
- puts "Starting..."
5
-
6
4
  # Add lib to load path
7
5
  $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib'))
8
6
 
@@ -11,4 +9,4 @@ require 'nanoc3'
11
9
  require 'nanoc3/cli'
12
10
 
13
11
  # Run base
14
- Nanoc3::CLI::Base.shared_base.run(ARGV)
12
+ Nanoc3::CLI.run(ARGV)
@@ -3,22 +3,10 @@
3
3
  module Nanoc3
4
4
 
5
5
  # The current nanoc version.
6
- VERSION = '3.2.0a4'
6
+ VERSION = '3.2.0b1'
7
7
 
8
8
  end
9
9
 
10
- # Switch #require for a faster variant
11
- require 'set'
12
- $_nanoc_requires ||= Set.new
13
- module Kernel
14
- alias_method :nanoc_original_require, :require
15
- def require(r)
16
- return if $_nanoc_requires.include?(r)
17
- nanoc_original_require(r)
18
- $_nanoc_requires << r
19
- end
20
- end
21
-
22
10
  # Load general requirements
23
11
  require 'digest'
24
12
  require 'enumerator'
@@ -139,6 +139,27 @@ module Nanoc3
139
139
  end
140
140
  end
141
141
 
142
+ # Creates a dependency from the item that is currently being filtered onto
143
+ # the given collection of items. In other words, require the given items
144
+ # to be compiled first before this items is processed.
145
+ #
146
+ # @param [Array<Nanoc3::Item>] items The items that are depended on.
147
+ #
148
+ # @return [void]
149
+ def depend_on(items)
150
+ # Notify
151
+ items.each do |item|
152
+ Nanoc3::NotificationCenter.post(:visit_started, item)
153
+ Nanoc3::NotificationCenter.post(:visit_ended, item)
154
+ end
155
+
156
+ # Raise unmet dependency error if necessary
157
+ items.each do |item|
158
+ rep = item.reps.find { |r| !r.compiled? }
159
+ raise Nanoc3::Errors::UnmetDependency.new(rep) if rep
160
+ end
161
+ end
162
+
142
163
  end
143
164
 
144
165
  end
@@ -20,8 +20,6 @@ module Nanoc3
20
20
 
21
21
  def_delegators :@item_rep, :item, :name, :binary, :binary?, :compiled_content, :has_snapshot?, :raw_path, :path, :assigns, :assigns=
22
22
 
23
- # @return The list of recorded actions (“rule memory”)
24
- #
25
23
  # @example The compilation rule and the corresponding rule memory
26
24
  #
27
25
  # # rule
@@ -38,7 +36,7 @@ module Nanoc3
38
36
  # [ :layout, 'meh' ]
39
37
  # ]
40
38
  #
41
- # @return [Array] The rule memory
39
+ # @return [Array] The list of recorded actions (“rule memory”)
42
40
  attr_reader :rule_memory
43
41
 
44
42
  # @param [Nanoc3::ItemRep] item_rep The item representation that this
@@ -203,7 +203,7 @@ module Nanoc3
203
203
  @checksum_store
204
204
  end
205
205
 
206
- # TODO document
206
+ # @return [Nanoc3::RulesCollection] The rules collection
207
207
  def rules_collection
208
208
  site.compiler.rules_collection
209
209
  end
@@ -13,8 +13,6 @@ module Nanoc3
13
13
  # @option params [Nanoc3::RulesCollection] rules_collection The rules
14
14
  # collection
15
15
  def initialize(params={})
16
- super('tmp/rule_memory', 1)
17
-
18
16
  @rules_collection = params[:rules_collection] or
19
17
  raise ArgumentError, "Required :rules_collection option is missing"
20
18
  end
@@ -34,7 +34,14 @@ module Nanoc3
34
34
  @layout_filter_mapping = OrderedHash.new
35
35
  end
36
36
 
37
- # TODO document
37
+ # Add the given rule to the list of item compilation rules.
38
+ #
39
+ # @param [Nanoc3::Rule] rule The item compilation rule to add
40
+ #
41
+ # @param [:before, :after] position The place where the rule should be
42
+ # added (either at the beginning or the end of the list of rules)
43
+ #
44
+ # @return [void]
38
45
  def add_item_compilation_rule(rule, position=:after)
39
46
  case position
40
47
  when :before
@@ -46,7 +53,14 @@ module Nanoc3
46
53
  end
47
54
  end
48
55
 
49
- # TODO document
56
+ # Add the given rule to the list of item routing rules.
57
+ #
58
+ # @param [Nanoc3::Rule] rule The item routing rule to add
59
+ #
60
+ # @param [:before, :after] position The place where the rule should be
61
+ # added (either at the beginning or the end of the list of rules)
62
+ #
63
+ # @return [void]
50
64
  def add_item_routing_rule(rule, position=:after)
51
65
  case position
52
66
  when :before
@@ -58,12 +72,17 @@ module Nanoc3
58
72
  end
59
73
  end
60
74
 
61
- # TODO document
75
+ # @param [Nanoc3::Item] item The item for which the compilation rules
76
+ # should be retrieved
77
+ #
78
+ # @return [Array] The list of item compilation rules for the given item
62
79
  def item_compilation_rules_for(item)
63
80
  @item_compilation_rules.select { |r| r.applicable_to?(item) }
64
81
  end
65
82
 
66
83
  # Loads this site’s rules.
84
+ #
85
+ # @return [void]
67
86
  def load
68
87
  # Find rules file
69
88
  rules_filenames = [ 'Rules', 'rules', 'Rules.rb', 'rules.rb' ]
@@ -78,6 +97,8 @@ module Nanoc3
78
97
  end
79
98
 
80
99
  # Unloads this site’s rules.
100
+ #
101
+ # @return [void]
81
102
  def unload
82
103
  @item_compilation_rules = []
83
104
  @item_routing_rules = []
@@ -114,6 +135,8 @@ module Nanoc3
114
135
  # returned. The result is a hash containing the corresponding rule for
115
136
  # each snapshot.
116
137
  #
138
+ # @param [Nanoc3::ItemRep] rep The item rep for which to fetch the rules
139
+ #
117
140
  # @return [Hash<Symbol, Nanoc3::Rule>] The routing rules for the given rep
118
141
  def routing_rules_for(rep)
119
142
  rules = {}
@@ -146,17 +169,15 @@ module Nanoc3
146
169
  end
147
170
  memoize :dsl
148
171
 
149
- # TODO document
172
+ # Returns an object that can be used for uniquely identifying objects.
173
+ #
174
+ # @return [Object] An unique reference to this object
150
175
  def reference
151
176
  :rules
152
177
  end
153
178
 
154
- # TODO document
155
- def data
156
- @data
157
- end
158
-
159
- # TODO document
179
+ # @return [String] The checksum for this object. If its contents change,
180
+ # the checksum will change as well.
160
181
  def checksum
161
182
  @data.checksum
162
183
  end
@@ -184,18 +205,21 @@ module Nanoc3
184
205
  end
185
206
  memoize :new_rule_memory_for_layout
186
207
 
187
- # TODO document
208
+ # @param [Nanoc3::Item] obj The object for which to check the rule memory
209
+ #
210
+ # @return [Boolean] true if the rule memory for the given object has
211
+ # changed since the last compilation, false otherwise
188
212
  def rule_memory_differs_for(obj)
189
213
  !rule_memory_store[obj].eql?(rule_memory_calculator[obj])
190
214
  end
191
215
  memoize :rule_memory_differs_for
192
216
 
193
- # TODO document
217
+ # @return [Nanoc3::RuleMemoryStore] The rule memory store
194
218
  def rule_memory_store
195
219
  @compiler.rule_memory_store
196
220
  end
197
221
 
198
- # TODO document
222
+ # @return [Nanoc3::RuleMemoryCalculator] The rule memory calculator
199
223
  def rule_memory_calculator
200
224
  @compiler.rule_memory_calculator
201
225
  end
@@ -31,16 +31,16 @@ module Nanoc3
31
31
  # # => %w( b c )
32
32
  class DirectedGraph
33
33
 
34
- # The list of vertices in this graph.
34
+ # The set of vertices in this graph.
35
35
  #
36
- # @return [Array]
36
+ # @return [Set]
37
37
  attr_reader :vertices
38
38
 
39
39
  # @group Creating a graph
40
40
 
41
41
  # Creates a new directed graph with the given vertices.
42
42
  def initialize(vertices)
43
- @vertices = vertices
43
+ @vertices = Set.new(vertices)
44
44
 
45
45
  @from_graph = {}
46
46
  @to_graph = {}
@@ -49,21 +49,18 @@ module Nanoc3
49
49
 
50
50
  # Redefine
51
51
  define_method(method_name) do |*args|
52
- # Get method-specific cache
53
- key = [ self, method_name ]
54
- if !CACHE.has_key?(key)
55
- CACHE[key] = {}
56
- end
57
- method_cache = CACHE[key]
52
+ # Get cache
53
+ @cache ||= {}
54
+ @cache[method_name] ||= {}
58
55
 
59
56
  # Recalculate if necessary
60
- if !method_cache.has_key?(args)
57
+ if !@cache[method_name].has_key?(args)
61
58
  result = send(original_method_name, *args)
62
- method_cache[args] = result
59
+ @cache[method_name][args] = result
63
60
  end
64
61
 
65
62
  # Done
66
- method_cache[args]
63
+ @cache[method_name][args]
67
64
  end
68
65
  end
69
66
 
@@ -47,7 +47,8 @@ module Nanoc3
47
47
  "<#{self.class}:0x#{self.object_id.to_s(16)} filename=#{self.filename}>"
48
48
  end
49
49
 
50
- # TODO document
50
+ # @return [String] The checksum for this object. If its contents change,
51
+ # the checksum will change as well.
51
52
  def checksum
52
53
  @data.checksum
53
54
  end
@@ -2,15 +2,19 @@
2
2
 
3
3
  module Nanoc3
4
4
 
5
- # TODO document
5
+ # Represents the site configuration.
6
6
  class Configuration < ::Hash
7
7
 
8
- # TODO document
8
+ # Creates a new configuration with the given hash.
9
+ #
10
+ # @param [Hash] hash The actual configuration hash
9
11
  def initialize(hash)
10
12
  self.replace(hash)
11
13
  end
12
14
 
13
- # TODO document
15
+ # Returns an object that can be used for uniquely identifying objects.
16
+ #
17
+ # @return [Object] An unique reference to this object
14
18
  def reference
15
19
  :config
16
20
  end
@@ -166,16 +166,19 @@ module Nanoc3
166
166
  # Get captured content (hax)
167
167
  # TODO [in nanoc 4.0] remove me
168
168
  if key.to_s =~ /^content_for_(.*)$/
169
+ @@_content_for_warning_issued ||= false
170
+ @@_Nanoc3_Helpers_Capturing_included ||= false
171
+
169
172
  # Warn
170
- unless @_content_for_warning_issued
173
+ unless @@_content_for_warning_issued
171
174
  warn 'WARNING: Accessing captured content should happen using the #content_for method defined in the Capturing helper instead of using item[:content_for_something]. The latter way of accessing captured content will be removed in nanoc 4.0.'
172
- @_content_for_warning_issued = true
175
+ @@_content_for_warning_issued = true
173
176
  end
174
177
 
175
178
  # Include capturing helper if necessary
176
- unless @_Nanoc3_Helpers_Capturing_included
179
+ unless @@_Nanoc3_Helpers_Capturing_included
177
180
  self.class.send(:include, ::Nanoc3::Helpers::Capturing)
178
- @_Nanoc3_Helpers_Capturing_included = true
181
+ @@_Nanoc3_Helpers_Capturing_included = true
179
182
  end
180
183
 
181
184
  # Get content
@@ -233,18 +236,57 @@ module Nanoc3
233
236
  "<#{self.class}:0x#{self.object_id.to_s(16)} identifier=#{self.identifier} binary?=#{self.binary?}>"
234
237
  end
235
238
 
236
- # TODO document
239
+ # @return [String] The checksum for this object. If its contents change,
240
+ # the checksum will change as well.
237
241
  def checksum
238
- if binary?
239
- Pathname.new(raw_filename).checksum
242
+ content_checksum = if binary?
243
+ if File.exist?(raw_filename)
244
+ Pathname.new(raw_filename).checksum
245
+ else
246
+ ''.checksum
247
+ end
240
248
  else
241
- attributes = @attributes.dup
242
- attributes.delete(:file)
243
- @raw_content.checksum + ',' + attributes.checksum
249
+ @raw_content.checksum
244
250
  end
251
+
252
+ attributes = @attributes.dup
253
+ attributes.delete(:file)
254
+ attributes_checksum = attributes.checksum
255
+
256
+ content_checksum + ',' + attributes_checksum
245
257
  end
246
258
  memoize :checksum
247
259
 
260
+ def hash
261
+ self.class.hash ^ self.identifier.hash
262
+ end
263
+
264
+ def eql?(other)
265
+ self.class == other.class && self.identifier == other.identifier
266
+ end
267
+
268
+ def ==(other)
269
+ self.eql?(other)
270
+ end
271
+
272
+ def marshal_dump
273
+ [
274
+ @is_binary,
275
+ @raw_filename,
276
+ @raw_content,
277
+ @attributes,
278
+ @identifier
279
+ ]
280
+ end
281
+
282
+ def marshal_load(source)
283
+ @is_binary,
284
+ @raw_filename,
285
+ @raw_content,
286
+ @attributes,
287
+ @identifier = *source
288
+ end
289
+
248
290
  # @deprecated Access the modification time using `item[:mtime]` instead.
249
291
  def mtime
250
292
  self[:mtime]