Use mypy in daemon mode

This commit is contained in:
Kovid Goyal 2020-03-05 20:38:51 +05:30
parent 77e9460eea
commit 1e998b6a3f
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
6 changed files with 32 additions and 21 deletions

1
.gitignore vendored
View File

@ -2,6 +2,7 @@
*.pyc *.pyc
*.pyo *.pyo
*_stub.pyi *_stub.pyi
/.dmypy.json
/tags /tags
/build/ /build/
/linux-package/ /linux-package/

View File

@ -4,18 +4,23 @@
import subprocess import subprocess
from collections import defaultdict 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): def resolve_keys(keymap: KeymapType):
ans = defaultdict(list) ans: DefaultDict[str, List[str]] = defaultdict(list)
for ch, (attr, atype) in keymap.items(): for ch, (attr, atype) in keymap.items():
if atype not in ('int', 'uint'): if isinstance(atype, str) and atype in ('int', 'uint'):
atype = 'flag' q = atype
ans[atype].append(ch) else:
q = 'flag'
ans[q].append(ch)
return ans return ans
def enum(keymap): def enum(keymap: KeymapType):
lines = [] lines = []
for ch, (attr, atype) in keymap.items(): for ch, (attr, atype) in keymap.items():
lines.append(f"{attr}='{ch}'") lines.append(f"{attr}='{ch}'")
@ -26,15 +31,15 @@ def enum(keymap):
'''.format(',\n'.join(lines)) '''.format(',\n'.join(lines))
def parse_key(keymap): def parse_key(keymap: KeymapType):
lines = [] lines = []
for attr, atype in keymap.values(): 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;') lines.append(f'case {attr}: value_state = {vs}; break;')
return ' \n'.join(lines) return ' \n'.join(lines)
def parse_flag(keymap, type_map, command_class): def parse_flag(keymap: KeymapType, type_map, command_class):
lines = [] lines = []
for ch in type_map['flag']: for ch in type_map['flag']:
attr, allowed_values = keymap[ch] attr, allowed_values = keymap[ch]
@ -52,13 +57,13 @@ def parse_flag(keymap, type_map, command_class):
return ' \n'.join(lines) 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'] 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'] uint_keys = [f'U({attr})' for attr, atype in keymap.values() if atype == 'uint']
return '; '.join(int_keys), '; '.join(uint_keys) 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): def group(atype, conv):
flag_fmt, flag_attrs = [], [] flag_fmt, flag_attrs = [], []
cv = {'flag': 'c', 'int': 'i', 'uint': 'I'}[atype] 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) 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) type_map = resolve_keys(keymap)
keys_enum = enum(keymap) keys_enum = enum(keymap)
handle_key = parse_key(keymap) handle_key = parse_key(keymap)
@ -235,7 +240,7 @@ def write_header(text, path):
def graphics_parser(): def graphics_parser():
flag = frozenset flag = frozenset
keymap = { keymap: KeymapType = {
'a': ('action', flag('tTqpd')), 'a': ('action', flag('tTqpd')),
'd': ('delete_action', flag('aAiIcCpPqQxXyYzZ')), 'd': ('delete_action', flag('aAiIcCpPqQxXyYzZ')),
't': ('transmission_type', flag('dfts')), 't': ('transmission_type', flag('dfts')),

View File

@ -136,11 +136,11 @@ def main(sys_args):
for override in args.override: for override in args.override:
sys.argv.append('--override={}'.format(override)) sys.argv.append('--override={}'.format(override))
sys.argv.extend(items) 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.cached_values_name = 'panel'
run_app.first_window_callback = setup_x11_window run_app.first_window_callback = setup_x11_window
run_app.initial_window_size_func = initial_window_size_func run_app.initial_window_size_func = initial_window_size_func
main() real_main()
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -22,4 +22,4 @@ warn_redundant_casts = True
warn_unused_ignores = True warn_unused_ignores = True
warn_return_any = True warn_return_any = True
warn_unreachable = True warn_unreachable = True
# check_untyped_defs = True check_untyped_defs = True

View File

@ -870,9 +870,9 @@ def package(args, bundle_type):
f.seek(0), f.truncate(), f.write(nraw) f.seek(0), f.truncate(), f.write(nraw)
compile_python(libdir) compile_python(libdir)
for root, dirs, files in os.walk(libdir): for root, dirs, files in os.walk(libdir):
for f in files: for f_ in files:
path = os.path.join(root, f) path = os.path.join(root, f_)
os.chmod(path, 0o755 if f.endswith('.so') else 0o644) os.chmod(path, 0o755 if f_.endswith('.so') else 0o644)
if not is_macos: if not is_macos:
create_linux_bundle_gunk(ddir, args.libdir_name) create_linux_bundle_gunk(ddir, args.libdir_name)
@ -899,7 +899,9 @@ def clean():
for root, dirs, files in os.walk('.', topdown=True): for root, dirs, files in os.walk('.', topdown=True):
dirs[:] = [d for d in dirs if d not in exclude] 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')} 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: for f in files:
ext = f.rpartition('.')[-1] ext = f.rpartition('.')[-1]
if ext in ('so', 'dylib', 'pyc', 'pyo'): if ext in ('so', 'dylib', 'pyc', 'pyo'):

View File

@ -71,7 +71,10 @@ def type_check():
generate_stub() generate_stub()
from kitty.options_stub import generate_stub from kitty.options_stub import generate_stub
generate_stub() generate_stub()
if 'CI' in os.environ:
os.execlp('mypy', 'mypy') os.execlp('mypy', 'mypy')
else:
os.execlp('dmypy', 'dmypy', 'run', '--', '--follow-imports=error')
def run_tests(): def run_tests():