Source code for omniduct.utils.magics

from abc import ABCMeta, abstractmethod

from future.utils import with_metaclass

from interface_meta import quirk_docs


def process_line_arguments(f):
    def wrapped(*args, **kwargs):
        args = list(args)
        new_args, new_kwargs = _process_line_arguments(args.pop(0))
        args += new_args
        kwargs.update(new_kwargs)
        return f(*args, **kwargs)
    return wrapped


def process_line_cell_arguments(f):
    def wrapped(*args, **kwargs):
        args = list(args)
        new_args, new_kwargs = _process_line_arguments(args.pop(0))
        if len(args) == 0:
            args += [None]
        args += new_args
        kwargs.update(new_kwargs)
        return f(*args, **kwargs)
    return wrapped


def _process_line_arguments(line_arguments):
    from IPython import get_ipython
    args = []
    kwargs = {}
    reached_kwargs = False
    for arg in line_arguments.split():
        if '=' in arg:
            reached_kwargs = True
            key, value = arg.split('=')
            value = eval(value, get_ipython().user_ns)
            if key in kwargs:
                raise ValueError('Duplicate keyword argument `{}`.'.format(key))
            kwargs[key] = value
        else:
            if reached_kwargs:
                raise ValueError('Positional argument `{}` after keyword argument.'.format(arg))
            args.append(arg)
    return args, kwargs


[docs]class MagicsProvider(with_metaclass(ABCMeta, object)): @quirk_docs('_register_magics') def register_magics(self, base_name=None): base_name = base_name or self.name if base_name is None: raise RuntimeError("Cannot register magics without a base_name.") try: from IPython import get_ipython ip = get_ipython() assert ip is not None has_ipython = True except Exception: has_ipython = False if has_ipython: self._register_magics(base_name) @abstractmethod def _register_magics(self, base_name): pass