Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-python-iso639 for 
openSUSE:Factory checked in at 2025-12-29 15:16:56
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-python-iso639 (Old)
 and      /work/SRC/openSUSE:Factory/.python-python-iso639.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-python-iso639"

Mon Dec 29 15:16:56 2025 rev:4 rq:1324599 version:2025.11.16

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-python-iso639/python-python-iso639.changes    
    2025-04-29 16:40:34.750690954 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-python-iso639.new.1928/python-python-iso639.changes
      2025-12-29 15:17:47.653451232 +0100
@@ -1,0 +2,14 @@
+Sun Dec 28 21:03:19 UTC 2025 - Dirk Müller <[email protected]>
+
+- update to 2025.11.16:
+  * Added support for Python 3.14.
+  * Updated the ISO 639 data from SIL to the latest 2025-10-15
+    release.
+  * Case-insensitive matching for `Language.match` is now opt-in.
+  * The keyword argument has been renamed `strict_case` (from
+    `exact` before), defaulting to `True`.
+  * In `Language.match`, removed the keyword argument `exact`
+  * (replaced by `strict_case`, defaulting to `True`).
+  * Dropped support for Python 3.9.
+
+-------------------------------------------------------------------

Old:
----
  python_iso639-2025.2.18.tar.gz

New:
----
  python_iso639-2025.11.16.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-python-iso639.spec ++++++
--- /var/tmp/diff_new_pack.fvzvPn/_old  2025-12-29 15:17:48.729495460 +0100
+++ /var/tmp/diff_new_pack.fvzvPn/_new  2025-12-29 15:17:48.733495624 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-python-iso639
 #
-# Copyright (c) 2025 SUSE LLC
+# Copyright (c) 2025 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
 
 %{?sle15_python_module_pythons}
 Name:           python-python-iso639
-Version:        2025.2.18
+Version:        2025.11.16
 Release:        0
 Summary:        ISO 639 language codes, names, and other associated information
 License:        Apache-2.0

++++++ python_iso639-2025.2.18.tar.gz -> python_iso639-2025.11.16.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iso639-2025.2.18/.circleci/config.yml 
new/iso639-2025.11.16/.circleci/config.yml
--- old/iso639-2025.2.18/.circleci/config.yml   2025-02-18 14:44:20.000000000 
+0100
+++ new/iso639-2025.11.16/.circleci/config.yml  2025-11-16 22:45:07.000000000 
+0100
@@ -11,10 +11,7 @@
         type: string
     docker:
       # Pick the highest Python 3.x version that this package is known to 
support
-      - image: cimg/python:3.13
-        #auth:
-        #  username: $DOCKERHUB_USERNAME
-        #  password: $DOCKERHUB_PASSWORD
+      - image: cimg/python:3.14
     steps:
       - checkout
       - run:
@@ -26,9 +23,6 @@
         type: string
     docker:
       - image: cimg/python:<< parameters.python-version >>
-        #auth:
-        #  username: $DOCKERHUB_USERNAME
-        #  password: $DOCKERHUB_PASSWORD
     steps:
       - checkout
       - run:
@@ -117,7 +111,7 @@
             - bandit
           matrix:
             parameters:
-              python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
+              python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
       - build-python-win:
           requires:
             - flake8
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iso639-2025.2.18/CHANGELOG.md 
new/iso639-2025.11.16/CHANGELOG.md
--- old/iso639-2025.2.18/CHANGELOG.md   2025-02-18 14:44:20.000000000 +0100
+++ new/iso639-2025.11.16/CHANGELOG.md  2025-11-16 22:45:07.000000000 +0100
@@ -17,6 +17,28 @@
 ### Fixed
 ### Security
 
+## [2025.11.16]
+
+### Fixed
+* Fixed README.md (shown on the PyPI page) for the change from `exact` to 
`strict_case`
+  in `Language.match`.
+
+## [2025.11.11]
+
+### Added
+* Added support for Python 3.14.
+
+### Changed
+* Updated the ISO 639 data from SIL to the latest 2025-10-15 release.
+* Case-insensitive matching for `Language.match` is now opt-in.
+  The keyword argument has been renamed `strict_case` (from `exact` before),
+  defaulting to `True`.
+
+### Removed
+* In `Language.match`, removed the keyword argument `exact`
+  (replaced by `strict_case`, defaulting to `True`).
+* Dropped support for Python 3.9.
+
 ## [2025.2.18]
 
 ### Added
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iso639-2025.2.18/README.md 
new/iso639-2025.11.16/README.md
--- old/iso639-2025.2.18/README.md      2025-02-18 14:44:20.000000000 +0100
+++ new/iso639-2025.11.16/README.md     2025-11-16 22:45:07.000000000 +0100
@@ -116,22 +116,26 @@
 True
 ```
 
-By default, the classmethod `match` supports case-insensitive matching
-and ignores leading/trailing whitespace.
-To enforce exact matching instead, pass in `exact=True`:
+By default, the classmethod `match` is case-sensitive.
+To ignore case instead, pass in `strict_case=False`:
 
 ```python
->>> lang5 = iso639.Language.match('FRA')
->>> lang6 = iso639.Language.match('fra ')
->>> lang7 = iso639.Language.match('french')
->>> lang4 == lang5 == lang6 == lang7
+>>> lang5 = iso639.Language.match('FRA', strict_case=False)
+>>> lang6 = iso639.Language.match('french', strict_case=False)
+>>> lang4 == lang5 == lang6
 True
->>> iso639.Language.match("french", exact=True)
+>>> iso639.Language.match("french")
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
 LanguageNotFoundError: 'french' isn't an ISO language code or name
 ```
 
+> [!NOTE]  
+> Depending on your use case, ignoring case could potentially lead to matching 
issues,
+  where a language code might match an unintended language name (or vice 
versa),
+  e.g., conflating "igo" and "Igo", while there exist the ISO 639-3 code `ahl` 
for Igo and
+  the ISO 639-3 code `igo` for Isebe. 
+
 The classmethod `match` is particularly useful for consistently
 accessing a specific attribute from unknown inputs, e.g., the ISO 639-3 code.
 
@@ -264,7 +268,7 @@
     ```python
     >>> import iso639
     >>> iso639.DATA_LAST_UPDATED
