Module: Gibbler::Object

Included in:
Class, Array, Complex, DateTime, File, Hash, Nil, Range, String, Time, Module, OpenStruct, Proc
Defined in:
lib/gibbler.rb,
lib/gibbler/aliases.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.gibbler_fieldsObject



143
144
# File 'lib/gibbler.rb', line 143

def self.gibbler_fields
end

.included(obj) ⇒ Object



136
137
138
139
140
141
# File 'lib/gibbler.rb', line 136

def self.included(obj)
  obj.extend Attic
  obj.attic :gibbler_cache
  # Backwards compatibility for <= 0.6.2 
  obj.send :alias_method, :__gibbler_cache, :gibbler_cache
end

Instance Method Details

#__gibbler(digest_type = nil) ⇒ Object

Creates a digest for the current state of self based on:

  • Object#class

  • Length of Object#name || 0

  • Object#name || ”

e.g. Digest::SHA1.hexdigest “Class:6:Object” #=>

This is a default method appropriate for only the most basic objects like Class and Module.



197
198
199
200
201
202
203
204
# File 'lib/gibbler.rb', line 197

def __gibbler(digest_type=nil)
  klass = self.class
  nom = self.name if self.respond_to?(:name)
  nom ||= ''
  a = Gibbler.digest '%s:%s:%s' % [klass, nom.size, nom], digest_type
  gibbler_debug klass, a, [klass, nom.size, nom]
  a
end

#digest_cacheObject

The cache is in the Attic.



12
# File 'lib/gibbler/aliases.rb', line 12

def    digest_cache;     gibbler_cache;  end

#freezeObject

A simple override on Object#freeze to create a digest before the object is frozen. Once the object is frozen obj.gibbler will return the cached value with out calculation.



210
211
212
213
214
215
# File 'lib/gibbler.rb', line 210

def freeze()
  gibbler_debug :FREEZE, self.class, caller[0] if Gibbler.debug?
  self.gibbler
  super
  self
end

#gibbled?Boolean Also known as: changed?

Has this object been modified?

This method compares the return value from digest with the previous value returned by gibbler (the value is stored in the attic as gibbler_cache). See Attic

Returns:

  • (Boolean)


175
176
177
178
179
180
# File 'lib/gibbler.rb', line 175

def gibbled?
  self.gibbler_cache ||= self.gibbler
  was, now = self.gibbler_cache.clone, self.gibbler
  gibbler_debug :gibbled?, was, now
  was != now
end

#gibbler(digest_type = nil) ⇒ Object Also known as: digest

Calculates a digest for the current object instance. Objects that are a kind of Hash or Array are processed recursively. The length of the returned String depends on the digest type. Also stores the value in the attic.

obj.gibbler          # => a5b1191a
obj.gibbler_cache    # => a5b1191a

Calling gibbler_cache returns the most recent digest without calculation.

If the object is frozen, this will return the value of gibbler_cache.



162
163
164
165
166
167
# File 'lib/gibbler.rb', line 162

def gibbler(digest_type=nil)
  #gibbler_debug caller[0]
  gibbler_debug :GIBBLER, self.class, self
  return self.gibbler_cache if self.frozen?
  self.gibbler_cache = Gibbler::Digest.new self.__gibbler(digest_type)
end

#gibbler_debug(*args) ⇒ Object



182
183
184
185
# File 'lib/gibbler.rb', line 182

def gibbler_debug(*args)
  return unless Gibbler.debug?
  p args
end

#gibbler_fieldsObject Also known as: digest_fields



145
146
# File 'lib/gibbler.rb', line 145

def gibbler_fields
end