diff --git a/__main__.py b/__main__.py index 870664f0b..51e4173b6 100644 --- a/__main__.py +++ b/__main__.py @@ -13,13 +13,13 @@ def icat(args): def list_fonts(args): - from kitty.fonts.list import main - main(args) + from kitty.fonts.list import main as list_main + list_main(args) def remote_control(args): - from kitty.remote_control import main - main(args) + from kitty.remote_control import main as rc_main + rc_main(args) def runpy(args): @@ -35,8 +35,8 @@ def hold(args): def complete(args): - from kitty.complete import main - main(args[1:], entry_points, namespaced_entry_points) + from kitty.complete import main as complete_main + complete_main(args[1:], entry_points, namespaced_entry_points) def launch(args): @@ -92,10 +92,10 @@ def setup_openssl_environment(): if 'SSL_CERT_FILE' not in os.environ and 'SSL_CERT_DIR' not in os.environ: if os.access('/etc/pki/tls/certs/ca-bundle.crt', os.R_OK): os.environ['SSL_CERT_FILE'] = '/etc/pki/tls/certs/ca-bundle.crt' - sys.kitty_ssl_env_var = 'SSL_CERT_FILE' + setattr(sys, 'kitty_ssl_env_var', 'SSL_CERT_FILE') elif os.path.isdir('/etc/ssl/certs'): os.environ['SSL_CERT_DIR'] = '/etc/ssl/certs' - sys.kitty_ssl_env_var = 'SSL_CERT_DIR' + setattr(sys, 'kitty_ssl_env_var', 'SSL_CERT_DIR') def main(): @@ -109,8 +109,8 @@ def main(): elif first_arg.startswith('+'): namespaced(['+', first_arg[1:]] + sys.argv[2:]) else: - from kitty.main import main - main() + from kitty.main import main as kitty_main + kitty_main() else: func(sys.argv[1:]) diff --git a/gen-wcwidth.py b/gen-wcwidth.py index 35a7945a3..fd2d5c3e4 100755 --- a/gen-wcwidth.py +++ b/gen-wcwidth.py @@ -12,7 +12,9 @@ from functools import partial from html.entities import html5 from itertools import groupby from operator import itemgetter -from typing import DefaultDict, Dict, Set +from typing import ( + DefaultDict, Dict, Generator, Iterable, List, Optional, Set, Tuple, Union +) from urllib.request import urlopen os.chdir(os.path.dirname(os.path.abspath(__file__))) @@ -44,8 +46,8 @@ def get_data(fname, folder='UCD'): # Map of class names to set of codepoints in class class_maps: Dict[str, Set[int]] = {} -all_symbols = set() -name_map = {} +all_symbols: Set[int] = set() +name_map: Dict[int, str] = {} word_search_map: DefaultDict[str, Set[int]] = defaultdict(set) zwj = 0x200d marks = set(emoji_skin_tone_modifiers) | {zwj} @@ -60,7 +62,7 @@ def parse_ucd(): if len(w) > 1: word_search_map[w.lower()].add(c) - first = None + first: Optional[int] = None for word, c in html5.items(): if len(c) == 1: add_word(word.rstrip(';'), ord(c)) @@ -78,7 +80,7 @@ def parse_ucd(): category = parts[2] s = class_maps.setdefault(category, set()) desc = parts[1] - codepoints = (codepoint,) + codepoints: Union[Tuple[int, ...], Iterable[int]] = (codepoint,) if first is None: if desc.endswith(', First>'): first = codepoint @@ -104,8 +106,8 @@ def split_two(line): spec, rest = line.split(';', 1) spec, rest = spec.strip(), rest.strip().split(' ', 1)[0].strip() if '..' in spec: - chars = tuple(map(lambda x: int(x, 16), filter(None, spec.split('.')))) - chars = set(range(chars[0], chars[1] + 1)) + chars_ = tuple(map(lambda x: int(x, 16), filter(None, spec.split('.')))) + chars = set(range(chars_[0], chars_[1] + 1)) else: chars = {int(spec, 16)} return chars, rest @@ -137,7 +139,7 @@ ambiguous: Set[int] = set() def parse_eaw(): global doublewidth, ambiguous - seen = set() + seen: Set[int] = set() for line in get_data('ucd/EastAsianWidth.txt'): chars, eaw = split_two(line) if eaw == 'A': @@ -153,7 +155,7 @@ def parse_eaw(): doublewidth |= set(range(0x30000, 0x3FFFD + 1)) - seen -def get_ranges(items): +def get_ranges(items: List[int]) -> Generator[Union[int, Tuple[int, int]], None, None]: items.sort() for k, g in groupby(enumerate(items), lambda m: m[0]-m[1]): group = tuple(map(itemgetter(1), g)) @@ -221,7 +223,7 @@ def gen_emoji(): def category_test(name, p, classes, comment, static=False, extra_chars=frozenset(), exclude=frozenset()): static = 'static inline ' if static else '' - chars = set() + chars: Set[int] = set() for c in classes: chars |= class_maps[c] chars |= extra_chars @@ -252,7 +254,7 @@ def codepoint_to_mark_map(p, mark_map): def classes_to_regex(classes, exclude=''): - chars = set() + chars: Set[int] = set() for c in classes: chars |= class_maps[c] for c in map(ord, exclude): @@ -300,7 +302,9 @@ def gen_ucd(): p('}\n') with open('kitty/unicode-data.h') as f: unicode_data = f.read() - expected = int(re.search(r'^#define VS15 (\d+)', unicode_data, re.M).group(1)) + m = re.search(r'^#define VS15 (\d+)', unicode_data, re.M) + if m is not None: + expected = int(m.group(1)) if rmap[0xfe0e] != expected: raise ValueError('The mark for 0xfe0e has changed, you have to update VS15 to {} and VS16 to {} in unicode-data.h'.format( rmap[0xfe0e], rmap[0xfe0f] @@ -364,7 +368,7 @@ def gen_names(): # The trie p(f'typedef struct {{ uint32_t children_offset; uint32_t match_offset; }} word_trie;\n') - all_trie_nodes = [] + all_trie_nodes: List['TrieNode'] = [] class TrieNode: @@ -411,7 +415,7 @@ def gen_names(): def gen_wcwidth(): - seen = set() + seen: Set[int] = set() def add(p, comment, chars_, ret): chars = chars_ - seen diff --git a/glfw/glfw.py b/glfw/glfw.py index 4e8aae0e4..d737b191b 100755 --- a/glfw/glfw.py +++ b/glfw/glfw.py @@ -46,8 +46,8 @@ def init_env(env, pkg_config, at_least_version, test_compile, module='x11'): elif module == 'cocoa': ans.cppflags.append('-DGL_SILENCE_DEPRECATION') - for f in 'Cocoa IOKit CoreFoundation CoreVideo'.split(): - ans.ldpaths.extend(('-framework', f)) + for f_ in 'Cocoa IOKit CoreFoundation CoreVideo'.split(): + ans.ldpaths.extend(('-framework', f_)) elif module == 'wayland': at_least_version('wayland-protocols', *sinfo['wayland_protocols']) diff --git a/kitty/client.py b/kitty/client.py index 498268ae3..4b844f8fa 100644 --- a/kitty/client.py +++ b/kitty/client.py @@ -127,16 +127,16 @@ def screen_manipulate_title_stack(op, which): write(CSI + '%d;%dt' % (op, which)) -def report_device_attributes(mode, char): +def report_device_attributes(mode: int, char: int) -> None: x = CSI if char: - x += ord(char) + x += chr(char) if mode: x += str(mode) write(CSI + x + 'c') -def write_osc(code, string=''): +def write_osc(code: int, string='') -> None: if string: string = ';' + string write(OSC + str(code) + string + '\x07') diff --git a/kitty/fonts/__init__.py b/kitty/fonts/__init__.py index e69de29bb..88ec07c94 100644 --- a/kitty/fonts/__init__.py +++ b/kitty/fonts/__init__.py @@ -0,0 +1,11 @@ +try: + from typing import TypedDict +except ImportError: + TypedDict = dict + + +class ListedFont(TypedDict): + family: str + full_name: str + postscript_name: str + is_monospace: bool diff --git a/kitty/fonts/core_text.py b/kitty/fonts/core_text.py index 7339c06c8..cc871f1ad 100644 --- a/kitty/fonts/core_text.py +++ b/kitty/fonts/core_text.py @@ -3,10 +3,13 @@ # License: GPL v3 Copyright: 2017, Kovid Goyal import re +from typing import Generator from kitty.fast_data_types import coretext_all_fonts from kitty.utils import log_error +from . import ListedFont + attr_map = {(False, False): 'font_family', (True, False): 'bold_font', (False, True): 'italic_font', @@ -32,7 +35,7 @@ def all_fonts_map(): return ans -def list_fonts(): +def list_fonts() -> Generator[ListedFont, None, None]: for fd in coretext_all_fonts(): f = fd['family'] if f: diff --git a/kitty/fonts/fontconfig.py b/kitty/fonts/fontconfig.py index 8a004d33b..ad30a68c5 100644 --- a/kitty/fonts/fontconfig.py +++ b/kitty/fonts/fontconfig.py @@ -4,12 +4,15 @@ import re from functools import lru_cache +from typing import Generator from kitty.fast_data_types import ( - FC_SLANT_ITALIC, FC_SLANT_ROMAN, FC_WEIGHT_BOLD, FC_WEIGHT_REGULAR, - fc_list, fc_match as fc_match_impl, FC_DUAL, FC_MONO + FC_DUAL, FC_MONO, FC_SLANT_ITALIC, FC_SLANT_ROMAN, FC_WEIGHT_BOLD, + FC_WEIGHT_REGULAR, fc_list, fc_match as fc_match_impl ) +from . import ListedFont + attr_map = {(False, False): 'font_family', (True, False): 'bold_font', (False, True): 'italic_font', @@ -39,7 +42,7 @@ def all_fonts_map(monospaced=True): return create_font_map(ans) -def list_fonts(): +def list_fonts() -> Generator[ListedFont, None, None]: for fd in fc_list(): f = fd.get('family') if f: diff --git a/kitty/fonts/list.py b/kitty/fonts/list.py index ef6947812..65be4e98d 100644 --- a/kitty/fonts/list.py +++ b/kitty/fonts/list.py @@ -4,6 +4,7 @@ import sys from kitty.constants import is_macos +from typing import Sequence if is_macos: from .core_text import list_fonts @@ -19,7 +20,7 @@ def create_family_groups(monospaced=True): return g -def main(argv): +def main(argv: Sequence[str]) -> None: psnames = '--psnames' in argv isatty = sys.stdout.isatty() groups = create_family_groups()