New Upstream Release - mkautodoc

Ready changes

Summary

Merged new upstream version: 0.2.0 (was: 0.1.0).

Resulting package

Built on 2022-12-20T05:39 (took 2m21s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-releases python3-mkautodoc

Lintian Result

Diff

diff --git a/README.md b/README.md
index 7870242..3a5d0ed 100644
--- a/README.md
+++ b/README.md
@@ -4,6 +4,8 @@ Python API documention for MkDocs.
 
 This markdown extension adds `autodoc` style support, for use with MkDocs.
 
+![aIAgAAjQpG](https://user-images.githubusercontent.com/647359/66651320-a276ff80-ec2a-11e9-9cec-9eba425d5304.gif)
+
 ## Usage
 
 #### 1. Include the extension in you `mkdocs.yml` config file:
@@ -34,6 +36,31 @@ you may need to use `pip install -e .` or modify `PYTHONPATH` in your docs build
     :members:
 ```
 
+#### 4. Optionally, add styling for the API docs
+
+Update your `mkdocs.yml` to include some custom CSS.
+
+```yaml
+[...]
+extra_css:
+    - css/custom.css
+```
+
+Then add a `css/custom.css` file to your documentation.
+
+```css
+div.autodoc-docstring {
+  padding-left: 20px;
+  margin-bottom: 30px;
+  border-left: 5px solid rgba(230, 230, 230);
+}
+
+div.autodoc-members {
+  padding-left: 20px;
+  margin-bottom: 15px;
+}
+```
+
 ## Notes
 
 #### The :docstring: declaration.
diff --git a/debian/changelog b/debian/changelog
index eb96ef0..ee802ac 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,10 +1,12 @@
-mkautodoc (0.1.0-5) UNRELEASED; urgency=medium
+mkautodoc (0.2.0-1) UNRELEASED; urgency=medium
 
   * Trim trailing whitespace.
   * Set upstream metadata fields: Bug-Database, Bug-Submit, Repository-Browse.
   * Update standards version to 4.6.1, no changes needed.
+  * New upstream release.
+  * Drop patch markdown-etree.patch, present upstream.
 
- -- Debian Janitor <janitor@jelmer.uk>  Sat, 29 Oct 2022 10:33:48 -0000
+ -- Debian Janitor <janitor@jelmer.uk>  Tue, 20 Dec 2022 05:38:07 -0000
 
 mkautodoc (0.1.0-4) unstable; urgency=medium
 
diff --git a/debian/patches/markdown-etree.patch b/debian/patches/markdown-etree.patch
deleted file mode 100644
index d65a7c9..0000000
--- a/debian/patches/markdown-etree.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-diff --git a/mkautodoc/extension.py b/mkautodoc/extension.py
-index 86e70b3..64fe7fa 100644
---- a/mkautodoc/extension.py
-+++ b/mkautodoc/extension.py
-@@ -1,7 +1,7 @@
- from markdown import Markdown
- from markdown.extensions import Extension
- from markdown.blockprocessors import BlockProcessor
--from markdown.util import etree
-+from xml.etree import ElementTree as etree
- import importlib
- import inspect
- import re
-diff --git a/requirements.txt b/requirements.txt
-index 67ec1b1..8a7d94c 100644
---- a/requirements.txt
-+++ b/requirements.txt
-@@ -1,4 +1,4 @@
--markdown
-+-e .
- 
- # Testing
- black
-diff --git a/setup.py b/setup.py
-index 8cb3b5b..8be283f 100644
---- a/setup.py
-+++ b/setup.py
-@@ -37,7 +37,7 @@ setup(
-     author='Tom Christie',
-     author_email='tom@tomchristie.com',
-     packages=get_packages('mkautodoc'),
--    install_requires=[],
-+    install_requires=["Markdown"],
-     python_requires='>=3.6',
-     classifiers=[
-         'Development Status :: 3 - Alpha',
--- 
-2.30.2
-
diff --git a/debian/patches/series b/debian/patches/series
index 481fc76..e69de29 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +0,0 @@
-markdown-etree.patch
diff --git a/mkautodoc/__init__.py b/mkautodoc/__init__.py
index 0c8c5d4..5dcbe96 100644
--- a/mkautodoc/__init__.py
+++ b/mkautodoc/__init__.py
@@ -1,5 +1,5 @@
 from .extension import MKAutoDocExtension, makeExtension
 
 
-__version__ = "0.1.0"
+__version__ = "0.2.0"
 __all__ = ["MKAutoDocExtension", "makeExtension"]
diff --git a/mkautodoc/extension.py b/mkautodoc/extension.py
index db64fd4..64fe7fa 100644
--- a/mkautodoc/extension.py
+++ b/mkautodoc/extension.py
@@ -1,7 +1,7 @@
 from markdown import Markdown
 from markdown.extensions import Extension
 from markdown.blockprocessors import BlockProcessor
-from markdown.util import etree
+from xml.etree import ElementTree as etree
 import importlib
 import inspect
 import re
@@ -66,7 +66,7 @@ def get_params(signature: inspect.Signature) -> typing.List[str]:
 
 def last_iter(seq: typing.Sequence) -> typing.Iterator:
     """
-    Given an sequence, return a two-tuple (item, is_last) iterable.
+    Given a sequence, return a two-tuple (item, is_last) iterable.
 
     See: https://stackoverflow.com/a/1633483/596689
     """
@@ -182,6 +182,9 @@ class AutoDocProcessor(BlockProcessor):
         if inspect.isclass(item):
             qualifier_elem = etree.SubElement(signature_elem, "em")
             qualifier_elem.text = "class "
+        elif inspect.iscoroutinefunction(item):
+            qualifier_elem = etree.SubElement(signature_elem, "em")
+            qualifier_elem.text = "async "
 
         name_elem = etree.SubElement(signature_elem, "code")
         if module_string:
diff --git a/requirements.txt b/requirements.txt
index 67ec1b1..8a7d94c 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,4 @@
-markdown
+-e .
 
 # Testing
 black
diff --git a/scripts/install b/scripts/install
index 8e65b3a..52dccac 100755
--- a/scripts/install
+++ b/scripts/install
@@ -8,5 +8,6 @@ else
     BIN_PATH="venv/bin/"
 fi
 
+${BIN_PATH}pip install --upgrade pip
 ${BIN_PATH}pip install -r requirements.txt
 ${BIN_PATH}pip install -e .
diff --git a/setup.py b/setup.py
index 4e1ef00..4f90226 100644
--- a/setup.py
+++ b/setup.py
@@ -31,13 +31,13 @@ version = get_version('mkautodoc')
 setup(
     name='mkautodoc',
     version=version,
-    url='https://github.com/encode/mkautodoc',
+    url='https://github.com/tomchristie/mkautodoc',
     license='BSD',
     description='AutoDoc for MarkDown',
     author='Tom Christie',
     author_email='tom@tomchristie.com',
     packages=get_packages('mkautodoc'),
-    install_requires=[],
+    install_requires=["Markdown"],
     python_requires='>=3.6',
     classifiers=[
         'Development Status :: 3 - Alpha',
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/assertions.py b/tests/assertions.py
new file mode 100644
index 0000000..14d21f6
--- /dev/null
+++ b/tests/assertions.py
@@ -0,0 +1,71 @@
+from xml import etree
+from xml.dom import minidom
+import textwrap
+
+
+def assert_xml_equal(xml_string, expected_xml_string):
+    """
+    Assert equality of two xml strings, particularly that the contents of
+    each string have the same elements, with the same attributes (e.g. class,
+    text) and the same non-xml string contents
+    """
+    # this prints a human-formatted string of what the test passed in -- useful
+    # if you need to modify test expectations after you've modified
+    # a rendering and tested it visually
+    print(to_readable_error_output(xml_string))
+
+    assert_elements_equal(
+        etree.ElementTree.fromstring(tostring(xml_string)),
+        etree.ElementTree.fromstring(tostring(expected_xml_string)),
+    )
+
+
+def assert_elements_equal(element, reference_element):
+    """
+    Assert, recursively, the equality of two etree objects.
+    """
+    assert (
+        element.text == reference_element.text
+    ), f"Text doesn't match: {element.text} =/= {reference_element.text}."
+    assert (
+        element.attrib == reference_element.attrib
+    ), f"Attrib doesn't match: {element.attrib} =/= {reference_element.attrib}"
+    assert len(element) == len(
+        reference_element
+    ), f"Expected {len(reference_element)} children but got {len(element)}"
+    for sub_element, reference_sub_element in zip(element, reference_element):
+        assert_elements_equal(sub_element, reference_sub_element)
+
+
+def tostring(xml_string):
+    """
+    Wraps `xml_string` in a div so it can be rendered, even if it has multiple roots.
+    """
+    return remove_indents(f"<div>{remove_indents(xml_string)}</div>").encode("utf-8")
+
+
+def to_readable_error_output(xml_string):
+    return textwrap.dedent(
+        "\n".join(
+            minidom.parseString(tostring(xml_string))
+            .toprettyxml(indent="  ")
+            .split("\n")[2:-2]  # remove xml declaration and div added by `tostring`
+        )
+    )  # dent by "  "
+
+
+def remove_indents(html):
+    """
+    Remove leading whitespace from a string
+
+    e.g.
+        input:                    output:
+        . <div>                   . <div>
+        .    <p>Some Text</p>     . <p>Some Text</p>
+        .    <div>                . <div>
+        .      Some more text     . Some more text
+        .    </div>               . </div>
+        . </div>                  . </div>
+    """
+    lines = [el.lstrip() for el in html.split("\n")]
+    return "".join([el for el in lines if el or el != "\n"])
diff --git a/tests/mocklib/mocklib.py b/tests/mocklib/mocklib.py
index 7b70eea..f41bb9b 100644
--- a/tests/mocklib/mocklib.py
+++ b/tests/mocklib/mocklib.py
@@ -24,3 +24,9 @@ class ExampleClass:
         """
         This is a property with a *docstring*.
         """
+
+
+async def example_async_function():
+    """
+    This is a coroutine function as can be seen by the *async* keyword.
+    """
diff --git a/tests/test_extension.py b/tests/test_extension.py
index a9db6d0..4600361 100644
--- a/tests/test_extension.py
+++ b/tests/test_extension.py
@@ -1,4 +1,5 @@
 import markdown
+from .assertions import assert_xml_equal
 
 
 def test_docstring():
@@ -9,13 +10,55 @@ def test_docstring():
     :docstring:
 """
     output = markdown.markdown(content, extensions=["mkautodoc"])
-    assert output.splitlines() == [
-        "<h1>Example</h1>",
-        '<div class="autodoc">',
-        '<div class="autodoc-signature"><code>mocklib.<strong>example_function</strong></code><span class="autodoc-punctuation">(</span><em class="autodoc-param">a</em><span class="autodoc-punctuation">, </span><em class="autodoc-param">b=None</em><span class="autodoc-punctuation">, </span><em class="autodoc-param">*args</em><span class="autodoc-punctuation">, </span><em class="autodoc-param">**kwargs</em><span class="autodoc-punctuation">)</span></div>',
-        '<div class="autodoc-docstring"><p>This is a function with a <em>docstring</em>.</p></div>',
-        "</div>",
-    ]
+    assert_xml_equal(
+        output,
+        """
+<h1>Example</h1>
+<div class="autodoc">
+  <div class="autodoc-signature">
+    <code>
+      mocklib.
+      <strong>example_function</strong>
+    </code>
+    <span class="autodoc-punctuation">(</span>
+    <em class="autodoc-param">a</em>
+    <span class="autodoc-punctuation">, </span>
+    <em class="autodoc-param">b=None</em>
+    <span class="autodoc-punctuation">, </span>
+    <em class="autodoc-param">*args</em>
+    <span class="autodoc-punctuation">, </span>
+    <em class="autodoc-param">**kwargs</em>
+    <span class="autodoc-punctuation">)</span>
+  </div>
+  <div class="autodoc-docstring">
+    <p>
+      This is a function with a <em>docstring</em>.
+    </p>
+  </div>
+</div>""",
+    )
+
+
+def test_async_function():
+    content = """
+::: mocklib.example_async_function
+"""
+    output = markdown.markdown(content, extensions=["mkautodoc"])
+    assert_xml_equal(
+        output,
+        """
+<div class="autodoc">
+  <div class="autodoc-signature">
+    <em>async </em>
+    <code>
+      mocklib.
+      <strong>example_async_function</strong>
+    </code>
+    <span class="autodoc-punctuation">(</span>
+    <span class="autodoc-punctuation">)</span>
+  </div>
+</div>""",
+    )
 
 
 def test_members():
@@ -27,16 +70,53 @@ def test_members():
     :members:
 """
     output = markdown.markdown(content, extensions=["mkautodoc"])
-    assert output.splitlines() == [
-        "<h1>Example</h1>",
-        '<div class="autodoc">',
-        '<div class="autodoc-signature"><em>class </em><code>mocklib.<strong>ExampleClass</strong></code><span class="autodoc-punctuation">(</span><span class="autodoc-punctuation">)</span></div>',
-        '<div class="autodoc-docstring"><p>This is a class with a <em>docstring</em>.</p></div>',
-        '<div class="autodoc-members">',
-        '<div class="autodoc-signature"><code><strong>example_method</strong></code><span class="autodoc-punctuation">(</span><em class="autodoc-param">self</em><span class="autodoc-punctuation">, </span><em class="autodoc-param">a</em><span class="autodoc-punctuation">, </span><em class="autodoc-param">b=None</em><span class="autodoc-punctuation">)</span></div>',
-        '<div class="autodoc-docstring"><p>This is a method with a <em>docstring</em>.</p></div>',
-        '<div class="autodoc-signature"><code><strong>example_property</strong></code></div>',
-        '<div class="autodoc-docstring"><p>This is a property with a <em>docstring</em>.</p></div>',
-        "</div>",
-        "</div>",
-    ]
+    assert_xml_equal(
+        output,
+        """
+<h1>Example</h1>
+<div class="autodoc">
+  <div class="autodoc-signature">
+    <em>class </em>
+    <code>
+      mocklib.
+      <strong>ExampleClass</strong>
+    </code>
+    <span class="autodoc-punctuation">(</span>
+    <span class="autodoc-punctuation">)</span>
+  </div>
+  <div class="autodoc-docstring">
+    <p>
+      This is a class with a <em>docstring</em>.
+    </p>
+  </div>
+  <div class="autodoc-members">
+    <div class="autodoc-signature">
+      <code>
+        <strong>example_method</strong>
+      </code>
+      <span class="autodoc-punctuation">(</span>
+      <em class="autodoc-param">self</em>
+      <span class="autodoc-punctuation">, </span>
+      <em class="autodoc-param">a</em>
+      <span class="autodoc-punctuation">, </span>
+      <em class="autodoc-param">b=None</em>
+      <span class="autodoc-punctuation">)</span>
+    </div>
+    <div class="autodoc-docstring">
+      <p>
+        This is a method with a <em>docstring</em>.
+      </p>
+    </div>
+    <div class="autodoc-signature">
+      <code>
+        <strong>example_property</strong>
+      </code>
+    </div>
+    <div class="autodoc-docstring">
+      <p>
+        This is a property with a <em>docstring</em>.
+      </p>
+    </div>
+  </div>
+</div>""",
+    )

More details

Full run details