From e2b61c003e9be2cc4fe35140d6a607e63677aa6f Mon Sep 17 00:00:00 2001 From: Pascal Bourgault Date: Tue, 11 Jun 2024 14:32:21 -0400 Subject: [PATCH] Fix custom formatters needing registry --- CHANGES | 2 +- pint/delegates/formatter/_to_register.py | 2 ++ pint/delegates/formatter/full.py | 12 +++++++++--- pint/testsuite/test_formatting.py | 2 ++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index e3a1b7ad0..8e59b4803 100644 --- a/CHANGES +++ b/CHANGES @@ -4,7 +4,7 @@ Pint Changelog 0.25 (unreleased) ----------------- -Nothing added yet. +- Fix custom formatter needing the registry object. (PR #2011) 0.24 (2024-06-07) diff --git a/pint/delegates/formatter/_to_register.py b/pint/delegates/formatter/_to_register.py index 0f8f46788..697973716 100644 --- a/pint/delegates/formatter/_to_register.py +++ b/pint/delegates/formatter/_to_register.py @@ -61,6 +61,8 @@ def wrapper(func: Callable[[PlainUnit, UnitRegistry], str]): raise ValueError(f"format {name!r} already exists") # or warn instead class NewFormatter(BaseFormatter): + spec = name + def format_magnitude( self, magnitude: Magnitude, diff --git a/pint/delegates/formatter/full.py b/pint/delegates/formatter/full.py index e6d0eee47..adc6f6c83 100644 --- a/pint/delegates/formatter/full.py +++ b/pint/delegates/formatter/full.py @@ -103,11 +103,17 @@ def get_formatter(self, spec: str): return v try: - return REGISTERED_FORMATTERS[spec] + orphan_fmt = REGISTERED_FORMATTERS[spec] except KeyError: - pass + return self._formatters["D"] - return self._formatters["D"] + try: + fmt = orphan_fmt.__class__(self._registry) + spec = getattr(fmt, "spec", spec) + self._formatters[spec] = fmt + return fmt + except Exception: + return orphan_fmt def format_magnitude( self, magnitude: Magnitude, mspec: str = "", **babel_kwds: Unpack[BabelKwds] diff --git a/pint/testsuite/test_formatting.py b/pint/testsuite/test_formatting.py index e74c09c50..d8f10715b 100644 --- a/pint/testsuite/test_formatting.py +++ b/pint/testsuite/test_formatting.py @@ -59,6 +59,8 @@ def test_split_format(format, default, flag, expected): def test_register_unit_format(func_registry): @fmt.register_unit_format("custom") def format_custom(unit, registry, **options): + # Ensure the registry is correct.. + registry.Unit(unit) return "" quantity = 1.0 * func_registry.meter