]> git.ipfire.org Git - thirdparty/babel.git/commitdiff
Document and enhance the alias system
authorAarni Koskela <akx@iki.fi>
Fri, 31 Jul 2026 12:35:12 +0000 (15:35 +0300)
committerAarni Koskela <akx@iki.fi>
Fri, 31 Jul 2026 19:19:03 +0000 (22:19 +0300)
babel/localedata.py
tests/test_localedata.py

index 297955b97454df8ca319bb482fd56f6e3aa0a665..1967856f56e5e229dca91b2f6eb19771419d8fb3 100644 (file)
@@ -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
 
 
index 20093c7f489ad79662e664a9d0f4eeb6a173486e..0e500be4ac7c4a1a6534734c444b67d6d50fb06c 100644 (file)
@@ -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')