Note that we only hash the bytecode, so only really modified code will change the resulting hash.
import inspect
def get_module_hash(root, obj=None, hash=None, verbose=False):
if not obj:
obj = root
if verbose:
print obj.__name__
if not hash:
import sha
hash = sha.new()
for member in inspect.getmembers(obj):
name, child = member
if inspect.ismodule(child):
if child.__name__.startswith(root.__name__):
if child != root:
if verbose:
print child.__name__
hash = get_module_hash(root, child, hash, verbose)
if inspect.isclass(child):
if child.__module__.startswith(root.__name__):
if verbose:
print ' ', child.__name__
hash = get_module_hash(root, child, hash, verbose)
if inspect.ismethod(child):
if verbose:
print ' ', child.__name__
hash.update(child.im_func.func_code.co_code)
if inspect.isfunction(child):
if root.__name__ in child.func_code.co_filename:
if verbose:
print ' ', child.__name__
hash.update(child.func_code.co_code)
return hash
hash = get_module_hash(yourmodule)
print 'version hash:', hash.hexdigest()
