LINUX.ORG.RU

Автоматически сконвертировать doctest в unittest

 , ,


2

5

Привет, есть один здоровенный файл с кучей доктестов. Поначалу было удобно, но потом обросло костылями из-за юникода в Python2/3 и т. п. Хочется эту помойку превратить в нормальный код с assert-ами и не иметь проблем.

Есть ли какие-то тулзы, чтобы автоматом сконвертировать? Просто тупо вместо

>>> get_data()
42

получить

assert get_data() == 42

Наколхозил:

#!/usr/bin/env python

from doctest import DocTestParser
parser = DocTestParser()


def gen_example_code(example):
    source = example.source.rstrip('\n')
    want = example.want.rstrip('\n')

    if not want:
        yield source
        return

    if want.startswith('<BLANKLINE>'):
        want = ''

    if source.startswith('print '):
        source = source[len('print '):]
        string = True
    else:
        string = False

    if len(source) > 50:
        yield 'result = ' + source
        source = 'result'

    yield 'assert {} == {}'.format(source, repr(want) if string else wayt)


def gen_code(docstring):
    if not docstring:
        return
    examples = parser.get_examples(docstring)
    for example in examples:
        for line in gen_example_code(example):
            yield line


def doc2unit(obj):
    return '\n'.join(gen_code(obj.__doc__))

Работает как-то так:

>>> import hashlib
>>> print hashlib.__doc__
<...>
For example, to obtain the digest of the string 'Nobody inspects the
spammish repetition':

    >>> import hashlib
    >>> m = hashlib.md5()
    >>> m.update("Nobody inspects")
    >>> m.update(" the spammish repetition")
    >>> m.digest()
    '\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'

More condensed:

    >>> hashlib.sha224("Nobody inspects the spammish repetition").hexdigest()
    'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'


>>> print doc2unit(hashlib)
import hashlib
m = hashlib.md5()
m.update("Nobody inspects")
m.update(" the spammish repetition")
assert m.digest() == '\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
result = hashlib.sha224("Nobody inspects the spammish repetition").hexdigest()
assert result == 'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'
HeipaVai1o
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.