lists.arthurdejong.org
RSS feed

python-stdnum branch master updated. 1.20-20-g2b92075

[Date Prev][Date Next] [Thread Prev][Thread Next]

python-stdnum branch master updated. 1.20-20-g2b92075



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  2b9207582b9712c79015f79151f266b30b5ab824 (commit)
      from  02186014334be2cd2d8899835b8380ba1af74b7b (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=2b9207582b9712c79015f79151f266b30b5ab824

commit 2b9207582b9712c79015f79151f266b30b5ab824
Author: Arthur de Jong <arthur@arthurdejong.org>
Date:   Sat Jan 11 15:50:03 2025 +0100

    Drop Python 2 support
    
    This deprecates the stdnum.util.to_unicode() function because we no
    longer have to deal with bytestrings.

diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index dbbc988..767659b 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -9,26 +9,12 @@ on:
     - cron: '9 0 * * 1'
 
 jobs:
-  test_py27:
-    runs-on: ubuntu-20.04
-    container:
-      image: python:2.7.18-buster
-    strategy:
-      fail-fast: false
-      matrix:
-        python-version: [2.7]
-    steps:
-      - uses: actions/checkout@v3
-      - name: Install dependencies
-        run: python -m pip install --upgrade pip virtualenv tox
-      - name: Run tox
-        run: tox -e "$(echo py${{ matrix.python-version }} | sed -e 
's/[.]//g;s/pypypy/pypy/')" --skip-missing-interpreters false
   test_legacy:
     runs-on: ubuntu-20.04
     strategy:
       fail-fast: false
       matrix:
-        python-version: [3.6, 3.7, pypy2.7]
+        python-version: [3.6, 3.7]
     steps:
       - uses: actions/checkout@v3
       - name: Set up Python ${{ matrix.python-version }}
diff --git a/README.md b/README.md
index 5805816..17a231e 100644
--- a/README.md
+++ b/README.md
@@ -283,13 +283,12 @@ Requirements
 ------------
 
 The modules should not require any external Python modules and should be pure
-Python. The modules are developed and tested with Python 2.7 and 3.6 but may
-also work with older versions of Python.
+Python. The modules are developed and tested with Python 3 versions (see 
`setup.py`).
 
 Copyright
 ---------
 
-Copyright (C) 2010-2024 Arthur de Jong and others
+Copyright (C) 2010-2025 Arthur de Jong and others
 
 This library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
diff --git a/online_check/stdnum.wsgi b/online_check/stdnum.wsgi
index 6115d6c..2d6f0c8 100755
--- a/online_check/stdnum.wsgi
+++ b/online_check/stdnum.wsgi
@@ -1,6 +1,6 @@
 # stdnum.wsgi - simple WSGI application to check numbers
 #
-# Copyright (C) 2017-2024 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
@@ -33,7 +33,7 @@ sys.stdout = sys.stderr
 sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'python-stdnum'))
 
 from stdnum.util import (  # noqa: E402,I001 (import after changes to sys.path)
-    get_module_description, get_module_name, get_number_modules, to_unicode)
+    get_module_description, get_module_name, get_number_modules)
 
 
 _template = None
@@ -52,7 +52,7 @@ def get_conversions(module, number):
                     if isinstance(conversion, datetime.date):
                         yield (prop, conversion.strftime('%Y-%m-%d'))
                     elif conversion != number:
-                        yield (prop, to_unicode(conversion))
+                        yield (prop, conversion)
                 except Exception:  # noqa: B902 (catch anything that goes 
wrong)
                     pass
 
@@ -66,8 +66,8 @@ def info(module, number):
         compact=compactfn(number),
         valid=module.is_valid(number),
         module=module.__name__.split('.', 1)[1],
-        name=to_unicode(get_module_name(module)),
-        description=to_unicode(get_module_description(module)),
+        name=get_module_name(module),
+        description=get_module_description(module),
         conversions=dict(get_conversions(module, number)))
 
 
@@ -98,14 +98,14 @@ def application(environ, start_response):
         basedir = os.path.join(
             environ['DOCUMENT_ROOT'],
             os.path.dirname(environ['SCRIPT_NAME']).strip('/'))
-        _template = to_unicode(open(os.path.join(basedir, 'template.html'), 
'rt').read())
+        _template = open(os.path.join(basedir, 'template.html'), 
'rb').read().decode('utf-8')
     is_ajax = environ.get(
         'HTTP_X_REQUESTED_WITH', '').lower() == 'xmlhttprequest'
     parameters = urllib.parse.parse_qs(environ.get('QUERY_STRING', ''))
     results = []
     number = ''
     if 'number' in parameters:
