From 6823fa634b23733fa14b407bbd333280553f9ab1 Mon Sep 17 00:00:00 2001 From: holger krekel Date: Fri, 4 Sep 2009 18:15:41 +0200 Subject: [PATCH] various 3k related fixes and cleanups removal of virtually unused py/rest/rst.py helpers --HG-- branch : trunk --- py/__init__.py | 1 - py/_testing/test_com.py | 3 +- py/_testing/test_initpkg.py | 13 +- py/_testing/test_oldmagic.py | 4 +- py/cmdline/testing/test_generic.py | 2 +- py/code/oldmagic.py | 3 +- py/initpkg.py | 4 +- py/process/forkedfunc.py | 4 +- py/rest/rst.py | 417 ---------------------- py/rest/testing/test_rst.py | 468 ------------------------- py/rest/testing/test_transform.py | 39 --- py/rest/transform.py | 184 ---------- py/test/plugin/test_pytest_terminal.py | 6 +- 13 files changed, 16 insertions(+), 1132 deletions(-) delete mode 100644 py/rest/rst.py delete mode 100644 py/rest/testing/test_rst.py delete mode 100644 py/rest/testing/test_transform.py delete mode 100644 py/rest/transform.py diff --git a/py/__init__.py b/py/__init__.py index c8f21a038..afd45843f 100644 --- a/py/__init__.py +++ b/py/__init__.py @@ -147,7 +147,6 @@ initpkg(__name__, 'builtin.print_' : ('./builtin/builtin31.py', 'print_'), 'builtin._reraise' : ('./builtin/builtin31.py', '_reraise'), 'builtin.exec_' : ('./builtin/builtin31.py', 'exec_'), - 'builtin.intern' : ('./builtin/builtin31.py', 'intern'), 'builtin._basestring' : ('./builtin/builtin31.py', '_basestring'), 'builtin._totext' : ('./builtin/builtin31.py', '_totext'), 'builtin._isbytes' : ('./builtin/builtin31.py', '_isbytes'), diff --git a/py/_testing/test_com.py b/py/_testing/test_com.py index e4d9ec2a7..c329cd442 100644 --- a/py/_testing/test_com.py +++ b/py/_testing/test_com.py @@ -10,7 +10,6 @@ def test_varnames(): def f(self, y): pass assert varnames(f) == ("x",) - assert varnames(A.f) == ('y',) assert varnames(A().f) == ('y',) class TestMultiCall: @@ -121,7 +120,7 @@ class TestRegistry: class api4: x = 44 l = list(plugins.listattr('x', extra=(api4,))) - assert l == range(41, 45) + assert l == [41,42,43,44] assert len(list(plugins)) == 3 # otherwise extra added def test_api_and_defaults(): diff --git a/py/_testing/test_initpkg.py b/py/_testing/test_initpkg.py index 271246c01..2ddbf0bef 100644 --- a/py/_testing/test_initpkg.py +++ b/py/_testing/test_initpkg.py @@ -50,21 +50,14 @@ def test_importall(): base = py.path.local(py.__file__).dirpath() nodirs = ( base.join('test', 'testing', 'data'), - base.join('apigen', 'tracer', 'testing', 'package'), - base.join('test', 'testing', 'test'), - base.join('test', 'rsession', 'webjs.py'), - base.join('apigen', 'source', 'server.py'), - base.join('magic', 'greenlet.py'), + base.join('test', 'web'), base.join('path', 'gateway',), base.join('doc',), base.join('rest', 'directive.py'), base.join('test', 'testing', 'import_test'), - base.join('c-extension',), - base.join('test', 'report', 'web.py'), - base.join('test', 'report', 'webjs.py'), - base.join('test', 'report', 'rest.py'), - base.join('magic', 'greenlet.py'), base.join('bin'), + base.join('code', 'oldmagic.py'), + base.join('code', '_assertionold.py'), base.join('execnet', 'script'), base.join('compat', 'testing'), ) diff --git a/py/_testing/test_oldmagic.py b/py/_testing/test_oldmagic.py index 838826234..e6f608578 100644 --- a/py/_testing/test_oldmagic.py +++ b/py/_testing/test_oldmagic.py @@ -8,7 +8,7 @@ def check_assertion(): raise ValueError("assertion not enabled: got %s" % s) def test_invoke_assertion(recwarn, monkeypatch): - monkeypatch.setattr(py.std.__builtin__, 'AssertionError', None) + monkeypatch.setattr(py.builtin.builtins, 'AssertionError', None) py.magic.invoke(assertion=True) try: check_assertion() @@ -17,7 +17,7 @@ def test_invoke_assertion(recwarn, monkeypatch): recwarn.pop(DeprecationWarning) def test_invoke_compile(recwarn, monkeypatch): - monkeypatch.setattr(py.std.__builtin__, 'compile', None) + monkeypatch.setattr(py.builtin.builtins, 'compile', None) py.magic.invoke(compile=True) try: co = compile("""if 1: diff --git a/py/cmdline/testing/test_generic.py b/py/cmdline/testing/test_generic.py index a3efee0ec..616bf6d74 100644 --- a/py/cmdline/testing/test_generic.py +++ b/py/cmdline/testing/test_generic.py @@ -10,7 +10,7 @@ def setup_module(mod): def checkmain(name): main = getattr(py.cmdline, name) - assert callable(main) + assert py.builtin.callable(main) assert name[:2] == "py" scriptname = "py." + name[2:] assert binpath.join(scriptname).check() diff --git a/py/code/oldmagic.py b/py/code/oldmagic.py index 7dc06de73..51db7f572 100644 --- a/py/code/oldmagic.py +++ b/py/code/oldmagic.py @@ -1,7 +1,8 @@ """ deprecated module for turning on/off some features. """ import py -import __builtin__ as cpy_builtin + +from py.builtin import builtins as cpy_builtin def invoke(assertion=False, compile=False): """ (deprecated) invoke magic, currently you can specify: diff --git a/py/initpkg.py b/py/initpkg.py index 7f5d37747..3e7425117 100644 --- a/py/initpkg.py +++ b/py/initpkg.py @@ -171,8 +171,8 @@ class ApiModule(ModuleType): dict = dictdescr.__get__(self) if dict is not None: if '*' not in self.__map__: - for name in self.__map__.keys(): - hasattr(self, name) # force attribute to be loaded, ignore errors + for name in list(self.__map__): + hasattr(self, name) # force attribute load, ignore errors assert not self.__map__, "%r not empty" % self.__map__ else: fsname = self.__map__['*'][0] diff --git a/py/process/forkedfunc.py b/py/process/forkedfunc.py index 2fa3cd18f..c8b650246 100644 --- a/py/process/forkedfunc.py +++ b/py/process/forkedfunc.py @@ -46,7 +46,7 @@ class ForkedFunc(object): fdstderr = stderr.fileno() if fdstderr != 2: os.dup2(fdstderr, 2) - retvalf = self.RETVAL.open("w") + retvalf = self.RETVAL.open("wb") EXITSTATUS = 0 try: if nice_level: @@ -79,7 +79,7 @@ class ForkedFunc(object): exitstatus = 0 signal = systemstatus & 0x7f if not exitstatus and not signal: - retval = self.RETVAL.open() + retval = self.RETVAL.open('rb') try: retval_data = retval.read() finally: diff --git a/py/rest/rst.py b/py/rest/rst.py deleted file mode 100644 index 8207fb79c..000000000 --- a/py/rest/rst.py +++ /dev/null @@ -1,417 +0,0 @@ - -""" reStructuredText generation tools - - provides an api to build a tree from nodes, which can be converted to - ReStructuredText on demand - - note that not all of ReST is supported, a usable subset is offered, but - certain features aren't supported, and also certain details (like how links - are generated, or how escaping is done) can not be controlled -""" - -from __future__ import generators - -import py - -def escape(txt): - """escape ReST markup""" - if not isinstance(txt, str) and not isinstance(txt, unicode): - txt = str(txt) - # XXX this takes a very naive approach to escaping, but it seems to be - # sufficient... - for c in '\\*`|:_': - txt = txt.replace(c, '\\%s' % (c,)) - return txt - -class RestError(Exception): - """ raised on containment errors (wrong parent) """ - -class AbstractMetaclass(type): - def __new__(cls, *args): - obj = super(AbstractMetaclass, cls).__new__(cls, *args) - parent_cls = obj.parentclass - if parent_cls is None: - return obj - if not isinstance(parent_cls, list): - class_list = [parent_cls] - else: - class_list = parent_cls - if obj.allow_nesting: - class_list.append(obj) - - for _class in class_list: - if not _class.allowed_child: - _class.allowed_child = {obj:True} - else: - _class.allowed_child[obj] = True - return obj - -class AbstractNode(object): - """ Base class implementing rest generation - """ - sep = '' - __metaclass__ = AbstractMetaclass - parentclass = None # this exists to allow parent to know what - # children can exist - allow_nesting = False - allowed_child = {} - defaults = {} - - _reg_whitespace = py.std.re.compile('\s+') - - def __init__(self, *args, **kwargs): - self.parent = None - self.children = [] - for child in args: - self._add(child) - for arg in kwargs: - setattr(self, arg, kwargs[arg]) - - def join(self, *children): - """ add child nodes - - returns a reference to self - """ - for child in children: - self._add(child) - return self - - def add(self, child): - """ adds a child node - - returns a reference to the child - """ - self._add(child) - return child - - def _add(self, child): - if child.__class__ not in self.allowed_child: - raise RestError("%r cannot be child of %r" % \ - (child.__class__, self.__class__)) - self.children.append(child) - child.parent = self - - def __getitem__(self, item): - return self.children[item] - - def __setitem__(self, item, value): - self.children[item] = value - - def text(self): - """ return a ReST string representation of the node """ - return self.sep.join([child.text() for child in self.children]) - - def wordlist(self): - """ return a list of ReST strings for this node and its children """ - return [self.text()] - -class Rest(AbstractNode): - """ Root node of a document """ - - sep = "\n\n" - def __init__(self, *args, **kwargs): - AbstractNode.__init__(self, *args, **kwargs) - self.links = {} - - def render_links(self, check=False): - """render the link attachments of the document""" - assert not check, "Link checking not implemented" - if not self.links: - return "" - link_texts = [] - # XXX this could check for duplicates and remove them... - for link, target in self.links.items(): - link_texts.append(".. _`%s`: %s" % (escape(link), target)) - return "\n" + "\n".join(link_texts) + "\n\n" - - def text(self): - outcome = [] - if (isinstance(self.children[0], Transition) or - isinstance(self.children[-1], Transition)): - raise ValueError('document must not begin or end with a ' - 'transition') - for child in self.children: - outcome.append(child.text()) - - # always a trailing newline - text = self.sep.join([i for i in outcome if i]) + "\n" - return text + self.render_links() - -class Transition(AbstractNode): - """ a horizontal line """ - parentclass = Rest - - def __init__(self, char='-', width=80, *args, **kwargs): - self.char = char - self.width = width - super(Transition, self).__init__(*args, **kwargs) - - def text(self): - return (self.width - 1) * self.char - -class Paragraph(AbstractNode): - """ simple paragraph """ - - parentclass = Rest - sep = " " - indent = "" - width = 80 - - def __init__(self, *args, **kwargs): - # make shortcut - args = list(args) - for num, arg in enumerate(args): - if isinstance(arg, str): - args[num] = Text(arg) - super(Paragraph, self).__init__(*args, **kwargs) - - def text(self): - texts = [] - for child in self.children: - texts += child.wordlist() - - buf = [] - outcome = [] - lgt = len(self.indent) - - def grab(buf): - outcome.append(self.indent + self.sep.join(buf)) - - texts.reverse() - while texts: - next = texts[-1] - if not next: - texts.pop() - continue - if lgt + len(self.sep) + len(next) <= self.width or not buf: - buf.append(next) - lgt += len(next) + len(self.sep) - texts.pop() - else: - grab(buf) - lgt = len(self.indent) - buf = [] - grab(buf) - return "\n".join(outcome) - -class SubParagraph(Paragraph): - """ indented sub paragraph """ - - indent = " " - -class Title(Paragraph): - """ title element """ - - parentclass = Rest - belowchar = "=" - abovechar = "" - - def text(self): - txt = self._get_text() - lines = [] - if self.abovechar: - lines.append(self.abovechar * len(txt)) - lines.append(txt) - if self.belowchar: - lines.append(self.belowchar * len(txt)) - return "\n".join(lines) - - def _get_text(self): - txt = [] - for node in self.children: - txt += node.wordlist() - return ' '.join(txt) - -class AbstractText(AbstractNode): - parentclass = [Paragraph, Title] - start = "" - end = "" - def __init__(self, _text): - self._text = _text - - def text(self): - text = self.escape(self._text) - return self.start + text + self.end - - def escape(self, text): - if not isinstance(text, str) and not isinstance(text, unicode): - text = str(text) - if self.start: - text = text.replace(self.start, '\\%s' % (self.start,)) - if self.end and self.end != self.start: - text = text.replace(self.end, '\\%s' % (self.end,)) - return text - -class Text(AbstractText): - def wordlist(self): - text = escape(self._text) - return self._reg_whitespace.split(text) - -class LiteralBlock(AbstractText): - parentclass = Rest - start = '::\n\n' - - def text(self): - if not self._text.strip(): - return '' - text = self.escape(self._text).split('\n') - for i, line in enumerate(text): - if line.strip(): - text[i] = ' %s' % (line,) - return self.start + '\n'.join(text) - -class Em(AbstractText): - start = "*" - end = "*" - -class Strong(AbstractText): - start = "**" - end = "**" - -class Quote(AbstractText): - start = '``' - end = '``' - -class Anchor(AbstractText): - start = '_`' - end = '`' - -class Footnote(AbstractText): - def __init__(self, note, symbol=False): - raise NotImplemented('XXX') - -class Citation(AbstractText): - def __init__(self, text, cite): - raise NotImplemented('XXX') - -class ListItem(Paragraph): - allow_nesting = True - item_chars = '*+-' - - def text(self): - idepth = self.get_indent_depth() - indent = self.indent + (idepth + 1) * ' ' - txt = '\n\n'.join(self.render_children(indent)) - ret = [] - item_char = self.item_chars[idepth] - ret += [indent[len(item_char)+1:], item_char, ' ', txt[len(indent):]] - return ''.join(ret) - - def render_children(self, indent): - txt = [] - buffer = [] - def render_buffer(fro, to): - if not fro: - return - p = Paragraph(indent=indent, *fro) - p.parent = self.parent - to.append(p.text()) - for child in self.children: - if isinstance(child, AbstractText): - buffer.append(child) - else: - if buffer: - render_buffer(buffer, txt) - buffer = [] - txt.append(child.text()) - - render_buffer(buffer, txt) - return txt - - def get_indent_depth(self): - depth = 0 - current = self - while (current.parent is not None and - isinstance(current.parent, ListItem)): - depth += 1 - current = current.parent - return depth - -class OrderedListItem(ListItem): - item_chars = ["#."] * 5 - -class DListItem(ListItem): - item_chars = None - def __init__(self, term, definition, *args, **kwargs): - self.term = term - super(DListItem, self).__init__(definition, *args, **kwargs) - - def text(self): - idepth = self.get_indent_depth() - indent = self.indent + (idepth + 1) * ' ' - txt = '\n\n'.join(self.render_children(indent)) - ret = [] - ret += [indent[2:], self.term, '\n', txt] - return ''.join(ret) - -class Link(AbstractText): - start = '`' - end = '`_' - - def __init__(self, _text, target): - self._text = _text - self.target = target - self.rest = None - - def text(self): - if self.rest is None: - self.rest = self.find_rest() - if self.rest.links.get(self._text, self.target) != self.target: - raise ValueError('link name %r already in use for a different ' - 'target' % (self.target,)) - self.rest.links[self._text] = self.target - return AbstractText.text(self) - - def find_rest(self): - # XXX little overkill, but who cares... - next = self - while next.parent is not None: - next = next.parent - return next - -class InternalLink(AbstractText): - start = '`' - end = '`_' - -class LinkTarget(Paragraph): - def __init__(self, name, target): - self.name = name - self.target = target - - def text(self): - return ".. _`%s`:%s\n" % (self.name, self.target) - -class Substitution(AbstractText): - def __init__(self, text, **kwargs): - raise NotImplemented('XXX') - -class Directive(Paragraph): - indent = ' ' - def __init__(self, name, *args, **options): - self.name = name - self.content = options.pop('content', []) - children = list(args) - super(Directive, self).__init__(*children) - self.options = options - - def text(self): - # XXX not very pretty... - namechunksize = len(self.name) + 2 - self.children.insert(0, Text('X' * namechunksize)) - txt = super(Directive, self).text() - txt = '.. %s::%s' % (self.name, txt[namechunksize + 3:],) - options = '\n'.join([' :%s: %s' % (k, v) for (k, v) in - self.options.items()]) - if options: - txt += '\n%s' % (options,) - - if self.content: - txt += '\n' - for item in self.content: - assert item.parentclass == Rest, 'only top-level items allowed' - assert not item.indent - item.indent = ' ' - txt += '\n' + item.text() - - return txt - diff --git a/py/rest/testing/test_rst.py b/py/rest/testing/test_rst.py deleted file mode 100644 index 1ef9ec3b2..000000000 --- a/py/rest/testing/test_rst.py +++ /dev/null @@ -1,468 +0,0 @@ - -""" rst generation tests -""" -import py -py.test.importorskip("docutils") -from py.__.rest.rst import * -from py.__.rest.resthtml import process as restcheck -import traceback - -tempdir = py.test.ensuretemp('rest') -def checkrest(rest): - fname = traceback.extract_stack()[-2][2] - i = 0 - while True: - if i == 0: - filename = '%s.txt' % (fname,) - else: - filename = '%s_%s.txt' % (fname, i) - tempfile = tempdir.join(filename) - if not tempfile.check(): - break - i += 1 - tempfile.write(rest) - restcheck(tempfile) - return tempfile.new(ext='.html').read() - -def test_escape_text(): - txt = Paragraph('*escape* ``test``').text() - assert txt == '\\*escape\\* \\`\\`test\\`\\`' - html = checkrest(txt) - assert '*escape* ``test``' in html - -def test_escape_markup_simple(): - txt = Paragraph(Em('*em*')).text() - assert txt == '*\\*em\\**' - html = checkrest(txt) - assert '*em*' in html - -def test_escape_underscore(): - txt = Rest(Paragraph('foo [1]_')).text() - assert txt == "foo [1]\\_\n" - html = checkrest(txt) - assert 'foo [1]_' in html - -def test_escape_markup_spaces_docutils_nastyness(): - txt = Rest(Paragraph(Em('foo *bar* baz'))).text() - assert txt == '*foo \\*bar\\* baz*\n' - html = checkrest(txt) - assert 'foo *bar* baz' in html - -def test_escape_literal(): - txt = LiteralBlock('*escape* ``test``').text() - assert txt == '::\n\n *escape* ``test``' - html = checkrest(txt) - assert '>\n*escape* ``test``\n' in html - -def test_escape_markup_obvious(): - txt = Em('foo*bar').text() - assert txt == '*foo\\*bar*' - html = checkrest(txt) - assert 'foo*bar' in html - -def test_escape_markup_text_1(): - txt = Paragraph(Em('foo'), "*bar").text() - assert txt == '*foo* \\*bar' - html = checkrest(txt) - assert 'foo *bar' in html - -def test_escape_markup_text_2(): - txt = Paragraph(Em('foo'), "bar*").text() - assert txt == '*foo* bar\\*' - html = checkrest(txt) - assert 'foo bar*' in html - -def test_illegal_parent(): - Rest(Paragraph(Text('spam'))) - py.test.raises(RestError, 'Rest(Text("spam"))') - py.test.raises(RestError, 'ListItem(Paragraph(Text("eggs")))') - -def test_text_basic(): - txt = Text("dupa").text() - assert txt == "dupa" - -def test_basic_inline(): - txt = Em('foo').text() - assert txt == '*foo*' - -def test_basic_inline_2(): - txt = Strong('bar').text() - assert txt == '**bar**' - -def test_text_multiple_arguments(): - txt = Paragraph(Text("dupa"), Text("dupa")).text() - assert txt == "dupa dupa" - -def test_text_join(): - txt = Paragraph(Text("worse things")) - txt = txt.join(Text("happen at sea"), Text("you know")) - assert txt.text() == "worse things happen at sea you know" - -def test_text_add(): - p = Paragraph(Text('grmbl')) - p2 = p.add(Text('grmbl too')) - assert p2.text() == 'grmbl too' - assert p.text() == 'grmbl grmbl too' - -def test_paragraph_basic(): - txt = Paragraph(Text('spam')).text() - assert txt == 'spam' - -def test_paragraph_string(): - txt = Paragraph("eggs").text() - assert txt == "eggs" - checkrest(txt) - -def test_paragraph_join(): - txt = Rest(Paragraph(Text("a")), Paragraph(Text("b"))).text() - assert txt == "a\n\nb\n" - -def test_paragraph_indent(): - txt = Paragraph(Text("a"), indent=" ").text() - assert txt == " a" - checkrest(txt) - txt = Paragraph(Text(" a "), indent=" ").text() - assert txt == " a" - -def test_paragraph_width(): - txt = Paragraph(Text("a b c d e f"), width=3, indent=" ").text() - assert txt == ' a\n b\n c\n d\n e\n f' - checkrest(txt) - text = """ -Lorem ipsum dolor sit amet, consectetuer -adipiscing elit. Vestibulum malesuada -eleifend leo. Sed faucibus commodo libero. -Mauris elementum fringilla velit. Ut -sem urna, aliquet sed, molestie at, viverra -id, justo. In ornare lacinia turpis. Etiam -et ipsum. Quisque at lacus. Etiam -pellentesque, enim porta pulvinar viverra, -libero elit iaculis justo, vitae convallis -pede purus vel arcu. Morbi aliquam lacus -et urna. Donec commodo pellentesque mi. -""" - expected = """\ -Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vestibulum malesuada -eleifend leo. Sed faucibus commodo libero. Mauris elementum fringilla velit. Ut -sem urna, aliquet sed, molestie at, viverra id, justo. In ornare lacinia -turpis. Etiam et ipsum. Quisque at lacus. Etiam pellentesque, enim porta -pulvinar viverra, libero elit iaculis justo, vitae convallis pede purus vel -arcu. Morbi aliquam lacus et urna. Donec commodo pellentesque mi.""" - txt = Paragraph(text, width=80).text() - print(repr(txt)) - print(repr(expected)) - assert txt == expected - checkrest(txt) - -def test_paragraph_stripping(): - txt = Paragraph(Text('\n foo bar\t')).text() - assert txt == 'foo bar' - checkrest(txt) - -def test_blockquote(): - expected = """\ -Text - -:: - - def fun(): - some - -Paragraph -""" - txt = Rest(Paragraph("Text"), LiteralBlock("def fun():\n some"), \ - Paragraph("Paragraph")).text() - print(repr(txt)) - assert txt == expected - checkrest(txt) - -def test_blockquote_empty(): - expected = """\ -Foo - -Bar -""" - txt = Rest(Paragraph('Foo'), LiteralBlock(''), Paragraph('Bar')).text() - print(repr(txt)) - assert txt == expected - checkrest(txt) - -def test_title(): - txt = Title(Text("Some title"), belowchar="=").text() - assert txt == "Some title\n==========" - checkrest(txt) - txt = Title("Some title", belowchar="#", abovechar="#").text() - assert txt == "##########\nSome title\n##########" - html = checkrest(txt) - assert '>Some title' in html - -def test_title_long(): - txt = Title('Some very long title that doesn\'t fit on a single line ' - 'but still should not be split into multiple lines').text() - assert txt == ("Some very long title that doesn't fit on a single line " - "but still should not be split into multiple lines\n" - "=======================================================" - "=================================================") - checkrest(txt) - -def test_title_long_with_markup(): - txt = Title('Some very long title with', Em('some markup'), - 'to test whether that works as expected too...').text() - assert txt == ("Some very long title with *some markup* to test whether " - "that works as expected too...\n" - "========================================================" - "=============================") - checkrest(txt) - -def test_title_escaping(): - txt = Title('foo *bar* baz').text() - assert txt == 'foo \\*bar\\* baz\n===============' - checkrest(txt) - -def test_link(): - expected = "`some link`_\n\n.. _`some link`: http://codespeak.net\n\n" - txt = Rest(Paragraph(Link("some link", "http://codespeak.net"))).text() - assert txt == expected - html = checkrest(txt) - assert ' href="http://codespeak.net">some link' in html - -def test_link_same_text_and_target(): - txt = Rest(Paragraph(Link('some link', 'bar'), 'foo', - Link('some link', 'bar')) - ).text() - expected = '`some link`_ foo `some link`_\n\n.. _`some link`: bar\n\n' - assert txt == expected - -def test_link_same_text_different_target(): - py.test.raises(ValueError, ("Rest(Paragraph(Link('some link', 'foo')," - "Link('some link', 'bar'))).text()")) - -def test_text_multiline(): - expected = """\ -Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vestibulum malesuada -eleifend leo. Sed faucibus commodo libero. Mauris elementum fringilla velit. Ut -sem urna, aliquet sed, molestie at, viverra id, justo. In ornare lacinia -turpis. Etiam et ipsum. Quisque at lacus. Etiam pellentesque, enim porta -pulvinar viverra, libero elit iaculis justo, vitae convallis pede purus vel -arcu. Morbi aliquam lacus et urna. Donec commodo pellentesque mi. -""" - txt = Rest(Paragraph('Lorem ipsum dolor sit amet, consectetuer adipiscing ' - 'elit. Vestibulum malesuada eleifend leo. Sed ' - 'faucibus commodo libero. Mauris elementum fringilla ' - 'velit. Ut sem urna, aliquet sed, molestie at, ' - 'viverra id, justo. In ornare lacinia turpis. Etiam ' - 'et ipsum. Quisque at lacus. Etiam pellentesque, ' - 'enim porta pulvinar viverra, libero elit iaculis ' - 'justo, vitae convallis pede purus vel arcu. Morbi ' - 'aliquam lacus et urna. Donec commodo pellentesque ' - 'mi.')).text() - assert txt == expected - checkrest(txt) - -def test_text_indented(): - expected = """\ -This is a paragraph with some indentation. The indentation should be removed -and the lines split up nicely. This is still part of the first paragraph. -""" - txt = Rest(Paragraph('This is a paragraph with some\n' - ' indentation. The indentation\n' - ' should be removed and the lines split up nicely.\n' - '\nThis is still part of the first paragraph.') - ).text() - assert txt == expected - checkrest(txt) - -def test_text_strip(): - expected = "foo\n" - txt = Rest(Paragraph(Text(' foo '))).text() - assert txt == expected - checkrest(txt) - -def test_list(): - expected = "* a\n\n* b\n" - txt = Rest(ListItem("a"), ListItem("b")).text() - assert txt == expected - checkrest(txt) - -def test_list_item_multiple_args(): - expected = "* foo bar baz\n" - txt = Rest(ListItem('foo', 'bar', 'baz')).text() - assert txt == expected - checkrest(txt) - -def test_list_multiline(): - expected = """\ -* Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vestibulum - malesuada eleifend leo. Sed faucibus commodo libero. - -* Mauris elementum fringilla velit. Ut sem urna, aliquet sed, molestie at, - viverra id, justo. In ornare lacinia turpis. Etiam et ipsum. Quisque at - lacus. - -* Etiam pellentesque, enim porta pulvinar viverra, libero elit iaculis justo, - vitae convallis pede purus vel arcu. Morbi aliquam lacus et urna. Donec - commodo pellentesque mi. -""" - txt = Rest(ListItem('Lorem ipsum dolor sit amet, consectetuer adipiscing ' - 'elit. Vestibulum malesuada eleifend leo. Sed ' - 'faucibus commodo libero.'), - ListItem('Mauris elementum fringilla velit. Ut sem urna, ' - 'aliquet sed, molestie at, viverra id, justo. In ' - 'ornare lacinia turpis. Etiam et ipsum. Quisque at ' - 'lacus.'), - ListItem('Etiam pellentesque, enim porta pulvinar viverra, ' - 'libero elit iaculis justo, vitae convallis pede ' - 'purus vel arcu. Morbi aliquam lacus et urna. Donec ' - 'commodo pellentesque mi.')).text() - assert txt == expected - checkrest(txt) - -def test_list_multiline_no_parent(): - expected = ("* test **strong**\n thisisaverylongwordthatdoesntfiton" - "thepreviouslineandthereforeshouldbeindented") - txt = ListItem(Text('test'), Strong('strong'), - Text('thisisaverylongwordthatdoesntfitontheprevious' - 'lineandthereforeshouldbeindented')).text() - assert txt == expected - checkrest(txt) - -def test_ordered_list(): - expected = "#. foo\n\n#. bar\n\n#. baz\n" - txt = Rest(OrderedListItem('foo'), OrderedListItem('bar'), - OrderedListItem('baz')).text() - assert txt == expected - checkrest(txt) - -def test_nested_lists(): - expected = """\ -* foo - -* bar - - + baz -""" - txt = Rest(ListItem('foo'), ListItem('bar', ListItem('baz'))).text() - assert txt == expected - checkrest(txt) - -def test_nested_nested_lists(): - expected = """\ -* foo - - + bar - - - baz - - + qux - -* quux -""" - txt = Rest(ListItem('foo', ListItem('bar', ListItem('baz')), - ListItem('qux')), ListItem('quux')).text() - print(txt) - assert txt == expected - checkrest(txt) - -def test_definition_list(): - expected = """\ -foo - bar, baz and qux! - -spam - eggs, spam, spam, eggs, spam and spam... -""" - txt = Rest(DListItem("foo", "bar, baz and qux!"), - DListItem("spam", "eggs, spam, spam, eggs, spam and spam...") - ).text() - assert txt == expected - checkrest(txt) - -def test_nested_dlists(): - expected = """\ -foo - bar baz - - qux - quux -""" - txt = Rest(DListItem('foo', 'bar baz', DListItem('qux', 'quux'))).text() - assert txt == expected - -def test_nested_list_dlist(): - expected = """\ -* foo - - foobar - baz -""" - txt = Rest(ListItem('foo', DListItem('foobar', 'baz'))).text() - assert txt == expected - -def test_transition(): - txt = Rest(Paragraph('foo'), Transition(), Paragraph('bar')).text() - assert txt == 'foo\n\n%s\n\nbar\n' % ('-' * 79,) - checkrest(txt) - txt = Rest(Paragraph('foo'), Transition('+'), Paragraph('bar')).text() - assert txt == 'foo\n\n%s\n\nbar\n' % ('+' * 79,) - checkrest(txt) - - py.test.raises(ValueError, 'Rest(Transition(), Paragraph("foo")).text()') - py.test.raises(ValueError, 'Rest(Paragraph("foo"), Transition()).text()') - -def test_directive_simple(): - txt = Rest(Directive('image', 'images/foo.png')).text() - assert txt == '.. image:: images/foo.png\n' - -def test_directive_metadata(): - txt = Rest(Directive('image', 'images/foo.png', - width=200, height=150)).text() - assert txt == ('.. image:: images/foo.png\n :width: 200\n' - ' :height: 150\n') - -def test_directive_multiline(): - txt = Rest(Directive('note', ('This is some string that is too long to ' - 'fit on a single line, so it should be ' - 'broken up.'))).text() - assert txt == """\ -.. note:: This is some string that is too long to fit on a single line, so it - should be broken up. -""" - -def test_directive_content(): - txt = Rest(Directive('image', 'foo.png', width=200, height=100, - content=[Paragraph('Some paragraph content.')])).text() - assert txt == """\ -.. image:: foo.png - :width: 200 - :height: 100 - - Some paragraph content. -""" - -def test_title_following_links_empty_line(): - expected = """\ -Foo, bar and `baz`_ - -Spam -==== - -Spam, eggs and spam. - -.. _`baz`: http://www.baz.com - -""" - txt = Rest(Paragraph("Foo, bar and ", Link("baz", "http://www.baz.com")), - Title('Spam'), Paragraph('Spam, eggs and spam.')).text() - assert txt == expected - checkrest(txt) - -def test_nonstring_text(): - expected = """\ - -""" - class FooBar(object): - def __str__(self): - return '' - txt = Rest(Paragraph(Text(FooBar()))).text() - assert txt == expected - diff --git a/py/rest/testing/test_transform.py b/py/rest/testing/test_transform.py deleted file mode 100644 index 30f4d1a3b..000000000 --- a/py/rest/testing/test_transform.py +++ /dev/null @@ -1,39 +0,0 @@ -import py -from py.__.rest.rst import * -from py.__.rest.transform import * - -def convert_to_html(tree): - handler = HTMLHandler() - t = RestTransformer(tree) - t.parse(handler) - return handler.html - -class HTMLHandler(py.__.rest.transform.HTMLHandler): - def startDocument(self): - pass - endDocument = startDocument - -def test_transform_basic_html(): - for rest, expected in ((Rest(Title('foo')), '

foo

'), - (Rest(Paragraph('foo')), '

foo

'), - (Rest(SubParagraph('foo')), - '

foo

'), - (Rest(LiteralBlock('foo\tbar')), - '
foo\tbar
'), - (Rest(Paragraph(Link('foo', - 'http://www.foo.com/'))), - '

foo

')): - html = convert_to_html(rest) - assert html == expected - -def test_transform_list_simple(): - rest = Rest(ListItem('foo'), ListItem('bar')) - html = convert_to_html(rest) - assert html == '
    \n
  • foo
  • \n
  • bar
' - -def test_transform_list_nested(): - rest = Rest(ListItem('foo'), ListItem('bar', ListItem('baz'))) - html = convert_to_html(rest) - assert html == ('
    \n
  • foo
  • \n
  • bar\n
      ' - '\n
    • baz
') - diff --git a/py/rest/transform.py b/py/rest/transform.py deleted file mode 100644 index 5862476d3..000000000 --- a/py/rest/transform.py +++ /dev/null @@ -1,184 +0,0 @@ -import py -from py.__.rest import rst -from py.xml import html - -class RestTransformer(object): - def __init__(self, tree): - self.tree = tree - self._titledepths = {} - self._listmarkers = [] - - def parse(self, handler): - handler.startDocument() - self.parse_nodes(self.tree.children, handler) - handler.endDocument() - - def parse_nodes(self, nodes, handler): - for node in nodes: - name = node.__class__.__name__ - if name == 'Rest': - continue - getattr(self, 'handle_%s' % (name,))(node, handler) - - def handle_Title(self, node, handler): - depthkey = (node.abovechar, node.belowchar) - if depthkey not in self._titledepths: - if not self._titledepths: - depth = 1 - else: - depth = max(self._titledepths.values()) + 1 - self._titledepths[depthkey] = depth - else: - depth = self._titledepths[depthkey] - handler.startTitle(depth) - self.parse_nodes(node.children, handler) - handler.endTitle(depth) - - def handle_ListItem(self, node, handler): - # XXX oomph... - startlist = False - c = node.parent.children - nodeindex = c.index(node) - if nodeindex == 0: - startlist = True - else: - prev = c[nodeindex - 1] - if not isinstance(prev, rst.ListItem): - startlist = True - elif prev.indent < node.indent: - startlist = True - endlist = False - if nodeindex == len(c) - 1: - endlist = True - else: - next = c[nodeindex + 1] - if not isinstance(next, rst.ListItem): - endlist = True - elif next.indent < node.indent: - endlist = True - type = isinstance(node, rst.OrderedListItem) and 'o' or 'u' - handler.startListItem('u', startlist) - self.parse_nodes(node.children, handler) - handler.endListItem('u', endlist) - - def handle_Transition(self, node, handler): - handler.handleTransition() - - def handle_Paragraph(self, node, handler): - handler.startParagraph() - self.parse_nodes(node.children, handler) - handler.endParagraph() - - def handle_SubParagraph(self, node, handler): - handler.startSubParagraph() - self.parse_nodes(node.children, handler) - handler.endSubParagraph() - - def handle_LiteralBlock(self, node, handler): - handler.handleLiteralBlock(node._text) - - def handle_Text(self, node, handler): - handler.handleText(node._text) - - def handle_Em(self, node, handler): - handler.handleEm(node._text) - - def handle_Strong(self, node, handler): - handler.handleStrong(node._text) - - def handle_Quote(self, node, handler): - handler.handleQuote(node._text) - - def handle_Link(self, node, handler): - handler.handleLink(node._text, node.target) - -def entitize(txt): - for char, repl in (('&', 'amp'), ('>', 'gt'), ('<', 'lt'), ('"', 'quot'), - ("'", 'apos')): - txt = txt.replace(char, '&%s;' % (repl,)) - return txt - -class HTMLHandler(object): - def __init__(self, title='untitled rest document'): - self.title = title - self.root = None - self.tagstack = [] - self._currlist = None - - def startDocument(self): - h = html.html() - self.head = head = html.head() - self.title = title = html.title(self.title) - self._push(h) - h.append(head) - h.append(title) - self.body = body = html.body() - self._push(body) - - def endDocument(self): - self._pop() # body - self._pop() # html - - def startTitle(self, depth): - h = getattr(html, 'h%s' % (depth,))() - self._push(h) - - def endTitle(self, depth): - self._pop() - - def startParagraph(self): - self._push(html.p()) - - def endParagraph(self): - self._pop() - - def startSubParagraph(self): - self._push(html.p(**{'class': 'sub'})) - - def endSubParagraph(self): - self._pop() - - def handleLiteralBlock(self, text): - pre = html.pre(text) - if self.tagstack: - self.tagstack[-1].append(pre) - else: - self.root = pre - - def handleText(self, text): - self.tagstack[-1].append(text) - - def handleEm(self, text): - self.tagstack[-1].append(html.em(text)) - - def handleStrong(self, text): - self.tagstack[-1].append(html.strong(text)) - - def startListItem(self, type, startlist): - if startlist: - nodename = type == 'o' and 'ol' or 'ul' - self._push(getattr(html, nodename)()) - self._push(html.li()) - - def endListItem(self, type, closelist): - self._pop() - if closelist: - self._pop() - - def handleLink(self, text, target): - self.tagstack[-1].append(html.a(text, href=target)) - - def _push(self, el): - if self.tagstack: - self.tagstack[-1].append(el) - else: - self.root = el - self.tagstack.append(el) - - def _pop(self): - self.tagstack.pop() - - def _html(self): - return self.root.unicode() - html = property(_html) - diff --git a/py/test/plugin/test_pytest_terminal.py b/py/test/plugin/test_pytest_terminal.py index 6e0e0b759..6b3522628 100644 --- a/py/test/plugin/test_pytest_terminal.py +++ b/py/test/plugin/test_pytest_terminal.py @@ -9,9 +9,9 @@ import sys # # =============================================================================== -import pytest_runner as runner # XXX -from pytest_terminal import TerminalReporter, CollectonlyReporter -from pytest_terminal import repr_pythonversion, folded_skips +from py.__.test.plugin.pytest_terminal import TerminalReporter, \ + CollectonlyReporter, repr_pythonversion, folded_skips +from py.__.test.plugin import pytest_runner as runner def basic_run_report(item): return runner.call_and_report(item, "call", log=False)