##// END OF EJS Templates
fix for PySide2 cannot be activated since it is directly deactivated again in the else part
fix for PySide2 cannot be activated since it is directly deactivated again in the else part

File last commit:

r24586:0ec527d5
r24792:d6fff837
Show More
autogen_config.py
154 lines | 4.7 KiB | text/x-python | PythonLexer
/ docs / autogen_config.py
Yaroslav Halchenko
ENH: list generated config files in generated, and rm them upon clean
r16197 #!/usr/bin/env python
Min RK
abspath fixes for autogen scripts
r21590 from os.path import join, dirname, abspath
Thomas Kluyver
Generate docs for config options.
r13459 from IPython.terminal.ipapp import TerminalIPythonApp
Thomas Kluyver
Use new traitlets API to generate config docs...
r21400 from ipykernel.kernelapp import IPKernelApp
Thomas Kluyver
Make each config option individually linkable
r23831 from traitlets import Undefined
Thomas Kluyver
Include command line aliases in config docs
r23832 from collections import defaultdict
Thomas Kluyver
Generate docs for config options.
r13459
Min RK
abspath fixes for autogen scripts
r21590 here = abspath(dirname(__file__))
options = join(here, 'source', 'config', 'options')
klonuo
Refactor autogen config
r22516 generated = join(options, 'config-generated.txt')
Matthias Bussonnier
Remove implicit dependency to ipython_genutils....
r24586 import textwrap
indent = lambda text,n: textwrap.indent(text,n*' ')
def dedent(text):
"""Equivalent of textwrap.dedent that ignores unindented first line.
This means it will still dedent strings like:
'''foo
is a bar
'''
For use in wrap_paragraphs.
"""
if text.startswith('\n'):
# text starts with blank line, don't ignore the first line
return textwrap.dedent(text)
# split first line
splits = text.split('\n',1)
if len(splits) == 1:
# only one line
return textwrap.dedent(text)
first, rest = splits
# dedent everything but the first line
rest = textwrap.dedent(rest)
return '\n'.join([first, rest])
Thomas Kluyver
Make each config option individually linkable
r23831
def interesting_default_value(dv):
if (dv is None) or (dv is Undefined):
return False
if isinstance(dv, (str, list, tuple, dict, set)):
return bool(dv)
return True
Thomas Kluyver
Include command line aliases in config docs
r23832 def format_aliases(aliases):
fmted = []
for a in aliases:
dashes = '-' if len(a) == 1 else '--'
fmted.append('``%s%s``' % (dashes, a))
return ', '.join(fmted)
def class_config_rst_doc(cls, trait_aliases):
Thomas Kluyver
Make each config option individually linkable
r23831 """Generate rST documentation for this class' config options.
Excludes traits defined on parent classes.
"""
lines = []
classname = cls.__name__
for k, trait in sorted(cls.class_traits(config=True).items()):
ttype = trait.__class__.__name__
Thomas Kluyver
Include command line aliases in config docs
r23832 fullname = classname + '.' + trait.name
lines += ['.. configtrait:: ' + fullname,
Thomas Kluyver
Make each config option individually linkable
r23831 ''
]
help = trait.help.rstrip() or 'No description'
lines.append(indent(dedent(help), 4) + '\n')
# Choices or type
if 'Enum' in ttype:
# include Enum choices
lines.append(indent(
':options: ' + ', '.join('``%r``' % x for x in trait.values), 4))
else:
lines.append(indent(':trait type: ' + ttype, 4))
# Default value
# Ignore boring default values like None, [] or ''
if interesting_default_value(trait.default_value):
try:
dvr = trait.default_value_repr()
except Exception:
dvr = None # ignore defaults we can't construct
if dvr is not None:
if len(dvr) > 64:
dvr = dvr[:61] + '...'
# Double up backslashes, so they get to the rendered docs
dvr = dvr.replace('\\n', '\\\\n')
lines.append(indent(':default: ``%s``' % dvr, 4))
Thomas Kluyver
Include command line aliases in config docs
r23832 # Command line aliases
if trait_aliases[fullname]:
fmt_aliases = format_aliases(trait_aliases[fullname])
lines.append(indent(':CLI option: ' + fmt_aliases, 4))
Thomas Kluyver
Make each config option individually linkable
r23831 # Blank line
lines.append('')
return '\n'.join(lines)
Thomas Kluyver
Include command line aliases in config docs
r23832 def reverse_aliases(app):
"""Produce a mapping of trait names to lists of command line aliases.
"""
res = defaultdict(list)
for alias, trait in app.aliases.items():
res[trait].append(alias)
# Flags also often act as aliases for a boolean trait.
# Treat flags which set one trait to True as aliases.
for flag, (cfg, _) in app.flags.items():
if len(cfg) == 1:
classname = list(cfg)[0]
cls_cfg = cfg[classname]
if len(cls_cfg) == 1:
traitname = list(cls_cfg)[0]
if cls_cfg[traitname] is True:
res[classname+'.'+traitname].append(flag)
return res
Min RK
abspath fixes for autogen scripts
r21590
Thomas Kluyver
Use new traitlets API to generate config docs...
r21400 def write_doc(name, title, app, preamble=None):
Thomas Kluyver
Include command line aliases in config docs
r23832 trait_aliases = reverse_aliases(app)
Thomas Kluyver
Revert part of gh-9567
r22615 filename = join(options, name+'.rst')
with open(filename, 'w') as f:
Thomas Kluyver
Generate docs for config options.
r13459 f.write(title + '\n')
f.write(('=' * len(title)) + '\n')
f.write('\n')
if preamble is not None:
f.write(preamble + '\n\n')
Thomas Kluyver
Make each config option individually linkable
r23831 #f.write(app.document_config_options())
for c in app._classes_inc_parents():
Thomas Kluyver
Include command line aliases in config docs
r23832 f.write(class_config_rst_doc(c, trait_aliases))
Thomas Kluyver
Make each config option individually linkable
r23831 f.write('\n')
Yaroslav Halchenko
ENH: list generated config files in generated, and rm them upon clean
r16197
Thomas Kluyver
Generate docs for config options.
r13459
if __name__ == '__main__':
Thomas Kluyver
Revert part of gh-9567
r22615 # Touch this file for the make target
klonuo
Refactor autogen config
r22516 with open(generated, 'w'):
pass
Yaroslav Halchenko
ENH: list generated config files in generated, and rm them upon clean
r16197
Thomas Kluyver
Use new traitlets API to generate config docs...
r21400 write_doc('terminal', 'Terminal IPython options', TerminalIPythonApp())
write_doc('kernel', 'IPython kernel options', IPKernelApp(),
preamble=("These options can be used in :file:`ipython_kernel_config.py`. "
"The kernel also respects any options in `ipython_config.py`"),
MinRK
remove references to kernel config in parent config files...
r18030 )