-        number = to_unicode(parameters['number'][0])
+        number = parameters['number'][0]
         results = [
             info(module, number)
             for module in get_number_modules()
diff --git a/setup.cfg b/setup.cfg
index afd45e7..88f795a 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -5,9 +5,6 @@ license_files = COPYING
 owner=root
 group=root
 
-[bdist_wheel]
-universal=1
-
 [tool:pytest]
 addopts = --doctest-modules --doctest-glob="*.doctest" stdnum tests 
--ignore=stdnum/iso9362.py --cov=stdnum --cov-report=term-missing:skip-covered 
--cov-report=html
 doctest_optionflags = NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL
diff --git a/setup.py b/setup.py
index b8819ef..cc69fee 100755
--- a/setup.py
+++ b/setup.py
@@ -2,7 +2,7 @@
 
 # setup.py - python-stdnum installation script
 #
-# Copyright (C) 2010-2021 Arthur de Jong
+# Copyright (C) 2010-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
@@ -62,8 +62,6 @@ setup(
         'License :: OSI Approved :: GNU Lesser General Public License v2 or 
later (LGPLv2+)',
         'Operating System :: OS Independent',
         'Programming Language :: Python',
-        'Programming Language :: Python :: 2',
-        'Programming Language :: Python :: 2.7',
         'Programming Language :: Python :: 3',
         'Programming Language :: Python :: 3.6',
         'Programming Language :: Python :: 3.7',
diff --git a/stdnum/by/unp.py b/stdnum/by/unp.py
index 7279543..b9c7ebc 100644
--- a/stdnum/by/unp.py
+++ b/stdnum/by/unp.py
@@ -1,7 +1,7 @@
 # unp.py - functions for handling Belarusian UNP numbers
 # coding: utf-8
 #
-# Copyright (C) 2020-2024 Arthur de Jong
+# Copyright (C) 2020-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
@@ -42,13 +42,13 @@ InvalidChecksum: ...
 """
 
 from stdnum.exceptions import *
-from stdnum.util import clean, isdigits, to_unicode
+from stdnum.util import clean, isdigits
 
 
 # Mapping of Cyrillic letters to Latin letters
 _cyrillic_to_latin = dict(zip(
-    u'АВЕКМНОРСТ',
-    u'ABEKMHOPCT',
+    'АВЕКМНОРСТ',
+    'ABEKMHOPCT',
 ))
 
 
@@ -56,14 +56,11 @@ def compact(number):
     """Convert the number to the minimal representation. This strips the
     number of any valid separators and removes surrounding whitespace."""
     number = clean(number, ' ').upper().strip()
-    for prefix in ('УНП', u'УНП', 'UNP', u'UNP'):
-        if type(number) == type(prefix) and number.startswith(prefix):
+    for prefix in ('УНП', 'UNP'):
+        if number.startswith(prefix):
             number = number[len(prefix):]
     # Replace Cyrillic letters with Latin letters
-    cleaned = ''.join(_cyrillic_to_latin.get(x, x) for x in to_unicode(number))
-    if type(cleaned) != type(number):  # pragma: no cover (Python2 only)
-        cleaned = cleaned.encode('utf-8')
-    return cleaned
+    return ''.join(_cyrillic_to_latin.get(x, x) for x in number)
 
 
 def calc_check_digit(number):
diff --git a/stdnum/de/handelsregisternummer.py 
b/stdnum/de/handelsregisternummer.py
index 333e5f4..cce3043 100644
--- a/stdnum/de/handelsregisternummer.py
+++ b/stdnum/de/handelsregisternummer.py
@@ -2,7 +2,7 @@
 # coding: utf-8
 #
 # Copyright (C) 2015 Holvi Payment Services Oy
-# Copyright (C) 2018-2024 Arthur de Jong
+# Copyright (C) 2018-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
@@ -54,7 +54,7 @@ import re
 import unicodedata
 
 from stdnum.exceptions import *
-from stdnum.util import clean, to_unicode
+from stdnum.util import clean
 
 
 # The known courts that have a Handelsregister
@@ -216,7 +216,7 @@ GERMAN_COURTS = (
 def _to_min(court):
     """Convert the court name for quick comparison without encoding issues."""
     return ''.join(
-        x for x in unicodedata.normalize('NFD', to_unicode(court).lower())
+        x for x in unicodedata.normalize('NFD', court.lower())
         if x in 'abcdefghijklmnopqrstuvwxyz')
 
 
@@ -306,8 +306,6 @@ def validate(number, company_form=None):
     court = _courts.get(_to_min(court))
     if not court:
         raise InvalidComponent()
-    if not isinstance(court, type(number)):  # pragma: no cover (Python 2 code)
-        court = court.decode('utf-8')
     if company_form and COMPANY_FORM_REGISTRY_TYPES.get(company_form) != 
registry:
         raise InvalidComponent()
     return ' '.join(x for x in [court, registry, number, qualifier] if x)
diff --git a/stdnum/do/ncf.py b/stdnum/do/ncf.py
index eea6b3d..39c17a7 100644
--- a/stdnum/do/ncf.py
+++ b/stdnum/do/ncf.py
@@ -1,7 +1,7 @@
 # ncf.py - functions for handling Dominican Republic invoice numbers
 # coding: utf-8
 #
-# Copyright (C) 2017-2024 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
@@ -135,21 +135,21 @@ def _convert_result(result):  # pragma: no cover
         'MENSAJE_VALIDACION': 'validation_message',
         'RNC': 'rnc',
         'NCF': 'ncf',
-        u'RNC / Cédula': 'rnc',
-        u'RNC/Cédula': 'rnc',
-        u'Nombre / Razón Social': 'name',
-        u'Nombre/Razón Social': 'name',
+        'RNC / Cédula': 'rnc',
+        'RNC/Cédula': 'rnc',
+        'Nombre / Razón Social': 'name',
+        'Nombre/Razón Social': 'name',
         'Estado': 'status',
         'Tipo de comprobante': 'type',
-        u'Válido hasta': 'valid_until',
-        u'Código de Seguridad': 'security_code',
+        'Válido hasta': 'valid_until',
+        'Código de Seguridad': 'security_code',
         'Rnc Emisor': 'issuing_rnc',
         'Rnc Comprador': 'buyer_rnc',
         'Monto Total': 'total',
         'Total de ITBIS': 'total_itbis',
         'Fecha Emisi&oacuten': 'issuing_date',
-        u'Fecha Emisión': 'issuing_date',
-        u'Fecha de Firma': 'signature_date',
+        'Fecha Emisión': 'issuing_date',
+        'Fecha de Firma': 'signature_date',
         'e-NCF': 'ncf',
     }
     return dict(
diff --git a/stdnum/eg/tn.py b/stdnum/eg/tn.py
index 51e63b1..aef9ca5 100644
--- a/stdnum/eg/tn.py
+++ b/stdnum/eg/tn.py
@@ -2,6 +2,7 @@
 # coding: utf-8
 #
 # Copyright (C) 2022 Leandro Regueiro
+# 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
@@ -18,7 +19,7 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 # 02110-1301 USA
 
-u"""Tax Registration Number (الرقم الضريبي, Egypt tax number).
+"""Tax Registration Number (الرقم الضريبي, Egypt tax number).
 
 This number consists of 9 digits, usually separated into three groups
 using hyphens to make it easier to read, like XXX-XXX-XXX.
@@ -29,7 +30,7 @@ More information:
 
 >>> validate('100-531-385')
 '100531385'
->>> validate(u'٣٣١-١٠٥-٢٦٨')
+>>> validate('٣٣١-١٠٥-٢٦٨')
 '331105268'
 >>> validate('12345')
 Traceback (most recent call last):
@@ -49,27 +50,27 @@ from stdnum.util import clean, isdigits
 
 _ARABIC_NUMBERS_MAP = {
     # Arabic-indic digits.
-    u'٠': '0',
-    u'١': '1',
-    u'٢': '2',
-    u'٣': '3',
-    u'٤': '4',
-    u'٥': '5',
-    u'٦': '6',
-    u'٧': '7',
-    u'٨': '8',
-    u'٩': '9',
+    '٠': '0',
+    '١': '1',
+    '٢': '2',
+    '٣': '3',
+    '٤': '4',
+    '٥': '5',
+    '٦': '6',
+    '٧': '7',
+    '٨': '8',
+    '٩': '9',
     # Extended arabic-indic digits.
-    u'۰': '0',
-    u'۱': '1',
-    u'۲': '2',
-    u'۳': '3',
-    u'۴': '4',
-    u'۵': '5',
-    u'۶': '6',
-    u'۷': '7',
-    u'۸': '8',
-    u'۹': '9',
+    '۰': '0',
+    '۱': '1',
+    '۲': '2',
+    '۳': '3',
+    '۴': '4',
+    '۵': '5',
+    '۶': '6',
+    '۷': '7',
+    '۸': '8',
+    '۹': '9',
 }
 
 
@@ -79,10 +80,7 @@ def compact(number):
     This strips the number of any valid separators and removes surrounding
     whitespace. It also converts arabic numbers.
     """
-    try:
-        return str(''.join((_ARABIC_NUMBERS_MAP.get(c, c) for c in 
clean(number, ' -/').strip())))
-    except UnicodeError:  # pragma: no cover (Python 2 specific)
-        raise InvalidFormat()
+    return ''.join((_ARABIC_NUMBERS_MAP.get(c, c) for c in clean(number, ' 
-/').strip()))
 
 
 def validate(number):
diff --git a/stdnum/es/referenciacatastral.py b/stdnum/es/referenciacatastral.py
index 2d8cafa..3e7eae3 100644
--- a/stdnum/es/referenciacatastral.py
+++ b/stdnum/es/referenciacatastral.py
@@ -2,7 +2,7 @@
 # coding: utf-8
 #
 # Copyright (C) 2016 David García Garzón
-# Copyright (C) 2016-2017 Arthur de Jong
+# Copyright (C) 2016-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
@@ -55,10 +55,10 @@ InvalidChecksum: ...
 """
 
 from stdnum.exceptions import *
-from stdnum.util import clean, to_unicode
+from stdnum.util import clean
 
 
-alphabet = u'ABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789'
+alphabet = 'ABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789'
 
 
 def compact(number):
@@ -91,7 +91,7 @@ def _check_digit(number):
 
 def calc_check_digits(number):
     """Calculate the check digits for the number."""
-    number = to_unicode(compact(number))
+    number = compact(number)
     return (
         _check_digit(number[0:7] + number[14:18]) +
         _check_digit(number[7:14] + number[14:18]))
@@ -101,12 +101,11 @@ def validate(number):
     """Check if the number is a valid Cadastral Reference. This checks the
     length, formatting and check digits."""
     number = compact(number)
-    n = to_unicode(number)
-    if not all(c in alphabet for c in n):
+    if not all(c in alphabet for c in number):
         raise InvalidFormat()
-    if len(n) != 20:
+    if len(number) != 20:
         raise InvalidLength()
-    if calc_check_digits(n) != n[18:]:
+    if calc_check_digits(number) != number[18:]:
         raise InvalidChecksum()
     return number
 
diff --git a/stdnum/eu/nace.py b/stdnum/eu/nace.py
index ac72548..d667f4f 100644
--- a/stdnum/eu/nace.py
+++ b/stdnum/eu/nace.py
@@ -1,7 +1,7 @@
 # nace.py - functions for handling EU NACE classification
 # coding: utf-8
 #
-# Copyright (C) 2017-2019 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
@@ -38,7 +38,7 @@ More information:
 'A'
 >>> validate('62.01')
 '6201'
->>> str(get_label('62.01'))
+>>> get_label('62.01')
 'Computer programming activities'
 >>> validate('62.05')
 Traceback (most recent call last):
diff --git a/stdnum/imsi.py b/stdnum/imsi.py
index ceb1549..952615b 100644
--- a/stdnum/imsi.py
+++ b/stdnum/imsi.py
@@ -1,7 +1,7 @@
 # imsi.py - functions for handling International Mobile Subscriber Identity
 #           (IMSI) numbers
 #
-# Copyright (C) 2011-2015 Arthur de Jong
+# Copyright (C) 2011-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
@@ -35,7 +35,7 @@ InvalidComponent: ...
 ('310', '150', '123456789')
 >>> info('460001234567890')['mcc']
 '460'
->>> str(info('460001234567890')['country'])
+>>> info('460001234567890')['country']
 'China'
 """
 
diff --git a/stdnum/mac.py b/stdnum/mac.py
index 6ca29fb..947e893 100644
--- a/stdnum/mac.py
+++ b/stdnum/mac.py
@@ -1,6 +1,6 @@
 # mac.py - functions for handling MAC (Ethernet) addresses
 #
-# Copyright (C) 2018 Arthur de Jong
+# Copyright (C) 2018-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
@@ -35,7 +35,7 @@ More information:
 'D0-50-99-84-A2-A0'
 >>> is_multicast('d0:50:99:84:a2:a0')
 False
->>> str(get_manufacturer('d0:50:99:84:a2:a0'))
+>>> get_manufacturer('d0:50:99:84:a2:a0')
 'ASRock Incorporation'
 >>> get_oui('d0:50:99:84:a2:a0')
 'D05099'
diff --git a/stdnum/meid.py b/stdnum/meid.py
index 9f25379..d883eec 100644
--- a/stdnum/meid.py
+++ b/stdnum/meid.py
@@ -1,6 +1,6 @@
 # meid.py - functions for handling Mobile Equipment Identifiers (MEIDs)
 #
-# Copyright (C) 2010-2017 Arthur de Jong
+# Copyright (C) 2010-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
@@ -105,15 +105,6 @@ def compact(number, strip_check_digit=True):
     return number + cd
 
 
-def _bit_length(n):
-    """Return the number of bits necessary to store the number in binary."""
-    try:
-        return n.bit_length()
-    except AttributeError:  # pragma: no cover (Python 2.6 only)
-        import math
-        return int(math.log(n, 2)) + 1
-
-
 def validate(number, strip_check_digit=True):
     """Check if the number is a valid MEID number. This converts the
     representation format of the number (if it is decimal it is not converted
@@ -128,7 +119,7 @@ def validate(number, strip_check_digit=True):
         # convert to hex
         manufacturer_code = int(number[0:10])
         serial_num = int(number[10:18])
-        if _bit_length(manufacturer_code) > 32 or _bit_length(serial_num) > 24:
+        if manufacturer_code.bit_length() > 32 or serial_num.bit_length() > 24:
             raise InvalidComponent()
         number = '%08X%06X' % (manufacturer_code, serial_num)
         cd = calc_check_digit(number)
diff --git a/stdnum/mk/edb.py b/stdnum/mk/edb.py
index 6d84f58..c654dbd 100644
--- a/stdnum/mk/edb.py
+++ b/stdnum/mk/edb.py
@@ -2,6 +2,7 @@
 # coding: utf-8
 #
 # Copyright (C) 2022 Leandro Regueiro
+# 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
@@ -53,10 +54,9 @@ def compact(number):
     whitespace.
     """
     number = clean(number, ' -').upper().strip()
-    # First two are ASCII, second two are Cyrillic and only strip matching
-    # types to avoid implicit conversion to unicode strings in Python 2.7
-    for prefix in ('MK', u'MK', 'МК', u'МК'):
-        if isinstance(number, type(prefix)) and number.startswith(prefix):
+    # First two are ASCII, second two are Cyrillic
+    for prefix in ('MK', 'МК'):
+        if number.startswith(prefix):
             number = number[len(prefix):]
     return number
 
diff --git a/stdnum/mx/curp.py b/stdnum/mx/curp.py
index e9dadd1..33b9168 100644
--- a/stdnum/mx/curp.py
+++ b/stdnum/mx/curp.py
@@ -1,7 +1,7 @@
 # curp.py - functions for handling Mexican personal identifiers
 # coding: utf-8
 #
-# Copyright (C) 2019 Arthur de Jong
+# Copyright (C) 2019-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
@@ -114,7 +114,7 @@ def validate(number, validate_check_digits=True):
     number = compact(number)
     if len(number) != 18:
         raise InvalidLength()
-    if not re.match(u'^[A-Z]{4}[0-9]{6}[A-Z]{6}[0-9A-Z][0-9]$', number):
+    if not re.match('^[A-Z]{4}[0-9]{6}[A-Z]{6}[0-9A-Z][0-9]$', number):
         raise InvalidFormat()
     if number[:4] in _name_blacklist:
         raise InvalidComponent()
diff --git a/stdnum/mx/rfc.py b/stdnum/mx/rfc.py
index 2904ed8..5bb6cf0 100644
--- a/stdnum/mx/rfc.py
+++ b/stdnum/mx/rfc.py
@@ -1,7 +1,7 @@
 # rfc.py - functions for handling Mexican tax numbers
 # coding: utf-8
 #
-# Copyright (C) 2015 Arthur de Jong
+# Copyright (C) 2015-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
@@ -64,7 +64,7 @@ import datetime
 import re
 
 from stdnum.exceptions import *
-from stdnum.util import clean, to_unicode
+from stdnum.util import clean
 
 
 # these values should not appear as first part of a personal number
@@ -78,7 +78,7 @@ _name_blacklist = set([
 
 
 # characters used for checksum calculation,
-_alphabet = u'0123456789ABCDEFGHIJKLMN&OPQRSTUVWXYZ Ñ'
+_alphabet = '0123456789ABCDEFGHIJKLMN&OPQRSTUVWXYZ Ñ'
 
 
 def compact(number):
@@ -102,7 +102,6 @@ def _get_date(number):
 def calc_check_digit(number):
     """Calculate the check digit. The number passed should not have the
     check digit included."""
-    number = to_unicode(number)
     number = ('   ' + number)[-12:]
     check = sum(_alphabet.index(n) * (13 - i) for i, n in enumerate(number))
     return _alphabet[(11 - check) % 11]
@@ -111,25 +110,24 @@ def calc_check_digit(number):
 def validate(number, validate_check_digits=False):
     """Check if the number is a valid RFC."""
     number = compact(number)
-    n = to_unicode(number)
-    if len(n) in (10, 13):
+    if len(number) in (10, 13):
         # number assigned to person
-        if not re.match(u'^[A-Z&Ñ]{4}[0-9]{6}[0-9A-Z]{0,3}$', n):
+        if not re.match('^[A-Z&Ñ]{4}[0-9]{6}[0-9A-Z]{0,3}$', number):
             raise InvalidFormat()
-        if n[:4] in _name_blacklist:
+        if number[:4] in _name_blacklist:
             raise InvalidComponent()
-        _get_date(n[4:10])
-    elif len(n) == 12:
+        _get_date(number[4:10])
+    elif len(number) == 12:
         # number assigned to company
-        if not re.match(u'^[A-Z&Ñ]{3}[0-9]{6}[0-9A-Z]{3}$', n):
+        if not re.match('^[A-Z&Ñ]{3}[0-9]{6}[0-9A-Z]{3}$', number):
             raise InvalidFormat()
-        _get_date(n[3:9])
+        _get_date(number[3:9])
     else:
         raise InvalidLength()
-    if validate_check_digits and len(n) >= 12:
-        if not re.match(u'^[1-9A-V][1-9A-Z][0-9A]$', n[-3:]):
+    if validate_check_digits and len(number) >= 12:
+        if not re.match('^[1-9A-V][1-9A-Z][0-9A]$', number[-3:]):
             raise InvalidComponent()
-        if n[-1] != calc_check_digit(n[:-1]):
+        if number[-1] != calc_check_digit(number[:-1]):
             raise InvalidChecksum()
     return number
 
diff --git a/stdnum/util.py b/stdnum/util.py
index eeb89ed..081c3ba 100644
--- a/stdnum/util.py
+++ b/stdnum/util.py
@@ -1,7 +1,7 @@
 # util.py - common utility functions
 # coding: utf-8
 #
-# Copyright (C) 2012-2024 Arthur de Jong
+# Copyright (C) 2012-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
@@ -49,10 +49,7 @@ def _mk_char_map(mapping):
     to tuples with unicode characters as key."""
     for key, value in mapping.items():
         for char in key.split(','):
-            try:
-                yield (unicodedata.lookup(char), value)
-            except KeyError:  # pragma: no cover (does not happen on Python3)
-                pass
+            yield (unicodedata.lookup(char), value)
 
 
 # build mapping of Unicode characters to equivalent ASCII characters
@@ -171,16 +168,7 @@ def clean(number, deletechars=''):
         number = ''.join(x for x in number)
     except Exception:  # noqa: B902
         raise InvalidFormat()
-    if sys.version < '3' and isinstance(number, str):  # pragma: no cover 
(Python 2 specific code)
-        try:
-            number = _clean_chars(number.decode()).encode()
-        except UnicodeError:
-            try:
-                number = _clean_chars(number.decode('utf-8')).encode('utf-8')
-            except UnicodeError:
-                pass
-    else:  # pragma: no cover (Python 3 specific code)
-        number = _clean_chars(number)
+    number = _clean_chars(number)
     return ''.join(x for x in number if x not in deletechars)
 
 
@@ -192,8 +180,11 @@ def isdigits(number):
 
 
 def to_unicode(text):
-    """Convert the specified text to a unicode string."""
-    if not isinstance(text, type(u'')):
+    """DEPRECATED: Will be removed in an upcoming release."""  # noqa: D40
+    warnings.warn(
+        'to_unicode() will be removed in an upcoming release',
+        DeprecationWarning, stacklevel=2)
+    if not isinstance(text, str):
         try:
             return text.decode('utf-8')
         except UnicodeDecodeError:
@@ -235,7 +226,7 @@ def get_cc_module(cc, name):
     if cc in ('in', 'is', 'if'):
         cc += '_'
     try:
-        mod = __import__('stdnum.%s' % cc, globals(), locals(), [str(name)])
+        mod = __import__('stdnum.%s' % cc, globals(), locals(), [name])
         return getattr(mod, name, None)
     except ImportError:
         return
@@ -256,15 +247,8 @@ def _get_zeep_soap_client(wsdlurl, timeout, verify):  # 
pragma: no cover (not pa
 
 
 def _get_suds_soap_client(wsdlurl, timeout, verify):  # pragma: no cover (not 
part of normal test suite)
-    # other implementations require passing the proxy config
-    try:
-        from urllib.request import getproxies
-    except ImportError:  # Python 2 specific
-        from urllib import getproxies
-    try:
-        from urllib.request import HTTPSHandler
-    except ImportError:  # Python 2 specific
-        from urllib2 import HTTPSHandler
+    from urllib.request import HTTPSHandler, getproxies
+
     from suds.client import Client
     from suds.transport.http import HttpTransport
 
diff --git a/tests/test_by_unp.doctest b/tests/test_by_unp.doctest
index 6c2b8a4..428473b 100644
--- a/tests/test_by_unp.doctest
+++ b/tests/test_by_unp.doctest
@@ -1,6 +1,6 @@
 test_by_unp.doctest - more detailed doctests for stdnum.by.unp module
 
-Copyright (C) 2020 Arthur de Jong
+Copyright (C) 2020-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
@@ -32,8 +32,6 @@ Tests for some corner cases.
 '591705582'
 >>> unp.validate('УНП 591705582')
 '591705582'
->>> str(unp.validate(u'\u0423\u041d\u041f 591705582'))
-'591705582'
 >>> unp.validate('UNP 591705582')
 '591705582'
 >>> unp.validate('5917DDD82')  # letters in wrong places
diff --git a/tests/test_cn_ric.doctest b/tests/test_cn_ric.doctest
index 21ba405..bb4a523 100644
--- a/tests/test_cn_ric.doctest
+++ b/tests/test_cn_ric.doctest
@@ -1,6 +1,7 @@
 test_cn_ric.doctest - more detailed doctests for stdnum.cn.ric module
 
 Copyright (C) 2014 Jiangge Zhang
+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
@@ -46,12 +47,10 @@ datetime.date(2014, 10, 5)
 
 Get the birth place:
 
->>> c = ric.get_birth_place('360426199101010071')['county']
->>> c == u'\u5fb7\u5b89\u53bf'
-True
->>> c = ric.get_birth_place('44011320141005001x')['county']
->>> c == u'\u756a\u79ba\u533a'
-True
+>>> ric.get_birth_place('360426199101010071')['county']
+'德安县'
+>>> ric.get_birth_place('44011320141005001x')['county']
+'番禺区'
 
 
 Invalid format:
diff --git a/tests/test_de_handelsregisternummer.doctest 
b/tests/test_de_handelsregisternummer.doctest
index 3f6d4e4..dcabca9 100644
--- a/tests/test_de_handelsregisternummer.doctest
+++ b/tests/test_de_handelsregisternummer.doctest
@@ -1,6 +1,6 @@
 test_de_handelsregisternummer.doctest - tests for German register number
 
-Copyright (C) 2018-2019 Arthur de Jong
+Copyright (C) 2018-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
@@ -62,18 +62,14 @@ funky so they work both in Python 2 and Python 3.
 'Berlin (Charlottenburg) HRB 11223 B'
 >>> handelsregisternummer.validate('St. Ingbert HRA 61755')
 'St. Ingbert (St Ingbert) HRA 61755'
->>> number = u'K\xf6ln HRB 49263'  # Unicode
->>> handelsregisternummer.validate(number) == number
-True
->>> utf8 = 'K\xc3\xb6ln HRB 49263'  # UTF-8
->>> handelsregisternummer.validate(utf8) == 'Köln HRB 49263'
-True
->>> iso885915 = 'K\xf6ln HRB 49263'  # ISO-8859-15
->>> handelsregisternummer.validate(iso885915) == 'Köln HRB 49263'
-True
->>> ascii = 'Koln HRB 49263'  # ASCII replaced
->>> handelsregisternummer.validate(ascii) == 'Köln HRB 49263'
-True
+>>> handelsregisternummer.validate('Köln HRB 49263')
+'Köln HRB 49263'
+>>> handelsregisternummer.validate('K\xc3\xb6ln HRB 49263')
+'Köln HRB 49263'
+>>> handelsregisternummer.validate('K\xf6ln HRB 49263')
+'Köln HRB 49263'
+>>> handelsregisternummer.validate('Koln HRB 49263')  # ASCII replaced
+'Köln HRB 49263'
 >>> handelsregisternummer.validate('KXln HRB 49263')  # too wrong
 Traceback (most recent call last):
   ...
diff --git a/tests/test_de_stnr.doctest b/tests/test_de_stnr.doctest
index 7996c34..cf41cdd 100644
--- a/tests/test_de_stnr.doctest
+++ b/tests/test_de_stnr.doctest
@@ -1,7 +1,7 @@
 test_de_stnr.doctest - more detailed doctests for the stdnum.de.stnr module
 
 Copyright (C) 2017 Holvi Payment Services
-Copyright (C) 2018 Arthur de Jong
+Copyright (C) 2018-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
@@ -53,11 +53,9 @@ InvalidLength: ...
 
 The module should handle various encodings of region names properly.
 
->>> stnr.validate('9381508152', u'Baden-W\xfcrttemberg')  # Python unicode
+>>> stnr.validate('9381508152', 'Baden-Württemberg')
 '9381508152'
->>> stnr.validate('9381508152', 'Baden-W\xc3\xbcrttemberg')  # UTF-8
-'9381508152'
->>> stnr.validate('9381508152', 'Baden-W\xfcrttemberg')  # ISO-8859-15
+>>> stnr.validate('9381508152', 'Baden-W\xc3\xbcrttemberg')  # mangled unicode
 '9381508152'
 >>> stnr.validate('9381508152', 'Baden Wurttemberg')  # ASCII with space
 '9381508152'
diff --git a/tests/test_eg_tn.doctest b/tests/test_eg_tn.doctest
index afd2eb9..9518924 100644
--- a/tests/test_eg_tn.doctest
+++ b/tests/test_eg_tn.doctest
@@ -2,6 +2,7 @@ test_eg_tn.doctest - more detailed doctests for stdnum.eg.tn 
module
 coding: utf-8
 
 Copyright (C) 2022 Leandro Regueiro
+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
@@ -36,15 +37,15 @@ Tests for some corner cases.
 '421159723'
 >>> tn.validate('347/404/847')
 '347404847'
->>> tn.validate(u'٣٣١-١٠٥-٢٦٨')
+>>> tn.validate('٣٣١-١٠٥-٢٦٨')
 '331105268'
->>> tn.validate(u'۹٤۹-۸۹۱-۲۰٤')
+>>> tn.validate('۹٤۹-۸۹۱-۲۰٤')
 '949891204'
 >>> tn.format('100531385')
 '100-531-385'
->>> tn.format(u'٣٣١-١٠٥-٢٦٨')
+>>> tn.format('٣٣١-١٠٥-٢٦٨')
 '331-105-268'
->>> tn.format(u'۹٤۹-۸۹۱-۲۰٤')
+>>> tn.format('۹٤۹-۸۹۱-۲۰٤')
 '949-891-204'
 >>> tn.validate('12345')
 Traceback (most recent call last):
@@ -58,7 +59,7 @@ InvalidFormat: ...
 
 These have been found online and should all be valid numbers.
 
->>> numbers = u'''
+>>> numbers = '''
 ...
 ... 039-528-313
 ... 100-131-778
diff --git a/tests/test_es_referenciacatastral.doctest 
b/tests/test_es_referenciacatastral.doctest
index e7fbfad..73754cc 100644
--- a/tests/test_es_referenciacatastral.doctest
+++ b/tests/test_es_referenciacatastral.doctest
@@ -1,7 +1,7 @@
 test_es_referenciacatastral.doctest - more detailed doctests for 
stdnum.es.referenciacatastral module
 
 Copyright (C) 2016 David García Garzón
-Copyright (C) 2015-2017 Arthur de Jong
+Copyright (C) 2015-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
@@ -77,12 +77,12 @@ seems that unicode literals do not work so we are escaping 
Ñ.
 
 >>> referenciacatastral.calc_check_digits('9872023 ÑH5797S 0001')
 'WP'
->>> referenciacatastral.calc_check_digits(u'9872023 \xd1H5797S 0001')
+>>> referenciacatastral.calc_check_digits('9872023 \xd1H5797S 0001')
 'WP'
->>> referenciacatastral.validate('9872023 ÑH5797S 0001 WP') == 
'9872023ÑH5797S0001WP'
-True
->>> referenciacatastral.validate(u'9872023 \xd1H5797S 0001 WP') == 
u'9872023\xd1H5797S0001WP'
-True
+>>> referenciacatastral.validate('9872023 ÑH5797S 0001 WP')
+'9872023ÑH5797S0001WP'
+>>> referenciacatastral.validate('9872023 \xd1H5797S 0001 WP')
+'9872023\xd1H5797S0001WP'
 
 
 These have been found online and should all be valid numbers.
diff --git a/tests/test_isan.doctest b/tests/test_isan.doctest
index 32f0f1d..bb670c1 100644
--- a/tests/test_isan.doctest
+++ b/tests/test_isan.doctest
@@ -1,6 +1,6 @@
 test_isan.doctest - more detailed doctests for stdnum.isan module
 
-Copyright (C) 2010, 2012, 2013 Arthur de Jong
+Copyright (C) 2010-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
@@ -113,8 +113,5 @@ A simple test for the to_binary() function.
 
 >>> import binascii
 >>> import sys
->>> x = binascii.b2a_hex(isan.to_binary('0000-0000-D07A-0090-Q'))
->>> if sys.version > '3':
-...     x = str(x, encoding='ascii')
->>> x
-'00000000d07a0090'
+>>> binascii.b2a_hex(isan.to_binary('0000-0000-D07A-0090-Q'))
+b'00000000d07a0090'
diff --git a/tests/test_mac.doctest b/tests/test_mac.doctest
index aab8339..2ddf501 100644
--- a/tests/test_mac.doctest
+++ b/tests/test_mac.doctest
@@ -1,6 +1,6 @@
 test_mac.doctest - more detailed doctests for the stdnum.mac module
 
-Copyright (C) 2018 Arthur de Jong
+Copyright (C) 2018-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
@@ -77,9 +77,9 @@ True
 We can lookup the organisation that registered the OUI part of the MAC
 address.
 
->>> str(mac.get_manufacturer('2c:76:8a:ad:f2:74'))
+>>> mac.get_manufacturer('2c:76:8a:ad:f2:74')
 'Hewlett Packard'
->>> str(mac.get_manufacturer('fe:54:00:76:07:0a'))  # libvirt MAC address
+>>> mac.get_manufacturer('fe:54:00:76:07:0a')  # libvirt MAC address
 Traceback (most recent call last):
     ...
 InvalidComponent: ...
diff --git a/tests/test_mk_edb.doctest b/tests/test_mk_edb.doctest
index 07b8a37..1490822 100644
--- a/tests/test_mk_edb.doctest
+++ b/tests/test_mk_edb.doctest
@@ -1,6 +1,7 @@
 test_mk_edb.doctest - more detailed doctests for stdnum.mk.edb module
 
 Copyright (C) 2022 Leandro Regueiro
+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
@@ -29,13 +30,13 @@ Tests for some corner cases.
 
 >>> edb.validate('4030000375897')
 '4030000375897'
->>> str(edb.validate(u'МК 4020990116747'))  # Cyrillic letters
+>>> edb.validate('МК 4020990116747')  # Cyrillic letters
 '4020990116747'
 >>> edb.validate('MK4057009501106')  # ASCII letters
 '4057009501106'
 >>> edb.validate('МК4030006603425')  # Cyrillic letters
 '4030006603425'
->>> str(edb.validate(u'МК4030006603425'))  # Cyrillic letters
+>>> edb.validate('МК4030006603425')  # Cyrillic letters
 '4030006603425'
 >>> edb.validate('12345')
 Traceback (most recent call last):
@@ -51,11 +52,11 @@ Traceback (most recent call last):
 InvalidChecksum: ...
 >>> edb.format('4030000375897')
 '4030000375897'
->>> str(edb.format(u'МК 4020990116747'))  # Cyrillic letters
+>>> edb.format('МК 4020990116747')  # Cyrillic letters
 '4020990116747'
 >>> edb.format('MK4057009501106')  # ASCII letters
 '4057009501106'
->>> str(edb.format(u'МК4030006603425'))  # Cyrillic letters
+>>> edb.format('МК4030006603425')  # Cyrillic letters
 '4030006603425'
 
 
diff --git a/tests/test_my_nric.doctest b/tests/test_my_nric.doctest
index a68a932..c0d2193 100644
--- a/tests/test_my_nric.doctest
+++ b/tests/test_my_nric.doctest
@@ -1,6 +1,6 @@
 test_my_nric.doctest - more detailed doctests for stdnum.my.nric module
 
-Copyright (C) 2013, 2014 Arthur de Jong
+Copyright (C) 2013-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
@@ -52,13 +52,13 @@ datetime.date(1988, 2, 29)
 
 Get the birth place:
 
->>> str(nric.get_birth_place('770305-02-1234')['state'])
+>>> nric.get_birth_place('770305-02-1234')['state']
 'Kedah'
->>> str(nric.get_birth_place('890131-06-1224')['state'])
+>>> nric.get_birth_place('890131-06-1224')['state']
 'Pahang'
->>> str(nric.get_birth_place('810909785542')['country']).upper()
+>>> nric.get_birth_place('810909785542')['country'].upper()
 'SRI LANKA'
->>> str(nric.get_birth_place('880229875542')['countries']).upper()
+>>> nric.get_birth_place('880229875542')['countries'].upper()
 'BRITAIN, GREAT BRITAIN, IRELAND'
 
 
diff --git a/tests/test_robustness.doctest b/tests/test_robustness.doctest
index 9250bc7..7515f63 100644
--- a/tests/test_robustness.doctest
+++ b/tests/test_robustness.doctest
@@ -1,6 +1,6 @@
 test_robustness.doctest - test is_valid() functions to not break
 
-Copyright (C) 2011-2019 Arthur de Jong
+Copyright (C) 2011-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
@@ -23,7 +23,7 @@ check whether all provided is_valid() functions can handle 
clearly
 invalid junk.
 
 >>> testvalues = (
-...     None, '*&^%$', '', 0, False, object(), 'Z', 'QQ', '3', '€', u'€',
+...     None, '*&^%$', '', 0, False, object(), 'Z', 'QQ', '3', '€', 
'€'.encode('utf-8'),
 ...     '😴', '¥', '3²', 'ⅷ', '⑱', '᭓', b'\xc2\xb2'.decode('utf-8'))
 >>> from stdnum.util import get_number_modules
 
diff --git a/tests/test_util.doctest b/tests/test_util.doctest
index ff92978..e1097db 100644
--- a/tests/test_util.doctest
+++ b/tests/test_util.doctest
@@ -1,6 +1,6 @@
 test_util.doctest - more detailed doctests for the stdnum.util package
 
-Copyright (C) 2017-2019 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
@@ -23,6 +23,7 @@ tries to test more corner cases and detailed functionality. 
This module is
 meant for internal use by stdnum modules and is not guaranteed to remain
 stable and as such not part of the public API of stdnum.
 
+>>> import warnings
 >>> from stdnum.util import (
 ...     get_number_modules, get_module_name, get_module_description,
 ...     clean, isdigits, to_unicode)
@@ -30,14 +31,24 @@ stable and as such not part of the public API of stdnum.
 
 The to_unicode() function is used to force conversion of a string to unicode
 if it is not already a unicode string. This is mostly used to convert numbers
-with non-ASCII characters in it.
+with non-ASCII characters in it. This function is deprecated and should no
+longer be used.
 
 >>> n_str = b'\xc3\x91'.decode('utf-8')  # Ñ character as unicode string
->>> to_unicode(n_str) ==  n_str
+>>> with warnings.catch_warnings(record=True) as w:
+...     to_unicode(n_str) ==  n_str
+...     issubclass(w[-1].category, DeprecationWarning)
 True
->>> to_unicode(n_str.encode('utf-8')) ==  n_str
 True
->>> to_unicode(n_str.encode('iso-8859-1')) ==  n_str
+>>> with warnings.catch_warnings(record=True) as w:
+...     to_unicode(n_str.encode('utf-8')) ==  n_str
+...     issubclass(w[-1].category, DeprecationWarning)
+True
+True
+>>> with warnings.catch_warnings(record=True) as w:
+...     to_unicode(n_str.encode('iso-8859-1')) ==  n_str
+...     issubclass(w[-1].category, DeprecationWarning)
+True
 True
 
 
@@ -100,7 +111,7 @@ handle aliases properly.
 'stdnum.nl.btw'
 >>> get_cc_module('is', 'vat').__name__
 'stdnum.is_.vsk'
->>> get_cc_module(u'nl', u'vat').__name__
+>>> get_cc_module('nl', 'vat').__name__
 'stdnum.nl.btw'
 >>> get_cc_module('unknown', 'vat') is None
 True
diff --git a/tox.ini b/tox.ini
index f338dd9..0a080f5 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,5 +1,5 @@
 [tox]
-envlist = py{27,36,37,38,39,310,311,312,py,py3},flake8,docs,headers
+envlist = py{36,37,38,39,310,311,312,py3},flake8,docs,headers
 skip_missing_interpreters = true
 
 [testenv]
@@ -8,8 +8,6 @@ deps = pytest
 commands = pytest
 setenv=
     PYTHONWARNINGS=all
-    py27,pypy: VIRTUALENV_SETUPTOOLS=43.0.0
-    py27,pypy: VIRTUALENV_PIP=19.3.1
 
 [testenv:flake8]
 skip_install = true

-----------------------------------------------------------------------

Summary of changes:
 .github/workflows/test.yml                  | 16 +--------
 README.md                                   |  5 ++-
 online_check/stdnum.wsgi                    | 14 ++++----
 setup.cfg                                   |  3 --
 setup.py                                    |  4 +--
 stdnum/by/unp.py                            | 17 ++++------
 stdnum/de/handelsregisternummer.py          |  8 ++---
 stdnum/do/ncf.py                            | 18 +++++------
 stdnum/eg/tn.py                             | 50 ++++++++++++++---------------
 stdnum/es/referenciacatastral.py            | 15 ++++-----
 stdnum/eu/nace.py                           |  4 +--
 stdnum/imsi.py                              |  4 +--
 stdnum/mac.py                               |  4 +--
 stdnum/meid.py                              | 13 ++------
 stdnum/mk/edb.py                            |  8 ++---
 stdnum/mx/curp.py                           |  4 +--
 stdnum/mx/rfc.py                            | 28 ++++++++--------
 stdnum/util.py                              | 38 +++++++---------------
 tests/test_by_unp.doctest                   |  4 +--
 tests/test_cn_ric.doctest                   | 11 +++----
 tests/test_de_handelsregisternummer.doctest | 22 ++++++-------
 tests/test_de_stnr.doctest                  |  8 ++---
 tests/test_eg_tn.doctest                    | 11 ++++---
 tests/test_es_referenciacatastral.doctest   | 12 +++----
 tests/test_isan.doctest                     |  9 ++----
 tests/test_mac.doctest                      |  6 ++--
 tests/test_mk_edb.doctest                   |  9 +++---
 tests/test_my_nric.doctest                  | 10 +++---
 tests/test_robustness.doctest               |  4 +--
 tests/test_util.doctest                     | 23 +++++++++----
 tox.ini                                     |  4 +--
 31 files changed, 165 insertions(+), 221 deletions(-)


hooks/post-receive
-- 
python-stdnum