From 1e998b6a3f2f3042b02df2ee7e31db0b2f704340 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 5 Mar 2020 20:38:51 +0530 Subject: [PATCH] Use mypy in daemon mode --- .gitignore | 1 + gen-apc-parsers.py | 31 ++++++++++++++++++------------- kittens/panel/main.py | 4 ++-- setup.cfg | 2 +- setup.py | 10 ++++++---- test.py | 5 ++++- 6 files changed, 32 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore index ce0afb827..54940cc2f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ *.pyc *.pyo *_stub.pyi +/.dmypy.json /tags /build/ /linux-package/ diff --git a/gen-apc-parsers.py b/gen-apc-parsers.py index 0ffe881a4..48d62cdc7 100755 --- a/gen-apc-parsers.py +++ b/gen-apc-parsers.py @@ -4,18 +4,23 @@ import subprocess from collections import defaultdict +from typing import DefaultDict, Dict, FrozenSet, List, Tuple, Union + +KeymapType = Dict[str, Tuple[str, Union[FrozenSet[str], str]]] -def resolve_keys(keymap): - ans = defaultdict(list) +def resolve_keys(keymap: KeymapType): + ans: DefaultDict[str, List[str]] = defaultdict(list) for ch, (attr, atype) in keymap.items(): - if atype not in ('int', 'uint'): - atype = 'flag' - ans[atype].append(ch) + if isinstance(atype, str) and atype in ('int', 'uint'): + q = atype + else: + q = 'flag' + ans[q].append(ch) return ans -def enum(keymap): +def enum(keymap: KeymapType): lines = [] for ch, (attr, atype) in keymap.items(): lines.append(f"{attr}='{ch}'") @@ -26,15 +31,15 @@ def enum(keymap): '''.format(',\n'.join(lines)) -def parse_key(keymap): +def parse_key(keymap: KeymapType): lines = [] for attr, atype in keymap.values(): - vs = atype.upper() if atype in ('uint', 'int') else 'FLAG' + vs = atype.upper() if isinstance(atype, str) and atype in ('uint', 'int') else 'FLAG' lines.append(f'case {attr}: value_state = {vs}; break;') return ' \n'.join(lines) -def parse_flag(keymap, type_map, command_class): +def parse_flag(keymap: KeymapType, type_map, command_class): lines = [] for ch in type_map['flag']: attr, allowed_values = keymap[ch] @@ -52,13 +57,13 @@ def parse_flag(keymap, type_map, command_class): return ' \n'.join(lines) -def parse_number(keymap): +def parse_number(keymap: KeymapType): int_keys = [f'I({attr})' for attr, atype in keymap.values() if atype == 'int'] uint_keys = [f'U({attr})' for attr, atype in keymap.values() if atype == 'uint'] return '; '.join(int_keys), '; '.join(uint_keys) -def cmd_for_report(report_name, keymap, type_map, payload_allowed): +def cmd_for_report(report_name, keymap: KeymapType, type_map, payload_allowed): def group(atype, conv): flag_fmt, flag_attrs = [], [] cv = {'flag': 'c', 'int': 'i', 'uint': 'I'}[atype] @@ -84,7 +89,7 @@ def cmd_for_report(report_name, keymap, type_map, payload_allowed): return '\n'.join(ans) -def generate(function_name, callback_name, report_name, keymap, command_class, initial_key='a', payload_allowed=True): +def generate(function_name, callback_name, report_name, keymap: KeymapType, command_class, initial_key='a', payload_allowed=True): type_map = resolve_keys(keymap) keys_enum = enum(keymap) handle_key = parse_key(keymap) @@ -235,7 +240,7 @@ def write_header(text, path): def graphics_parser(): flag = frozenset - keymap = { + keymap: KeymapType = { 'a': ('action', flag('tTqpd')), 'd': ('delete_action', flag('aAiIcCpPqQxXyYzZ')), 't': ('transmission_type', flag('dfts')), diff --git a/kittens/panel/main.py b/kittens/panel/main.py index 6ca938692..cdf9d9e1d 100644 --- a/kittens/panel/main.py +++ b/kittens/panel/main.py @@ -136,11 +136,11 @@ def main(sys_args): for override in args.override: sys.argv.append('--override={}'.format(override)) sys.argv.extend(items) - from kitty.main import run_app, main + from kitty.main import run_app, main as real_main run_app.cached_values_name = 'panel' run_app.first_window_callback = setup_x11_window run_app.initial_window_size_func = initial_window_size_func - main() + real_main() if __name__ == '__main__': diff --git a/setup.cfg b/setup.cfg index e5e049b03..01baa811c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -22,4 +22,4 @@ warn_redundant_casts = True warn_unused_ignores = True warn_return_any = True warn_unreachable = True -# check_untyped_defs = True +check_untyped_defs = True diff --git a/setup.py b/setup.py index 0833654ab..e6058354e 100755 --- a/setup.py +++ b/setup.py @@ -870,9 +870,9 @@ def package(args, bundle_type): f.seek(0), f.truncate(), f.write(nraw) compile_python(libdir) for root, dirs, files in os.walk(libdir): - for f in files: - path = os.path.join(root, f) - os.chmod(path, 0o755 if f.endswith('.so') else 0o644) + for f_ in files: + path = os.path.join(root, f_) + os.chmod(path, 0o755 if f_.endswith('.so') else 0o644) if not is_macos: create_linux_bundle_gunk(ddir, args.libdir_name) @@ -899,7 +899,9 @@ def clean(): for root, dirs, files in os.walk('.', topdown=True): dirs[:] = [d for d in dirs if d not in exclude] remove_dirs = {d for d in dirs if d == '__pycache__' or d.endswith('.dSYM')} - [(shutil.rmtree(os.path.join(root, d)), dirs.remove(d)) for d in remove_dirs] + for d in remove_dirs: + shutil.rmtree(os.path.join(root, d)) + dirs.remove(d) for f in files: ext = f.rpartition('.')[-1] if ext in ('so', 'dylib', 'pyc', 'pyo'): diff --git a/test.py b/test.py index 7ca67f2c7..7b4462fa2 100755 --- a/test.py +++ b/test.py @@ -71,7 +71,10 @@ def type_check(): generate_stub() from kitty.options_stub import generate_stub generate_stub() - os.execlp('mypy', 'mypy') + if 'CI' in os.environ: + os.execlp('mypy', 'mypy') + else: + os.execlp('dmypy', 'dmypy', 'run', '--', '--follow-imports=error') def run_tests():