diff --git a/.travis.yml b/.travis.yml index d81b6fa..4666146 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,19 +3,26 @@ arch: - amd64 - ppc64le python: - - "3.4" - "3.5" - "3.6" - "3.7" - "3.8" - "3.9" - "pypy3" -# Disable unsuported version pypy for ppc64le +# Disable unsupported version pypy for ppc64le jobs: exclude: - arch: ppc64le python: pypy3 +matrix: + include: + - python: 3.9 + install: + - pip install mypy + script: + - mypy --strict idna/ + install: - pip install . script: diff --git a/MANIFEST.in b/MANIFEST.in index 66a19d4..3d746f6 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,7 +1,6 @@ include *.rst include LICENSE.md include idna/py.typed -recursive-include idna *.pyi recursive-include tools * recursive-exclude tools *.pyc recursive-include tests * diff --git a/idna/__init__.py b/idna/__init__.py index 338e170..a40eeaf 100644 --- a/idna/__init__.py +++ b/idna/__init__.py @@ -12,7 +12,6 @@ check_nfc, decode, encode, - intranges_contain, ulabel, uts46_remap, valid_contextj, @@ -20,6 +19,7 @@ valid_label_length, valid_string_length, ) +from .intranges import intranges_contain __all__ = [ "IDNABidiError", diff --git a/idna/codec.py b/idna/codec.py index 30fe72f..bcf5986 100644 --- a/idna/codec.py +++ b/idna/codec.py @@ -1,3 +1,4 @@ +# type: ignore from .core import encode, decode, alabel, ulabel, IDNAError import codecs import re diff --git a/idna/codec.pyi b/idna/codec.pyi deleted file mode 100644 index 3726afc..0000000 --- a/idna/codec.pyi +++ /dev/null @@ -1,27 +0,0 @@ -import codecs -from typing import Tuple - -class Codec(codecs.Codec): - def encode(self, data: str, errors: str = ...) -> Tuple[bytes, int]: ... - def decode(self, data: bytes, errors: str = ...) -> Tuple[str, int]: ... - -class IncrementalEncoder(codecs.BufferedIncrementalEncoder): - def _buffer_encode( # type: ignore - self, - data: str, - errors: str, - final: bool - ) -> Tuple[str, int]: ... - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - def _buffer_decode( # type: ignore - self, - data: str, - errors: str, - final: bool - ) -> Tuple[str, int]: ... - -class StreamWriter(Codec, codecs.StreamWriter): ... -class StreamReader(Codec, codecs.StreamReader): ... - -def getregentry() -> codecs.CodecInfo: ... diff --git a/idna/compat.py b/idna/compat.py index 2e622d6..eadd901 100644 --- a/idna/compat.py +++ b/idna/compat.py @@ -1,12 +1,13 @@ from .core import * from .codec import * +from typing import Any -def ToASCII(label): +def ToASCII(label: str) -> bytes: return encode(label) -def ToUnicode(label): +def ToUnicode(label: bytes) -> str: return decode(label) -def nameprep(s): +def nameprep(s: Any) -> None: raise NotImplementedError('IDNA 2008 does not utilise nameprep protocol') diff --git a/idna/compat.pyi b/idna/compat.pyi deleted file mode 100644 index 44677a6..0000000 --- a/idna/compat.pyi +++ /dev/null @@ -1,5 +0,0 @@ -from typing import Any - -def ToASCII(label: str) -> bytes: ... -def ToUnicode(label: bytes) -> str: ... -def nameprep(s: Any) -> None: ... diff --git a/idna/core.py b/idna/core.py index 2c193d6..bd8c34f 100644 --- a/idna/core.py +++ b/idna/core.py @@ -2,7 +2,7 @@ import bisect import unicodedata import re -import sys +from typing import Union, Optional from .intranges import intranges_contain _virama_combining_class = 9 @@ -29,38 +29,38 @@ class InvalidCodepointContext(IDNAError): pass -def _combining_class(cp): +def _combining_class(cp: int) -> int: v = unicodedata.combining(chr(cp)) if v == 0: if not unicodedata.name(chr(cp)): raise ValueError('Unknown character in unicodedata') return v -def _is_script(cp, script): +def _is_script(cp: str, script: str) -> bool: return intranges_contain(ord(cp), idnadata.scripts[script]) -def _punycode(s): +def _punycode(s: str) -> bytes: return s.encode('punycode') -def _unot(s): +def _unot(s: int) -> str: return 'U+{:04X}'.format(s) -def valid_label_length(label): +def valid_label_length(label: Union[bytes, str]) -> bool: if len(label) > 63: return False return True -def valid_string_length(label, trailing_dot): +def valid_string_length(label: Union[bytes, str], trailing_dot: bool) -> bool: if len(label) > (254 if trailing_dot else 253): return False return True -def check_bidi(label, check_ltr=False): +def check_bidi(label: str, check_ltr: bool = False) -> bool: # Bidi rules should only be applied if string contains RTL characters bidi_label = False @@ -84,7 +84,7 @@ def check_bidi(label, check_ltr=False): raise IDNABidiError('First codepoint in label {} must be directionality L, R or AL'.format(repr(label))) valid_ending = False - number_type = False + number_type: Union[str, bool] = False for (idx, cp) in enumerate(label, 1): direction = unicodedata.bidirectional(cp) @@ -120,14 +120,14 @@ def check_bidi(label, check_ltr=False): return True -def check_initial_combiner(label): +def check_initial_combiner(label: str) -> bool: if unicodedata.category(label[0])[0] == 'M': raise IDNAError('Label begins with an illegal combining character') return True -def check_hyphen_ok(label): +def check_hyphen_ok(label: str) -> bool: if label[2:4] == '--': raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') @@ -136,13 +136,13 @@ def check_hyphen_ok(label): return True -def check_nfc(label): +def check_nfc(label: str) -> None: if unicodedata.normalize('NFC', label) != label: raise IDNAError('Label must be in Normalization Form C') -def valid_contextj(label, pos): +def valid_contextj(label: str, pos: int) -> bool: cp_value = ord(label[pos]) @@ -186,7 +186,7 @@ def valid_contextj(label, pos): return False -def valid_contexto(label, pos, exception=False): +def valid_contexto(label: str, pos: int, exception: bool = False) -> bool: cp_value = ord(label[pos]) @@ -226,8 +226,10 @@ def valid_contexto(label, pos, exception=False): return False return True + return False -def check_label(label): + +def check_label(label: Union[str, bytes, bytearray]) -> None: if isinstance(label, (bytes, bytearray)): label = label.decode('utf-8') @@ -259,14 +261,14 @@ def check_label(label): check_bidi(label) -def alabel(label): +def alabel(label: str) -> bytes: try: - label = label.encode('ascii') - ulabel(label) - if not valid_label_length(label): + label_bytes = label.encode('ascii') + ulabel(label_bytes) + if not valid_label_length(label_bytes): raise IDNAError('Label too long') - return label + return label_bytes except UnicodeEncodeError: pass @@ -275,51 +277,58 @@ def alabel(label): label = str(label) check_label(label) - label = _punycode(label) - label = _alabel_prefix + label + label_bytes = _punycode(label) + label_bytes = _alabel_prefix + label_bytes - if not valid_label_length(label): + if not valid_label_length(label_bytes): raise IDNAError('Label too long') - return label + return label_bytes -def ulabel(label): +def ulabel(label: Union[str, bytes, bytearray]) -> str: if not isinstance(label, (bytes, bytearray)): try: - label = label.encode('ascii') + label_bytes = label.encode('ascii') except UnicodeEncodeError: check_label(label) return label + else: + label_bytes = label - label = label.lower() - if label.startswith(_alabel_prefix): - label = label[len(_alabel_prefix):] - if not label: + label_bytes = label_bytes.lower() + if label_bytes.startswith(_alabel_prefix): + label_bytes = label_bytes[len(_alabel_prefix):] + if not label_bytes: raise IDNAError('Malformed A-label, no Punycode eligible content found') - if label.decode('ascii')[-1] == '-': + if label_bytes.decode('ascii')[-1] == '-': raise IDNAError('A-label must not end with a hyphen') else: - check_label(label) - return label.decode('ascii') + check_label(label_bytes) + return label_bytes.decode('ascii') - label = label.decode('punycode') + label = label_bytes.decode('punycode') check_label(label) return label -def uts46_remap(domain, std3_rules=True, transitional=False): +def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False) -> str: """Re-map the characters in the string according to UTS46 processing.""" from .uts46data import uts46data output = '' - try: - for pos, char in enumerate(domain): - code_point = ord(char) + + for pos, char in enumerate(domain): + code_point = ord(char) + try: uts46row = uts46data[code_point if code_point < 256 else bisect.bisect_left(uts46data, (code_point, 'Z')) - 1] status = uts46row[1] - replacement = uts46row[2] if len(uts46row) == 3 else None + replacement: Optional[str] + if len(uts46row) == 3: + replacement = uts46row[2] # type: ignore + else: + replacement = None if (status == 'V' or (status == 'D' and not transitional) or (status == '3' and not std3_rules and replacement is None)): @@ -330,14 +339,19 @@ def uts46_remap(domain, std3_rules=True, transitional=False): output += replacement elif status != 'I': raise IndexError() - return unicodedata.normalize('NFC', output) - except IndexError: - raise InvalidCodepoint( - 'Codepoint {} not allowed at position {} in {}'.format( - _unot(code_point), pos + 1, repr(domain))) + except IndexError: + raise InvalidCodepoint( + 'Codepoint {} not allowed at position {} in {}'.format( + _unot(code_point), pos + 1, repr(domain))) + + return unicodedata.normalize('NFC', output) -def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): +def encode(s: Union[str, bytes, bytearray], + strict: bool = False, + uts46: bool = False, + std3_rules: bool = False, + transitional: bool = False) -> bytes: if isinstance(s, (bytes, bytearray)): s = s.decode('ascii') @@ -368,7 +382,10 @@ def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): return s -def decode(s, strict=False, uts46=False, std3_rules=False): +def decode(s: Union[str, bytes, bytearray], + strict: bool = False, + uts46: bool = False, + std3_rules: bool = False) -> str: if isinstance(s, (bytes, bytearray)): s = s.decode('ascii') diff --git a/idna/core.pyi b/idna/core.pyi deleted file mode 100644 index 5b8a4ac..0000000 --- a/idna/core.pyi +++ /dev/null @@ -1,39 +0,0 @@ -from typing import Union -from .intranges import intranges_contain as intranges_contain # noqa - -class IDNAError(UnicodeError): ... -class IDNABidiError(IDNAError): ... -class InvalidCodepoint(IDNAError): ... -class InvalidCodepointContext(IDNAError): ... - -def _combining_class(cp: int) -> int: ... -def _is_script(cp: str, script: str) -> bool: ... -def _punycode(s: str) -> bytes: ... -def _unot(s: int) -> str: ... -def valid_label_length(label: Union[str, bytes]) -> bool: ... -def valid_string_length(label: Union[str, bytes], trailing_dot: bool) -> bool: ... -def check_bidi(label: str, check_ltr: bool = ...) -> bool: ... -def check_initial_combiner(label: str) -> bool: ... -def check_hyphen_ok(label: str) -> bool: ... -def check_nfc(label: str) -> None: ... -def valid_contextj(label: str, pos: int) -> bool: ... -def valid_contexto(label: str, pos: int, exception: bool = False) -> bool: ... -def check_label(label: Union[str, bytes, bytearray]) -> None: ... -def alabel(label: str) -> bytes: ... -def ulabel(label: Union[str, bytes, bytearray]) -> str: ... -def uts46_remap( - domain: str, std3_rules: bool = ..., transitional: bool = ... -) -> str: ... -def encode( - s: Union[str, bytes, bytearray], - strict: bool = False, - uts46: bool = False, - std3_rules: bool = False, - transitional: bool = False, -) -> bytes: ... -def decode( - s: Union[str, bytes, bytearray], - strict: bool = ..., - uts46: bool = ..., - std3_rules: bool = ..., -) -> str: ... diff --git a/idna/idnadata.pyi b/idna/idnadata.pyi deleted file mode 100644 index 691249f..0000000 --- a/idna/idnadata.pyi +++ /dev/null @@ -1,6 +0,0 @@ -from typing import Dict, Tuple - -__version__: str -scripts: Dict[str, Tuple[int, ...]] -joining_types: Dict[int, int] -codepoint_classes: Dict[str, Tuple[int, ...]] diff --git a/idna/intranges.py b/idna/intranges.py index fa8a735..6a43b04 100644 --- a/idna/intranges.py +++ b/idna/intranges.py @@ -6,8 +6,9 @@ """ import bisect +from typing import List, Tuple -def intranges_from_list(list_): +def intranges_from_list(list_: List[int]) -> Tuple[int, ...]: """Represent a list of integers as a sequence of ranges: ((start_0, end_0), (start_1, end_1), ...), such that the original integers are exactly those x such that start_i <= x < end_i for some i. @@ -28,14 +29,14 @@ def intranges_from_list(list_): return tuple(ranges) -def _encode_range(start, end): +def _encode_range(start: int, end: int) -> int: return (start << 32) | end -def _decode_range(r): +def _decode_range(r: int) -> Tuple[int, int]: return (r >> 32), (r & ((1 << 32) - 1)) -def intranges_contain(int_, ranges): +def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool: """Determine if `int_` falls into one of the ranges in `ranges`.""" tuple_ = _encode_range(int_, 0) pos = bisect.bisect_left(ranges, tuple_) diff --git a/idna/intranges.pyi b/idna/intranges.pyi deleted file mode 100644 index cde4c23..0000000 --- a/idna/intranges.pyi +++ /dev/null @@ -1,6 +0,0 @@ -from typing import List, Tuple - -def intranges_from_list(list_: List[int]) -> Tuple[int, ...]: ... -def _encode_range(start: int, end: int) -> int: ... -def _decode_range(r: int) -> Tuple[int, int]: ... -def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool: ... diff --git a/idna/package_data.pyi b/idna/package_data.pyi deleted file mode 100644 index bda5b5a..0000000 --- a/idna/package_data.pyi +++ /dev/null @@ -1 +0,0 @@ -__version__: str diff --git a/idna/uts46data.py b/idna/uts46data.py index 8ae36cb..2f56cd1 100644 --- a/idna/uts46data.py +++ b/idna/uts46data.py @@ -1,10 +1,12 @@ # This file is automatically generated by tools/idna-data +from typing import List, Tuple, Union + """IDNA Mapping Table from UTS46.""" __version__ = '13.0.0' -def _seg_0(): +def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x0, '3'), (0x1, '3'), @@ -108,7 +110,7 @@ def _seg_0(): (0x63, 'V'), ] -def _seg_1(): +def _seg_1() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x64, 'V'), (0x65, 'V'), @@ -212,7 +214,7 @@ def _seg_1(): (0xC7, 'M', 'ç'), ] -def _seg_2(): +def _seg_2() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xC8, 'M', 'è'), (0xC9, 'M', 'é'), @@ -316,7 +318,7 @@ def _seg_2(): (0x12B, 'V'), ] -def _seg_3(): +def _seg_3() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x12C, 'M', 'ĭ'), (0x12D, 'V'), @@ -420,7 +422,7 @@ def _seg_3(): (0x193, 'M', 'ɠ'), ] -def _seg_4(): +def _seg_4() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x194, 'M', 'ɣ'), (0x195, 'V'), @@ -524,7 +526,7 @@ def _seg_4(): (0x20C, 'M', 'ȍ'), ] -def _seg_5(): +def _seg_5() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x20D, 'V'), (0x20E, 'M', 'ȏ'), @@ -628,7 +630,7 @@ def _seg_5(): (0x377, 'V'), ] -def _seg_6(): +def _seg_6() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x378, 'X'), (0x37A, '3', ' ι'), @@ -732,7 +734,7 @@ def _seg_6(): (0x402, 'M', 'ђ'), ] -def _seg_7(): +def _seg_7() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x403, 'M', 'ѓ'), (0x404, 'M', 'є'), @@ -836,7 +838,7 @@ def _seg_7(): (0x49D, 'V'), ] -def _seg_8(): +def _seg_8() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x49E, 'M', 'ҟ'), (0x49F, 'V'), @@ -940,7 +942,7 @@ def _seg_8(): (0x502, 'M', 'ԃ'), ] -def _seg_9(): +def _seg_9() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x503, 'V'), (0x504, 'M', 'ԅ'), @@ -1044,7 +1046,7 @@ def _seg_9(): (0x61E, 'V'), ] -def _seg_10(): +def _seg_10() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x675, 'M', 'اٴ'), (0x676, 'M', 'وٴ'), @@ -1148,7 +1150,7 @@ def _seg_10(): (0xA5B, 'M', 'ਜ਼'), ] -def _seg_11(): +def _seg_11() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xA5C, 'V'), (0xA5D, 'X'), @@ -1252,7 +1254,7 @@ def _seg_11(): (0xC12, 'V'), ] -def _seg_12(): +def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xC29, 'X'), (0xC2A, 'V'), @@ -1356,7 +1358,7 @@ def _seg_12(): (0xEB4, 'V'), ] -def _seg_13(): +def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xEBE, 'X'), (0xEC0, 'V'), @@ -1460,7 +1462,7 @@ def _seg_13(): (0x1312, 'V'), ] -def _seg_14(): +def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1316, 'X'), (0x1318, 'V'), @@ -1564,7 +1566,7 @@ def _seg_14(): (0x1C4D, 'V'), ] -def _seg_15(): +def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1C80, 'M', 'в'), (0x1C81, 'M', 'д'), @@ -1668,7 +1670,7 @@ def _seg_15(): (0x1D52, 'M', 'o'), ] -def _seg_16(): +def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1D53, 'M', 'ɔ'), (0x1D54, 'M', 'ᴖ'), @@ -1772,7 +1774,7 @@ def _seg_16(): (0x1E20, 'M', 'ḡ'), ] -def _seg_17(): +def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1E21, 'V'), (0x1E22, 'M', 'ḣ'), @@ -1876,7 +1878,7 @@ def _seg_17(): (0x1E84, 'M', 'ẅ'), ] -def _seg_18(): +def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1E85, 'V'), (0x1E86, 'M', 'ẇ'), @@ -1980,7 +1982,7 @@ def _seg_18(): (0x1EED, 'V'), ] -def _seg_19(): +def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1EEE, 'M', 'ữ'), (0x1EEF, 'V'), @@ -2084,7 +2086,7 @@ def _seg_19(): (0x1F84, 'M', 'ἄι'), ] -def _seg_20(): +def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1F85, 'M', 'ἅι'), (0x1F86, 'M', 'ἆι'), @@ -2188,7 +2190,7 @@ def _seg_20(): (0x1FF3, 'M', 'ωι'), ] -def _seg_21(): +def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1FF4, 'M', 'ώι'), (0x1FF5, 'X'), @@ -2292,7 +2294,7 @@ def _seg_21(): (0x2101, '3', 'a/s'), ] -def _seg_22(): +def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x2102, 'M', 'c'), (0x2103, 'M', '°c'), @@ -2396,7 +2398,7 @@ def _seg_22(): (0x2179, 'M', 'x'), ] -def _seg_23(): +def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x217A, 'M', 'xi'), (0x217B, 'M', 'xii'), @@ -2500,7 +2502,7 @@ def _seg_23(): (0x24B9, 'M', 'd'), ] -def _seg_24(): +def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x24BA, 'M', 'e'), (0x24BB, 'M', 'f'), @@ -2604,7 +2606,7 @@ def _seg_24(): (0x2C25, 'M', 'ⱕ'), ] -def _seg_25(): +def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x2C26, 'M', 'ⱖ'), (0x2C27, 'M', 'ⱗ'), @@ -2708,7 +2710,7 @@ def _seg_25(): (0x2CBE, 'M', 'ⲿ'), ] -def _seg_26(): +def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x2CBF, 'V'), (0x2CC0, 'M', 'ⳁ'), @@ -2812,7 +2814,7 @@ def _seg_26(): (0x2F11, 'M', '刀'), ] -def _seg_27(): +def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x2F12, 'M', '力'), (0x2F13, 'M', '勹'), @@ -2916,7 +2918,7 @@ def _seg_27(): (0x2F75, 'M', '竹'), ] -def _seg_28(): +def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x2F76, 'M', '米'), (0x2F77, 'M', '糸'), @@ -3020,7 +3022,7 @@ def _seg_28(): (0x3002, 'M', '.'), ] -def _seg_29(): +def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x3003, 'V'), (0x3036, 'M', '〒'), @@ -3124,7 +3126,7 @@ def _seg_29(): (0x3180, 'M', 'ᅇ'), ] -def _seg_30(): +def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x3181, 'M', 'ᅌ'), (0x3182, 'M', 'ᇱ'), @@ -3228,7 +3230,7 @@ def _seg_30(): (0x3242, '3', '(自)'), ] -def _seg_31(): +def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x3243, '3', '(至)'), (0x3244, 'M', '問'), @@ -3332,7 +3334,7 @@ def _seg_31(): (0x32AD, 'M', '企'), ] -def _seg_32(): +def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x32AE, 'M', '資'), (0x32AF, 'M', '協'), @@ -3436,7 +3438,7 @@ def _seg_32(): (0x3311, 'M', 'ギニー'), ] -def _seg_33(): +def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x3312, 'M', 'キュリー'), (0x3313, 'M', 'ギルダー'), @@ -3540,7 +3542,7 @@ def _seg_33(): (0x3375, 'M', 'ov'), ] -def _seg_34(): +def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x3376, 'M', 'pc'), (0x3377, 'M', 'dm'), @@ -3644,7 +3646,7 @@ def _seg_34(): (0x33D9, 'M', 'ppm'), ] -def _seg_35(): +def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x33DA, 'M', 'pr'), (0x33DB, 'M', 'sr'), @@ -3748,7 +3750,7 @@ def _seg_35(): (0xA687, 'V'), ] -def _seg_36(): +def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xA688, 'M', 'ꚉ'), (0xA689, 'V'), @@ -3852,7 +3854,7 @@ def _seg_36(): (0xA76E, 'M', 'ꝯ'), ] -def _seg_37(): +def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xA76F, 'V'), (0xA770, 'M', 'ꝯ'), @@ -3956,7 +3958,7 @@ def _seg_37(): (0xA9CF, 'V'), ] -def _seg_38(): +def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xA9DA, 'X'), (0xA9DE, 'V'), @@ -4060,7 +4062,7 @@ def _seg_38(): (0xABB3, 'M', 'Ꮳ'), ] -def _seg_39(): +def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xABB4, 'M', 'Ꮴ'), (0xABB5, 'M', 'Ꮵ'), @@ -4164,7 +4166,7 @@ def _seg_39(): (0xF94E, 'M', '漏'), ] -def _seg_40(): +def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xF94F, 'M', '累'), (0xF950, 'M', '縷'), @@ -4268,7 +4270,7 @@ def _seg_40(): (0xF9B2, 'M', '零'), ] -def _seg_41(): +def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xF9B3, 'M', '靈'), (0xF9B4, 'M', '領'), @@ -4372,7 +4374,7 @@ def _seg_41(): (0xFA18, 'M', '礼'), ] -def _seg_42(): +def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xFA19, 'M', '神'), (0xFA1A, 'M', '祥'), @@ -4476,7 +4478,7 @@ def _seg_42(): (0xFA81, 'M', '嬨'), ] -def _seg_43(): +def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xFA82, 'M', '廒'), (0xFA83, 'M', '廙'), @@ -4580,7 +4582,7 @@ def _seg_43(): (0xFB16, 'M', 'վն'), ] -def _seg_44(): +def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xFB17, 'M', 'մխ'), (0xFB18, 'X'), @@ -4684,7 +4686,7 @@ def _seg_44(): (0xFBF2, 'M', 'ئۆ'), ] -def _seg_45(): +def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xFBF4, 'M', 'ئۈ'), (0xFBF6, 'M', 'ئې'), @@ -4788,7 +4790,7 @@ def _seg_45(): (0xFC5F, '3', ' ٍّ'), ] -def _seg_46(): +def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xFC60, '3', ' َّ'), (0xFC61, '3', ' ُّ'), @@ -4892,7 +4894,7 @@ def _seg_46(): (0xFCC3, 'M', 'قم'), ] -def _seg_47(): +def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xFCC4, 'M', 'كج'), (0xFCC5, 'M', 'كح'), @@ -4996,7 +4998,7 @@ def _seg_47(): (0xFD27, 'M', 'شخ'), ] -def _seg_48(): +def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xFD28, 'M', 'شم'), (0xFD29, 'M', 'شر'), @@ -5100,7 +5102,7 @@ def _seg_48(): (0xFDAE, 'M', 'يحي'), ] -def _seg_49(): +def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xFDAF, 'M', 'يجي'), (0xFDB0, 'M', 'يمي'), @@ -5204,7 +5206,7 @@ def _seg_49(): (0xFE66, '3', '='), ] -def _seg_50(): +def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xFE67, 'X'), (0xFE68, '3', '\\'), @@ -5308,7 +5310,7 @@ def _seg_50(): (0xFF23, 'M', 'c'), ] -def _seg_51(): +def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xFF24, 'M', 'd'), (0xFF25, 'M', 'e'), @@ -5412,7 +5414,7 @@ def _seg_51(): (0xFF87, 'M', 'ヌ'), ] -def _seg_52(): +def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0xFF88, 'M', 'ネ'), (0xFF89, 'M', 'ノ'), @@ -5516,7 +5518,7 @@ def _seg_52(): (0x1000D, 'V'), ] -def _seg_53(): +def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x10027, 'X'), (0x10028, 'V'), @@ -5620,7 +5622,7 @@ def _seg_53(): (0x104BE, 'M', '𐓦'), ] -def _seg_54(): +def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x104BF, 'M', '𐓧'), (0x104C0, 'M', '𐓨'), @@ -5724,7 +5726,7 @@ def _seg_54(): (0x10BB0, 'X'), ] -def _seg_55(): +def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x10C00, 'V'), (0x10C49, 'X'), @@ -5828,7 +5830,7 @@ def _seg_55(): (0x11212, 'X'), ] -def _seg_56(): +def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x11213, 'V'), (0x1123F, 'X'), @@ -5932,7 +5934,7 @@ def _seg_56(): (0x118B7, 'M', '𑣗'), ] -def _seg_57(): +def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x118B8, 'M', '𑣘'), (0x118B9, 'M', '𑣙'), @@ -6036,7 +6038,7 @@ def _seg_57(): (0x16A5F, 'X'), ] -def _seg_58(): +def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x16A60, 'V'), (0x16A6A, 'X'), @@ -6140,7 +6142,7 @@ def _seg_58(): (0x1D165, 'V'), ] -def _seg_59(): +def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1D173, 'X'), (0x1D17B, 'V'), @@ -6244,7 +6246,7 @@ def _seg_59(): (0x1D451, 'M', 'd'), ] -def _seg_60(): +def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1D452, 'M', 'e'), (0x1D453, 'M', 'f'), @@ -6348,7 +6350,7 @@ def _seg_60(): (0x1D4B8, 'M', 'c'), ] -def _seg_61(): +def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1D4B9, 'M', 'd'), (0x1D4BA, 'X'), @@ -6452,7 +6454,7 @@ def _seg_61(): (0x1D51D, 'X'), ] -def _seg_62(): +def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1D51E, 'M', 'a'), (0x1D51F, 'M', 'b'), @@ -6556,7 +6558,7 @@ def _seg_62(): (0x1D583, 'M', 'x'), ] -def _seg_63(): +def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1D584, 'M', 'y'), (0x1D585, 'M', 'z'), @@ -6660,7 +6662,7 @@ def _seg_63(): (0x1D5E7, 'M', 't'), ] -def _seg_64(): +def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1D5E8, 'M', 'u'), (0x1D5E9, 'M', 'v'), @@ -6764,7 +6766,7 @@ def _seg_64(): (0x1D64B, 'M', 'p'), ] -def _seg_65(): +def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1D64C, 'M', 'q'), (0x1D64D, 'M', 'r'), @@ -6868,7 +6870,7 @@ def _seg_65(): (0x1D6B0, 'M', 'ι'), ] -def _seg_66(): +def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1D6B1, 'M', 'κ'), (0x1D6B2, 'M', 'λ'), @@ -6972,7 +6974,7 @@ def _seg_66(): (0x1D716, 'M', 'ε'), ] -def _seg_67(): +def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1D717, 'M', 'θ'), (0x1D718, 'M', 'κ'), @@ -7076,7 +7078,7 @@ def _seg_67(): (0x1D77B, 'M', 'μ'), ] -def _seg_68(): +def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1D77C, 'M', 'ν'), (0x1D77D, 'M', 'ξ'), @@ -7180,7 +7182,7 @@ def _seg_68(): (0x1D7E3, 'M', '1'), ] -def _seg_69(): +def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1D7E4, 'M', '2'), (0x1D7E5, 'M', '3'), @@ -7284,7 +7286,7 @@ def _seg_69(): (0x1E960, 'X'), ] -def _seg_70(): +def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1EC71, 'V'), (0x1ECB5, 'X'), @@ -7388,7 +7390,7 @@ def _seg_70(): (0x1EE6A, 'M', 'ك'), ] -def _seg_71(): +def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1EE6B, 'X'), (0x1EE6C, 'M', 'م'), @@ -7492,7 +7494,7 @@ def _seg_71(): (0x1F108, '3', '7,'), ] -def _seg_72(): +def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1F109, '3', '8,'), (0x1F10A, '3', '9,'), @@ -7596,7 +7598,7 @@ def _seg_72(): (0x1F223, 'M', '販'), ] -def _seg_73(): +def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1F224, 'M', '声'), (0x1F225, 'M', '吹'), @@ -7700,7 +7702,7 @@ def _seg_73(): (0x1FBF9, 'M', '9'), ] -def _seg_74(): +def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x1FBFA, 'X'), (0x20000, 'V'), @@ -7804,7 +7806,7 @@ def _seg_74(): (0x2F85B, 'M', '壷'), ] -def _seg_75(): +def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x2F85C, 'M', '夆'), (0x2F85D, 'M', '多'), @@ -7908,7 +7910,7 @@ def _seg_75(): (0x2F8C2, 'M', '㨮'), ] -def _seg_76(): +def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x2F8C3, 'M', '摩'), (0x2F8C4, 'M', '摾'), @@ -8012,7 +8014,7 @@ def _seg_76(): (0x2F926, 'M', '𤜵'), ] -def _seg_77(): +def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x2F927, 'M', '𤠔'), (0x2F928, 'M', '獺'), @@ -8116,7 +8118,7 @@ def _seg_77(): (0x2F98D, 'M', '辞'), ] -def _seg_78(): +def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x2F98E, 'M', '䑫'), (0x2F98F, 'M', '芑'), @@ -8220,7 +8222,7 @@ def _seg_78(): (0x2F9F1, 'M', '𨵷'), ] -def _seg_79(): +def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ (0x2F9F2, 'M', '䧦'), (0x2F9F3, 'M', '雃'), @@ -8272,7 +8274,7 @@ def _seg_79(): (0xE01F0, 'X'), ] -uts46data = tuple( +uts46data: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] = tuple( _seg_0() + _seg_1() + _seg_2() diff --git a/idna/uts46data.pyi b/idna/uts46data.pyi deleted file mode 100644 index 5937034..0000000 --- a/idna/uts46data.pyi +++ /dev/null @@ -1,4 +0,0 @@ -from typing import Tuple, Union - -__version__: str -uts46data: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] diff --git a/setup.py b/setup.py index d4c95ba..3ea5678 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ def main(): arguments = { 'name': 'idna', 'packages': ['idna'], - 'package_data': {'idna': ['py.typed', '*.pyi']}, + 'package_data': {'idna': ['py.typed']}, 'include_package_data': True, 'version': package_data['__version__'], 'description': 'Internationalized Domain Names in Applications (IDNA)', @@ -51,7 +51,7 @@ def main(): 'Topic :: Software Development :: Libraries :: Python Modules', 'Topic :: Utilities', ], - 'python_requires': '>=3.4', + 'python_requires': '>=3.5', 'test_suite': 'tests', } diff --git a/tools/idna-data b/tools/idna-data index 00c0f4e..8a7847b 100755 --- a/tools/idna-data +++ b/tools/idna-data @@ -575,6 +575,7 @@ def uts46_libdata(ucdata): yield '# This file is automatically generated by tools/idna-data' yield '# vim: set fileencoding=utf-8 :\n' + yield 'from typing import List, Tuple, Union\n\n' yield '"""IDNA Mapping Table from UTS46."""\n\n' yield '__version__ = \'{}\''.format(ucdata.version) @@ -585,11 +586,11 @@ def uts46_libdata(ucdata): if idx % UTS46_SEGMENT_SIZE == 0: if idx != 0: yield ' ]\n' - yield 'def _seg_{}():\n return ['.format(idx // UTS46_SEGMENT_SIZE) + yield 'def _seg_{}() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:\n return ['.format(idx // UTS46_SEGMENT_SIZE) yield ' {},'.format(row) yield ' ]\n' - yield 'uts46data = tuple(' + yield 'uts46data: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] = tuple(' yield ' _seg_0()' for i in range(1, idx // UTS46_SEGMENT_SIZE + 1): yield ' + _seg_{}()'.format(i)