-    datetime.date(2025, 1, 15)
+    datetime.date(2025, 10, 15)
     ```
 
 * `ALL_LANGUAGES`: The list of all `Language` objects based on the included 
language code data
@@ -274,7 +278,7 @@
     >>> type(iso639.ALL_LANGUAGES)
     <class 'set'>
     >>> len(iso639.ALL_LANGUAGES)
-    8307
+    8311
     ```
 
 ## Links
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iso639-2025.2.18/pyproject.toml 
new/iso639-2025.11.16/pyproject.toml
--- old/iso639-2025.2.18/pyproject.toml 2025-02-18 14:44:20.000000000 +0100
+++ new/iso639-2025.11.16/pyproject.toml        2025-11-16 22:45:07.000000000 
+0100
@@ -4,10 +4,10 @@
 
 [project]
 name = "python-iso639"
-version = "2025.2.18"
+version = "2025.11.16"
 description = "ISO 639 language codes, names, and other associated information"
 readme = "README.md"
-requires-python = ">= 3.9"
+requires-python = ">= 3.10"
 license = { text = "Apache 2.0" }
 authors = [ { name = "Jackson L. Lee", email = "[email protected]" } ]
 keywords = ["ISO 639", "language codes", "languages", "linguistics"]
@@ -21,11 +21,11 @@
     "Operating System :: OS Independent",
     "Programming Language :: Python :: 3",
     "Programming Language :: Python :: 3 :: Only",
-    "Programming Language :: Python :: 3.9",
     "Programming Language :: Python :: 3.10",
     "Programming Language :: Python :: 3.11",
     "Programming Language :: Python :: 3.12",
     "Programming Language :: Python :: 3.13",
+    "Programming Language :: Python :: 3.14",
     "Topic :: Text Processing",
     "Topic :: Text Processing :: General",
     "Topic :: Text Processing :: Indexing",
@@ -34,13 +34,13 @@
 
 [project.optional-dependencies]
 dev = [
-    "black == 25.1.0",
-    "build == 1.2.2",
-    "flake8 == 7.1.1",
-    "mypy == 1.15.0",
-    "pytest == 8.3.4",
-    "requests == 2.32.3",
-    "twine == 6.1.0",
+    "black == 25.11.0",
+    "build == 1.3.0",
+    "flake8 == 7.3.0",
+    "mypy == 1.18.2",
+    "pytest == 9.0.0",
+    "requests == 2.32.5",
+    "twine == 6.2.0",
 ]
 
 [project.urls]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iso639-2025.2.18/src/iso639/__init__.py 
new/iso639-2025.11.16/src/iso639/__init__.py
--- old/iso639-2025.2.18/src/iso639/__init__.py 2025-02-18 14:44:20.000000000 
+0100
+++ new/iso639-2025.11.16/src/iso639/__init__.py        2025-11-16 
22:45:07.000000000 +0100
@@ -9,7 +9,7 @@
 # While DATA_LAST_UPDATED is strictly the date for the ISO 639-3 data release,
 # __version__ can be bumped for changes other than data updates.
 __version__ = version("python-iso639")
-DATA_LAST_UPDATED = datetime.date(2025, 1, 15)
+DATA_LAST_UPDATED = datetime.date(2025, 10, 15)
 
 
 __all__ = [
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iso639-2025.2.18/src/iso639/_data/__init__.py 
new/iso639-2025.11.16/src/iso639/_data/__init__.py
--- old/iso639-2025.2.18/src/iso639/_data/__init__.py   2025-02-18 
14:44:20.000000000 +0100
+++ new/iso639-2025.11.16/src/iso639/_data/__init__.py  2025-11-16 
22:45:07.000000000 +0100
@@ -5,8 +5,6 @@
 from collections import defaultdict
 from enum import Enum
 
-from typing import Dict, List, Union
-
 
 class _CodesColumn(Enum):
     ID = "Id"
@@ -40,10 +38,10 @@
     STATUS = "I_Status"
 
 
-_COLUMN_TYPE = Union[
-    _CodesColumn, _NameIndexColumn, _RetirementsColumn, _MacrolanguagesColumn
-]
-_ROW_TYPE = Dict[_COLUMN_TYPE, str]
+_COLUMN_TYPE = (
+    _CodesColumn | _NameIndexColumn | _RetirementsColumn | 
_MacrolanguagesColumn
+)
+_ROW_TYPE = dict[_COLUMN_TYPE, str]
 
 
 class _Table(Enum):
@@ -62,56 +60,56 @@
 }
 
 
-def _load_tsv(table: _Table) -> List[_ROW_TYPE]:
+def _load_tsv(table: _Table) -> list[_ROW_TYPE]:
     column = table.value
     with open(_DATA_TSV_PATHS[table], encoding="utf-8", newline="") as 
tsv_file:
         tsv_reader = csv.DictReader(tsv_file, delimiter="\t")
         return [{column(k): v for k, v in row.items()} for row in tsv_reader]
 
 
