autogen_shortcuts.py
94 lines
| 2.6 KiB
| text/x-python
|
PythonLexer
/ docs / autogen_shortcuts.py
NotWearingPants
|
r26119 | from pathlib import Path | ||
klonuo
|
r22590 | |||
Gabriel Potter
|
r24389 | from IPython.terminal.shortcuts import create_ipython_shortcuts | ||
klonuo
|
r22590 | |||
def name(c): | ||||
s = c.__class__.__name__ | ||||
Matthias Bussonnier
|
r22624 | if s == '_Invert': | ||
return '(Not: %s)' % name(c.filter) | ||||
if s in log_filters.keys(): | ||||
return '(%s: %s)' % (log_filters[s], ', '.join(name(x) for x in c.filters)) | ||||
klonuo
|
r22590 | return log_filters[s] if s in log_filters.keys() else s | ||
def sentencize(s): | ||||
"""Extract first sentence | ||||
""" | ||||
s = s.replace('\n', ' ').strip().split('.') | ||||
s = s[0] if len(s) else s | ||||
try: | ||||
return " ".join(s.split()) | ||||
except AttributeError: | ||||
return s | ||||
def most_common(lst, n=3): | ||||
"""Most common elements occurring more then `n` times | ||||
""" | ||||
from collections import Counter | ||||
c = Counter(lst) | ||||
return [k for (k, v) in c.items() if k and v > n] | ||||
def multi_filter_str(flt): | ||||
"""Yield readable conditional filter | ||||
""" | ||||
assert hasattr(flt, 'filters'), 'Conditional filter required' | ||||
yield name(flt) | ||||
Srinivas Reddy Thatiparthy
|
r23231 | log_filters = {'_AndList': 'And', '_OrList': 'Or'} | ||
Matthias Bussonnier
|
r22624 | log_invert = {'_Invert'} | ||
klonuo
|
r22590 | |||
Matthias Bussonnier
|
r26160 | class _DummyTerminal: | ||
Gabriel Potter
|
r24389 | """Used as a buffer to get prompt_toolkit bindings | ||
""" | ||||
handle_return = None | ||||
Thomas Kluyver
|
r24402 | input_transformer_manager = None | ||
Gabriel Potter
|
r24389 | display_completions = None | ||
Matthias Bussonnier
|
r26160 | editing_mode = "emacs" | ||
Gabriel Potter
|
r24389 | |||
ipy_bindings = create_ipython_shortcuts(_DummyTerminal()).bindings | ||||
klonuo
|
r22590 | |||
dummy_docs = [] # ignore bindings without proper documentation | ||||
common_docs = most_common([kb.handler.__doc__ for kb in ipy_bindings]) | ||||
if common_docs: | ||||
dummy_docs.extend(common_docs) | ||||
dummy_docs = list(set(dummy_docs)) | ||||
Srinivas Reddy Thatiparthy
|
r23231 | single_filter = {} | ||
multi_filter = {} | ||||
klonuo
|
r22590 | for kb in ipy_bindings: | ||
doc = kb.handler.__doc__ | ||||
if not doc or doc in dummy_docs: | ||||
continue | ||||
shortcut = ' '.join([k if isinstance(k, str) else k.name for k in kb.keys]) | ||||
shortcut += shortcut.endswith('\\') and '\\' or '' | ||||
if hasattr(kb.filter, 'filters'): | ||||
flt = ' '.join(multi_filter_str(kb.filter)) | ||||
multi_filter[(shortcut, flt)] = sentencize(doc) | ||||
else: | ||||
single_filter[(shortcut, name(kb.filter))] = sentencize(doc) | ||||
if __name__ == '__main__': | ||||
NotWearingPants
|
r26119 | here = Path(__file__).parent | ||
Matthias Bussonnier
|
r26175 | dest = here / "source" / "config" / "shortcuts" | ||
klonuo
|
r22590 | |||
Snir Broshi
|
r26125 | def sort_key(item): | ||
k, v = item | ||||
shortcut, flt = k | ||||
return (str(shortcut), str(flt)) | ||||
Matthias Bussonnier
|
r26175 | for filters, output_filename in [ | ||
(single_filter, "single_filtered"), | ||||
(multi_filter, "multi_filtered"), | ||||
]: | ||||
with (dest / "{}.csv".format(output_filename)).open("w") as csv: | ||||
Snir Broshi
|
r26125 | for (shortcut, flt), v in sorted(filters.items(), key=sort_key): | ||
Matthias Bussonnier
|
r26175 | csv.write(":kbd:`{}`\t{}\t{}\n".format(shortcut, flt, v)) | ||