From 15d219d871f8b836fbc3b4bebd83614f60dc7d5c Mon Sep 17 00:00:00 2001 From: Krzysztof Kalinowski Date: Mon, 4 Dec 2023 16:07:23 +0400 Subject: [PATCH] Fix the test that broke after 3.12 changes to locale.normalize - On Linux, C.UTF-8 locale is now part of the standard. macOS and Windows use en_US.UTF-8 instead. - Up to 3.11, `locale.normalize` was converting `C.UTF-8` into `en_US.UTF-8`. If you normalized the locale string, it was impossible to set `C.UTF-8`. - In 3.12, `C.UTF-8` maps to itself. - https://github.com/python/cpython/pull/14925 - https://peps.python.org/pep-0538/ - `C.UTF-8` doesn't seem to be used anywhere else in the codebase, except for this one test. - Other fix would be to inject a previous value to `locale.locale_alias` dictionary for certain platforms. However, this is part of the private implementation and could change without prior notice. - More changes to the locale are scheduled for 3.15. --- test/unit/b2http/test_b2http.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/unit/b2http/test_b2http.py b/test/unit/b2http/test_b2http.py index 4ab4da27b..038c0b4da 100644 --- a/test/unit/b2http/test_b2http.py +++ b/test/unit/b2http/test_b2http.py @@ -11,6 +11,7 @@ import datetime import locale +import sys from unittest.mock import MagicMock, call, patch import apiver_deps @@ -32,7 +33,6 @@ ) from b2sdk.b2http import setlocale - from ..test_base import TestBase @@ -306,9 +306,11 @@ class TestB2HttpUserAgentAppend(TestB2Http): class TestSetLocaleContextManager(TestBase): def test_set_locale_context_manager(self): - test_locale = locale.normalize( - 'C.utf8' - ) # C.UTF-8 on Ubuntu 18.04 Bionic, C.utf8 on Ubuntu 22.04 Jammy + # C.UTF-8 on Ubuntu 18.04 Bionic, C.utf8 on Ubuntu 22.04 Jammy + # Neither macOS nor Windows have C.UTF-8 locale, and they use `en_US.UTF-8`. + # Since Python 3.12, locale.normalize no longer falls back + # to the `en_US` version, so we're providing it here manually. + test_locale = locale.normalize('C.UTF-8' if sys.platform == 'linux' else 'en_US.UTF-8') other_locale = 'C' saved = locale.setlocale(locale.LC_ALL)