From c909f67ba3fcdd7b98b86a3da1b1e45cc5c12115 Mon Sep 17 00:00:00 2001 From: sumanjeet0012 Date: Mon, 13 Jul 2026 13:50:49 +0530 Subject: [PATCH] feat: add encoder_by_name factory function --- multibase/__init__.py | 1 + multibase/multibase.py | 20 ++++++++++++++++++++ tests/test_multibase.py | 19 +++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/multibase/__init__.py b/multibase/__init__.py index 3a236be..eaa264b 100644 --- a/multibase/__init__.py +++ b/multibase/__init__.py @@ -18,6 +18,7 @@ Encoding, decode, encode, + encoder_by_name, get_codec, get_encoding_info, is_encoded, diff --git a/multibase/multibase.py b/multibase/multibase.py index 9447cbb..0c667e6 100644 --- a/multibase/multibase.py +++ b/multibase/multibase.py @@ -192,6 +192,26 @@ def decode(data, return_encoding=False): raise DecodingError(f"Failed to decode multibase data: {e}") from e +def encoder_by_name(name_or_prefix): + """ + Create an Encoder from a name or single-character prefix. + + :param name_or_prefix: encoding name or prefix character + :type name_or_prefix: str + :return: an Encoder instance + :rtype: Encoder + :raises UnsupportedEncodingError: if the encoding is not supported + """ + if name_or_prefix in ENCODINGS_LOOKUP: + return Encoder(name_or_prefix) + + prefix_bytes = name_or_prefix.encode("utf-8") + if prefix_bytes in ENCODINGS_LOOKUP: + return Encoder(ENCODINGS_LOOKUP[prefix_bytes].encoding) + + raise UnsupportedEncodingError(f"Encoding {name_or_prefix!r} not supported.") + + class Encoder: """Reusable encoder for a specific encoding.""" diff --git a/tests/test_multibase.py b/tests/test_multibase.py index 77bad99..50731d0 100644 --- a/tests/test_multibase.py +++ b/tests/test_multibase.py @@ -13,6 +13,7 @@ UnsupportedEncodingError, decode, encode, + encoder_by_name, get_encoding_info, is_encoded, is_encoding_supported, @@ -192,6 +193,24 @@ def test_encoder_class(): Encoder("base999") +def test_encoder_by_name(): + """Test encoder_by_name factory function.""" + enc1 = encoder_by_name("base16") + assert enc1.encoding == "base16" + + enc2 = encoder_by_name("f") + assert enc2.encoding == "base16" + + enc3 = encoder_by_name("🚀") + assert enc3.encoding == "base256emoji" + + with pytest.raises(UnsupportedEncodingError): + encoder_by_name("base999") + + with pytest.raises(UnsupportedEncodingError): + encoder_by_name("?") + + def test_decoder_class(): """Test Decoder class.""" decoder = Decoder()