123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547 |
- ##############################################################################
- #
- # Copyright (c) 2001, 2002 Zope Foundation and Contributors.
- # All Rights Reserved.
- #
- # This software is subject to the provisions of the Zope Public License,
- # Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
- # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
- # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
- # FOR A PARTICULAR PURPOSE.
- #
- ##############################################################################
- """Documentation tests.
- """
- import sys
- import unittest
- class Test_asStructuredText(unittest.TestCase):
- def _callFUT(self, iface):
- from zope.interface.document import asStructuredText
- return asStructuredText(iface)
- def test_asStructuredText_no_docstring(self):
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "INoDocstring",
- " Attributes:",
- " Methods:",
- ""
- ])
- class INoDocstring(Interface):
- pass
- self.assertEqual(self._callFUT(INoDocstring), EXPECTED)
- def test_asStructuredText_empty_with_docstring(self):
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "IEmpty",
- " This is an empty interface.",
- " Attributes:",
- " Methods:",
- ""
- ])
- class IEmpty(Interface):
- """ This is an empty interface.
- """
- self.assertEqual(self._callFUT(IEmpty), EXPECTED)
- def test_asStructuredText_empty_with_multiline_docstring(self):
- from zope.interface import Interface
- # In Python 3.13+, compiler strips indents from docstrings
- indent = " " * 12 if sys.version_info < (3, 13) else ""
- EXPECTED = '\n'.join([
- "IEmpty",
- "",
- " This is an empty interface.",
- " ",
- (f"{indent} It can be used to annotate any class or object, "
- "because it promises"), # noqa E127
- f"{indent} nothing.",
- "",
- " Attributes:",
- "",
- " Methods:",
- "",
- ""
- ])
- class IEmpty(Interface):
- """ This is an empty interface.
- It can be used to annotate any class or object, because it promises
- nothing.
- """
- self.assertEqual(self._callFUT(IEmpty), EXPECTED)
- def test_asStructuredText_with_attribute_no_docstring(self):
- from zope.interface import Attribute
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "IHasAttribute",
- " This interface has an attribute.",
- " Attributes:",
- " an_attribute -- no documentation",
- " Methods:",
- ""
- ])
- class IHasAttribute(Interface):
- """ This interface has an attribute.
- """
- an_attribute = Attribute('an_attribute')
- self.assertEqual(self._callFUT(IHasAttribute), EXPECTED)
- def test_asStructuredText_with_attribute_with_docstring(self):
- from zope.interface import Attribute
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "IHasAttribute",
- " This interface has an attribute.",
- " Attributes:",
- " an_attribute -- This attribute is documented.",
- " Methods:",
- ""
- ])
- class IHasAttribute(Interface):
- """ This interface has an attribute.
- """
- an_attribute = Attribute('an_attribute',
- 'This attribute is documented.')
- self.assertEqual(self._callFUT(IHasAttribute), EXPECTED)
- def test_asStructuredText_with_method_no_args_no_docstring(self):
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "IHasMethod",
- " This interface has a method.",
- " Attributes:",
- " Methods:",
- " aMethod() -- no documentation",
- ""
- ])
- class IHasMethod(Interface):
- """ This interface has a method.
- """
- def aMethod():
- pass # pragma: no cover
- self.assertEqual(self._callFUT(IHasMethod), EXPECTED)
- def test_asStructuredText_with_method_positional_args_no_docstring(self):
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "IHasMethod",
- " This interface has a method.",
- " Attributes:",
- " Methods:",
- " aMethod(first, second) -- no documentation",
- ""
- ])
- class IHasMethod(Interface):
- """ This interface has a method.
- """
- def aMethod(first, second):
- pass # pragma: no cover
- self.assertEqual(self._callFUT(IHasMethod), EXPECTED)
- def test_asStructuredText_with_method_starargs_no_docstring(self):
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "IHasMethod",
- " This interface has a method.",
- " Attributes:",
- " Methods:",
- " aMethod(first, second, *rest) -- no documentation",
- ""
- ])
- class IHasMethod(Interface):
- """ This interface has a method.
- """
- def aMethod(first, second, *rest):
- pass # pragma: no cover
- self.assertEqual(self._callFUT(IHasMethod), EXPECTED)
- def test_asStructuredText_with_method_kwargs_no_docstring(self):
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "IHasMethod",
- " This interface has a method.",
- " Attributes:",
- " Methods:",
- " aMethod(first, second, **kw) -- no documentation",
- ""
- ])
- class IHasMethod(Interface):
- """ This interface has a method.
- """
- def aMethod(first, second, **kw):
- pass # pragma: no cover
- self.assertEqual(self._callFUT(IHasMethod), EXPECTED)
- def test_asStructuredText_with_method_with_docstring(self):
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "IHasMethod",
- " This interface has a method.",
- " Attributes:",
- " Methods:",
- " aMethod() -- This method is documented.",
- ""
- ])
- class IHasMethod(Interface):
- """ This interface has a method.
- """
- def aMethod():
- """This method is documented.
- """
- self.assertEqual(self._callFUT(IHasMethod), EXPECTED)
- def test_asStructuredText_derived_ignores_base(self):
- from zope.interface import Attribute
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "IDerived",
- " IDerived doc",
- " This interface extends:",
- " o IBase",
- " Attributes:",
- " attr1 -- no documentation",
- " attr2 -- attr2 doc",
- " Methods:",
- " method3() -- method3 doc",
- " method4() -- no documentation",
- " method5() -- method5 doc",
- "",
- ])
- class IBase(Interface):
- def method1():
- """docstring"""
- def method2():
- """docstring"""
- class IDerived(IBase):
- "IDerived doc"
- attr1 = Attribute('attr1')
- attr2 = Attribute('attr2', 'attr2 doc')
- def method3():
- "method3 doc"
- def method4():
- pass # pragma: no cover
- def method5():
- "method5 doc"
- self.assertEqual(self._callFUT(IDerived), EXPECTED)
- class Test_asReStructuredText(unittest.TestCase):
- def _callFUT(self, iface):
- from zope.interface.document import asReStructuredText
- return asReStructuredText(iface)
- def test_asReStructuredText_no_docstring(self):
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "``INoDocstring``",
- " Attributes:",
- " Methods:",
- ""
- ])
- class INoDocstring(Interface):
- pass
- self.assertEqual(self._callFUT(INoDocstring), EXPECTED)
- def test_asReStructuredText_empty_with_docstring(self):
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "``IEmpty``",
- " This is an empty interface.",
- " Attributes:",
- " Methods:",
- ""
- ])
- class IEmpty(Interface):
- """ This is an empty interface.
- """
- self.assertEqual(self._callFUT(IEmpty), EXPECTED)
- def test_asReStructuredText_empty_with_multiline_docstring(self):
- from zope.interface import Interface
- # In Python 3.13+, compiler strips indents from docstrings
- indent = " " * 12 if sys.version_info < (3, 13) else ""
- EXPECTED = '\n'.join([
- "``IEmpty``",
- "",
- " This is an empty interface.",
- " ",
- (f"{indent} It can be used to annotate any class or object, "
- f"because it"
- ), # noqa E124
- f"{indent} promises nothing.",
- "",
- " Attributes:",
- "",
- " Methods:",
- "",
- ""
- ])
- class IEmpty(Interface):
- """ This is an empty interface.
- It can be used to annotate any class or object, because it
- promises nothing.
- """
- self.assertEqual(self._callFUT(IEmpty), EXPECTED)
- def test_asReStructuredText_with_attribute_no_docstring(self):
- from zope.interface import Attribute
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "``IHasAttribute``",
- " This interface has an attribute.",
- " Attributes:",
- " ``an_attribute`` -- no documentation",
- " Methods:",
- ""
- ])
- class IHasAttribute(Interface):
- """ This interface has an attribute.
- """
- an_attribute = Attribute('an_attribute')
- self.assertEqual(self._callFUT(IHasAttribute), EXPECTED)
- def test_asReStructuredText_with_attribute_with_docstring(self):
- from zope.interface import Attribute
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "``IHasAttribute``",
- " This interface has an attribute.",
- " Attributes:",
- " ``an_attribute`` -- This attribute is documented.",
- " Methods:",
- ""
- ])
- class IHasAttribute(Interface):
- """ This interface has an attribute.
- """
- an_attribute = Attribute('an_attribute',
- 'This attribute is documented.')
- self.assertEqual(self._callFUT(IHasAttribute), EXPECTED)
- def test_asReStructuredText_with_method_no_args_no_docstring(self):
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "``IHasMethod``",
- " This interface has a method.",
- " Attributes:",
- " Methods:",
- " ``aMethod()`` -- no documentation",
- ""
- ])
- class IHasMethod(Interface):
- """ This interface has a method.
- """
- def aMethod():
- pass # pragma: no cover
- self.assertEqual(self._callFUT(IHasMethod), EXPECTED)
- def test_asReStructuredText_with_method_positional_args_no_docstring(self):
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "``IHasMethod``",
- " This interface has a method.",
- " Attributes:",
- " Methods:",
- " ``aMethod(first, second)`` -- no documentation",
- ""
- ])
- class IHasMethod(Interface):
- """ This interface has a method.
- """
- def aMethod(first, second):
- pass # pragma: no cover
- self.assertEqual(self._callFUT(IHasMethod), EXPECTED)
- def test_asReStructuredText_with_method_starargs_no_docstring(self):
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "``IHasMethod``",
- " This interface has a method.",
- " Attributes:",
- " Methods:",
- " ``aMethod(first, second, *rest)`` -- no documentation",
- ""
- ])
- class IHasMethod(Interface):
- """ This interface has a method.
- """
- def aMethod(first, second, *rest):
- pass # pragma: no cover
- self.assertEqual(self._callFUT(IHasMethod), EXPECTED)
- def test_asReStructuredText_with_method_kwargs_no_docstring(self):
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "``IHasMethod``",
- " This interface has a method.",
- " Attributes:",
- " Methods:",
- " ``aMethod(first, second, **kw)`` -- no documentation",
- ""
- ])
- class IHasMethod(Interface):
- """ This interface has a method.
- """
- def aMethod(first, second, **kw):
- pass # pragma: no cover
- self.assertEqual(self._callFUT(IHasMethod), EXPECTED)
- def test_asReStructuredText_with_method_with_docstring(self):
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "``IHasMethod``",
- " This interface has a method.",
- " Attributes:",
- " Methods:",
- " ``aMethod()`` -- This method is documented.",
- ""
- ])
- class IHasMethod(Interface):
- """ This interface has a method.
- """
- def aMethod():
- """This method is documented.
- """
- self.assertEqual(self._callFUT(IHasMethod), EXPECTED)
- def test_asReStructuredText_derived_ignores_base(self):
- from zope.interface import Attribute
- from zope.interface import Interface
- EXPECTED = '\n\n'.join([
- "``IDerived``",
- " IDerived doc",
- " This interface extends:",
- " o ``IBase``",
- " Attributes:",
- " ``attr1`` -- no documentation",
- " ``attr2`` -- attr2 doc",
- " Methods:",
- " ``method3()`` -- method3 doc",
- " ``method4()`` -- no documentation",
- " ``method5()`` -- method5 doc",
- "",
- ])
- class IBase(Interface):
- def method1():
- pass # pragma: no cover
- def method2():
- pass # pragma: no cover
- class IDerived(IBase):
- "IDerived doc"
- attr1 = Attribute('attr1')
- attr2 = Attribute('attr2', 'attr2 doc')
- def method3():
- "method3 doc"
- def method4():
- pass # pragma: no cover
- def method5():
- "method5 doc"
- self.assertEqual(self._callFUT(IDerived), EXPECTED)
- class Test__justify_and_indent(unittest.TestCase):
- def _callFUT(self, text, level, **kw):
- from zope.interface.document import _justify_and_indent
- return _justify_and_indent(text, level, **kw)
- def test_simple_level_0(self):
- LINES = ['Three blind mice', 'See how they run']
- text = '\n'.join(LINES)
- self.assertEqual(self._callFUT(text, 0), text)
- def test_simple_level_1(self):
- LINES = ['Three blind mice', 'See how they run']
- text = '\n'.join(LINES)
- self.assertEqual(self._callFUT(text, 1),
- '\n'.join([' ' + line for line in LINES]))
- def test_simple_level_2(self):
- LINES = ['Three blind mice', 'See how they run']
- text = '\n'.join(LINES)
- self.assertEqual(self._callFUT(text, 1),
- '\n'.join([' ' + line for line in LINES]))
- def test_simple_w_CRLF(self):
- LINES = ['Three blind mice', 'See how they run']
- text = '\r\n'.join(LINES)
- self.assertEqual(self._callFUT(text, 1),
- '\n'.join([' ' + line for line in LINES]))
- def test_with_munge(self):
- TEXT = ("This is a piece of text longer than 15 characters, \n"
- "and split across multiple lines.")
- EXPECTED = (" This is a piece\n"
- " of text longer\n"
- " than 15 characters,\n"
- " and split across\n"
- " multiple lines.\n"
- " ")
- self.assertEqual(self._callFUT(TEXT, 1, munge=1, width=15), EXPECTED)
|