pbrod/Nvector

View on GitHub
src/nvector/_common.py

Summary

Maintainability
A
25 mins
Test Coverage
import inspect
try:
    import textwrap
    textwrap.indent  # pylint: disable=pointless-statement
except AttributeError:  # undefined function (wasn't added until Python 3.3)
    def indent(text, amount=4, ch=' '):
        padding = amount * ch
        return ''.join(padding+line for line in text.splitlines(True))
else:
    def indent(text, amount=4, ch=' '):
        return textwrap.indent(text, amount * ch)

dedent = textwrap.dedent


def _get_h1line(object_):
    """Returns the H1 line of the documentation of an object."""
    doc = object_.__doc__
    if doc:
        return doc.partition("Parameters\n")[0].strip()
    return ''


def _make_summary(odict):
    """Return summary of all functions and classes in odict"""

    class_summary = '\n'.join([':\n'.join((oname, indent(_get_h1line(obj))))
                               for oname, obj in odict.items() if inspect.isclass(obj)])

    fun_summary = '\n'.join([':\n'.join((oname, indent(_get_h1line(obj))))
                             for oname, obj in odict.items() if not inspect.isclass(obj)])
    fmt = "{} in module\n{}----------\n{}\n\n"
    summary = ''
    if class_summary:
        summary = fmt.format("Classes", '-'*8, class_summary)
    if fun_summary:
        summary = summary + fmt.format('Functions', '-'*9, fun_summary)
    return summary


def use_docstring_from(cls):
    """This decorator modifies the decorated function's docstring by
    with the docstring from the class `cls`.

    If the function's docstring is None it is replaced with the supplied cls.__doc__.
    otherwise it is set to old_docstring.format(super=cls.__doc__)

    This is useful when you want to reuse the docstring from another class or
    if you want modify the docstring of a function at runtime.

    """
    return use_docstring(cls.__doc__)


def use_docstring(docstring):
    """This decorator modifies the decorated function's docstring with supplied docstring.

    If the function's docstring is None it is replaced with the supplied docstring.
    otherwise it is set to old_docstring.format(super=docstring)

    This is useful when you want modify the docstring of a function at runtime.
    """
    def _doc(func):
        func_docstring = func.__doc__
        if func_docstring is None:
            func.__doc__ = docstring
        else:
            try:
                new_docstring = dedent(func_docstring).format(super=docstring)
                func.__doc__ = new_docstring
            except Exception:
                pass  # python 2 crashes if the docstring alreasy exists!
        return func
    return _doc


def test_docstrings(filename):
    import doctest
    print('Testing docstrings in {0!s}'.format(filename))
    doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS)
    print('Docstrings tested')


def write_readme(doc):

    with open('readme.txt', 'w') as fid:
        fid.write(doc)