class Nanoc::Core::Checksummer
Creates checksums for given objects.
A checksum is a string, such as “mL+TaqNsEeiPkWloPgCtAofT1yg=”, that is used to determine whether a piece of data has changed.
Public Class Methods
calc(obj, digest_class = CompactDigest)
click to toggle source
@param obj The object to create a checksum for
@return [String] The digest
# File lib/nanoc/core/checksummer.rb, line 42 def calc(obj, digest_class = CompactDigest) digest = digest_class.new update(obj, digest) digest.to_s end
calc_for_content_of(obj)
click to toggle source
# File lib/nanoc/core/checksummer.rb, line 48 def calc_for_content_of(obj) obj.content_checksum_data || obj.checksum_data || Nanoc::Core::Checksummer.calc(obj.content) end
calc_for_each_attribute_of(obj, digest_class = CompactDigest)
click to toggle source
# File lib/nanoc/core/checksummer.rb, line 52 def calc_for_each_attribute_of(obj, digest_class = CompactDigest) obj.attributes.transform_values do |value| Nanoc::Core::Checksummer.calc(value, digest_class) end end
define_behavior(klass, behavior)
click to toggle source
# File lib/nanoc/core/checksummer.rb, line 58 def define_behavior(klass, behavior) behaviors[klass] = behavior end
Private Class Methods
behavior_for(obj)
click to toggle source
# File lib/nanoc/core/checksummer.rb, line 120 def behavior_for(obj) behavior_for_class(obj.class) end
behavior_for_class(klass)
click to toggle source
# File lib/nanoc/core/checksummer.rb, line 110 def behavior_for_class(klass) behaviors.fetch(klass) do if Object.equal?(klass.superclass) RescueUpdateBehavior else behavior_for_class(klass.superclass) end end end
behaviors()
click to toggle source
# File lib/nanoc/core/checksummer.rb, line 76 def behaviors return @behaviors if @behaviors @behaviors = {} # NOTE: Other behaviors are registered elsewhere # (search for `define_behavior`). define_behavior(Array, ArrayUpdateBehavior) define_behavior(FalseClass, NoUpdateBehavior) define_behavior(Hash, HashUpdateBehavior) define_behavior(NilClass, NoUpdateBehavior) define_behavior(Numeric, RawUpdateBehavior) define_behavior(Pathname, PathnameUpdateBehavior) define_behavior(String, RawUpdateBehavior) define_behavior(Symbol, RawUpdateBehavior) define_behavior(Time, ToIToSUpdateBehavior) define_behavior(TrueClass, NoUpdateBehavior) define_behavior(Nanoc::Core::BinaryContent, BinaryContentUpdateBehavior) define_behavior(Nanoc::Core::Configuration, HashUpdateBehavior) define_behavior(Nanoc::Core::Context, ContextUpdateBehavior) define_behavior(Nanoc::Core::CodeSnippet, DataUpdateBehavior) define_behavior(Nanoc::Core::IdentifiableCollection, ArrayUpdateBehavior) define_behavior(Nanoc::Core::Identifier, ToSUpdateBehavior) define_behavior(Nanoc::Core::Item, DocumentUpdateBehavior) define_behavior(Nanoc::Core::ItemRep, ItemRepUpdateBehavior) define_behavior(Nanoc::Core::Layout, DocumentUpdateBehavior) define_behavior(Nanoc::Core::TextualContent, StringUpdateBehavior) define_behavior(Nanoc::Core::View, UnwrapUpdateBehavior) @behaviors end
update(obj, digest, visited = Hamster::Set.new)
click to toggle source
# File lib/nanoc/core/checksummer.rb, line 64 def update(obj, digest, visited = Hamster::Set.new) digest.update(obj.class.to_s) if visited.include?(obj) digest.update('<recur>') else digest.update('<') behavior_for(obj).update(obj, digest) { |o| update(o, digest, visited.add(obj)) } digest.update('>') end end