| | """Implementation of configuration-related magic functions. |
| | """ |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | import re |
| |
|
| | |
| | from IPython.core.error import UsageError |
| | from IPython.core.magic import Magics, magics_class, line_magic |
| | from logging import error |
| |
|
| | |
| | |
| | |
| |
|
| | reg = re.compile(r'^\w+\.\w+$') |
| | @magics_class |
| | class ConfigMagics(Magics): |
| |
|
| | def __init__(self, shell): |
| | super(ConfigMagics, self).__init__(shell) |
| | self.configurables = [] |
| |
|
| | @line_magic |
| | def config(self, s): |
| | """configure IPython |
| | |
| | %config Class[.trait=value] |
| | |
| | This magic exposes most of the IPython config system. Any |
| | Configurable class should be able to be configured with the simple |
| | line:: |
| | |
| | %config Class.trait=value |
| | |
| | Where `value` will be resolved in the user's namespace, if it is an |
| | expression or variable name. |
| | |
| | Examples |
| | -------- |
| | |
| | To see what classes are available for config, pass no arguments:: |
| | |
| | In [1]: %config |
| | Available objects for config: |
| | AliasManager |
| | DisplayFormatter |
| | HistoryManager |
| | IPCompleter |
| | LoggingMagics |
| | MagicsManager |
| | OSMagics |
| | PrefilterManager |
| | ScriptMagics |
| | TerminalInteractiveShell |
| | |
| | To view what is configurable on a given class, just pass the class |
| | name:: |
| | |
| | In [2]: %config LoggingMagics |
| | LoggingMagics(Magics) options |
| | --------------------------- |
| | LoggingMagics.quiet=<Bool> |
| | Suppress output of log state when logging is enabled |
| | Current: False |
| | |
| | but the real use is in setting values:: |
| | |
| | In [3]: %config LoggingMagics.quiet = True |
| | |
| | and these values are read from the user_ns if they are variables:: |
| | |
| | In [4]: feeling_quiet=False |
| | |
| | In [5]: %config LoggingMagics.quiet = feeling_quiet |
| | |
| | """ |
| | from traitlets.config.loader import Config |
| | |
| | |
| | |
| | configurables = sorted(set([ c for c in self.shell.configurables |
| | if c.__class__.class_traits(config=True) |
| | ]), key=lambda x: x.__class__.__name__) |
| | classnames = [ c.__class__.__name__ for c in configurables ] |
| |
|
| | line = s.strip() |
| | if not line: |
| | |
| | print("Available objects for config:") |
| | for name in classnames: |
| | print(" ", name) |
| | return |
| | elif line in classnames: |
| | |
| | |
| | c = configurables[classnames.index(line)] |
| | cls = c.__class__ |
| | help = cls.class_get_help(c) |
| | |
| | help = re.sub(re.compile(r'^--', re.MULTILINE), '', help) |
| | print(help) |
| | return |
| | elif reg.match(line): |
| | cls, attr = line.split('.') |
| | return getattr(configurables[classnames.index(cls)],attr) |
| | elif '=' not in line: |
| | msg = "Invalid config statement: %r, "\ |
| | "should be `Class.trait = value`." |
| | |
| | ll = line.lower() |
| | for classname in classnames: |
| | if ll == classname.lower(): |
| | msg = msg + '\nDid you mean %s (note the case)?' % classname |
| | break |
| |
|
| | raise UsageError( msg % line) |
| |
|
| | |
| | |
| | |
| | cfg = Config() |
| | exec("cfg."+line, self.shell.user_ns, locals()) |
| |
|
| | for configurable in configurables: |
| | try: |
| | configurable.update_config(cfg) |
| | except Exception as e: |
| | error(e) |
| |
|