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