##// END OF EJS Templates
Refactor of coloring and traceback mechanism....
Refactor of coloring and traceback mechanism. This should not change behavior be should slightly clean the code to be a bit more pythonic, and start to introduce methods that avoid side effect (that is to say return values instead of directly writing to stdout). I keep it relatively small and simple for now. My goal is to slowly change the traceback mechanisme to separate buiding the data structure from rendering it to potentially introduce richer tracebacks. Locally I've also started from the other side (re build a traceback rendered from scratch) to see what's needed.

File last commit:

r23231:5835a76e
r24334:50b3e0b7
Show More
autogen_shortcuts.py
85 lines | 2.4 KiB | text/x-python | PythonLexer
/ docs / autogen_shortcuts.py
klonuo
Added keyboard shortcuts docs
r22590 from os.path import abspath, dirname, join
from IPython.terminal.interactiveshell import KeyBindingManager
def name(c):
s = c.__class__.__name__
Matthias Bussonnier
Improve grouping of filter
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
Added keyboard shortcuts docs
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
remove dict() function call and replace it with dict literal - {}
r23231 log_filters = {'_AndList': 'And', '_OrList': 'Or'}
Matthias Bussonnier
Improve grouping of filter
r22624 log_invert = {'_Invert'}
klonuo
Added keyboard shortcuts docs
r22590
kbm = KeyBindingManager.for_prompt()
ipy_bindings = kbm.registry.key_bindings
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
remove dict() function call and replace it with dict literal - {}
r23231 single_filter = {}
multi_filter = {}
klonuo
Added keyboard shortcuts docs
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__':
Matthias Bussonnier
Sort by filter, before sorting by shortcut....
r22625 sort_key = lambda k:(str(k[0][1]),str(k[0][0]))
klonuo
Added keyboard shortcuts docs
r22590 here = abspath(dirname(__file__))
dest = join(here, 'source', 'config', 'shortcuts')
with open(join(dest, 'single_filtered.csv'), 'w') as csv:
Matthias Bussonnier
Sort by filter, before sorting by shortcut....
r22625 for k, v in sorted(single_filter.items(), key=sort_key):
klonuo
Added keyboard shortcuts docs
r22590 csv.write(':kbd:`{}`\t{}\t{}\n'.format(k[0], k[1], v))
with open(join(dest, 'multi_filtered.csv'), 'w') as csv:
Matthias Bussonnier
Sort by filter, before sorting by shortcut....
r22625 for k, v in sorted(multi_filter.items(), key=sort_key):
klonuo
Added keyboard shortcuts docs
r22590 csv.write(':kbd:`{}`\t{}\t{}\n'.format(k[0], k[1], v))