-_PART3_TO_CODES: Dict[str, _ROW_TYPE] = {
+_PART3_TO_CODES: dict[str, _ROW_TYPE] = {
     row[_CodesColumn.ID]: row for row in _load_tsv(_Table.CODES)
 }
 
-_part3_to_name_index: defaultdict[str, List[_ROW_TYPE]] = defaultdict(list)
+_part3_to_name_index: defaultdict[str, list[_ROW_TYPE]] = defaultdict(list)
 for row in _load_tsv(_Table.NAME_INDEX):
     _part3_to_name_index[row[_NameIndexColumn.ID]].append(row)
-_PART3_TO_NAME_INDEX: Dict[str, List[_ROW_TYPE]] = dict(_part3_to_name_index)
+_PART3_TO_NAME_INDEX: dict[str, list[_ROW_TYPE]] = dict(_part3_to_name_index)
 
-_PART3_TO_RETIREMENTS: Dict[str, _ROW_TYPE] = {
+_PART3_TO_RETIREMENTS: dict[str, _ROW_TYPE] = {
     row[_RetirementsColumn.ID]: row for row in _load_tsv(_Table.RETIREMENTS)
 }
-_PART3_TO_MACROLANGUAGES: Dict[str, _ROW_TYPE] = {
+_PART3_TO_MACROLANGUAGES: dict[str, _ROW_TYPE] = {
     row[_MacrolanguagesColumn.ID]: row for row in 
_load_tsv(_Table.MACROLANGUAGES)
 }
 
-_PART2B_TO_PART3: Dict[str, str] = {
+_PART2B_TO_PART3: dict[str, str] = {
     row[_CodesColumn.PART2B]: part3
     for part3, row in _PART3_TO_CODES.items()
     if row[_CodesColumn.PART2B]
 }
-_PART2T_TO_PART3: Dict[str, str] = {
+_PART2T_TO_PART3: dict[str, str] = {
     row[_CodesColumn.PART2T]: part3
     for part3, row in _PART3_TO_CODES.items()
     if row[_CodesColumn.PART2T]
 }
-_PART1_TO_PART3: Dict[str, str] = {
+_PART1_TO_PART3: dict[str, str] = {
     row[_CodesColumn.PART1]: part3
     for part3, row in _PART3_TO_CODES.items()
     if row[_CodesColumn.PART1]
 }
-_REF_NAME_TO_PART3: Dict[str, str] = {
+_REF_NAME_TO_PART3: dict[str, str] = {
     row[_CodesColumn.REF_NAME]: part3
     for part3, row in _PART3_TO_CODES.items()
     if row[_CodesColumn.REF_NAME]
 }
-_PRINT_NAME_TO_PART3: Dict[str, str] = {
+_PRINT_NAME_TO_PART3: dict[str, str] = {
     row[_NameIndexColumn.PRINT_NAME]: part3
     for part3, rows in _PART3_TO_NAME_INDEX.items()
     for row in rows
     if row[_NameIndexColumn.PRINT_NAME]
 }
-_INVERTED_NAME_TO_PART3: Dict[str, str] = {
+_INVERTED_NAME_TO_PART3: dict[str, str] = {
     row[_NameIndexColumn.INVERTED_NAME]: part3
     for part3, rows in _PART3_TO_NAME_INDEX.items()
     for row in rows
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iso639-2025.2.18/src/iso639/_data/iso-639-3.tab 
new/iso639-2025.11.16/src/iso639/_data/iso-639-3.tab
--- old/iso639-2025.2.18/src/iso639/_data/iso-639-3.tab 2025-02-18 
14:44:20.000000000 +0100
+++ new/iso639-2025.11.16/src/iso639/_data/iso-639-3.tab        2025-11-16 
22:45:07.000000000 +0100
@@ -1297,7 +1297,7 @@
 clj                            I       L       Laitu Chin      
 clk                            I       L       Idu-Mishmi      
 cll                            I       L       Chala   
-clm                            I       L       Clallam 
+clm                            I       L       Klallam 
 clo                            I       L       Lowland Oaxaca Chontal  
 cls                            I       H       Classical Sanskrit      
 clt                            I       L       Lautu Chin      
@@ -2325,7 +2325,7 @@
 gza                            I       L       Ganza   
 gzi                            I       L       Gazi    
 gzn                            I       L       Gane    
-haa                            I       L       Han     
+haa                            I       L       Hän     
 hab                            I       L       Hanoi Sign Language     
 hac                            I       L       Gurani  
 had                            I       L       Hatam   
@@ -2892,7 +2892,7 @@
 kcf                            I       L       Ukaan   
 kcg                            I       L       Tyap    
 kch                            I       L       Vono    
-kci                            I       L       Kamantan        
+kci                            I       L       Ngyian  
 kcj                            I       L       Kobiana 
 kck                            I       L       Kalanga 
 kcl                            I       L       Kela (Papua New Guinea) 
@@ -3390,7 +3390,7 @@
 kwh                            I       L       Kowiai  
 kwi                            I       L       Awa-Cuaiquer    
 kwj                            I       L       Kwanga  
-kwk                            I       L       Kwakiutl        
+kwk                            I       L       Kwak'wala       
 kwl                            I       L       Kofyar  
 kwm                            I       L       Kwambi  
 kwn                            I       L       Kwangali        
@@ -3795,7 +3795,7 @@
 luq                            I       L       Lucumi  
 lur                            I       L       Laura   
 lus    lus     lus             I       L       Lushai  
-lut                            I       L       Lushootseed     
+lut                            I       E       Lushootseed     
 luu                            I       L       Lumba-Yakkha    
 luv                            I       L       Luwati  
 luw                            I       L       Luo (Cameroon)  
@@ -4011,7 +4011,7 @@
 mhk                            I       L       Mungaka 
 mhl                            I       L       Mauwake 
 mhm                            I       L       Makhuwa-Moniga  
-mhn                            I       L       Mócheno 
+mhn                            I       L       Mòcheno 
 mho                            I       L       Mashi (Zambia)  
 mhp                            I       L       Balinese Malay  
 mhq                            I       L       Mandan  
@@ -4574,7 +4574,7 @@
 net                            I       L       Nete    
 neu                            I       C       Neo     
 nev                            I       L       Nyaheun 
-new    new     new             I       L       Newari  
+new    new     new             I       L       Nepal Bhasa     
 nex                            I       L       Neme    
 ney                            I       L       Neyo    
 nez                            I       L       Nez Perce       
@@ -4916,7 +4916,7 @@
 nxq                            I       L       Naxi    
 nxr                            I       L       Ninggerum       
 nxx                            I       L       Nafri   
-nya    nya     nya     ny      I       L       Nyanja  
+nya    nya     nya     ny      I       L       Chichewa        
 nyb                            I       L       Nyangbo 
 nyc                            I       L       Nyanga-li       
 nyd                            I       L       Nyore   
@@ -4954,6 +4954,7 @@
 nzz                            I       L       Nanga Dama Dogon        
 oaa                            I       L       Orok    
 oac                            I       L       Oroch   
+oak                            I       L       Noakhali        
 oar                            I       H       Old Aramaic (up to 700 BCE)     
 oav                            I       H       Old Avar        
 obi                            I       E       Obispeño        
@@ -5017,6 +5018,7 @@
 okx                            I       L       Okpe (Northwestern Edo) 
 okz                            I       H       Old Khmer       
 ola                            I       L       Walungge        
+olb                            I       L       Oli-Bodiman     
 old                            I       L       Mochi   
 ole                            I       L       Olekha  
 olk                            I       E       Olkol   
@@ -5088,11 +5090,12 @@
 orz                            I       L       Ormu    
 osa    osa     osa             I       L       Osage   
 osc                            I       H       Oscan   
+osd                            I       L       Digor Ossetic   
 osi                            I       L       Osing   
 osn                            I       H       Old Sundanese   
 oso                            I       L       Ososo   
 osp                            I       H       Old Spanish     
-oss    oss     oss     os      I       L       Ossetian        
+oss    oss     oss     os      I       L       Iron Ossetic    
 ost                            I       L       Osatu   
 osu                            I       L       Southern One    
 osx                            I       H       Old Saxon       
@@ -5758,6 +5761,7 @@
 scv                            I       L       Sheni   
 scw                            I       L       Sha     
 scx                            I       H       Sicel   
+scz                            I       L       Shaetlan        
 sda                            I       L       Toraja-Sa'dan   
 sdb                            I       L       Shabak  
 sdc                            I       L       Sassarese Sardinian     
@@ -7651,7 +7655,6 @@
 yog                            I       L       Yogad   
 yoi                            I       L       Yonaguni        
 yok                            I       L       Yokuts  
-yol                            I       E       Yola    
 yom                            I       L       Yombe   
 yon                            I       L       Yongkom 
 yor    yor     yor     yo      I       L       Yoruba  
@@ -7833,7 +7836,7 @@
 zmm                            I       L       Marimanindji    
 zmn                            I       L       Mbangwe 
 zmo                            I       L       Molo    
-zmp                            I       L       Mpuono  
+zmp                            I       L       Mbuun   
 zmq                            I       L       Mituku  
 zmr                            I       L       Maranunggu      
 zms                            I       L       Mbesa   
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/iso639-2025.2.18/src/iso639/_data/iso-639-3_Name_Index.tab 
new/iso639-2025.11.16/src/iso639/_data/iso-639-3_Name_Index.tab
--- old/iso639-2025.2.18/src/iso639/_data/iso-639-3_Name_Index.tab      
2025-02-18 14:44:20.000000000 +0100
+++ new/iso639-2025.11.16/src/iso639/_data/iso-639-3_Name_Index.tab     
2025-11-16 22:45:07.000000000 +0100
@@ -378,6 +378,7 @@
 arz    Egyptian Arabic Arabic, Egyptian
 asa    Asu (Tanzania)  Asu (Tanzania)
 asb    Assiniboine     Assiniboine
+asb    Nakoda Assiniboine      Nakoda Assiniboine
 asc    Casuarina Coast Asmat   Asmat, Casuarina Coast
 ase    American Sign Language  American Sign Language
 asf    Auslan  Auslan
@@ -413,6 +414,7 @@
 atg    Ivbie North-Okpela-Arhe Ivbie North-Okpela-Arhe
 ati    Attié   Attié
 atj    Atikamekw       Atikamekw
+atj    Nehirowimowin   Nehirowimowin
 atk    Ati     Ati
 atl    Mt. Iraya Agta  Agta, Mt. Iraya
 atm    Ata     Ata
@@ -1340,6 +1342,7 @@
 ckz    Cakchiquel-Quiché Mixed Language        Cakchiquel-Quiché Mixed Language
 cla    Ron     Ron
 clc    Chilcotin       Chilcotin
+clc    Tsilhqot’in     Tsilhqot’in
 cld    Chaldean Neo-Aramaic    Neo-Aramaic, Chaldean
 cle    Lealao Chinantec        Chinantec, Lealao
 clh    Chilisso        Chilisso
@@ -1348,6 +1351,7 @@
 clk    Idu-Mishmi      Idu-Mishmi
 cll    Chala   Chala
 clm    Clallam Clallam
+clm    Klallam Klallam
 clo    Lowland Oaxaca Chontal  Chontal, Lowland Oaxaca
 cls    Classical Sanskrit      Classical Sanskrit
 clt    Lautu Chin      Chin, Lautu
@@ -2432,7 +2436,7 @@
 gza    Ganza   Ganza
 gzi    Gazi    Gazi
 gzn    Gane    Gane
-haa    Han     Han
+haa    Hän     Hän
 hab    Hanoi Sign Language     Hanoi Sign Language
 hac    Gurani  Gurani
 had    Hatam   Hatam
@@ -3042,6 +3046,7 @@
 kcg    Tyap    Tyap
 kch    Vono    Vono
 kci    Kamantan        Kamantan
+kci    Ngyian  Ngyian
 kcj    Kobiana Kobiana
 kck    Kalanga Kalanga
 kcl    Kala    Kala
@@ -3565,6 +3570,7 @@
 kwi    Awa-Cuaiquer    Awa-Cuaiquer
 kwj    Kwanga  Kwanga
 kwk    Kwakiutl        Kwakiutl
+kwk    Kwak'wala       Kwak'wala
 kwl    Kofyar  Kofyar
 kwm    Kwambi  Kwambi
 kwn    Kwangali        Kwangali
@@ -4217,7 +4223,7 @@
 mhk    Mungaka Mungaka
 mhl    Mauwake Mauwake
 mhm    Makhuwa-Moniga  Makhuwa-Moniga
-mhn    Mócheno Mócheno
+mhn    Mòcheno Mòcheno
 mho    Mashi (Zambia)  Mashi (Zambia)
 mhp    Balinese Malay  Malay, Balinese
 mhq    Mandan  Mandan
@@ -4804,6 +4810,7 @@
 neu    Neo     Neo
 nev    Nyaheun Nyaheun
 new    Nepal Bhasa     Bhasa, Nepal
+new    Newar   Newar
 new    Newari  Newari
 nex    Neme    Neme
 ney    Neyo    Neyo
@@ -5202,6 +5209,8 @@
 nzz    Nanga Dama Dogon        Dogon, Nanga Dama
 oaa    Orok    Orok
 oac    Oroch   Oroch
+oak    Noakhailla      Noakhailla
+oak    Noakhali        Noakhali
 oar    Ancient Aramaic (up to 700 BCE) Aramaic, Ancient (up to 700 BCE)
 oar    Old Aramaic (up to 700 BCE)     Aramaic, Old (up to 700 BCE)
 oav    Old Avar        Avar, Old
@@ -5266,6 +5275,7 @@
 okx    Okpe (Northwestern Edo) Okpe (Northwestern Edo)
 okz    Old Khmer       Khmer, Old
 ola    Walungge        Walungge
+olb    Oli-Bodiman     Oli-Bodiman
 old    Mochi   Mochi
 ole    Olekha  Olekha
 olk    Olkol   Olkol
@@ -5338,10 +5348,16 @@
 orz    Ormu    Ormu
 osa    Osage   Osage
 osc    Oscan   Oscan
+osd    Digor   Digor
+osd    Digor Ossetian  Ossetian, Digor
+osd    Digor Ossetic   Ossetic, Digor
 osi    Osing   Osing
 osn    Old Sundanese   Sundanese, Old
 oso    Ososo   Ososo
 osp    Old Spanish     Spanish, Old
+oss    Iron    Iron
+oss    Iron Ossetian   Ossetian, Iron
+oss    Iron Ossetic    Ossetic, Iron
 oss    Ossetian        Ossetian
 oss    Ossetic Ossetic
 ost    Osatu   Osatu
@@ -5738,7 +5754,7 @@
 pyy    Pyen    Pyen
 pze    Pesse   Pesse
 pzh    Pazeh   Pazeh
-pzn    Jejara Naga     Jejara Naga
+pzn    Jejara Naga     Naga, Jejara
 pzn    Para Naga       Naga, Para
 qua    Quapaw  Quapaw
 qub    Huallaga Huánuco Quechua        Quechua, Huallaga Huánuco
@@ -6043,6 +6059,7 @@
 scv    Sheni   Sheni
 scw    Sha     Sha
 scx    Sicel   Sicel
+scz    Shaetlan        Shaetlan
 sda    Toraja-Sa'dan   Toraja-Sa'dan
 sdb    Shabak  Shabak
 sdc    Sassarese Sardinian     Sardinian, Sassarese
@@ -6066,6 +6083,7 @@
 sea    Semai   Semai
 seb    Shempire Senoufo        Senoufo, Shempire
 sec    Sechelt Sechelt
+sec    She shashishalhem       She shashishalhem
 sed    Sedang  Sedang
 see    Seneca  Seneca
 sef    Cebaara Senoufo Senoufo, Cebaara
@@ -6130,6 +6148,7 @@
 shp    Shipibo-Conibo  Shipibo-Conibo
 shq    Sala    Sala
 shr    Shi     Shi
+shs    Secwepemctsín   Secwepemctsín
 shs    Shuswap Shuswap
 sht    Shasta  Shasta
 shu    Chadian Arabic  Arabic, Chadian
@@ -6335,6 +6354,7 @@
 sqr    Siculo Arabic   Arabic, Siculo
 sqs    Sri Lankan Sign Language        Sri Lankan Sign Language
 sqt    Soqotri Soqotri
+squ    Sḵwx̱wú7mesh sníchim    Sḵwx̱wú7mesh sníchim
 squ    Squamish        Squamish
 sqx    Kufr Qassem Sign Language (KQSL)        Kufr Qassem Sign Language (KQSL)
 sra    Saruga  Saruga
@@ -6668,11 +6688,14 @@
 thl    Dangaura Tharu  Tharu, Dangaura
 thm    Aheu    Aheu
 thn    Thachanadan     Thachanadan
+thp    Nłeʔkepmxcín    Nłeʔkepmxcín
 thp    Thompson        Thompson
+thp    Thompson River Salish   Salish, Thompson River
 thq    Kochila Tharu   Tharu, Kochila
 thr    Rana Tharu      Tharu, Rana
 ths    Thakali Thakali
 tht    Tahltan Tahltan
+tht    Tāłtān        Tāłtān
 thu    Thuri   Thuri
 thv    Tahaggart Tamahaq       Tamahaq, Tahaggart
 thy    Tha     Tha
@@ -8011,7 +8034,6 @@
 yog    Yogad   Yogad
 yoi    Yonaguni        Yonaguni
 yok    Yokuts  Yokuts
-yol    Yola    Yola
 yom    Yombe   Yombe
 yon    Yongkom Yongkom
 yor    Yoruba  Yoruba
@@ -8201,7 +8223,7 @@
 zmm    Marramaninyshi  Marramaninyshi
 zmn    Mbangwe Mbangwe
 zmo    Molo    Molo
-zmp    Mpuono  Mpuono
+zmp    Mbuun   Mbuun
 zmq    Mituku  Mituku
 zmr    Maranunggu      Maranunggu
 zms    Mbesa   Mbesa
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/iso639-2025.2.18/src/iso639/_data/iso-639-3_Retirements.tab 
new/iso639-2025.11.16/src/iso639/_data/iso-639-3_Retirements.tab
--- old/iso639-2025.2.18/src/iso639/_data/iso-639-3_Retirements.tab     
2025-02-18 14:44:20.000000000 +0100
+++ new/iso639-2025.11.16/src/iso639/_data/iso-639-3_Retirements.tab    
2025-11-16 22:45:07.000000000 +0100
@@ -1,5 +1,5 @@
 Id     Ref_Name        Ret_Reason      Change_To       Ret_Remedy      
Effective
-fri    Western Frisian C       fry             2007-02-01
+fri    Western Frisian C       fry             2005-11-16
 auv    Auvergnat       M       oci             2007-03-14
 gsc    Gascon  M       oci             2007-03-14
 lms    Limousin        M       oci             2007-03-14
@@ -18,7 +18,6 @@
 mzf    Aiku    S               Split into four languages: Ambrak [aag]; Yangum 
Dey [yde]; Yangum Gel [ygl]; Yangum Mon [ymo]   2007-07-18
 nhj    Tlalitzlipa Nahuatl     M       nhi             2007-07-18
 nhs    Southeastern Puebla Nahuatl     S               Split into Sierra Negra 
Nahuatl [nsu] and Southeastern Puebla Nahuatl [npl]     2007-07-18
-occ    Occidental      D       ile             2007-07-18
 tmx    Tomyang M       ybi             2007-07-18
 tot    Patla-Chicontla Totonac S               Split into Upper Necaxa Totonac 
[tku] and Tecpatlán Totonac [tcw]       2007-07-18
 xmi    Miarrã  N                       2007-07-18
@@ -27,6 +26,7 @@
 atf    Atuence N                       2007-08-10
 bqe    Navarro-Labourdin Basque        M       eus             2007-08-10
 bsz    Souletin Basque M       eus             2007-08-10
+occ    Occidental      D       ile             2007-12-07
 aex    Amerax  M       eng             2008-01-14
 ahe    Ahe     M       knx             2008-01-14
 aiz    Aari    S               Split into Aari [aiw] (new identifier) and 
Gayil [gyl]  2008-01-14
@@ -169,21 +169,21 @@
 drh    Darkhat M       khk             2010-01-18
 drw    Darwazi M       prs             2010-01-18
 gav    Gabutamon       M       dev             2010-01-18
-mof    Mohegan-Montauk-Narragansett    S               split into 
Mohegan-Pequot [xpq] and Narragansett [xnt]  2010-01-18
+mof    Mohegan-Montauk-Narragansett    S               Split into 
Mohegan-Pequot [xpq] and Narragansett [xnt]  2010-01-18
 mst    Cataelano Mandaya       M       mry             2010-01-18
 myt    Sangab Mandaya  M       mry             2010-01-18
-rmr    Caló    S               split into Caló [rmq] and Erromintxela [emx]    
2010-01-18
-sgl    Sanglechi-Ishkashimi    S               split into Sanglechi [sgy] and 
Ishkashimi [isk] 2010-01-18
+rmr    Caló    S               Split into Caló [rmq] and Erromintxela [emx]    
2010-01-18
+sgl    Sanglechi-Ishkashimi    S               Split into Sanglechi [sgy] and 
Ishkashimi [isk] 2010-01-18
 sul    Surigaonon      S               Split into Tandaganon [tgn] and 
Surigaonon [sgd] (new identifier)       2010-01-18
 sum    Sumo-Mayangna   S               Split into Mayangna [yan] and Ulwa 
[ulw]        2010-01-18
 tnf    Tangshewi       M       prs             2010-01-18
 wgw    Wagawaga        S               Split into Yaleba [ylb] and Wagawaga 
[wgb] (new identifier)     2010-01-18
 ayx    Ayi (China)     D       nun             2011-05-18
-bjq    Southern Betsimisaraka Malagasy S               split into Southern 
Betsimisaraka [bzc] and Tesaka Malagasy [tkg]       2011-05-18
+bjq    Southern Betsimisaraka Malagasy S               Split into Southern 
Betsimisaraka [bzc] and Tesaka Malagasy [tkg]       2011-05-18
 dha    Dhanwar (India) N                       2011-05-18
-dkl    Kolum So Dogon  S               split into Ampari Dogon [aqd] and Mombo 
Dogon [dmb]     2011-05-18
+dkl    Kolum So Dogon  S               Split into Ampari Dogon [aqd] and Mombo 
Dogon [dmb]     2011-05-18
 mja    Mahei   N                       2011-05-18
-nbf    Naxi    S               split into Naxi [nxq] and Narua [nru]   
2011-05-18
+nbf    Naxi    S               Split into Naxi [nxq] and Narua [nru]   
2011-05-18
 noo    Nootka  S               Split into [dtd] Ditidaht and [nuk] 
Nuu-chah-nulth      2011-05-18
 tie    Tingal  M       ras             2011-05-18
 tkk    Takpa   D       twm             2011-05-18
@@ -195,15 +195,14 @@
 dwl    Walo Kumbe Dogon        S               Split into Dogon, Bankan Tey 
(Walo) [dbw]  and Dogon, Ben Tey (Beni) [dbt]      2012-02-03
 elp    Elpaputih       N                       2012-02-03
 gbc    Garawa  S               Split into Garrwa [wrk] and Wanyi [wny] 
2012-02-03
-gio    Gelao   S               Split into Qau [gqu] and A'ou [aou] with some 
going to Green Gelao [gig], some to Red Gelao [gir], and some to White Gelao 
[giw]        2012-02-03
+gio    Gelao   S               Split into Qau [gqu] and A'ou [aou]     
2012-02-03
 hrr    Horuru  M       jal             2012-02-03
 ibi    Ibilo   M       opa             2012-02-03
-jar    Jarawa (Nigeria)        S               split into Gwak [jgk] and 
Bankal [jjr]  2012-02-03
-kdv    Kado    S               split into Kadu [zkd] and Kanan [zkn]   
2012-02-03
+jar    Jarawa (Nigeria)        S               Split into Gwak [jgk] and 
Bankal [jjr]  2012-02-03
+kdv    Kado    S               Split into Kadu [zkd] and Kanan [zkn]   
2012-02-03
 kgh    Upper Tanudan Kalinga   M       kml             2012-02-03
 kpp    Paku Karen      S               Split into Paku Karen [jkp] and Mobwa 
Karen [jkm]       2012-02-03
 kzh    Kenuzi-Dongola  S               Split into Andaandi (Dongolawi) [dgl] 
and Kenzi (Mattoki) [xnz] 2012-02-03
-lcq    Luhu    M       ppr             2012-02-03
 mgx    Omati   S               Split into Barikewa [jbk] and Mouwase [jmw]     
2012-02-03
 nln    Durango Nahuatl S               Split into Eastern Durango Nahuatl 
[azd] and Western Durango Nahuatl [azn]      2012-02-03
 pbz    Palu    N                       2012-02-03
@@ -248,7 +247,6 @@
 bmy    Bemba (Democratic Republic of Congo)    N                       
2015-01-12
 bxx    Borna (Democratic Republic of Congo)    N                       
2015-01-12
 byy    Buya    N                       2015-01-12
-dzd    Daza    N                       2015-01-12
 gfx    Mangetti Dune ǃXung     M       vaj             2015-01-12
 gti    Gbati-ri        M       nyc             2015-01-12
 ime    Imeraguen       N                       2015-01-12
@@ -265,7 +263,6 @@
 thx    The     D       oyb             2015-01-12
 tsf    Southwestern Tamang     M       taj             2015-01-12
 uok    Uokha   M       ema             2015-01-12
-xsj    Subi    D       suj             2015-01-12
 yds    Yiddish Sign Language   N                       2015-01-12
 ymt    Mator-Taygi-Karagas     D       mtm             2015-01-12
 ynh    Yangho  N                       2015-01-12
@@ -276,9 +273,9 @@
 coy    Coyaima M       pij             2016-01-15
 cqu    Chilean Quechua M       quh             2016-01-15
 cum    Cumeral N                       2016-01-15
-duj    Dhuwal  S               split into [dwu] Dhuwal and [dwy] Dhuwaya       
2016-01-15
+duj    Dhuwal  S               Split into [dwu] Dhuwal and [dwy] Dhuwaya       
2016-01-15
 ggn    Eastern Gurung  M       gvr             2016-01-15
-ggo    Southern Gondi  S               split into [esg] Aheri Gondi and [wsg] 
Adilabad Gondi   2016-01-15
+ggo    Southern Gondi  S               Split into [esg] Aheri Gondi and [wsg] 
Adilabad Gondi   2016-01-15
 guv    Gey     M       duz             2016-01-15
 iap    Iapama  N                       2016-01-15
 ill    Iranun  S               Split into Iranun (Philippines) [ilp] and 
Iranun (Malaysia) [ilm]       2016-01-15
@@ -349,7 +346,7 @@
 sdm    Semandang       S               Split into Semandang [sdq], Beginci 
[ebc] and Gerai [gef]       2020-01-23
 tbb    Tapeba  N                       2020-01-23
 xrq    Karranga        M       dmw             2020-01-23
-xtz    Tasmanian       S               Split into [xpv] Northern Tasman,  
[xph] North Midlands Tasman, [xpb] Northeastern Tasman, [xpd] Oyster Bay 
Tasmanian, [xpf] Southeast Tasma, [xpx] Southwestern Tasman, [xpw] Northwestern 
Tasman., [xpl] Port Sorell Tasman. and [xpz] Bruny Island Tasman.   2020-01-23
+xtz    Tasmanian       S               Split into [xpv] Northern Tasman,  
[xph] North Midlands Tasman, [xpb] Northeastern Tasman, [xpd] Oyster Bay 
Tasman, [xpf] Southeast Tasman, [xpx] Southwestern Tasman, [xpw] Northwestern 
Tasman, [xpl] Port Sorell Tasman, and [xpz] Bruny Island Tasman       2020-01-23
 zir    Ziriya  D       scv             2020-01-23
 thw    Thudam  M       ola             2020-03-19
 bic    Bikaru  M       bir             2021-01-15
@@ -361,7 +358,7 @@
 pat    Papitalai       M       kxr             2021-01-15
 vki    Ija-Zuba        S               Split into Koro Nulu [vkn] and Koro 
Zuba [vkz]  2021-01-15
 wra    Warapu  S               Split into Bauni [bpe], Uni [uni] and Bouni 
[suo]       2021-01-15
-ajt    Judeo-Tunisian Arabic   D       aeb             2022-01-20
+ajt    Judeo-Tunisian Arabic   M       aeb             2022-01-20
 cug    Chungmboko      S               Split into Chung [cnq] and Mbuk [bpc]   
2022-01-20
 lak    Laka (Nigeria)  M       ksp             2022-01-20
 lno    Lango (South Sudan)     S               Split into Lango [lgo], Imotong 
[imt], Logir [lqr] and Okolie [oie]     2022-01-20
@@ -373,7 +370,9 @@
 wya    Wyandot S               Split into Wyandot [wyn] and Wendat [wdt]       
2022-01-20
 ajp    South Levantine Arabic  M       apc             2023-01-20
 kgm    Karipúna        D       plu             2023-01-20
+ksa    Shuwa-Zamani    S               Split into [rsw] Rishiwa and [izm] 
Kizamani     2023-01-20
 nom    Nocamán M       cbr             2023-01-20
+plj    Polci   S               Split into Pesse [pze], Nyamzak-Dir-Mbarimi 
[nzr], Zul [zlu], and Buli [uly]    2023-01-20
 pmk    Pamlico M       crr             2023-01-20
 prp    Parsi   M       guj             2023-01-20
 slq    Salchuq N                       2023-01-20
@@ -383,7 +382,6 @@
 xss    Assan   M       zko             2023-01-20
 zkb    Koibal  D       kjh             2023-01-20
 zua    Zeem    S               Split into [tvi] Tulai, [dyr] Dyarim, [dsk] 
Dokshi, [cxh] Cha'ari, and [zem] Zeem       2023-01-20
-ksa    Shuwa-Zamani    S               Split into [rsw] Rishiwa and [izm] 
Kizamani     2023-01-23
-plj    Polci   S               Split into Pesse [pze], Nyamzak-Dir-Mbarimi 
[nzr], Zul [zlu], and Buli [uly]    2023-01-23
-dek    Dek     D       sqm             2024-09-09
-nte    Nathembo        M       eko             2024-09-09
+dek    Dek     D       sqm             2024-10-15
+nte    Nathembo        M       eko             2024-10-15
+yol    Yola    M       enm             2025-10-15
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iso639-2025.2.18/src/iso639/language.py 
new/iso639-2025.11.16/src/iso639/language.py
--- old/iso639-2025.2.18/src/iso639/language.py 2025-02-18 14:44:20.000000000 
+0100
+++ new/iso639-2025.11.16/src/iso639/language.py        2025-11-16 
22:45:07.000000000 +0100
@@ -5,7 +5,7 @@
 import datetime
 from dataclasses import dataclass
 
-from typing import Dict, List, NoReturn, Optional, Union, Set
+from typing import NoReturn
 
 from ._data import (
     _PART3_TO_CODES,
@@ -26,10 +26,7 @@
 )
 
 
-_STRING_CLEANING_FUNCS = [
-    lambda x: x.strip().lower(),
-    lambda x: x.strip().title(),
-]
+_STRING_CLEANING_FUNCS = [lambda x: x.lower(), lambda x: x.title()]
 
 
 class LanguageNotFoundError(Exception):
@@ -73,31 +70,26 @@
 
     # From the "codes" table
     part3: str
-    # Although Union[..., None] and Optional[...] are equivalent, I prefer 
Union.
-    # Optional simply doesn't sound right, as it would imply that the 
attribute in
-    # question is optional, which it's not.
-    # When support for Python 3.9 is dropped, we will switch to the pipe syntax
-    # for `... | None`.
-    part2b: Union[str, None]
-    part2t: Union[str, None]
-    part1: Union[str, None]
+    part2b: str | None
+    part2t: str | None
+    part1: str | None
     scope: str
-    type: Union[str, None]
+    type: str | None
     status: str
     name: str
-    comment: Union[str, None]
+    comment: str | None
 
     # From the "name_index" table
-    other_names: Union[List[Name], None]
+    other_names: list[Name] | None
 
     # From the "macrolanguages" table
-    macrolanguage: Union[str, None]
+    macrolanguage: str | None
 
     # From the "retirements" table
-    retire_reason: Union[str, None]
-    retire_change_to: Union[str, None]
-    retire_remedy: Union[str, None]
-    retire_date: Union[datetime.date, None]
+    retire_reason: str | None
+    retire_change_to: str | None
+    retire_remedy: str | None
+    retire_date: datetime.date | None
 
     def __hash__(self) -> int:
         return hash(self.part3)
@@ -106,17 +98,19 @@
         return isinstance(other, Language) and self.part3 == other.part3
 
     @classmethod
-    def match(cls, user_input: str, /, *, exact: bool = False) -> Language:
+    def match(cls, user_input: str, /, *, strict_case: bool = True) -> 
Language:
         """Return a ``Language`` instance by matching on the user input.
 
         Parameters
         ----------
         user_input : str
             A language code or name.
-        exact : bool, optional
-            Whether to enforce exact matching against the user input.
-            Defaults to `False`. If `False`, matching is case-insensitive
-            and ignores leading/trailing whitespace.
+        strict_case : bool, optional
+            Defaults to ``True``, for enforcing strict case sensitivity.
+            If ``False`` and if ``user_input`` doesn't find a match,
+            further match attempts will be made with the all-lowercase version 
of
+            ``user_input`` (``"foobar"``) and the title-case version of 
``user_input``
+            (``"Foobar"``).
 
         Returns
         -------
@@ -140,7 +134,7 @@
         # Order of columns to query the data tables.
         # Bias towards (and therefore prioritize) the user input being
         # a language code rather than a language name.
-        query_order: List[_COLUMN_TYPE] = [
+        query_order: list[_COLUMN_TYPE] = [
             _CodesColumn.ID,
             _CodesColumn.PART2B,
             _CodesColumn.PART2T,
@@ -150,7 +144,7 @@
             _NameIndexColumn.PRINT_NAME,
             _NameIndexColumn.INVERTED_NAME,
         ]
-        return _PART3_TO_LANGUAGES[_get_part3(user_input, query_order, exact)]
+        return _PART3_TO_LANGUAGES[_get_part3(user_input, query_order, 
strict_case)]
 
     @classmethod
     def from_part3(cls, user_input: str, /) -> Language:
@@ -177,7 +171,7 @@
     @classmethod
     def from_name(cls, user_input: str, /) -> Language:
         """Return a ``Language`` instance from an ISO 639-3 reference language 
name."""
-        query_order: List[_COLUMN_TYPE] = [
+        query_order: list[_COLUMN_TYPE] = [
             _CodesColumn.REF_NAME,
             _NameIndexColumn.PRINT_NAME,
             _NameIndexColumn.INVERTED_NAME,
@@ -190,7 +184,7 @@
 
 
 def _get_part3(
-    user_input: str, query_order: List[_COLUMN_TYPE], exact: bool = True
+    user_input: str, query_order: list[_COLUMN_TYPE], strict_case: bool = True
 ) -> str:
     """Get the part 3 code of a language.
 
@@ -200,9 +194,12 @@
         The user-provided language code or name.
     query_order : List[_COLUMN_TYPE]
         A list of columns to specify query order.
-    exact : bool, optional
-        Whether to enforce exact matching against the user input. Defaults to 
`True`.
-        If `False`, basic string cleaning is applied to the user input.
+    strict_case : bool, optional
+        Defaults to ``True``, for enforcing strict case sensitivity.
+        If ``False`` and if ``user_input`` doesn't find a match,
+        further match attempts will be made with the all-lowercase version of
+        ``user_input`` (``"foobar"``) and the title-case version of 
``user_input``
+        (``"Foobar"``).
 
     Returns
     -------
@@ -216,7 +213,7 @@
     try:
         return _get_part3_exact(user_input, query_order)
     except LanguageNotFoundError as e:
-        if exact:
+        if strict_case:
             raise e
         else:
             for func in _STRING_CLEANING_FUNCS:
@@ -230,8 +227,8 @@
 
 def _get_part3_exact(
     user_input: str,
-    query_order: List[_COLUMN_TYPE],
-    original_user_input: Optional[str] = None,
+    query_order: list[_COLUMN_TYPE],
+    original_user_input: str | None = None,
 ) -> str:
     """Get the part 3 code of a language.
 
@@ -239,7 +236,7 @@
     ----------
     user_input : str
         The user-provided language code or name.
-    query_order : List[_COLUMN_TYPE]
+    query_order : list[_COLUMN_TYPE]
         A list of columns to specify query order.
     original_user_input : str, optional
         The original user input. Default is `None`.
@@ -254,7 +251,8 @@
     LanguageNotFoundError
         If `part3` isn't a language name or code
     """
-    part3: Union[str, None] = None
+    user_input = user_input.strip()
+    part3: str | None = None
     for column in query_order:
         if column == _CodesColumn.ID:
             if user_input in _PART3_TO_CODES:
@@ -307,7 +305,7 @@
         else from_retirements[_RetirementsColumn.REF_NAME]  # type: ignore
     )
 
-    other_names: Union[List[Name], None] = []
+    other_names: list[Name] | None = []
     for row in _PART3_TO_NAME_INDEX.get(part3, []):
         p, i = row[_NameIndexColumn.PRINT_NAME], 
row[_NameIndexColumn.INVERTED_NAME]
         if not ref_name == p == i:
@@ -370,7 +368,7 @@
     return language
 
 
-def _get_all_languages() -> Dict[str, Language]:
+def _get_all_languages() -> dict[str, Language]:
     languages = {}
     for part3 in _PART3_TO_CODES:
         languages[part3] = _get_language(part3)
@@ -379,6 +377,6 @@
     return languages
 
 
-_PART3_TO_LANGUAGES: Dict[str, Language] = _get_all_languages()
+_PART3_TO_LANGUAGES: dict[str, Language] = _get_all_languages()
 
-ALL_LANGUAGES: Set[Language] = set(_PART3_TO_LANGUAGES.values())
+ALL_LANGUAGES: set[Language] = set(_PART3_TO_LANGUAGES.values())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/iso639-2025.2.18/tests/test_language.py 
new/iso639-2025.11.16/tests/test_language.py
--- old/iso639-2025.2.18/tests/test_language.py 2025-02-18 14:44:20.000000000 
+0100
+++ new/iso639-2025.11.16/tests/test_language.py        2025-11-16 
22:45:07.000000000 +0100
@@ -7,9 +7,10 @@
 
 
 @pytest.mark.parametrize(
-    "user_input, exact, expected_part3",
+    "user_input, strict_case, expected_part3",
     [
         ("fra", True, "fra"),
+        (" fra  ", True, "fra"),
         ("fra", False, "fra"),
         ("FRA", True, None),
         ("FRA", False, "fra"),
@@ -28,12 +29,38 @@
         ("Castilian", True, "spa"),
     ],
 )
-def test_match(user_input, exact, expected_part3):
+def test_match(user_input, strict_case, expected_part3):
     if expected_part3 is None:
         with pytest.raises(LanguageNotFoundError):
-            Language.match(user_input, exact=exact)
+            Language.match(user_input, strict_case=strict_case)
     else:
-        actual_part3 = Language.match(user_input, exact=exact).part3
+        actual_part3 = Language.match(user_input, 
strict_case=strict_case).part3
+        assert actual_part3 == expected_part3
+
+
[email protected](
+    "user_input, expected_part3",
+    [
+        ("fra", "fra"),
+        (" fra  ", "fra"),
+        ("FRA", None),
+        (" FRA  ", None),
+        ("Fra", None),
+        (" Fra  ", None),
+        ("French", "fra"),
+        ("FRENCH", None),
+        (" FRENCH  ", None),
+        ("french", None),
+        (" french  ", None),
+        ("Castilian", "spa"),
+    ],
+)
+def test_match_no_strict_case_kwarg(user_input, expected_part3):
+    if expected_part3 is None:
+        with pytest.raises(LanguageNotFoundError):
+            Language.match(user_input)
+    else:
+        actual_part3 = Language.match(user_input).part3
         assert actual_part3 == expected_part3
 
 
@@ -105,12 +132,15 @@
 
 
 def test_data_last_updated():
-    assert DATA_LAST_UPDATED == datetime.date(2025, 1, 15), "Need to update 
README.md"
+    assert DATA_LAST_UPDATED == datetime.date(2025, 10, 15), "Need to update 
README.md"
 
 
 def test_all_languages():
     assert type(ALL_LANGUAGES) is set
-    assert len(ALL_LANGUAGES) == 8307, "Need to update README.md"
+    # Defining `len_all_languages` so that when the assertion fails,
+    # the error message is more informative.
+    len_all_languages = len(ALL_LANGUAGES)
+    assert len_all_languages == 8311, "Need to update README.md"
     lang = list(ALL_LANGUAGES)[0]
     assert type(lang) is Language
 

Reply via email to