From ddf7d42c27eb23f3329d76b17e57999d658c4b1a Mon Sep 17 00:00:00 2001 From: robrobo Date: Sat, 11 Apr 2026 17:21:57 +0200 Subject: [PATCH] extended the has checksum case for edge cases that caused problems --- src/mdevaluate/checksum.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/mdevaluate/checksum.py b/src/mdevaluate/checksum.py index 1c0d745..a6d7f06 100755 --- a/src/mdevaluate/checksum.py +++ b/src/mdevaluate/checksum.py @@ -102,8 +102,20 @@ def checksum(*args, csum=None, _seen=None): _seen.add(obj_id) if hasattr(arg, "__checksum__"): - logger.debug("Checksum via __checksum__: %s", str(arg)) - csum.update(str(arg.__checksum__()).encode()) + method = getattr(arg, "__checksum__") + if callable(method) and not isinstance(arg, type): + logger.debug("Checksum via __checksum__: %s", str(arg)) + csum.update(str(method()).encode()) + elif isinstance(arg, type): + try: + src = inspect.getsource(arg) + csum.update(strip_comments(src).encode()) + logger.debug("Checksum via class source for %s", arg.__name__) + except (OSError, TypeError): + csum.update(arg.__name__.encode()) + logger.debug("Checksum via class name for %s", arg.__name__) + else: + logger.debug("Skipping unbound __checksum__ on %s", type(arg)) elif isinstance(arg, bytes): csum.update(arg) elif isinstance(arg, str):