python-stdnum branch master updated. 2.1-6-g843bbec
[
Date Prev][Date Next]
[
Thread Prev][Thread Next]
python-stdnum branch master updated. 2.1-6-g843bbec
- From: Commits of the python-stdnum project <python-stdnum-commits [at] lists.arthurdejong.org>
- To: python-stdnum-commits [at] lists.arthurdejong.org
- Reply-to: python-stdnum-users [at] lists.arthurdejong.org, python-stdnum-commits [at] lists.arthurdejong.org
- Subject: python-stdnum branch master updated. 2.1-6-g843bbec
- Date: Thu, 14 Aug 2025 16:42:13 +0200 (CEST)
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "python-stdnum".
The branch, master has been updated
via 843bbece41aa12b8d3557d2c83ed7de124e359bb (commit)
from deb0db15da3795bf9d7cf5213e6fdbac6f2407f9 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
https://arthurdejong.org/git/python-stdnum/commit/?id=843bbece41aa12b8d3557d2c83ed7de124e359bb
commit 843bbece41aa12b8d3557d2c83ed7de124e359bb
Author: Arthur de Jong <arthur@arthurdejong.org>
Date: Thu Aug 14 16:29:38 2025 +0200
Add validation of country code in BIC
Closes https://github.com/arthurdejong/python-stdnum/issues/482
diff --git a/stdnum/bic.py b/stdnum/bic.py
index 54b311c..cb82c23 100644
--- a/stdnum/bic.py
+++ b/stdnum/bic.py
@@ -1,7 +1,7 @@
# bic.py - functions for handling ISO 9362 Business identifier codes
#
# Copyright (C) 2015 Lifealike Ltd
-# Copyright (C) 2017-2018 Arthur de Jong
+# Copyright (C) 2017-2025 Arthur de Jong
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -28,6 +28,10 @@ The code consists of a 4 letter institution code, a 2 letter
country code,
and a 2 character location code, optionally followed by a three character
branch code.
+More information:
+
+* https://en.wikipedia.org/wiki/ISO_9362
+
>>> validate('AGRIFRPP882')
'AGRIFRPP882'
>>> validate('ABNA BE 2A')
@@ -55,7 +59,35 @@ from stdnum.exceptions import *
from stdnum.util import clean
-_bic_re = re.compile(r'^[A-Z]{6}[0-9A-Z]{2}([0-9A-Z]{3})?$')
+_bic_re =
re.compile(r'^[A-Z]{4}(?P<country_code>[A-Z]{2})[0-9A-Z]{2}([0-9A-Z]{3})?$')
+
+
+# Valid BIC country codes are ISO 3166-1 alpha-2 with the addition of
+# XK for the Republic of Kosovo
+# It seems that some of the countries included here don't currently have
+# any banks with a BIC code (e.g. Antarctica, Iran, Myanmar)
+_country_codes = {
+ 'AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT',
'AU',
+ 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ',
'BL',
+ 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', 'CA',
'CC',
+ 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU',
'CV',
+ 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', 'EE',
'EG',
+ 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB',
'GD',
+ 'GE', 'GF', 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS',
'GT',
+ 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE', 'IL',
'IM',
+ 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM', 'JO', 'JP', 'KE', 'KG',
'KH',
+ 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI',
'LK',
+ 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG',
'MH',
+ 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV',
'MW',
+ 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP',
'NR',
+ 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN',
'PR',
+ 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW', 'SA', 'SB',
'SC',
+ 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR',
'SS',
+ 'ST', 'SV', 'SX', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK',
'TL',
+ 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', 'US',
'UY',
+ 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', 'WF', 'WS', 'XK', 'YE',
'YT',
+ 'ZA', 'ZM', 'ZW',
+}
def compact(number: str) -> str:
@@ -73,6 +105,8 @@ def validate(number: str) -> str:
match = _bic_re.search(number)
if not match:
raise InvalidFormat()
+ if match.group('country_code') not in _country_codes:
+ raise InvalidComponent()
return number
diff --git a/tests/test_bic.doctest b/tests/test_bic.doctest
new file mode 100644
index 0000000..90b63c6
--- /dev/null
+++ b/tests/test_bic.doctest
@@ -0,0 +1,443 @@
+test_bic.doctest - more detailed doctests for stdnum.bic module
+
+Copyright (C) 2025 Arthur de Jong
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA
+
+
+This file contains more detailed doctests for the stdnum.bic module. It
+tries to test more corner cases and detailed functionality that is not
+really useful as module documentation.
+
+>>> from stdnum import bic
+
+
+Test for invalid country codes.
+
+>>> bic.validate('MULTIPLE') # IP is not a valid country code
+Traceback (most recent call last):
+ ...
+InvalidComponent: ...
+
+
+These have been found online and should all be valid numbers.
+
+>>> numbers = '''
+...
+... ABNCNL2AGIR
+... ABNNSVS2
+... ABOCCNBJ270
+... ABOCKRSE
+... ACGDGDGD
+... ADECCH2G
+... AFDBCIABNPD
+... AFGMMGMG
+... AFROGB2L
+... AGBMDEMM
+... AGRIGPGX
+... AGTBIDJA
+... AGUBDZAL
+... AHCDDOS2
+... AIEPSGSGIWC
+... AIRRHKHH
+... AIYLKG22
+... ALCVLBBE
+... ALFXAEAD
+... ALLFLULLAFI
+... ANCEAOLU
+... ANDLTRISTUZ
+... ANIKAM22
+... ANZBSBSB
+... ANZBTONN
+... APDEVAVA
+... ARABBHBM
+... ARABJOAX
+... ARABPS22600
+... ARCGITMA
+... ARECAM22
+... AREXGHAC
+... ARUBAWAX
+... ARUNTJ22
+... ARVDTJ22
+... ASBBNZ2A
+... ASCMPKKA002
+... ASPMMYKL
+... ATBJBJBJ
+... ATGWGWGW
+... ATTGTGTG
+... AUDBLBBX
+... AUIVAU2S
+... AVALUAUK
+... AWXLLT22
+... AXCWKWKW
+... AXISINBB389
+... AXSBBMHM
+... AZAMZMLU
+... AZRTAZ22
+... BAIPCVCV
+... BANOGLG2
+... BAPRNIMA
+... BARBFJFJ
+... BARBKENAKIS
+... BARBSCSC
+... BARCSCSC
+... BAVDCVCP
+... BBDEBRSPBGS
+... BBICCWCW
+... BBONKYKY
+... BBVATWTP
+... BCAOMLBASIK
+... BCAOSNDP
+... BCBATCGP
+... BCBHDOSD
+... BCBTBZBZ
+... BCEXCOBB
+... BCKICKCR
+... BCOMMOMX
+... BCOMPTPL
+... BCPLBOLXSCZ
+... BCPOMAMCBRK
+... BCTLTLDA
+... BCYPCY2N
+... BDACEGCA084
+... BDGEGNGN
+... BDINIDJATPC
+... BEACGQGQ
+... BFCORERX
+... BFCOYTYT
+... BFMXAOLU
+... BGFICMCX
+... BGFIGALI
+... BHELSHJJ
+... BIBDBNBB
+... BICCKMKM
+... BICVNENI
+... BIMOMZMXFIN
+... BJAZSAJE002
+... BKAUATWWWOL
+... BKCHCNBJ260
+... BKCHJPJTOTM
+... BKIDJPJTOSK
+... BKIGRWRW
+... BKIRKIKI
+... BKKBHKHHMTG
+... BKKBKHPP
+... BKMOMSMS
+... BKNNSMSM
+... BLFLLI2X225
+... BMCEMAMCCOR
+... BMILHNTE
+... BMOCMZMP
+... BNDCCAMMVAL
+... BNEVKNNE
+... BNGRGRAACON
+... BNPAFRPPAUX
+... BNPAMQMX
+... BNPANCNXKOU
+... BNPARERXPOR
+... BNPASARI
+... BNRWRWRW
+... BOFAIE3XFUT
+... BOMDMH22
+... BOSPCKCR
+... BPKOROBU
+... BPNGPGPM
+... BPOLPFTP
+... BPUNPKKACRU
+... BRASPYPX
+... BREDFJFJ
+... BREDVUVU
+... BRHAHTPP
+... BRMXNENI
+... BSANADAD
+... BSAPPEPL
+... BSLJSI2XATM
+... BSLULCLC
+... BSUPARBATIT
+... BTRLRO22BNA
+... BTVAAT22KIB
+... BUNONIMA
+... CABARS22
+... CAGLESMMVIG
+... CBAOBFBG
+... CBBSBA2A
+... CBCUUYMMGPA
+... CBCYCY2NPMT
+... CBGIGYGG
+... CBININBI
+... CBKNNANAPCH
+... CBKUKWKWBOD
+... CBLELSMX
+... CBOMOMRU
+... CBSISBSB
+... CCEICMCXDLA
+... CCIOCRSJBBI
+... CDCGWF2M
+... CDERCLRG
+... CDISALTR
+... CDSOGTG2
+... CEPANCNM
+... CESUUAU2
+... CGDITLDI
+... CHASARBA
+... CHASPHMMOBU
+... CHASTHBX
+... CHGLVGVG
+... CIBEEGCX166
+... CITCCWCU
+... CITGUS44EHP
+... CITINGLA
+... CLMDMGMG
+... CMBAAWAX
+... CMWBDMDM
+... CNBTIMDD
+... CNVXBMHM
+... COEBLALA
+... COFDPEPL
+... CORIMLBA
+... CPITMNUB
+... CRDAADAD
+... CRESCHZZ12Q
+... CRTUGE22086
+... CSDLLT22
+... CTCBTWTP012
+... DABAFIHHHAM
+... DABAIE2D917
+... DBLNBJBJ
+... DEUTESBBAP2
+... DFLTTTPS
+... DIETMCMC
+... DIKIBTBBORO
+... DKNBDKKKPLL
+... DOHBQAQAWBB
+... DVKAKZKA
+... EBAPFRPS
+... ECAAKYK2
+... ECOCGQGQ
+... ECOCSTST
+... ECOCTGTA
+... EIKBFOTFKON
+... EMSYMTMT
+... ESTPSTST
+... ESYIPRSJ
+... ETHNGRAATIP
+... EUBOBSNS
+... EXSKSKBX
+... EXTNKMKM
+... FARPSZMA
+... FCIBBBB2
+... FCIBTTP2
+... FCOHPAPA
+... FDSFLI22LV1
+... FIFBFOTX
+... FIRNBWGXCUS
+... FIRNLSMX
+... FIVFPGPM
+... FLMSNANX
+... FLORNL2ACCB
+... FMBKDEMM258
+... FMBZZMLX
+... FPVCCOBB
+... FTMDMD2X
+... GBHAMQMM
+... GDAAETAA
+... GIBAHUHB
+... GMBKGUGU
+... GODOSRPA
+... GOLDBRSP
+... GRENGLGXKON
+... GTBGGMGM
+... GUTIGYGE
+... GVVGVCVC
+... HABAEE2XTIP
+... HAMBGIGI
+... HANDPLPW
+... HATHKHPP
+... HBBAMEPG
+... HDELSI22
+... ICBKKZKX
+... ICBKNZ2A
+... ICDJDJJD
+... ICGSGTGC
+... IFIPPHM2
+... IHSAMUMU
+... INCEGHAC
+... INUIHR22CUS
+... IOPRVAVX
+... ISGUGNGN
+... ISRAILIR
+... JNBSJMKN
+... JSCLUZ22
+... KBNONO22
+... KCBLTZTZ
+... KICPDMD2
+... KNANKNSK
+... KOMASK2XSNV
+... KOMBCZPP
+... KREZHR2XCUS
+... KTAYCRSJ
+... KYRGKG22
+... LAPBLV2X
+... LBDELRLM
+... LDBBLALA
+... LHFMJESH
+... LIVEDKKK
+... LMLDZWHA
+... LNLNNOB2D01
+... LUMIILIT
+... LUOBLCLC
+... MAOISMSM003
+... MBICMRMR0MN
+... MBLBBDDH003
+... MBLNNPKA
+... MCBKBQBN
+... MCBLMVMV
+... MDFCGWGW
+... MEBBBA22
+... MENOMXMT
+... MMAUMVMV
+... NABTTVTV
+... NABZAZ2X
+... NACNBOLP
+... NACNPYPA0PE
+... NAPAPAPA
+... NATXDZAL
+... NBADBHBMTFO
+... NBELBZBB
+... NBFUAEAFSHJ
+... NBKEKENX757
+... NBMAMWMW005
+... NBRMMK2A
+... NBSLWSWS
+... NCBGGDGD001
+... NCBVVC22
+... NESWSZMX
+... NIBIETAA
+... NLPRXKPR
+... NOITAGAG
+... NOSCCATMSEC
+... NOSCTCGP
+... NREIGGSP
+... NSBINPKA
+... OKOYLV2X
+... ORBASXSM
+... ORBKGALI
+... ORINUGKA
+... OTPPHUH2
+... PACIECEG100
+... PAERCZPPGEN
+... PASCITMMCAN
+... PAVTPW22
+... PBPRHNT2
+... PCBCVNVX
+... PCCACLRZ
+... PHBXLRLM
+... PICHECEQ522
+... PICTBSNX
+... PLLPMUMU
+... PMAPPS22ACH
+... PRBAUYMM
+... PRCBRSBG
+... PRCBSVSS
+... PRDTNGLA
+... PSATPLPW
+... PSBKLKLX023
+... PUBABDDH205
+... PYMXMTMTMAL
+... QNBAMRMU
+... RBMAMWMWMRA
+... RBNKAIAI
+... RBNKSXSMANT
+... RBNKVGVGVGA
+... RBTTBQBN
+... REBZZWHQ
+... REVOPTP2
+... RFLCJESX
+... RIKOEE22
+... RIKSSESSBER
+... RMABBTBT
+... RNCBMD2X
+... ROKLIMDI1UW
+... ROYCBBBB
+... ROYCGGSPOFM
+... ROYCSGS2
+... RYSGTM2A
+... RZOOAT2L226
+... SAMBQAQA
+... SBICCIAB
+... SBINOMRX
+... SBMMMCMC
+... SBZAZAJJAFR
+... SCBLFKFK
+... SCBLMOMX
+... SCBLTHBX
+... SCBLTZTXSSU
+... SCHBBWGX013
+... SCOBWSWS
+... SEDCJOAX
+... SENFLKLX
+... SGBBBFBF
+... SIMXMXMM
+... SKFISEGA
+... SLCBSLFR
+... SOCBPFTX
+... SOGEBJBJ
+... SOGHHTPP
+... SPYEISR2
+... SRIBDJJD
+... SSDSKRSE
+... STBBMK22
+... STBKTNTT925
+... STBMMNUB
+... STGNPRSJ
+... SWHTBEBB
+... TACBAU2S
+... TBLTGMGM
+... TEBKXKPR030
+... TEBUTRIS664
+... TEECMH22
+... TNBKTM2X
+... TNETZAJJ
+... TNOVGIGI
+... TODETONU
+... TOLMAGAG
+... TOPFUGKA
+... UBBIMY22
+... UBCITNTTCHG
+... UBKLGB2LBAK
+... UGEBGE22622
+... UNAFSNDA
+... UNALALTR
+... UNCRBGSF426
+... UOVBBNBBCMS
+... UPMKFIHH
+... USBKLU2L
+... UTBSSLFR
+... UTWBBEBBTGT
+... UZUMUZ22
+... VATOISRE
+... VBAAVNVX640
+... VCBSSRPA
+... VMBSJMKN
+... VPAYBGS2
+... WANFVUVV
+... WEWOUS33
+... ZBCGMEPG
+... ZRCPCAT2
+...
+... '''
+>>> [x for x in numbers.splitlines() if x and not bic.is_valid(x)]
+[]
-----------------------------------------------------------------------
Summary of changes:
stdnum/bic.py | 38 ++++-
tests/test_bic.doctest | 443 +++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 479 insertions(+), 2 deletions(-)
create mode 100644 tests/test_bic.doctest
hooks/post-receive
--
python-stdnum
- python-stdnum branch master updated. 2.1-6-g843bbec,
Commits of the python-stdnum project