diff --git a/swh/journal/serializers.py b/swh/journal/serializers.py --- a/swh/journal/serializers.py +++ b/swh/journal/serializers.py @@ -66,6 +66,28 @@ raise ValueError("Unknown object type: %s." % object_type) +def stringify_key_item(k: str, v: Union[str, bytes]) -> str: + """Turn the item of a dict key into a string""" + if isinstance(v, str): + return v + if k == "url": + return v.decode("utf-8") + return v.hex() + + +def pprint_key(key: KeyType) -> str: + """Pretty-print a kafka key""" + + if isinstance(key, dict): + return "{%s}" % ", ".join( + f"{k}: {stringify_key_item(k, v)}" for k, v in key.items() + ) + elif isinstance(key, bytes): + return key.hex() + else: + return key + + def key_to_kafka(key: KeyType) -> bytes: """Serialize a key, possibly a dict, in a predictable way""" p = msgpack.Packer(use_bin_type=True) diff --git a/swh/journal/tests/test_serializers.py b/swh/journal/tests/test_serializers.py --- a/swh/journal/tests/test_serializers.py +++ b/swh/journal/tests/test_serializers.py @@ -34,3 +34,20 @@ for object_type, objects in TEST_OBJECTS.items(): for obj in objects: assert serializers.object_key(object_type, obj) is not None + + +def test_pprint_key(): + """Test whether get_key works on all our objects""" + for object_type, objects in TEST_OBJECTS.items(): + for obj in objects: + key = serializers.object_key(object_type, obj) + pprinted_key = serializers.pprint_key(key) + assert isinstance(pprinted_key, str) + + if isinstance(key, dict): + assert pprinted_key[0], pprinted_key[-1] == "{}" + for dict_key in key.keys(): + assert f"{dict_key}:" in pprinted_key + + if isinstance(key, bytes): + assert pprinted_key == key.hex()