Source

sphinx / tests / util.py

Full commit
georg.brandl cbc5331 









georg.brandl 7187a9f 
georg.brandl cbc5331 

georg.brandl 7187a9f 

gbrandl f2678b1 




georg.brandl cbc5331 




georg.brandl 7187a9f 

georg.brandl cbc5331 

georg.brandl 5ddec89 
georg.brandl 7bc9879 
georg.brandl 72370f1 
georg.brandl de96e31 
georg.brandl 7187a9f 
georg.brandl cbc5331 


georg.brandl 5ddec89 


georg.brandl cbc5331 

























georg.brandl 72370f1 
georg.brandl cbc5331 




georg.brandl 7bc9879 




georg.brandl 7187a9f 
georg.brandl cbc5331 
georg.brandl 7187a9f 
georg.brandl cbc5331 


georg.brandl 7187a9f 



georg.brandl cbc5331 

georg.brandl 7187a9f 
georg.brandl cbc5331 









georg.brandl 0a71b9b 
georg.brandl cbc5331 


georg.brandl 0a71b9b 

georg.brandl cbc5331 
georg.brandl 5ddec89 
georg.brandl 7187a9f 
georg.brandl 0a71b9b 




georg.brandl cbc5331 

georg.brandl 7187a9f 
georg.brandl cbc5331 


georg.brandl 7187a9f 


georg.brandl 0a71b9b 
georg.brandl cbc5331 
georg.brandl 7187a9f 
georg.brandl 0a71b9b 

georg.brandl cbc5331 




georg.brandl 7187a9f 
georg.brandl cbc5331 
georg.brandl 0a71b9b 
georg.brandl cbc5331 




georg.brandl 0a71b9b 

georg.brandl e63649e 
georg.brandl 7187a9f 

georg.brandl 72370f1 
georg.brandl 7187a9f 














georg.brandl cbc5331 













georg.brandl 7187a9f 


# -*- coding: utf-8 -*-
"""
    Sphinx test suite utilities
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~

    :copyright: 2008 by Georg Brandl.
    :license: BSD.
"""

import sys
import os
import StringIO
import tempfile
import shutil

try:
    from functools import wraps
except ImportError:
    # functools is new in 2.4
    wraps = lambda f: (lambda w: w)

from sphinx import application, builder

from path import path

from nose import tools


__all__ = [
    'test_root',
    'raises', 'raises_msg', 'Struct',
    'ListOutput', 'TestApp', 'with_app',
    'path', 'with_tempdir', 'write_file',
    'sprint',
]


test_root = path(__file__).parent.joinpath('root').abspath()


def _excstr(exc):
    if type(exc) is tuple:
        return str(tuple(map(_excstr, exc)))
    return exc.__name__

def raises(exc, func, *args, **kwds):
    """
    Raise :exc:`AssertionError` if ``func(*args, **kwds)`` does not
    raise *exc*.
    """
    try:
        func(*args, **kwds)
    except exc:
        pass
    else:
        raise AssertionError('%s did not raise %s' %
                             (func.__name__, _excstr(exc)))

def raises_msg(exc, msg, func, *args, **kwds):
    """
    Raise :exc:`AssertionError` if ``func(*args, **kwds)`` does not
    raise *exc*, and check if the message contains *msg*.
    """
    try:
        func(*args, **kwds)
    except exc, err:
        assert msg in str(err), "\"%s\" not in \"%s\"" % (msg, err)
    else:
        raise AssertionError('%s did not raise %s' %
                             (func.__name__, _excstr(exc)))


class Struct(object):
    def __init__(self, **kwds):
        self.__dict__.update(kwds)


class ListOutput(object):
    """
    File-like object that collects written text in a list.
    """
    def __init__(self, name):
        self.name = name
        self.content = []

    def reset(self):
        del self.content[:]

    def write(self, text):
        self.content.append(text)


class TestApp(application.Sphinx):
    """
    A subclass of :class:`Sphinx` that runs on the test root, with some
    better default values for the initialization parameters.
    """

    def __init__(self, srcdir=None, confdir=None, outdir=None, doctreedir=None,
                 buildername='html', confoverrides=None, status=None, warning=None,
                 freshenv=None, confname='conf.py', cleanenv=False):

        application.CONFIG_FILENAME = confname

        self.cleanup_trees = []

        if srcdir is None:
            srcdir = test_root
        if srcdir == '(temp)':
            tempdir = path(tempfile.mkdtemp())
            self.cleanup_trees.append(tempdir)
            temproot = tempdir / 'root'
            test_root.copytree(temproot)
            srcdir = temproot
        else:
            srcdir = path(srcdir)
        self.builddir = srcdir.joinpath('_build')
        if confdir is None:
            confdir = srcdir
        if outdir is None:
            outdir = srcdir.joinpath(self.builddir, buildername)
            if not outdir.isdir():
                outdir.makedirs()
            self.cleanup_trees.insert(0, outdir)
        if doctreedir is None:
            doctreedir = srcdir.joinpath(srcdir, self.builddir, 'doctrees')
            if cleanenv:
                self.cleanup_trees.insert(0, doctreedir)
        if confoverrides is None:
            confoverrides = {}
        if status is None:
            status = StringIO.StringIO()
        if warning is None:
            warning = ListOutput('stderr')
        if freshenv is None:
            freshenv = False

        application.Sphinx.__init__(self, srcdir, confdir, outdir, doctreedir,
                                    buildername, confoverrides, status, warning,
                                    freshenv)

    def cleanup(self, doctrees=False):
        for tree in self.cleanup_trees:
            shutil.rmtree(tree, True)


def with_app(*args, **kwargs):
    """
    Make a TestApp with args and kwargs, pass it to the test and clean up
    properly.
    """
    def generator(func):
        @wraps(func)
        def deco(*args2, **kwargs2):
            app = TestApp(*args, **kwargs)
            try:
                func(app, *args2, **kwargs2)
            finally:
                app.cleanup()
        return deco
    return generator


def with_tempdir(func):
    def new_func():
        tempdir = path(tempfile.mkdtemp())
        func(tempdir)
        tempdir.rmtree()
    new_func.__name__ = func.__name__
    return new_func


def write_file(name, contents):
    f = open(str(name), 'wb')
    f.write(contents)
    f.close()


def sprint(*args):
    sys.stderr.write(' '.join(map(str, args)) + '\n')