From: Aarni Koskela Date: Fri, 31 Jul 2026 12:35:12 +0000 (+0300) Subject: Document and enhance the alias system X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c874ed6cacb35f4c94786a264678b2020b3fb3d4;p=thirdparty%2Fbabel.git Document and enhance the alias system --- diff --git a/babel/localedata.py b/babel/localedata.py index 297955b9..1967856f 100644 --- a/babel/localedata.py +++ b/babel/localedata.py @@ -217,6 +217,8 @@ def merge(dict1: MutableMapping[Any, Any], dict2: Mapping[Any, Any]) -> None: if val1 is None: val1 = {} if isinstance(val1, Alias): + # A dict overriding an alias becomes an `(alias, overrides)` tuple + # resolved in `Alias.resolve` or `LocaleDataDict.__getitem__`. val1 = (val1, val2) elif isinstance(val1, tuple): alias, others = val1 @@ -260,6 +262,10 @@ class Alias: elif isinstance(data, tuple): alias, others = data data = alias.resolve(base) + if others: # Apply overrides on a copy. + data = data.copy() + merge(data, others) + return data diff --git a/tests/test_localedata.py b/tests/test_localedata.py index 20093c7f..0e500be4 100644 --- a/tests/test_localedata.py +++ b/tests/test_localedata.py @@ -59,6 +59,24 @@ def test_merge_with_alias_and_resolve(): assert d1['y'] == (alias, {'b': 22, 'e': 25}) +def test_alias_resolving_to_partially_overridden_alias(): + # An alias chain that lands on an `(alias, overrides)` tuple + # must apply the overrides on top of the resolved target. + x_alias = localedata.Alias(('x',)) + data = { + 'x': {'a': 1, 'b': 2}, + 'y': (x_alias, {'b': 22, 'c': 33}), # 'x', partially overridden + 'z': localedata.Alias(('y',)), # an alias landing on the tuple + } + expected = {'a': 1, 'b': 22, 'c': 33} + assert localedata.Alias(('z',)).resolve(data) == expected + d = localedata.LocaleDataDict(data) + assert dict(d['z']) == expected + # Ensure original data is as before: + assert data['x'] == {'a': 1, 'b': 2} + assert data['y'] == (x_alias, {'b': 22, 'c': 33}) + + def test_load(): assert localedata.load('en_US')['languages']['sv'] == 'Swedish' assert localedata.load('en_US') is localedata.load('en_US')