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