Use mypy in daemon mode
This commit is contained in:
parent
77e9460eea
commit
1e998b6a3f
1
.gitignore
vendored
1
.gitignore
vendored
@ -2,6 +2,7 @@
|
|||||||
*.pyc
|
*.pyc
|
||||||
*.pyo
|
*.pyo
|
||||||
*_stub.pyi
|
*_stub.pyi
|
||||||
|
/.dmypy.json
|
||||||
/tags
|
/tags
|
||||||
/build/
|
/build/
|
||||||
/linux-package/
|
/linux-package/
|
||||||
|
|||||||
@ -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')),
|
||||||
|
|||||||
@ -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__':
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
10
setup.py
10
setup.py
@ -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'):
|
||||||
|
|||||||
3
test.py
3
test.py
@ -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():
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user