supriya-project / uqbar

Tools for building documentation with Sphinx, Graphviz and LaTeX
https://supriya-project.github.io/uqbar
MIT License
13 stars 7 forks source link

Sphinx 5.3.0 is not supported by sphinx.testing feature in tests/conftest.py #81

Closed jgarte closed 1 year ago

jgarte commented 1 year ago

Hi,

In this doc it mentions the following:

New in version 1.6: sphinx.testing is added as a experimental.

That feature is used here:

https://github.com/josiah-wolf-oberholtzer/uqbar/blob/main/tests/conftest.py#L6

But when I pip install -e . in a venv I get Sphinx 5.3.0 as listed as supported in the pyproject.toml semver declaration and when I run make test I get the following error which I think is related to line 6 not being supported in Sphinx 5.3.0:

(.venv)  λ make test
make black-check
make[1]: Entering directory '/home/jgart/uqbar'
black --diff --check uqbar/ tests/ *.py
All done! ✨ 🍰 ✨
79 files would be left unchanged.
make[1]: Leaving directory '/home/jgart/uqbar'
make flake8
make[1]: Entering directory '/home/jgart/uqbar'
flake8 uqbar/ tests/ *.py
make[1]: Leaving directory '/home/jgart/uqbar'
make mypy
make[1]: Entering directory '/home/jgart/uqbar'
mypy uqbar/
Success: no issues found in 34 source files
make[1]: Leaving directory '/home/jgart/uqbar'
make pytest
make[1]: Entering directory '/home/jgart/uqbar'
pytest tests/ uqbar/
ImportError while loading conftest '/home/jgart/uqbar/tests/conftest.py'.
tests/conftest.py:6: in <module>
    from sphinx.testing.path import path
E   ModuleNotFoundError: No module named 'sphinx'
make[1]: *** [Makefile:62: pytest] Error 4
make[1]: Leaving directory '/home/jgart/uqbar'
make: *** [Makefile:79: test] Error 2

Which version of Sphinx are you using for local development in order to use the newer sphinx.testing feature?

jgarte commented 1 year ago

Do you need sphinx-testing to support older Sphinx versions like 5.3.0?

josiah-wolf-oberholtzer commented 1 year ago
  1. I need you to slow down. You're spamming me with trivial issues.

  2. What do you mean "not supported"?

  3. I don't know anything about the sphinx-testing package except that it hasn't been updated in years.

jgarte commented 1 year ago

I edited my initial issue post with more context. Running make test fails for me in a virtualenv. I think it is because Sphinx 5.3.0 doesn't support line 6 that I linked above from conftest.py. I may be wrong but see the exception I update/posted above. That's why I asked what version of Sphinx you're using for local development to see if it is/is not reproducible. I think this answers your point 2.

Just sharing my experience with trying to build the docs for uqbar in a venv and not being able to because of incompatibilities with what is in the latest commit of the code versus the versions you're declaring in the pyproject.toml. Sphinx 5.3.0 might not be supported by line 6 in conftest.py.

I'll stop "spamming trivialities" if that's how you're experiencing it. That was not my intent.

josiah-wolf-oberholtzer commented 1 year ago

Read the error again. ModuleNotFoundError: No module named 'sphinx'. That indicates that you don't have Sphinx installed at all.

jgarte commented 1 year ago

That's not the issue because I do have Sphinx 5.3.0 installed. That error that you're reading is a false positive.

I made sure to check that with the following command while in the venv:

.venv)  $ sphinx-quickstart --version
sphinx-quickstart 5.3.0

See just above that error line:

from sphinx.testing.path import path

in

ImportError while loading conftest '/home/jgart/uqbar/tests/conftest.py'.
tests/conftest.py:6: in <module>
    from sphinx.testing.path import path
E   ModuleNotFoundError: No module named 'sphinx'

and what I mentioned regarding Sphinx 5.3.0 versus later versions of Sphinx.

josiah-wolf-oberholtzer commented 1 year ago
  1. https://pypi.org/project/Sphinx/: Sphinx 5.3.0 is the latest version of Sphinx.
  2. Open a Python interpreter in your virtualenv and run import sphinx
  3. Run which sphinx-build to see where that's coming from
jgarte commented 1 year ago

import sphinx imports silently/successfully in my python interpreter if that's what you wanted me to test.

As for 3 that you listed:

(.venv)  $ which sphinx-build
/home/jgart/uqbar/.venv/bin/sphinx-build

The above which output looks correct to me.

As for 1:

https://pypi.org/project/Sphinx/: Sphinx 5.3.0 is the latest version of Sphinx.

That's the latest version on PyPi but the latest release from the project is

https://github.com/sphinx-doc/sphinx/releases/tag/v6.0.0b2

And the doc I mentioned above says the following:

New in version 1.6: sphinx.testing is added as a experimental.

And what you're using on line 6 seems to be from a version that is higher than 5.3.0:

from sphinx.testing.path import path

because of the following mention in Sphinx's release changelog:

New in version 1.6: sphinx.testing is added as a experimental.

josiah-wolf-oberholtzer commented 1 year ago

I don't understand what you're saying about the versions. New in version 1.6 just means they added the sphinx.testing package then. It's been around for multiple years. And sphinx.testing.path was added 4 years ago: https://github.com/sphinx-doc/sphinx/blame/master/sphinx/testing/path.py#L21

That line in my conftest.py is also 4 years old, back when Uqbar pinned Sphinx 1.7: https://github.com/josiah-wolf-oberholtzer/uqbar/blob/c32ab411a1e1565afa764b49af0c7164752d00b2/setup.py#L33

jgarte commented 1 year ago

It's been around for multiple years. And sphinx.testing.path was added 4 years ago: https://github.com/sphinx-doc/sphinx/blame/master/sphinx/testing/path.py#L21

Ok, thanks for clarifying that. I'm not sure why make test fails to build and reports the above mentioned error then 🦆

Given that info then I have no idea what the issue here might be. It might be some obscure discrepancy between my dev environment and yours that we/I haven't been able to identify yet.

jgarte commented 1 year ago

I'm going to close this issue for now. Maybe someone else will run into it in the future and report it if they fail to run the tests like I did.

Here's some more info about my system FTR that might or might not be relevant:

OS: Void Linux x86_64
Shell: bash 5.1.16
Kernel: 6.0.13_1
josiah-wolf-oberholtzer commented 1 year ago

Yeah, I dunno. Everything works fine on my OSX machine on Python 3.8, 3.9, 3.10 with fresh virtualenvs. And every commit to Uqbar is tested against OSX, Ubuntu and Windows, with Python 3.7 through 3.10. You can always look at the Actions for this repo to see exactly what gets installed and run. The versions of everything are printed out in the logs there.

jgarte commented 1 year ago

I got the tests to run on my machine with pytest --cov uqbar:

============================= test session starts ==============================
platform linux -- Python 3.11.1, pytest-7.2.0, pluggy-1.0.0 -- /home/jgart/uqbar/.venv/bin/python
cachedir: .pytest_cache
rootdir: /home/jgart/uqbar, configfile: pyproject.toml, testpaths: tests, uqbar
plugins: cov-4.0.0
collecting ... collected 141 items

tests/test_apis_APIBuilder.py::test_collection_01 PASSED                 [  0%]
tests/test_apis_APIBuilder.py::test_collection_02 PASSED                 [  1%]
tests/test_apis_APIBuilder.py::test_collection_03 PASSED                 [  2%]
tests/test_apis_APIBuilder.py::test_collection_04 PASSED                 [  2%]
tests/test_apis_APIBuilder.py::test_output_01 PASSED                     [  3%]
tests/test_apis_APIBuilder.py::test_output_02 PASSED                     [  4%]
tests/test_apis_APIBuilder.py::test_output_03 PASSED                     [  4%]
tests/test_apis_ClassDocumenter.py::test_str_01 PASSED                   [  5%]
tests/test_apis_ClassDocumenter.py::test_str_02 PASSED                   [  6%]
tests/test_apis_ClassDocumenter.py::test_str_03 PASSED                   [  7%]
tests/test_apis_InheritanceGraph.py::test_01 PASSED                      [  7%]
tests/test_apis_InheritanceGraph.py::test_02 PASSED                      [  8%]
tests/test_apis_InheritanceGraph.py::test_03 FAILED                      [  9%]
tests/test_apis_InheritanceGraph.py::test_04 PASSED                      [  9%]
tests/test_apis_SummarizingClassDocumenter.py::test_str_01 PASSED        [ 10%]
tests/test_apis_SummarizingClassDocumenter.py::test_str_02 PASSED        [ 11%]
tests/test_apis_SummarizingClassDocumenter.py::test_str_03 PASSED        [ 12%]
tests/test_apis_SummarizingClassDocumenter.py::test_str_04 FAILED        [ 12%]
tests/test_apis_SummarizingModuleDocumenter.py::test_str_01 PASSED       [ 13%]
tests/test_apis_SummarizingModuleDocumenter.py::test_str_02 PASSED       [ 14%]
tests/test_apis_SummarizingModuleDocumenter.py::test_str_03 PASSED       [ 14%]
tests/test_apis_SummarizingRootDocumenter.py::test_str_01 PASSED         [ 15%]
tests/test_book_sphinx.py::test_parse_rst_01 PASSED                      [ 16%]
tests/test_book_sphinx.py::test_parse_rst_02 PASSED                      [ 17%]
tests/test_book_sphinx.py::test_collect_literal_blocks_01 PASSED         [ 17%]
tests/test_book_sphinx.py::test_collect_literal_blocks_02 PASSED         [ 18%]
tests/test_book_sphinx.py::test_interpret_code_blocks_01 PASSED          [ 19%]
tests/test_book_sphinx.py::test_interpret_code_blocks_02 PASSED          [ 19%]
tests/test_book_sphinx.py::test_rebuild_document_01 PASSED               [ 20%]
tests/test_book_sphinx.py::test_rebuild_document_02 PASSED               [ 21%]
tests/test_book_sphinx.py::test_rebuild_document_03 PASSED               [ 21%]
tests/test_book_sphinx.py::test_rebuild_document_04 PASSED               [ 22%]
tests/test_containers_DependencyGraph.py::test___contains__ PASSED       [ 23%]
tests/test_containers_DependencyGraph.py::test___eq__ PASSED             [ 24%]
tests/test_containers_DependencyGraph.py::test___getitem__ PASSED        [ 24%]
tests/test_containers_DependencyGraph.py::test___iter__ PASSED           [ 25%]
tests/test_containers_DependencyGraph.py::test___len__ PASSED            [ 26%]
tests/test_containers_DependencyGraph.py::test_add PASSED                [ 26%]
tests/test_containers_DependencyGraph.py::test_children PASSED           [ 27%]
tests/test_containers_DependencyGraph.py::test_copy PASSED               [ 28%]
tests/test_containers_DependencyGraph.py::test_is_acyclic PASSED         [ 29%]
tests/test_containers_DependencyGraph.py::test_parents PASSED            [ 29%]
tests/test_containers_DependencyGraph.py::test_remove PASSED             [ 30%]
tests/test_containers_UniqueTreeContainer.py::TestCase::test___delitem___01 PASSED [ 31%]
tests/test_containers_UniqueTreeContainer.py::TestCase::test___delitem___02 PASSED [ 31%]
tests/test_containers_UniqueTreeContainer.py::TestCase::test___getitem___named PASSED [ 32%]
tests/test_containers_UniqueTreeContainer.py::TestCase::test___getitem___numbered PASSED [ 33%]
tests/test_containers_UniqueTreeContainer.py::TestCase::test___init___01 PASSED [ 34%]
tests/test_containers_UniqueTreeContainer.py::TestCase::test___init___02 PASSED [ 34%]
tests/test_containers_UniqueTreeContainer.py::TestCase::test___iter__ PASSED [ 35%]
tests/test_containers_UniqueTreeContainer.py::TestCase::test___len__ PASSED [ 36%]
tests/test_containers_UniqueTreeContainer.py::TestCase::test___setitem__ PASSED [ 36%]
tests/test_containers_UniqueTreeContainer.py::TestCase::test_append_01 PASSED [ 37%]
tests/test_containers_UniqueTreeContainer.py::TestCase::test_append_02 PASSED [ 38%]
tests/test_containers_UniqueTreeContainer.py::TestCase::test_extend_01 PASSED [ 39%]
tests/test_containers_UniqueTreeContainer.py::TestCase::test_extend_02 PASSED [ 39%]
tests/test_containers_UniqueTreeContainer.py::TestCase::test_forbid_circular_parentage PASSED [ 40%]
tests/test_containers_UniqueTreeContainer.py::TestCase::test_insert PASSED [ 41%]
tests/test_containers_UniqueTreeContainer.py::TestCase::test_pop PASSED  [ 41%]
tests/test_containers_UniqueTreeContainer.py::TestCase::test_remove PASSED [ 42%]
tests/test_containers_UniqueTreeNode.py::TestCase::test___init___01 PASSED [ 43%]
tests/test_containers_UniqueTreeNode.py::TestCase::test___init___02 PASSED [ 43%]
tests/test_containers_UniqueTreeNode.py::TestCase::test_name_01 PASSED   [ 44%]
tests/test_containers_UniqueTreeNode.py::TestCase::test_name_02 PASSED   [ 45%]
tests/test_graphs_Attributes.py::TestCase::test___format___graphviz_01 PASSED [ 46%]
tests/test_graphs_Attributes.py::TestCase::test___format___graphviz_02 PASSED [ 46%]
tests/test_graphs_Attributes.py::TestCase::test___format___str_01 PASSED [ 47%]
tests/test_graphs_Attributes.py::TestCase::test___format___str_02 PASSED [ 48%]
tests/test_graphs_Attributes.py::TestCase::test_mode PASSED              [ 48%]
tests/test_graphs_Edge.py::TestCase::test___format___graphviz PASSED     [ 49%]
tests/test_graphs_Edge.py::TestCase::test___format___str PASSED          [ 50%]
tests/test_graphs_Edge.py::TestCase::test___init__ PASSED                [ 51%]
tests/test_graphs_Graph.py::TestCase::test___format___graphviz_01 PASSED [ 51%]
tests/test_graphs_Graph.py::TestCase::test_functional PASSED             [ 52%]
tests/test_graphs_Graph.py::TestCase::test_initialized_with_attributes PASSED [ 53%]
tests/test_graphs_Grapher.py::test_01 PASSED                             [ 53%]
tests/test_graphs_Node.py::TestCase::test___format___graphviz PASSED     [ 54%]
tests/test_graphs_Node.py::TestCase::test___format___str PASSED          [ 55%]
tests/test_graphs_Node.py::TestCase::test___init__ PASSED                [ 56%]
tests/test_graphs_Node.py::TestCase::test__get_canonical_name PASSED     [ 56%]
tests/test_graphs_RecordField.py::test_graphs_RecordField PASSED         [ 57%]
tests/test_graphs_Table.py::test_graphs_Table PASSED                     [ 58%]
tests/test_io_find_executable.py::test_find_executable PASSED            [ 58%]
tests/test_objects_get_hash.py::test_objects_get_hash_01 PASSED          [ 59%]
tests/test_objects_get_repr.py::test_objects_get_repr_01 PASSED          [ 60%]
tests/test_objects_get_repr.py::test_objects_get_repr_02 PASSED          [ 60%]
tests/test_objects_get_repr.py::test_objects_get_repr_03 PASSED          [ 61%]
tests/test_objects_get_repr.py::test_objects_get_repr_04 PASSED          [ 62%]
tests/test_objects_get_repr.py::test_objects_get_repr_05 PASSED          [ 63%]
tests/test_objects_get_vars.py::test_objects_get_vars_01 PASSED          [ 63%]
tests/test_objects_get_vars.py::test_objects_get_vars_02 PASSED          [ 64%]
tests/test_objects_new.py::test_objects_new_01 PASSED                    [ 65%]
tests/test_sphinx_api.py::test_sphinx_api_1 PASSED                       [ 65%]
tests/test_sphinx_api.py::test_sphinx_api_2 FAILED                       [ 66%]
tests/test_sphinx_book.py::test_sphinx_book_html_cached PASSED           [ 67%]
tests/test_sphinx_book.py::test_sphinx_book_latex_cached PASSED          [ 68%]
tests/test_sphinx_book.py::test_sphinx_book_text_cached PASSED           [ 68%]
tests/test_sphinx_book.py::test_sphinx_book_text_uncached PASSED         [ 69%]
tests/test_sphinx_book.py::test_sphinx_book_text_broken_strict PASSED    [ 70%]
tests/test_sphinx_book.py::test_sphinx_book_text_broken_setup PASSED     [ 70%]
tests/test_sphinx_book.py::test_sphinx_book_text_broken_teardown PASSED  [ 71%]
tests/test_sphinx_inheritance.py::test_sphinx_style_html FAILED          [ 72%]
tests/test_sphinx_inheritance.py::test_sphinx_style_latex PASSED         [ 73%]
tests/test_sphinx_style.py::test_sphinx_style_1 PASSED                   [ 73%]
uqbar/enums.py::uqbar.enums.IntEnumeration PASSED                        [ 74%]
uqbar/enums.py::uqbar.enums.IntEnumeration.from_expr PASSED              [ 75%]
uqbar/enums.py::uqbar.enums.StrictEnumeration PASSED                     [ 75%]
uqbar/enums.py::uqbar.enums.StrictEnumeration.from_expr PASSED           [ 76%]
uqbar/io.py::uqbar.io.RedirectedStreams PASSED                           [ 77%]
uqbar/io.py::uqbar.io.Timer PASSED                                       [ 78%]
uqbar/io.py::uqbar.io.find_common_prefix PASSED                          [ 78%]
uqbar/io.py::uqbar.io.relative_to PASSED                                 [ 79%]
uqbar/objects.py::uqbar.objects.get_repr PASSED                          [ 80%]
uqbar/objects.py::uqbar.objects.get_vars PASSED                          [ 80%]
uqbar/objects.py::uqbar.objects.new PASSED                               [ 81%]
uqbar/strings.py::uqbar.strings.delimit_words PASSED                     [ 82%]
uqbar/strings.py::uqbar.strings.to_dash_case PASSED                      [ 82%]
uqbar/strings.py::uqbar.strings.to_snake_case PASSED                     [ 83%]
uqbar/apis/builders.py::uqbar.apis.builders.APIBuilder PASSED            [ 84%]
uqbar/apis/documenters.py::uqbar.apis.documenters.ClassDocumenter PASSED [ 85%]
uqbar/apis/documenters.py::uqbar.apis.documenters.FunctionDocumenter PASSED [ 85%]
uqbar/apis/documenters.py::uqbar.apis.documenters.ModuleDocumenter PASSED [ 86%]
uqbar/apis/documenters.py::uqbar.apis.documenters.RootDocumenter PASSED  [ 87%]
uqbar/apis/graphs.py::uqbar.apis.graphs.InheritanceGraph PASSED          [ 87%]
uqbar/apis/summarizers.py::uqbar.apis.summarizers.SummarizingClassDocumenter PASSED [ 88%]
uqbar/apis/summarizers.py::uqbar.apis.summarizers.SummarizingModuleDocumenter PASSED [ 89%]
uqbar/apis/summarizers.py::uqbar.apis.summarizers.SummarizingRootDocumenter PASSED [ 90%]
uqbar/book/console.py::uqbar.book.console.Console PASSED                 [ 90%]
uqbar/containers/dependency_graph.py::uqbar.containers.dependency_graph.DependencyGraph PASSED [ 91%]
uqbar/containers/unique_tree.py::uqbar.containers.unique_tree.UniqueTreeNode.graph_order PASSED [ 92%]
uqbar/graphs/attrs.py::uqbar.graphs.attrs.Attributes PASSED              [ 92%]
uqbar/graphs/core.py::uqbar.graphs.core.Node PASSED                      [ 93%]
uqbar/graphs/html.py::uqbar.graphs.html.HRule PASSED                     [ 94%]
uqbar/graphs/html.py::uqbar.graphs.html.LineBreak PASSED                 [ 95%]
uqbar/graphs/html.py::uqbar.graphs.html.Table PASSED                     [ 95%]
uqbar/graphs/html.py::uqbar.graphs.html.TableCell PASSED                 [ 96%]
uqbar/graphs/html.py::uqbar.graphs.html.TableRow PASSED                  [ 97%]
uqbar/graphs/html.py::uqbar.graphs.html.Text PASSED                      [ 97%]
uqbar/graphs/html.py::uqbar.graphs.html.VRule PASSED                     [ 98%]
uqbar/graphs/records.py::uqbar.graphs.records.RecordField PASSED         [ 99%]
uqbar/graphs/records.py::uqbar.graphs.records.RecordGroup PASSED         [100%]

=================================== FAILURES ===================================
___________________________________ test_03 ____________________________________

    def test_03():
        inheritance_graph = uqbar.apis.InheritanceGraph(
            package_paths=["uqbar"], lineage_paths=["uqbar"]
        )
>       assert str(inheritance_graph) == uqbar.strings.normalize(
            r"""
                digraph InheritanceGraph {
                    graph [bgcolor=transparent,
                        color=lightsteelblue2,
                        fontname=Arial,
                        fontsize=10,
                        outputorder=edgesfirst,
                        overlap=prism,
                        penwidth=2,
                        rankdir=LR,
                        splines=spline,
                        style="dashed, rounded",
                        truecolor=true];
                    node [colorscheme=pastel19,
                        fontname=Arial,
                        fontsize=10,
                        height=0,
                        penwidth=2,
                        shape=box,
                        style="filled, rounded",
                        width=0];
                    edge [color=lightslategrey,
                        penwidth=1];
                    subgraph cluster_builtins {
                        graph [label=builtins];
                        node [color=1];
                        "builtins.BaseException" [label="Base\nException"];
                        "builtins.Exception" [label=Exception];
                        "builtins.int" [label=int];
                        "builtins.object" [label=object];
                        "builtins.BaseException" -> "builtins.Exception";
                        "builtins.object" -> "builtins.BaseException";
                        "builtins.object" -> "builtins.int";
                    }
                    subgraph cluster_code {
                        graph [label=code];
                        node [color=2];
                        "code.InteractiveConsole" [label="Interactive\nConsole"];
                        "code.InteractiveInterpreter" [label="Interactive\nInterpreter"];
                        "code.InteractiveInterpreter" -> "code.InteractiveConsole";
                    }
                    subgraph "cluster_collections.abc" {
                        graph [label="collections.abc"];
                        node [color=3];
                        "collections.abc.Collection" [label=Collection,
                            shape=oval,
                            style=bold];
                        "collections.abc.Container" [label=Container,
                            shape=oval,
                            style=bold];
                        "collections.abc.Iterable" [label=Iterable,
                            shape=oval,
                            style=bold];
                        "collections.abc.Mapping" [label=Mapping,
                            shape=oval,
                            style=bold];
                        "collections.abc.MutableMapping" [label="Mutable\nMapping",
                            shape=oval,
                            style=bold];
                        "collections.abc.Sized" [label=Sized,
                            shape=oval,
                            style=bold];
                        "collections.abc.Collection" -> "collections.abc.Mapping";
                        "collections.abc.Container" -> "collections.abc.Collection";
                        "collections.abc.Iterable" -> "collections.abc.Collection";
                        "collections.abc.Mapping" -> "collections.abc.MutableMapping";
                        "collections.abc.Sized" -> "collections.abc.Collection";
                    }
                    subgraph "cluster_docutils.nodes" {
                        graph [label="docutils.nodes"];
                        node [color=4];
                        "docutils.nodes.Body" [label=Body];
                        "docutils.nodes.Element" [label=Element];
                        "docutils.nodes.General" [label=General];
                        "docutils.nodes.Node" [label="Node"];
                        "docutils.nodes.Body" -> "docutils.nodes.General";
                        "docutils.nodes.Node" -> "docutils.nodes.Element";
                    }
                    subgraph "cluster_docutils.parsers.rst" {
                        graph [label="docutils.parsers.rst"];
                        node [color=5];
                        "docutils.parsers.rst.Directive" [label=Directive];
                    }
                    subgraph cluster_enum {
                        graph [label=enum];
                        node [color=6];
                        "enum.Enum" [label=Enum];
                        "enum.IntEnum" [label="Int\nEnum"];
                        "enum.Enum" -> "enum.IntEnum";
                    }
                    subgraph "cluster_uqbar.apis.builders" {
                        graph [label="uqbar.apis.builders"];
                        node [color=7];
                        "uqbar.apis.builders.APIBuilder" [label=APIBuilder];
                    }
                    subgraph "cluster_uqbar.apis.documenters" {
                        graph [label="uqbar.apis.documenters"];
                        node [color=8];
                        "uqbar.apis.documenters.ClassDocumenter" [label="Class\nDocumenter"];
                        "uqbar.apis.documenters.FunctionDocumenter" [label="Function\nDocumenter"];
                        "uqbar.apis.documenters.MemberDocumenter" [label="Member\nDocumenter"];
                        "uqbar.apis.documenters.ModuleDocumenter" [label="Module\nDocumenter"];
                        "uqbar.apis.documenters.RootDocumenter" [label="Root\nDocumenter"];
                        "uqbar.apis.documenters.MemberDocumenter" -> "uqbar.apis.documenters.ClassDocumenter";
                        "uqbar.apis.documenters.MemberDocumenter" -> "uqbar.apis.documenters.FunctionDocumenter";
                    }
                    subgraph "cluster_uqbar.apis.dummy" {
                        graph [label="uqbar.apis.dummy"];
                        node [color=9];
                        "uqbar.apis.dummy.MyChildClass" [label="My\nChild\nClass"];
                        "uqbar.apis.dummy.MyParentClass" [label="My\nParent\nClass"];
                        "uqbar.apis.dummy.MyParentClass" -> "uqbar.apis.dummy.MyChildClass";
                    }
                    subgraph "cluster_uqbar.apis.graphs" {
                        graph [label="uqbar.apis.graphs"];
                        node [color=1];
                        "uqbar.apis.graphs.InheritanceGraph" [label="Inheritance\nGraph"];
                    }
                    subgraph "cluster_uqbar.apis.nodes" {
                        graph [label="uqbar.apis.nodes"];
                        node [color=2];
                        "uqbar.apis.nodes.ModuleNode" [label="Module\nNode"];
                        "uqbar.apis.nodes.PackageNode" [label="Package\nNode"];
                    }
                    subgraph "cluster_uqbar.apis.summarizers" {
                        graph [label="uqbar.apis.summarizers"];
                        node [color=3];
                        "uqbar.apis.summarizers.ImmaterialClassDocumenter" [label="Immaterial\nClass\nDocumenter"];
                        "uqbar.apis.summarizers.ImmaterialModuleDocumenter" [label="Immaterial\nModule\nDocumenter"];
                        "uqbar.apis.summarizers.SummarizingClassDocumenter" [label="Summarizing\nClass\nDocumenter"];
                        "uqbar.apis.summarizers.SummarizingModuleDocumenter" [label="Summarizing\nModule\nDocumenter"];
                        "uqbar.apis.summarizers.SummarizingRootDocumenter" [label="Summarizing\nRoot\nDocumenter"];
                        "uqbar.apis.summarizers.SummarizingClassDocumenter" -> "uqbar.apis.summarizers.ImmaterialClassDocumenter";
                    }
                    subgraph "cluster_uqbar.book.console" {
                        graph [label="uqbar.book.console"];
                        node [color=4];
                        "uqbar.book.console.Console" [label=Console];
                        "uqbar.book.console.ConsoleError" [label="Console\nError"];
                        "uqbar.book.console.ConsoleInput" [label="Console\nInput"];
                        "uqbar.book.console.ConsoleOutput" [label="Console\nOutput"];
                        "uqbar.book.console.MonkeyPatch" [label="Monkey\nPatch"];
                    }
                    subgraph "cluster_uqbar.book.extensions" {
                        graph [label="uqbar.book.extensions"];
                        node [color=5];
                        "uqbar.book.extensions.Extension" [label=Extension];
                        "uqbar.book.extensions.GraphExtension" [label="Graph\nExtension"];
                        "uqbar.book.extensions.Extension" -> "uqbar.book.extensions.GraphExtension";
                    }
                    subgraph "cluster_uqbar.book.sphinx" {
                        graph [label="uqbar.book.sphinx"];
                        node [color=6];
                        "uqbar.book.sphinx.UqbarBookDefaultsDirective" [label="Uqbar\nBook\nDefaults\nDirective"];
                        "uqbar.book.sphinx.UqbarBookDirective" [label="Uqbar\nBook\nDirective"];
                        "uqbar.book.sphinx.UqbarBookImportDirective" [label="Uqbar\nBook\nImport\nDirective"];
                        "uqbar.book.sphinx.uqbar_book_defaults_block" [label="uqbar\nbook\ndefaults\nblock"];
                        "uqbar.book.sphinx.uqbar_book_import_block" [label="uqbar\nbook\nimport\nblock"];
                    }
                    subgraph "cluster_uqbar.containers.dependency_graph" {
                        graph [label="uqbar.containers.dependency_graph"];
                        node [color=7];
                        "uqbar.containers.dependency_graph.DependencyGraph" [label="Dependency\nGraph"];
                    }
                    subgraph "cluster_uqbar.containers.unique_tree" {
                        graph [label="uqbar.containers.unique_tree"];
                        node [color=8];
                        "uqbar.containers.unique_tree.UniqueTreeContainer" [label="Unique\nTree\nContainer"];
                        "uqbar.containers.unique_tree.UniqueTreeDict" [label="Unique\nTree\nDict"];
                        "uqbar.containers.unique_tree.UniqueTreeList" [label="Unique\nTree\nList"];
                        "uqbar.containers.unique_tree.UniqueTreeNode" [label="Unique\nTree\nNode"];
                        "uqbar.containers.unique_tree.UniqueTreeSet" [label="Unique\nTree\nSet"];
                        "uqbar.containers.unique_tree.UniqueTreeTuple" [label="Unique\nTree\nTuple"];
                        "uqbar.containers.unique_tree.UniqueTreeContainer" -> "uqbar.containers.unique_tree.UniqueTreeDict";
                        "uqbar.containers.unique_tree.UniqueTreeContainer" -> "uqbar.containers.unique_tree.UniqueTreeList";
                        "uqbar.containers.unique_tree.UniqueTreeContainer" -> "uqbar.containers.unique_tree.UniqueTreeSet";
                        "uqbar.containers.unique_tree.UniqueTreeContainer" -> "uqbar.containers.unique_tree.UniqueTreeTuple";
                        "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.containers.unique_tree.UniqueTreeContainer";
                    }
                    subgraph "cluster_uqbar.enums" {
                        graph [label="uqbar.enums"];
                        node [color=9];
                        "uqbar.enums.IntEnumeration" [label="Int\nEnumeration"];
                        "uqbar.enums.StrictEnumeration" [label="Strict\nEnumeration"];
                    }
                    subgraph "cluster_uqbar.graphs.attrs" {
                        graph [label="uqbar.graphs.attrs"];
                        node [color=1];
                        "uqbar.graphs.attrs.Attributes" [label=Attributes];
                    }
                    subgraph "cluster_uqbar.graphs.core" {
                        graph [label="uqbar.graphs.core"];
                        node [color=2];
                        "uqbar.graphs.core.Attachable" [label=Attachable];
                        "uqbar.graphs.core.Edge" [label="Edge"];
                        "uqbar.graphs.core.Graph" [label="Graph"];
                        "uqbar.graphs.core.Node" [label="Node"];
                    }
                    subgraph "cluster_uqbar.graphs.graphers" {
                        graph [label="uqbar.graphs.graphers"];
                        node [color=3];
                        "uqbar.graphs.graphers.Grapher" [label=Grapher];
                    }
                    subgraph "cluster_uqbar.graphs.html" {
                        graph [label="uqbar.graphs.html"];
                        node [color=4];
                        "uqbar.graphs.html.HRule" [label=HRule];
                        "uqbar.graphs.html.LineBreak" [label="Line\nBreak"];
                        "uqbar.graphs.html.Table" [label=Table];
                        "uqbar.graphs.html.TableCell" [label="Table\nCell"];
                        "uqbar.graphs.html.TableRow" [label="Table\nRow"];
                        "uqbar.graphs.html.Text" [label=Text];
                        "uqbar.graphs.html.VRule" [label=VRule];
                    }
                    subgraph "cluster_uqbar.graphs.records" {
                        graph [label="uqbar.graphs.records"];
                        node [color=5];
                        "uqbar.graphs.records.RecordField" [label="Record\nField"];
                        "uqbar.graphs.records.RecordGroup" [label="Record\nGroup"];
                    }
                    subgraph "cluster_uqbar.io" {
                        graph [label="uqbar.io"];
                        node [color=6];
                        "uqbar.io.DirectoryChange" [color=black,
                            fontcolor=white,
                            label="Directory\nChange"];
                        "uqbar.io.Profiler" [color=black,
                            fontcolor=white,
                            label=Profiler];
                        "uqbar.io.RedirectedStreams" [color=black,
                            fontcolor=white,
                            label="Redirected\nStreams"];
                        "uqbar.io.Timer" [color=black,
                            fontcolor=white,
                            label=Timer];
                    }
                    subgraph "cluster_uqbar.sphinx.inheritance" {
                        graph [label="uqbar.sphinx.inheritance"];
                        node [color=7];
                        "uqbar.sphinx.inheritance.InheritanceDiagram" [label="Inheritance\nDiagram"];
                        "uqbar.sphinx.inheritance.inheritance_diagram" [label="inheritance\ndiagram"];
                    }
                    "builtins.Exception" -> "uqbar.book.console.ConsoleError";
                    "builtins.int" -> "enum.IntEnum";
                    "builtins.object" -> "code.InteractiveInterpreter";
                    "builtins.object" -> "collections.abc.Container";
                    "builtins.object" -> "collections.abc.Iterable";
                    "builtins.object" -> "collections.abc.Sized";
                    "builtins.object" -> "docutils.nodes.Body";
                    "builtins.object" -> "docutils.nodes.Node";
                    "builtins.object" -> "docutils.parsers.rst.Directive";
                    "builtins.object" -> "enum.Enum";
                    "builtins.object" -> "uqbar.apis.builders.APIBuilder";
                    "builtins.object" -> "uqbar.apis.documenters.MemberDocumenter";
                    "builtins.object" -> "uqbar.apis.documenters.ModuleDocumenter";
                    "builtins.object" -> "uqbar.apis.documenters.RootDocumenter";
                    "builtins.object" -> "uqbar.apis.dummy.MyParentClass";
                    "builtins.object" -> "uqbar.apis.graphs.InheritanceGraph";
                    "builtins.object" -> "uqbar.book.console.ConsoleInput";
                    "builtins.object" -> "uqbar.book.console.ConsoleOutput";
                    "builtins.object" -> "uqbar.book.console.MonkeyPatch";
                    "builtins.object" -> "uqbar.book.extensions.Extension";
                    "builtins.object" -> "uqbar.containers.dependency_graph.DependencyGraph";
                    "builtins.object" -> "uqbar.containers.unique_tree.UniqueTreeNode";
                    "builtins.object" -> "uqbar.graphs.core.Edge";
                    "builtins.object" -> "uqbar.graphs.graphers.Grapher";
                    "builtins.object" -> "uqbar.io.DirectoryChange";
                    "builtins.object" -> "uqbar.io.Profiler";
                    "builtins.object" -> "uqbar.io.RedirectedStreams";
                    "builtins.object" -> "uqbar.io.Timer";
                    "code.InteractiveConsole" -> "uqbar.book.console.Console";
                    "collections.abc.MutableMapping" -> "uqbar.graphs.attrs.Attributes";
                    "docutils.nodes.Element" -> "uqbar.book.sphinx.uqbar_book_defaults_block";
                    "docutils.nodes.Element" -> "uqbar.book.sphinx.uqbar_book_import_block";
                    "docutils.nodes.Element" -> "uqbar.sphinx.inheritance.inheritance_diagram";
                    "docutils.nodes.General" -> "uqbar.book.sphinx.uqbar_book_defaults_block";
                    "docutils.nodes.General" -> "uqbar.book.sphinx.uqbar_book_import_block";
                    "docutils.nodes.General" -> "uqbar.sphinx.inheritance.inheritance_diagram";
                    "docutils.parsers.rst.Directive" -> "uqbar.book.sphinx.UqbarBookDefaultsDirective";
                    "docutils.parsers.rst.Directive" -> "uqbar.book.sphinx.UqbarBookDirective";
                    "docutils.parsers.rst.Directive" -> "uqbar.book.sphinx.UqbarBookImportDirective";
                    "docutils.parsers.rst.Directive" -> "uqbar.sphinx.inheritance.InheritanceDiagram";
                    "enum.Enum" -> "uqbar.enums.StrictEnumeration";
                    "enum.IntEnum" -> "uqbar.enums.IntEnumeration";
                    "uqbar.apis.documenters.ClassDocumenter" -> "uqbar.apis.summarizers.SummarizingClassDocumenter";
                    "uqbar.apis.documenters.ModuleDocumenter" -> "uqbar.apis.summarizers.ImmaterialModuleDocumenter";
                    "uqbar.apis.documenters.ModuleDocumenter" -> "uqbar.apis.summarizers.SummarizingModuleDocumenter";
                    "uqbar.apis.documenters.RootDocumenter" -> "uqbar.apis.summarizers.SummarizingRootDocumenter";
                    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.apis.nodes.PackageNode";
                    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.core.Graph";
                    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.core.Node";
                    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.html.Table";
                    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.html.TableCell";
                    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.html.TableRow";
                    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.records.RecordGroup";
                    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.apis.nodes.ModuleNode";
                    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.core.Attachable";
                    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.html.HRule";
                    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.html.LineBreak";
                    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.html.Text";
                    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.html.VRule";
                    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.records.RecordField";
                    "uqbar.graphs.core.Attachable" -> "uqbar.graphs.html.TableCell";
                    "uqbar.graphs.core.Attachable" -> "uqbar.graphs.records.RecordField";
                }
            """
        )
E       assert 'digraph InheritanceGraph {\n    graph [bgcolor=transparent,\n        color=lightsteelblue2,\n        fontname=Arial,\n        fontsize=10,\n        outputorder=edgesfirst,\n        overlap=prism,\n        penwidth=2,\n        rankdir=LR,\n        splines=spline,\n        style="dashed, rounded",\n        truecolor=true];\n    node [colorscheme=pastel19,\n        fontname=Arial,\n        fontsize=10,\n        height=0,\n        penwidth=2,\n        shape=box,\n        style="filled, rounded",\n        width=0];\n    edge [color=lightslategrey,\n        penwidth=1];\n    subgraph cluster_builtins {\n        graph [label=builtins];\n        node [color=1];\n        "builtins.BaseException" [label="Base\\nException"];\n        "builtins.Exception" [label=Exception];\n        "builtins.int" [label=int];\n        "builtins.object" [label=object];\n        "builtins.BaseException" -> "builtins.Exception";\n        "builtins.object" -> "builtins.BaseException";\n        "builtins.object" -> "builtins.int";\n    }\n    subgraph cluster_code {\n        graph [label=code];\n        node [color=2];\n        "code.InteractiveConsole" [label="Interactive\\nConsole"];\n        "code.InteractiveInterpreter" [label="Interactive\\nInterpreter"];\n        "code.InteractiveInterpreter" -> "code.InteractiveConsole";\n    }\n    subgraph "cluster_collections.abc" {\n        graph [label="collections.abc"];\n        node [color=3];\n        "collections.abc.Collection" [label=Collection,\n            shape=oval,\n            style=bold];\n        "collections.abc.Container" [label=Container,\n            shape=oval,\n            style=bold];\n        "collections.abc.Iterable" [label=Iterable,\n            shape=oval,\n            style=bold];\n        "collections.abc.Mapping" [label=Mapping,\n            shape=oval,\n            style=bold];\n        "collections.abc.MutableMapping" [label="Mutable\\nMapping",\n            shape=oval,\n            style=bold];\n        "collections.abc.Sized" [label=Sized,\n            shape=oval,\n            style=bold];\n        "collections.abc.Collection" -> "collections.abc.Mapping";\n        "collections.abc.Container" -> "collections.abc.Collection";\n        "collections.abc.Iterable" -> "collections.abc.Collection";\n        "collections.abc.Mapping" -> "collections.abc.MutableMapping";\n        "collections.abc.Sized" -> "collections.abc.Collection";\n    }\n    subgraph "cluster_docutils.nodes" {\n        graph [label="docutils.nodes"];\n        node [color=4];\n        "docutils.nodes.Body" [label=Body];\n        "docutils.nodes.Element" [label=Element];\n        "docutils.nodes.General" [label=General];\n        "docutils.nodes.Node" [label="Node"];\n        "docutils.nodes.Body" -> "docutils.nodes.General";\n        "docutils.nodes.Node" -> "docutils.nodes.Element";\n    }\n    subgraph "cluster_docutils.parsers.rst" {\n        graph [label="docutils.parsers.rst"];\n        node [color=5];\n        "docutils.parsers.rst.Directive" [label=Directive];\n    }\n    subgraph cluster_enum {\n        graph [label=enum];\n        node [color=6];\n        "enum.Enum" [label=Enum];\n        "enum.IntEnum" [label="Int\\nEnum"];\n        "enum.ReprEnum" [label="Repr\\nEnum"];\n        "enum.Enum" -> "enum.ReprEnum";\n        "enum.ReprEnum" -> "enum.IntEnum";\n    }\n    subgraph "cluster_uqbar.apis.builders" {\n        graph [label="uqbar.apis.builders"];\n        node [color=7];\n        "uqbar.apis.builders.APIBuilder" [label=APIBuilder];\n    }\n    subgraph "cluster_uqbar.apis.documenters" {\n        graph [label="uqbar.apis.documenters"];\n        node [color=8];\n        "uqbar.apis.documenters.ClassDocumenter" [label="Class\\nDocumenter"];\n        "uqbar.apis.documenters.FunctionDocumenter" [label="Function\\nDocumenter"];\n        "uqbar.apis.documenters.MemberDocumenter" [label="Member\\nDocumenter"];\n        "uqbar.apis.documenters.ModuleDocumenter" [label="Module\\nDocumenter"];\n        "uqbar.apis.documenters.RootDocumenter" [label="Root\\nDocumenter"];\n        "uqbar.apis.documenters.MemberDocumenter" -> "uqbar.apis.documenters.ClassDocumenter";\n        "uqbar.apis.documenters.MemberDocumenter" -> "uqbar.apis.documenters.FunctionDocumenter";\n    }\n    subgraph "cluster_uqbar.apis.dummy" {\n        graph [label="uqbar.apis.dummy"];\n        node [color=9];\n        "uqbar.apis.dummy.MyChildClass" [label="My\\nChild\\nClass"];\n        "uqbar.apis.dummy.MyParentClass" [label="My\\nParent\\nClass"];\n        "uqbar.apis.dummy.MyParentClass" -> "uqbar.apis.dummy.MyChildClass";\n    }\n    subgraph "cluster_uqbar.apis.graphs" {\n        graph [label="uqbar.apis.graphs"];\n        node [color=1];\n        "uqbar.apis.graphs.InheritanceGraph" [label="Inheritance\\nGraph"];\n    }\n    subgraph "cluster_uqbar.apis.nodes" {\n        graph [label="uqbar.apis.nodes"];\n        node [color=2];\n        "uqbar.apis.nodes.ModuleNode" [label="Module\\nNode"];\n        "uqbar.apis.nodes.PackageNode" [label="Package\\nNode"];\n    }\n    subgraph "cluster_uqbar.apis.summarizers" {\n        graph [label="uqbar.apis.summarizers"];\n        node [color=3];\n        "uqbar.apis.summarizers.ImmaterialClassDocumenter" [label="Immaterial\\nClass\\nDocumenter"];\n        "uqbar.apis.summarizers.ImmaterialModuleDocumenter" [label="Immaterial\\nModule\\nDocumenter"];\n        "uqbar.apis.summarizers.SummarizingClassDocumenter" [label="Summarizing\\nClass\\nDocumenter"];\n        "uqbar.apis.summarizers.SummarizingModuleDocumenter" [label="Summarizing\\nModule\\nDocumenter"];\n        "uqbar.apis.summarizers.SummarizingRootDocumenter" [label="Summarizing\\nRoot\\nDocumenter"];\n        "uqbar.apis.summarizers.SummarizingClassDocumenter" -> "uqbar.apis.summarizers.ImmaterialClassDocumenter";\n    }\n    subgraph "cluster_uqbar.book.console" {\n        graph [label="uqbar.book.console"];\n        node [color=4];\n        "uqbar.book.console.Console" [label=Console];\n        "uqbar.book.console.ConsoleError" [label="Console\\nError"];\n        "uqbar.book.console.ConsoleInput" [label="Console\\nInput"];\n        "uqbar.book.console.ConsoleOutput" [label="Console\\nOutput"];\n        "uqbar.book.console.MonkeyPatch" [label="Monkey\\nPatch"];\n    }\n    subgraph "cluster_uqbar.book.extensions" {\n        graph [label="uqbar.book.extensions"];\n        node [color=5];\n        "uqbar.book.extensions.Extension" [label=Extension];\n        "uqbar.book.extensions.GraphExtension" [label="Graph\\nExtension"];\n        "uqbar.book.extensions.Extension" -> "uqbar.book.extensions.GraphExtension";\n    }\n    subgraph "cluster_uqbar.book.sphinx" {\n        graph [label="uqbar.book.sphinx"];\n        node [color=6];\n        "uqbar.book.sphinx.UqbarBookDefaultsDirective" [label="Uqbar\\nBook\\nDefaults\\nDirective"];\n        "uqbar.book.sphinx.UqbarBookDirective" [label="Uqbar\\nBook\\nDirective"];\n        "uqbar.book.sphinx.UqbarBookImportDirective" [label="Uqbar\\nBook\\nImport\\nDirective"];\n        "uqbar.book.sphinx.uqbar_book_defaults_block" [label="uqbar\\nbook\\ndefaults\\nblock"];\n        "uqbar.book.sphinx.uqbar_book_import_block" [label="uqbar\\nbook\\nimport\\nblock"];\n    }\n    subgraph "cluster_uqbar.containers.dependency_graph" {\n        graph [label="uqbar.containers.dependency_graph"];\n        node [color=7];\n        "uqbar.containers.dependency_graph.DependencyGraph" [label="Dependency\\nGraph"];\n    }\n    subgraph "cluster_uqbar.containers.unique_tree" {\n        graph [label="uqbar.containers.unique_tree"];\n        node [color=8];\n        "uqbar.containers.unique_tree.UniqueTreeContainer" [label="Unique\\nTree\\nContainer"];\n        "uqbar.containers.unique_tree.UniqueTreeDict" [label="Unique\\nTree\\nDict"];\n        "uqbar.containers.unique_tree.UniqueTreeList" [label="Unique\\nTree\\nList"];\n        "uqbar.containers.unique_tree.UniqueTreeNode" [label="Unique\\nTree\\nNode"];\n        "uqbar.containers.unique_tree.UniqueTreeSet" [label="Unique\\nTree\\nSet"];\n        "uqbar.containers.unique_tree.UniqueTreeTuple" [label="Unique\\nTree\\nTuple"];\n        "uqbar.containers.unique_tree.UniqueTreeContainer" -> "uqbar.containers.unique_tree.UniqueTreeDict";\n        "uqbar.containers.unique_tree.UniqueTreeContainer" -> "uqbar.containers.unique_tree.UniqueTreeList";\n        "uqbar.containers.unique_tree.UniqueTreeContainer" -> "uqbar.containers.unique_tree.UniqueTreeSet";\n        "uqbar.containers.unique_tree.UniqueTreeContainer" -> "uqbar.containers.unique_tree.UniqueTreeTuple";\n        "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.containers.unique_tree.UniqueTreeContainer";\n    }\n    subgraph "cluster_uqbar.enums" {\n        graph [label="uqbar.enums"];\n        node [color=9];\n        "uqbar.enums.IntEnumeration" [label="Int\\nEnumeration"];\n        "uqbar.enums.StrictEnumeration" [label="Strict\\nEnumeration"];\n    }\n    subgraph "cluster_uqbar.graphs.attrs" {\n        graph [label="uqbar.graphs.attrs"];\n        node [color=1];\n        "uqbar.graphs.attrs.Attributes" [label=Attributes];\n    }\n    subgraph "cluster_uqbar.graphs.core" {\n        graph [label="uqbar.graphs.core"];\n        node [color=2];\n        "uqbar.graphs.core.Attachable" [label=Attachable];\n        "uqbar.graphs.core.Edge" [label="Edge"];\n        "uqbar.graphs.core.Graph" [label="Graph"];\n        "uqbar.graphs.core.Node" [label="Node"];\n    }\n    subgraph "cluster_uqbar.graphs.graphers" {\n        graph [label="uqbar.graphs.graphers"];\n        node [color=3];\n        "uqbar.graphs.graphers.Grapher" [label=Grapher];\n    }\n    subgraph "cluster_uqbar.graphs.html" {\n        graph [label="uqbar.graphs.html"];\n        node [color=4];\n        "uqbar.graphs.html.HRule" [label=HRule];\n        "uqbar.graphs.html.LineBreak" [label="Line\\nBreak"];\n        "uqbar.graphs.html.Table" [label=Table];\n        "uqbar.graphs.html.TableCell" [label="Table\\nCell"];\n        "uqbar.graphs.html.TableRow" [label="Table\\nRow"];\n        "uqbar.graphs.html.Text" [label=Text];\n        "uqbar.graphs.html.VRule" [label=VRule];\n    }\n    subgraph "cluster_uqbar.graphs.records" {\n        graph [label="uqbar.graphs.records"];\n        node [color=5];\n        "uqbar.graphs.records.RecordField" [label="Record\\nField"];\n        "uqbar.graphs.records.RecordGroup" [label="Record\\nGroup"];\n    }\n    subgraph "cluster_uqbar.io" {\n        graph [label="uqbar.io"];\n        node [color=6];\n        "uqbar.io.DirectoryChange" [color=black,\n            fontcolor=white,\n            label="Directory\\nChange"];\n        "uqbar.io.Profiler" [color=black,\n            fontcolor=white,\n            label=Profiler];\n        "uqbar.io.RedirectedStreams" [color=black,\n            fontcolor=white,\n            label="Redirected\\nStreams"];\n        "uqbar.io.Timer" [color=black,\n            fontcolor=white,\n            label=Timer];\n    }\n    subgraph "cluster_uqbar.sphinx.inheritance" {\n        graph [label="uqbar.sphinx.inheritance"];\n        node [color=7];\n        "uqbar.sphinx.inheritance.InheritanceDiagram" [label="Inheritance\\nDiagram"];\n        "uqbar.sphinx.inheritance.inheritance_diagram" [label="inheritance\\ndiagram"];\n    }\n    "builtins.Exception" -> "uqbar.book.console.ConsoleError";\n    "builtins.int" -> "enum.IntEnum";\n    "builtins.object" -> "code.InteractiveInterpreter";\n    "builtins.object" -> "collections.abc.Container";\n    "builtins.object" -> "collections.abc.Iterable";\n    "builtins.object" -> "collections.abc.Sized";\n    "builtins.object" -> "docutils.nodes.Body";\n    "builtins.object" -> "docutils.nodes.Node";\n    "builtins.object" -> "docutils.parsers.rst.Directive";\n    "builtins.object" -> "enum.Enum";\n    "builtins.object" -> "uqbar.apis.builders.APIBuilder";\n    "builtins.object" -> "uqbar.apis.documenters.MemberDocumenter";\n    "builtins.object" -> "uqbar.apis.documenters.ModuleDocumenter";\n    "builtins.object" -> "uqbar.apis.documenters.RootDocumenter";\n    "builtins.object" -> "uqbar.apis.dummy.MyParentClass";\n    "builtins.object" -> "uqbar.apis.graphs.InheritanceGraph";\n    "builtins.object" -> "uqbar.book.console.ConsoleInput";\n    "builtins.object" -> "uqbar.book.console.ConsoleOutput";\n    "builtins.object" -> "uqbar.book.console.MonkeyPatch";\n    "builtins.object" -> "uqbar.book.extensions.Extension";\n    "builtins.object" -> "uqbar.containers.dependency_graph.DependencyGraph";\n    "builtins.object" -> "uqbar.containers.unique_tree.UniqueTreeNode";\n    "builtins.object" -> "uqbar.graphs.core.Edge";\n    "builtins.object" -> "uqbar.graphs.graphers.Grapher";\n    "builtins.object" -> "uqbar.io.DirectoryChange";\n    "builtins.object" -> "uqbar.io.Profiler";\n    "builtins.object" -> "uqbar.io.RedirectedStreams";\n    "builtins.object" -> "uqbar.io.Timer";\n    "code.InteractiveConsole" -> "uqbar.book.console.Console";\n    "collections.abc.MutableMapping" -> "uqbar.graphs.attrs.Attributes";\n    "docutils.nodes.Element" -> "uqbar.book.sphinx.uqbar_book_defaults_block";\n    "docutils.nodes.Element" -> "uqbar.book.sphinx.uqbar_book_import_block";\n    "docutils.nodes.Element" -> "uqbar.sphinx.inheritance.inheritance_diagram";\n    "docutils.nodes.General" -> "uqbar.book.sphinx.uqbar_book_defaults_block";\n    "docutils.nodes.General" -> "uqbar.book.sphinx.uqbar_book_import_block";\n    "docutils.nodes.General" -> "uqbar.sphinx.inheritance.inheritance_diagram";\n    "docutils.parsers.rst.Directive" -> "uqbar.book.sphinx.UqbarBookDefaultsDirective";\n    "docutils.parsers.rst.Directive" -> "uqbar.book.sphinx.UqbarBookDirective";\n    "docutils.parsers.rst.Directive" -> "uqbar.book.sphinx.UqbarBookImportDirective";\n    "docutils.parsers.rst.Directive" -> "uqbar.sphinx.inheritance.InheritanceDiagram";\n    "enum.Enum" -> "uqbar.enums.StrictEnumeration";\n    "enum.IntEnum" -> "uqbar.enums.IntEnumeration";\n    "uqbar.apis.documenters.ClassDocumenter" -> "uqbar.apis.summarizers.SummarizingClassDocumenter";\n    "uqbar.apis.documenters.ModuleDocumenter" -> "uqbar.apis.summarizers.ImmaterialModuleDocumenter";\n    "uqbar.apis.documenters.ModuleDocumenter" -> "uqbar.apis.summarizers.SummarizingModuleDocumenter";\n    "uqbar.apis.documenters.RootDocumenter" -> "uqbar.apis.summarizers.SummarizingRootDocumenter";\n    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.apis.nodes.PackageNode";\n    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.core.Graph";\n    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.core.Node";\n    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.html.Table";\n    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.html.TableCell";\n    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.html.TableRow";\n    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.records.RecordGroup";\n    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.apis.nodes.ModuleNode";\n    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.core.Attachable";\n    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.html.HRule";\n    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.html.LineBreak";\n    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.html.Text";\n    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.html.VRule";\n    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.records.RecordField";\n    "uqbar.graphs.core.Attachable" -> "uqbar.graphs.html.TableCell";\n    "uqbar.graphs.core.Attachable" -> "uqbar.graphs.records.RecordField";\n}' == 'digraph InheritanceGraph {\n    graph [bgcolor=transparent,\n        color=lightsteelblue2,\n        fontname=Arial,\n        fontsize=10,\n        outputorder=edgesfirst,\n        overlap=prism,\n        penwidth=2,\n        rankdir=LR,\n        splines=spline,\n        style="dashed, rounded",\n        truecolor=true];\n    node [colorscheme=pastel19,\n        fontname=Arial,\n        fontsize=10,\n        height=0,\n        penwidth=2,\n        shape=box,\n        style="filled, rounded",\n        width=0];\n    edge [color=lightslategrey,\n        penwidth=1];\n    subgraph cluster_builtins {\n        graph [label=builtins];\n        node [color=1];\n        "builtins.BaseException" [label="Base\\nException"];\n        "builtins.Exception" [label=Exception];\n        "builtins.int" [label=int];\n        "builtins.object" [label=object];\n        "builtins.BaseException" -> "builtins.Exception";\n        "builtins.object" -> "builtins.BaseException";\n        "builtins.object" -> "builtins.int";\n    }\n    subgraph cluster_code {\n        graph [label=code];\n        node [color=2];\n        "code.InteractiveConsole" [label="Interactive\\nConsole"];\n        "code.InteractiveInterpreter" [label="Interactive\\nInterpreter"];\n        "code.InteractiveInterpreter" -> "code.InteractiveConsole";\n    }\n    subgraph "cluster_collections.abc" {\n        graph [label="collections.abc"];\n        node [color=3];\n        "collections.abc.Collection" [label=Collection,\n            shape=oval,\n            style=bold];\n        "collections.abc.Container" [label=Container,\n            shape=oval,\n            style=bold];\n        "collections.abc.Iterable" [label=Iterable,\n            shape=oval,\n            style=bold];\n        "collections.abc.Mapping" [label=Mapping,\n            shape=oval,\n            style=bold];\n        "collections.abc.MutableMapping" [label="Mutable\\nMapping",\n            shape=oval,\n            style=bold];\n        "collections.abc.Sized" [label=Sized,\n            shape=oval,\n            style=bold];\n        "collections.abc.Collection" -> "collections.abc.Mapping";\n        "collections.abc.Container" -> "collections.abc.Collection";\n        "collections.abc.Iterable" -> "collections.abc.Collection";\n        "collections.abc.Mapping" -> "collections.abc.MutableMapping";\n        "collections.abc.Sized" -> "collections.abc.Collection";\n    }\n    subgraph "cluster_docutils.nodes" {\n        graph [label="docutils.nodes"];\n        node [color=4];\n        "docutils.nodes.Body" [label=Body];\n        "docutils.nodes.Element" [label=Element];\n        "docutils.nodes.General" [label=General];\n        "docutils.nodes.Node" [label="Node"];\n        "docutils.nodes.Body" -> "docutils.nodes.General";\n        "docutils.nodes.Node" -> "docutils.nodes.Element";\n    }\n    subgraph "cluster_docutils.parsers.rst" {\n        graph [label="docutils.parsers.rst"];\n        node [color=5];\n        "docutils.parsers.rst.Directive" [label=Directive];\n    }\n    subgraph cluster_enum {\n        graph [label=enum];\n        node [color=6];\n        "enum.Enum" [label=Enum];\n        "enum.IntEnum" [label="Int\\nEnum"];\n        "enum.Enum" -> "enum.IntEnum";\n    }\n    subgraph "cluster_uqbar.apis.builders" {\n        graph [label="uqbar.apis.builders"];\n        node [color=7];\n        "uqbar.apis.builders.APIBuilder" [label=APIBuilder];\n    }\n    subgraph "cluster_uqbar.apis.documenters" {\n        graph [label="uqbar.apis.documenters"];\n        node [color=8];\n        "uqbar.apis.documenters.ClassDocumenter" [label="Class\\nDocumenter"];\n        "uqbar.apis.documenters.FunctionDocumenter" [label="Function\\nDocumenter"];\n        "uqbar.apis.documenters.MemberDocumenter" [label="Member\\nDocumenter"];\n        "uqbar.apis.documenters.ModuleDocumenter" [label="Module\\nDocumenter"];\n        "uqbar.apis.documenters.RootDocumenter" [label="Root\\nDocumenter"];\n        "uqbar.apis.documenters.MemberDocumenter" -> "uqbar.apis.documenters.ClassDocumenter";\n        "uqbar.apis.documenters.MemberDocumenter" -> "uqbar.apis.documenters.FunctionDocumenter";\n    }\n    subgraph "cluster_uqbar.apis.dummy" {\n        graph [label="uqbar.apis.dummy"];\n        node [color=9];\n        "uqbar.apis.dummy.MyChildClass" [label="My\\nChild\\nClass"];\n        "uqbar.apis.dummy.MyParentClass" [label="My\\nParent\\nClass"];\n        "uqbar.apis.dummy.MyParentClass" -> "uqbar.apis.dummy.MyChildClass";\n    }\n    subgraph "cluster_uqbar.apis.graphs" {\n        graph [label="uqbar.apis.graphs"];\n        node [color=1];\n        "uqbar.apis.graphs.InheritanceGraph" [label="Inheritance\\nGraph"];\n    }\n    subgraph "cluster_uqbar.apis.nodes" {\n        graph [label="uqbar.apis.nodes"];\n        node [color=2];\n        "uqbar.apis.nodes.ModuleNode" [label="Module\\nNode"];\n        "uqbar.apis.nodes.PackageNode" [label="Package\\nNode"];\n    }\n    subgraph "cluster_uqbar.apis.summarizers" {\n        graph [label="uqbar.apis.summarizers"];\n        node [color=3];\n        "uqbar.apis.summarizers.ImmaterialClassDocumenter" [label="Immaterial\\nClass\\nDocumenter"];\n        "uqbar.apis.summarizers.ImmaterialModuleDocumenter" [label="Immaterial\\nModule\\nDocumenter"];\n        "uqbar.apis.summarizers.SummarizingClassDocumenter" [label="Summarizing\\nClass\\nDocumenter"];\n        "uqbar.apis.summarizers.SummarizingModuleDocumenter" [label="Summarizing\\nModule\\nDocumenter"];\n        "uqbar.apis.summarizers.SummarizingRootDocumenter" [label="Summarizing\\nRoot\\nDocumenter"];\n        "uqbar.apis.summarizers.SummarizingClassDocumenter" -> "uqbar.apis.summarizers.ImmaterialClassDocumenter";\n    }\n    subgraph "cluster_uqbar.book.console" {\n        graph [label="uqbar.book.console"];\n        node [color=4];\n        "uqbar.book.console.Console" [label=Console];\n        "uqbar.book.console.ConsoleError" [label="Console\\nError"];\n        "uqbar.book.console.ConsoleInput" [label="Console\\nInput"];\n        "uqbar.book.console.ConsoleOutput" [label="Console\\nOutput"];\n        "uqbar.book.console.MonkeyPatch" [label="Monkey\\nPatch"];\n    }\n    subgraph "cluster_uqbar.book.extensions" {\n        graph [label="uqbar.book.extensions"];\n        node [color=5];\n        "uqbar.book.extensions.Extension" [label=Extension];\n        "uqbar.book.extensions.GraphExtension" [label="Graph\\nExtension"];\n        "uqbar.book.extensions.Extension" -> "uqbar.book.extensions.GraphExtension";\n    }\n    subgraph "cluster_uqbar.book.sphinx" {\n        graph [label="uqbar.book.sphinx"];\n        node [color=6];\n        "uqbar.book.sphinx.UqbarBookDefaultsDirective" [label="Uqbar\\nBook\\nDefaults\\nDirective"];\n        "uqbar.book.sphinx.UqbarBookDirective" [label="Uqbar\\nBook\\nDirective"];\n        "uqbar.book.sphinx.UqbarBookImportDirective" [label="Uqbar\\nBook\\nImport\\nDirective"];\n        "uqbar.book.sphinx.uqbar_book_defaults_block" [label="uqbar\\nbook\\ndefaults\\nblock"];\n        "uqbar.book.sphinx.uqbar_book_import_block" [label="uqbar\\nbook\\nimport\\nblock"];\n    }\n    subgraph "cluster_uqbar.containers.dependency_graph" {\n        graph [label="uqbar.containers.dependency_graph"];\n        node [color=7];\n        "uqbar.containers.dependency_graph.DependencyGraph" [label="Dependency\\nGraph"];\n    }\n    subgraph "cluster_uqbar.containers.unique_tree" {\n        graph [label="uqbar.containers.unique_tree"];\n        node [color=8];\n        "uqbar.containers.unique_tree.UniqueTreeContainer" [label="Unique\\nTree\\nContainer"];\n        "uqbar.containers.unique_tree.UniqueTreeDict" [label="Unique\\nTree\\nDict"];\n        "uqbar.containers.unique_tree.UniqueTreeList" [label="Unique\\nTree\\nList"];\n        "uqbar.containers.unique_tree.UniqueTreeNode" [label="Unique\\nTree\\nNode"];\n        "uqbar.containers.unique_tree.UniqueTreeSet" [label="Unique\\nTree\\nSet"];\n        "uqbar.containers.unique_tree.UniqueTreeTuple" [label="Unique\\nTree\\nTuple"];\n        "uqbar.containers.unique_tree.UniqueTreeContainer" -> "uqbar.containers.unique_tree.UniqueTreeDict";\n        "uqbar.containers.unique_tree.UniqueTreeContainer" -> "uqbar.containers.unique_tree.UniqueTreeList";\n        "uqbar.containers.unique_tree.UniqueTreeContainer" -> "uqbar.containers.unique_tree.UniqueTreeSet";\n        "uqbar.containers.unique_tree.UniqueTreeContainer" -> "uqbar.containers.unique_tree.UniqueTreeTuple";\n        "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.containers.unique_tree.UniqueTreeContainer";\n    }\n    subgraph "cluster_uqbar.enums" {\n        graph [label="uqbar.enums"];\n        node [color=9];\n        "uqbar.enums.IntEnumeration" [label="Int\\nEnumeration"];\n        "uqbar.enums.StrictEnumeration" [label="Strict\\nEnumeration"];\n    }\n    subgraph "cluster_uqbar.graphs.attrs" {\n        graph [label="uqbar.graphs.attrs"];\n        node [color=1];\n        "uqbar.graphs.attrs.Attributes" [label=Attributes];\n    }\n    subgraph "cluster_uqbar.graphs.core" {\n        graph [label="uqbar.graphs.core"];\n        node [color=2];\n        "uqbar.graphs.core.Attachable" [label=Attachable];\n        "uqbar.graphs.core.Edge" [label="Edge"];\n        "uqbar.graphs.core.Graph" [label="Graph"];\n        "uqbar.graphs.core.Node" [label="Node"];\n    }\n    subgraph "cluster_uqbar.graphs.graphers" {\n        graph [label="uqbar.graphs.graphers"];\n        node [color=3];\n        "uqbar.graphs.graphers.Grapher" [label=Grapher];\n    }\n    subgraph "cluster_uqbar.graphs.html" {\n        graph [label="uqbar.graphs.html"];\n        node [color=4];\n        "uqbar.graphs.html.HRule" [label=HRule];\n        "uqbar.graphs.html.LineBreak" [label="Line\\nBreak"];\n        "uqbar.graphs.html.Table" [label=Table];\n        "uqbar.graphs.html.TableCell" [label="Table\\nCell"];\n        "uqbar.graphs.html.TableRow" [label="Table\\nRow"];\n        "uqbar.graphs.html.Text" [label=Text];\n        "uqbar.graphs.html.VRule" [label=VRule];\n    }\n    subgraph "cluster_uqbar.graphs.records" {\n        graph [label="uqbar.graphs.records"];\n        node [color=5];\n        "uqbar.graphs.records.RecordField" [label="Record\\nField"];\n        "uqbar.graphs.records.RecordGroup" [label="Record\\nGroup"];\n    }\n    subgraph "cluster_uqbar.io" {\n        graph [label="uqbar.io"];\n        node [color=6];\n        "uqbar.io.DirectoryChange" [color=black,\n            fontcolor=white,\n            label="Directory\\nChange"];\n        "uqbar.io.Profiler" [color=black,\n            fontcolor=white,\n            label=Profiler];\n        "uqbar.io.RedirectedStreams" [color=black,\n            fontcolor=white,\n            label="Redirected\\nStreams"];\n        "uqbar.io.Timer" [color=black,\n            fontcolor=white,\n            label=Timer];\n    }\n    subgraph "cluster_uqbar.sphinx.inheritance" {\n        graph [label="uqbar.sphinx.inheritance"];\n        node [color=7];\n        "uqbar.sphinx.inheritance.InheritanceDiagram" [label="Inheritance\\nDiagram"];\n        "uqbar.sphinx.inheritance.inheritance_diagram" [label="inheritance\\ndiagram"];\n    }\n    "builtins.Exception" -> "uqbar.book.console.ConsoleError";\n    "builtins.int" -> "enum.IntEnum";\n    "builtins.object" -> "code.InteractiveInterpreter";\n    "builtins.object" -> "collections.abc.Container";\n    "builtins.object" -> "collections.abc.Iterable";\n    "builtins.object" -> "collections.abc.Sized";\n    "builtins.object" -> "docutils.nodes.Body";\n    "builtins.object" -> "docutils.nodes.Node";\n    "builtins.object" -> "docutils.parsers.rst.Directive";\n    "builtins.object" -> "enum.Enum";\n    "builtins.object" -> "uqbar.apis.builders.APIBuilder";\n    "builtins.object" -> "uqbar.apis.documenters.MemberDocumenter";\n    "builtins.object" -> "uqbar.apis.documenters.ModuleDocumenter";\n    "builtins.object" -> "uqbar.apis.documenters.RootDocumenter";\n    "builtins.object" -> "uqbar.apis.dummy.MyParentClass";\n    "builtins.object" -> "uqbar.apis.graphs.InheritanceGraph";\n    "builtins.object" -> "uqbar.book.console.ConsoleInput";\n    "builtins.object" -> "uqbar.book.console.ConsoleOutput";\n    "builtins.object" -> "uqbar.book.console.MonkeyPatch";\n    "builtins.object" -> "uqbar.book.extensions.Extension";\n    "builtins.object" -> "uqbar.containers.dependency_graph.DependencyGraph";\n    "builtins.object" -> "uqbar.containers.unique_tree.UniqueTreeNode";\n    "builtins.object" -> "uqbar.graphs.core.Edge";\n    "builtins.object" -> "uqbar.graphs.graphers.Grapher";\n    "builtins.object" -> "uqbar.io.DirectoryChange";\n    "builtins.object" -> "uqbar.io.Profiler";\n    "builtins.object" -> "uqbar.io.RedirectedStreams";\n    "builtins.object" -> "uqbar.io.Timer";\n    "code.InteractiveConsole" -> "uqbar.book.console.Console";\n    "collections.abc.MutableMapping" -> "uqbar.graphs.attrs.Attributes";\n    "docutils.nodes.Element" -> "uqbar.book.sphinx.uqbar_book_defaults_block";\n    "docutils.nodes.Element" -> "uqbar.book.sphinx.uqbar_book_import_block";\n    "docutils.nodes.Element" -> "uqbar.sphinx.inheritance.inheritance_diagram";\n    "docutils.nodes.General" -> "uqbar.book.sphinx.uqbar_book_defaults_block";\n    "docutils.nodes.General" -> "uqbar.book.sphinx.uqbar_book_import_block";\n    "docutils.nodes.General" -> "uqbar.sphinx.inheritance.inheritance_diagram";\n    "docutils.parsers.rst.Directive" -> "uqbar.book.sphinx.UqbarBookDefaultsDirective";\n    "docutils.parsers.rst.Directive" -> "uqbar.book.sphinx.UqbarBookDirective";\n    "docutils.parsers.rst.Directive" -> "uqbar.book.sphinx.UqbarBookImportDirective";\n    "docutils.parsers.rst.Directive" -> "uqbar.sphinx.inheritance.InheritanceDiagram";\n    "enum.Enum" -> "uqbar.enums.StrictEnumeration";\n    "enum.IntEnum" -> "uqbar.enums.IntEnumeration";\n    "uqbar.apis.documenters.ClassDocumenter" -> "uqbar.apis.summarizers.SummarizingClassDocumenter";\n    "uqbar.apis.documenters.ModuleDocumenter" -> "uqbar.apis.summarizers.ImmaterialModuleDocumenter";\n    "uqbar.apis.documenters.ModuleDocumenter" -> "uqbar.apis.summarizers.SummarizingModuleDocumenter";\n    "uqbar.apis.documenters.RootDocumenter" -> "uqbar.apis.summarizers.SummarizingRootDocumenter";\n    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.apis.nodes.PackageNode";\n    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.core.Graph";\n    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.core.Node";\n    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.html.Table";\n    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.html.TableCell";\n    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.html.TableRow";\n    "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.records.RecordGroup";\n    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.apis.nodes.ModuleNode";\n    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.core.Attachable";\n    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.html.HRule";\n    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.html.LineBreak";\n    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.html.Text";\n    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.html.VRule";\n    "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.records.RecordField";\n    "uqbar.graphs.core.Attachable" -> "uqbar.graphs.html.TableCell";\n    "uqbar.graphs.core.Attachable" -> "uqbar.graphs.records.RecordField";\n}'
E           digraph InheritanceGraph {
E               graph [bgcolor=transparent,
E                   color=lightsteelblue2,
E                   fontname=Arial,
E                   fontsize=10,
E                   outputorder=edgesfirst,
E                   overlap=prism,
E                   penwidth=2,
E                   rankdir=LR,
E                   splines=spline,
E                   style="dashed, rounded",
E                   truecolor=true];
E               node [colorscheme=pastel19,
E                   fontname=Arial,
E                   fontsize=10,
E                   height=0,
E                   penwidth=2,
E                   shape=box,
E                   style="filled, rounded",
E                   width=0];
E               edge [color=lightslategrey,
E                   penwidth=1];
E               subgraph cluster_builtins {
E                   graph [label=builtins];
E                   node [color=1];
E                   "builtins.BaseException" [label="Base\nException"];
E                   "builtins.Exception" [label=Exception];
E                   "builtins.int" [label=int];
E                   "builtins.object" [label=object];
E                   "builtins.BaseException" -> "builtins.Exception";
E                   "builtins.object" -> "builtins.BaseException";
E                   "builtins.object" -> "builtins.int";
E               }
E               subgraph cluster_code {
E                   graph [label=code];
E                   node [color=2];
E                   "code.InteractiveConsole" [label="Interactive\nConsole"];
E                   "code.InteractiveInterpreter" [label="Interactive\nInterpreter"];
E                   "code.InteractiveInterpreter" -> "code.InteractiveConsole";
E               }
E               subgraph "cluster_collections.abc" {
E                   graph [label="collections.abc"];
E                   node [color=3];
E                   "collections.abc.Collection" [label=Collection,
E                       shape=oval,
E                       style=bold];
E                   "collections.abc.Container" [label=Container,
E                       shape=oval,
E                       style=bold];
E                   "collections.abc.Iterable" [label=Iterable,
E                       shape=oval,
E                       style=bold];
E                   "collections.abc.Mapping" [label=Mapping,
E                       shape=oval,
E                       style=bold];
E                   "collections.abc.MutableMapping" [label="Mutable\nMapping",
E                       shape=oval,
E                       style=bold];
E                   "collections.abc.Sized" [label=Sized,
E                       shape=oval,
E                       style=bold];
E                   "collections.abc.Collection" -> "collections.abc.Mapping";
E                   "collections.abc.Container" -> "collections.abc.Collection";
E                   "collections.abc.Iterable" -> "collections.abc.Collection";
E                   "collections.abc.Mapping" -> "collections.abc.MutableMapping";
E                   "collections.abc.Sized" -> "collections.abc.Collection";
E               }
E               subgraph "cluster_docutils.nodes" {
E                   graph [label="docutils.nodes"];
E                   node [color=4];
E                   "docutils.nodes.Body" [label=Body];
E                   "docutils.nodes.Element" [label=Element];
E                   "docutils.nodes.General" [label=General];
E                   "docutils.nodes.Node" [label="Node"];
E                   "docutils.nodes.Body" -> "docutils.nodes.General";
E                   "docutils.nodes.Node" -> "docutils.nodes.Element";
E               }
E               subgraph "cluster_docutils.parsers.rst" {
E                   graph [label="docutils.parsers.rst"];
E                   node [color=5];
E                   "docutils.parsers.rst.Directive" [label=Directive];
E               }
E               subgraph cluster_enum {
E                   graph [label=enum];
E                   node [color=6];
E                   "enum.Enum" [label=Enum];
E                   "enum.IntEnum" [label="Int\nEnum"];
E         +         "enum.ReprEnum" [label="Repr\nEnum"];
E         +         "enum.Enum" -> "enum.ReprEnum";
E         -         "enum.Enum" -> "enum.IntEnum";
E         +         "enum.ReprEnum" -> "enum.IntEnum";
E         ?               ++++
E               }
E               subgraph "cluster_uqbar.apis.builders" {
E                   graph [label="uqbar.apis.builders"];
E                   node [color=7];
E                   "uqbar.apis.builders.APIBuilder" [label=APIBuilder];
E               }
E               subgraph "cluster_uqbar.apis.documenters" {
E                   graph [label="uqbar.apis.documenters"];
E                   node [color=8];
E                   "uqbar.apis.documenters.ClassDocumenter" [label="Class\nDocumenter"];
E                   "uqbar.apis.documenters.FunctionDocumenter" [label="Function\nDocumenter"];
E                   "uqbar.apis.documenters.MemberDocumenter" [label="Member\nDocumenter"];
E                   "uqbar.apis.documenters.ModuleDocumenter" [label="Module\nDocumenter"];
E                   "uqbar.apis.documenters.RootDocumenter" [label="Root\nDocumenter"];
E                   "uqbar.apis.documenters.MemberDocumenter" -> "uqbar.apis.documenters.ClassDocumenter";
E                   "uqbar.apis.documenters.MemberDocumenter" -> "uqbar.apis.documenters.FunctionDocumenter";
E               }
E               subgraph "cluster_uqbar.apis.dummy" {
E                   graph [label="uqbar.apis.dummy"];
E                   node [color=9];
E                   "uqbar.apis.dummy.MyChildClass" [label="My\nChild\nClass"];
E                   "uqbar.apis.dummy.MyParentClass" [label="My\nParent\nClass"];
E                   "uqbar.apis.dummy.MyParentClass" -> "uqbar.apis.dummy.MyChildClass";
E               }
E               subgraph "cluster_uqbar.apis.graphs" {
E                   graph [label="uqbar.apis.graphs"];
E                   node [color=1];
E                   "uqbar.apis.graphs.InheritanceGraph" [label="Inheritance\nGraph"];
E               }
E               subgraph "cluster_uqbar.apis.nodes" {
E                   graph [label="uqbar.apis.nodes"];
E                   node [color=2];
E                   "uqbar.apis.nodes.ModuleNode" [label="Module\nNode"];
E                   "uqbar.apis.nodes.PackageNode" [label="Package\nNode"];
E               }
E               subgraph "cluster_uqbar.apis.summarizers" {
E                   graph [label="uqbar.apis.summarizers"];
E                   node [color=3];
E                   "uqbar.apis.summarizers.ImmaterialClassDocumenter" [label="Immaterial\nClass\nDocumenter"];
E                   "uqbar.apis.summarizers.ImmaterialModuleDocumenter" [label="Immaterial\nModule\nDocumenter"];
E                   "uqbar.apis.summarizers.SummarizingClassDocumenter" [label="Summarizing\nClass\nDocumenter"];
E                   "uqbar.apis.summarizers.SummarizingModuleDocumenter" [label="Summarizing\nModule\nDocumenter"];
E                   "uqbar.apis.summarizers.SummarizingRootDocumenter" [label="Summarizing\nRoot\nDocumenter"];
E                   "uqbar.apis.summarizers.SummarizingClassDocumenter" -> "uqbar.apis.summarizers.ImmaterialClassDocumenter";
E               }
E               subgraph "cluster_uqbar.book.console" {
E                   graph [label="uqbar.book.console"];
E                   node [color=4];
E                   "uqbar.book.console.Console" [label=Console];
E                   "uqbar.book.console.ConsoleError" [label="Console\nError"];
E                   "uqbar.book.console.ConsoleInput" [label="Console\nInput"];
E                   "uqbar.book.console.ConsoleOutput" [label="Console\nOutput"];
E                   "uqbar.book.console.MonkeyPatch" [label="Monkey\nPatch"];
E               }
E               subgraph "cluster_uqbar.book.extensions" {
E                   graph [label="uqbar.book.extensions"];
E                   node [color=5];
E                   "uqbar.book.extensions.Extension" [label=Extension];
E                   "uqbar.book.extensions.GraphExtension" [label="Graph\nExtension"];
E                   "uqbar.book.extensions.Extension" -> "uqbar.book.extensions.GraphExtension";
E               }
E               subgraph "cluster_uqbar.book.sphinx" {
E                   graph [label="uqbar.book.sphinx"];
E                   node [color=6];
E                   "uqbar.book.sphinx.UqbarBookDefaultsDirective" [label="Uqbar\nBook\nDefaults\nDirective"];
E                   "uqbar.book.sphinx.UqbarBookDirective" [label="Uqbar\nBook\nDirective"];
E                   "uqbar.book.sphinx.UqbarBookImportDirective" [label="Uqbar\nBook\nImport\nDirective"];
E                   "uqbar.book.sphinx.uqbar_book_defaults_block" [label="uqbar\nbook\ndefaults\nblock"];
E                   "uqbar.book.sphinx.uqbar_book_import_block" [label="uqbar\nbook\nimport\nblock"];
E               }
E               subgraph "cluster_uqbar.containers.dependency_graph" {
E                   graph [label="uqbar.containers.dependency_graph"];
E                   node [color=7];
E                   "uqbar.containers.dependency_graph.DependencyGraph" [label="Dependency\nGraph"];
E               }
E               subgraph "cluster_uqbar.containers.unique_tree" {
E                   graph [label="uqbar.containers.unique_tree"];
E                   node [color=8];
E                   "uqbar.containers.unique_tree.UniqueTreeContainer" [label="Unique\nTree\nContainer"];
E                   "uqbar.containers.unique_tree.UniqueTreeDict" [label="Unique\nTree\nDict"];
E                   "uqbar.containers.unique_tree.UniqueTreeList" [label="Unique\nTree\nList"];
E                   "uqbar.containers.unique_tree.UniqueTreeNode" [label="Unique\nTree\nNode"];
E                   "uqbar.containers.unique_tree.UniqueTreeSet" [label="Unique\nTree\nSet"];
E                   "uqbar.containers.unique_tree.UniqueTreeTuple" [label="Unique\nTree\nTuple"];
E                   "uqbar.containers.unique_tree.UniqueTreeContainer" -> "uqbar.containers.unique_tree.UniqueTreeDict";
E                   "uqbar.containers.unique_tree.UniqueTreeContainer" -> "uqbar.containers.unique_tree.UniqueTreeList";
E                   "uqbar.containers.unique_tree.UniqueTreeContainer" -> "uqbar.containers.unique_tree.UniqueTreeSet";
E                   "uqbar.containers.unique_tree.UniqueTreeContainer" -> "uqbar.containers.unique_tree.UniqueTreeTuple";
E                   "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.containers.unique_tree.UniqueTreeContainer";
E               }
E               subgraph "cluster_uqbar.enums" {
E                   graph [label="uqbar.enums"];
E                   node [color=9];
E                   "uqbar.enums.IntEnumeration" [label="Int\nEnumeration"];
E                   "uqbar.enums.StrictEnumeration" [label="Strict\nEnumeration"];
E               }
E               subgraph "cluster_uqbar.graphs.attrs" {
E                   graph [label="uqbar.graphs.attrs"];
E                   node [color=1];
E                   "uqbar.graphs.attrs.Attributes" [label=Attributes];
E               }
E               subgraph "cluster_uqbar.graphs.core" {
E                   graph [label="uqbar.graphs.core"];
E                   node [color=2];
E                   "uqbar.graphs.core.Attachable" [label=Attachable];
E                   "uqbar.graphs.core.Edge" [label="Edge"];
E                   "uqbar.graphs.core.Graph" [label="Graph"];
E                   "uqbar.graphs.core.Node" [label="Node"];
E               }
E               subgraph "cluster_uqbar.graphs.graphers" {
E                   graph [label="uqbar.graphs.graphers"];
E                   node [color=3];
E                   "uqbar.graphs.graphers.Grapher" [label=Grapher];
E               }
E               subgraph "cluster_uqbar.graphs.html" {
E                   graph [label="uqbar.graphs.html"];
E                   node [color=4];
E                   "uqbar.graphs.html.HRule" [label=HRule];
E                   "uqbar.graphs.html.LineBreak" [label="Line\nBreak"];
E                   "uqbar.graphs.html.Table" [label=Table];
E                   "uqbar.graphs.html.TableCell" [label="Table\nCell"];
E                   "uqbar.graphs.html.TableRow" [label="Table\nRow"];
E                   "uqbar.graphs.html.Text" [label=Text];
E                   "uqbar.graphs.html.VRule" [label=VRule];
E               }
E               subgraph "cluster_uqbar.graphs.records" {
E                   graph [label="uqbar.graphs.records"];
E                   node [color=5];
E                   "uqbar.graphs.records.RecordField" [label="Record\nField"];
E                   "uqbar.graphs.records.RecordGroup" [label="Record\nGroup"];
E               }
E               subgraph "cluster_uqbar.io" {
E                   graph [label="uqbar.io"];
E                   node [color=6];
E                   "uqbar.io.DirectoryChange" [color=black,
E                       fontcolor=white,
E                       label="Directory\nChange"];
E                   "uqbar.io.Profiler" [color=black,
E                       fontcolor=white,
E                       label=Profiler];
E                   "uqbar.io.RedirectedStreams" [color=black,
E                       fontcolor=white,
E                       label="Redirected\nStreams"];
E                   "uqbar.io.Timer" [color=black,
E                       fontcolor=white,
E                       label=Timer];
E               }
E               subgraph "cluster_uqbar.sphinx.inheritance" {
E                   graph [label="uqbar.sphinx.inheritance"];
E                   node [color=7];
E                   "uqbar.sphinx.inheritance.InheritanceDiagram" [label="Inheritance\nDiagram"];
E                   "uqbar.sphinx.inheritance.inheritance_diagram" [label="inheritance\ndiagram"];
E               }
E               "builtins.Exception" -> "uqbar.book.console.ConsoleError";
E               "builtins.int" -> "enum.IntEnum";
E               "builtins.object" -> "code.InteractiveInterpreter";
E               "builtins.object" -> "collections.abc.Container";
E               "builtins.object" -> "collections.abc.Iterable";
E               "builtins.object" -> "collections.abc.Sized";
E               "builtins.object" -> "docutils.nodes.Body";
E               "builtins.object" -> "docutils.nodes.Node";
E               "builtins.object" -> "docutils.parsers.rst.Directive";
E               "builtins.object" -> "enum.Enum";
E               "builtins.object" -> "uqbar.apis.builders.APIBuilder";
E               "builtins.object" -> "uqbar.apis.documenters.MemberDocumenter";
E               "builtins.object" -> "uqbar.apis.documenters.ModuleDocumenter";
E               "builtins.object" -> "uqbar.apis.documenters.RootDocumenter";
E               "builtins.object" -> "uqbar.apis.dummy.MyParentClass";
E               "builtins.object" -> "uqbar.apis.graphs.InheritanceGraph";
E               "builtins.object" -> "uqbar.book.console.ConsoleInput";
E               "builtins.object" -> "uqbar.book.console.ConsoleOutput";
E               "builtins.object" -> "uqbar.book.console.MonkeyPatch";
E               "builtins.object" -> "uqbar.book.extensions.Extension";
E               "builtins.object" -> "uqbar.containers.dependency_graph.DependencyGraph";
E               "builtins.object" -> "uqbar.containers.unique_tree.UniqueTreeNode";
E               "builtins.object" -> "uqbar.graphs.core.Edge";
E               "builtins.object" -> "uqbar.graphs.graphers.Grapher";
E               "builtins.object" -> "uqbar.io.DirectoryChange";
E               "builtins.object" -> "uqbar.io.Profiler";
E               "builtins.object" -> "uqbar.io.RedirectedStreams";
E               "builtins.object" -> "uqbar.io.Timer";
E               "code.InteractiveConsole" -> "uqbar.book.console.Console";
E               "collections.abc.MutableMapping" -> "uqbar.graphs.attrs.Attributes";
E               "docutils.nodes.Element" -> "uqbar.book.sphinx.uqbar_book_defaults_block";
E               "docutils.nodes.Element" -> "uqbar.book.sphinx.uqbar_book_import_block";
E               "docutils.nodes.Element" -> "uqbar.sphinx.inheritance.inheritance_diagram";
E               "docutils.nodes.General" -> "uqbar.book.sphinx.uqbar_book_defaults_block";
E               "docutils.nodes.General" -> "uqbar.book.sphinx.uqbar_book_import_block";
E               "docutils.nodes.General" -> "uqbar.sphinx.inheritance.inheritance_diagram";
E               "docutils.parsers.rst.Directive" -> "uqbar.book.sphinx.UqbarBookDefaultsDirective";
E               "docutils.parsers.rst.Directive" -> "uqbar.book.sphinx.UqbarBookDirective";
E               "docutils.parsers.rst.Directive" -> "uqbar.book.sphinx.UqbarBookImportDirective";
E               "docutils.parsers.rst.Directive" -> "uqbar.sphinx.inheritance.InheritanceDiagram";
E               "enum.Enum" -> "uqbar.enums.StrictEnumeration";
E               "enum.IntEnum" -> "uqbar.enums.IntEnumeration";
E               "uqbar.apis.documenters.ClassDocumenter" -> "uqbar.apis.summarizers.SummarizingClassDocumenter";
E               "uqbar.apis.documenters.ModuleDocumenter" -> "uqbar.apis.summarizers.ImmaterialModuleDocumenter";
E               "uqbar.apis.documenters.ModuleDocumenter" -> "uqbar.apis.summarizers.SummarizingModuleDocumenter";
E               "uqbar.apis.documenters.RootDocumenter" -> "uqbar.apis.summarizers.SummarizingRootDocumenter";
E               "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.apis.nodes.PackageNode";
E               "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.core.Graph";
E               "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.core.Node";
E               "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.html.Table";
E               "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.html.TableCell";
E               "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.html.TableRow";
E               "uqbar.containers.unique_tree.UniqueTreeList" -> "uqbar.graphs.records.RecordGroup";
E               "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.apis.nodes.ModuleNode";
E               "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.core.Attachable";
E               "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.html.HRule";
E               "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.html.LineBreak";
E               "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.html.Text";
E               "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.html.VRule";
E               "uqbar.containers.unique_tree.UniqueTreeNode" -> "uqbar.graphs.records.RecordField";
E               "uqbar.graphs.core.Attachable" -> "uqbar.graphs.html.TableCell";
E               "uqbar.graphs.core.Attachable" -> "uqbar.graphs.records.RecordField";
E           }

tests/test_apis_InheritanceGraph.py:181: AssertionError
_________________________________ test_str_04 __________________________________

test_path = None

    def test_str_04(test_path):
        documenter = uqbar.apis.SummarizingClassDocumenter("fake_package.enums.FakeEnum")
>       assert normalize(str(documenter)) == normalize(
            """
            .. autoclass:: FakeEnum
               :members:
               :undoc-members:
            """
        )
E       AssertionError: assert '.. autoclass:: FakeEnum\n   :members:\n   :undoc-members:\n\n   .. raw:: html\n\n      <hr/>\n\n   .. rubric:: Special methods\n      :class: class-header\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__abs__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__add__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__and__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__bool__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__ceil__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__contains__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__dir__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__divmod__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__eq__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__float__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__floor__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__floordiv__\n\n   .. automethod:: FakeEnum.__format__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__ge__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__getitem__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__gt__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__hash__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__index__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__int__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__invert__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__iter__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__le__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__len__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__lshift__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__lt__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__mod__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__mul__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__ne__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__neg__\n\n   .. automethod:: FakeEnum.__new__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__or__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__pos__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__pow__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__radd__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__rand__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__rdivmod__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__repr__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__rfloordiv__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__rlshift__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__rmod__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__rmul__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__ror__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__round__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__rpow__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__rrshift__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__rshift__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__rsub__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__rtruediv__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__rxor__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__str__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__sub__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__truediv__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__trunc__\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.__xor__\n\n   .. raw:: html\n\n      <hr/>\n\n   .. rubric:: Methods\n      :class: class-header\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.as_integer_ratio\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.bit_count\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.bit_length\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.conjugate\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.to_bytes\n\n   .. raw:: html\n\n      <hr/>\n\n   .. rubric:: Class & static methods\n      :class: class-header\n\n   .. container:: inherited\n\n      .. automethod:: FakeEnum.from_bytes' == '.. autoclass:: FakeEnum\n   :members:\n   :undoc-members:'
E           .. autoclass:: FakeEnum
E              :members:
E         -    :undoc-members:
E         +    :undoc-members:
E         ?                   +
E         + 
E         +    .. raw:: html
E         + 
E         +       <hr/>
E         + 
E         +    .. rubric:: Special methods
E         +       :class: class-header
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__abs__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__add__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__and__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__bool__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__ceil__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__contains__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__dir__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__divmod__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__eq__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__float__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__floor__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__floordiv__
E         + 
E         +    .. automethod:: FakeEnum.__format__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__ge__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__getitem__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__gt__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__hash__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__index__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__int__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__invert__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__iter__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__le__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__len__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__lshift__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__lt__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__mod__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__mul__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__ne__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__neg__
E         + 
E         +    .. automethod:: FakeEnum.__new__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__or__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__pos__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__pow__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__radd__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__rand__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__rdivmod__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__repr__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__rfloordiv__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__rlshift__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__rmod__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__rmul__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__ror__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__round__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__rpow__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__rrshift__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__rshift__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__rsub__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__rtruediv__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__rxor__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__str__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__sub__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__truediv__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__trunc__
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.__xor__
E         + 
E         +    .. raw:: html
E         + 
E         +       <hr/>
E         + 
E         +    .. rubric:: Methods
E         +       :class: class-header
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.as_integer_ratio
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.bit_count
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.bit_length
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.conjugate
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.to_bytes
E         + 
E         +    .. raw:: html
E         + 
E         +       <hr/>
E         + 
E         +    .. rubric:: Class & static methods
E         +       :class: class-header
E         + 
E         +    .. container:: inherited
E         + 
E         +       .. automethod:: FakeEnum.from_bytes

tests/test_apis_SummarizingClassDocumenter.py:200: AssertionError
______________________________ test_sphinx_api_2 _______________________________

app = <SphinxTestApp buildername='text'>
status = <_io.StringIO object at 0x7fbb311de440>
warning = <_io.StringIO object at 0x7fbb339afeb0>

    @pytest.mark.sphinx("text", testroot="uqbar-sphinx-api-2")
    def test_sphinx_api_2(app, status, warning):
        app.build()
        index_source = pathlib.Path(app.srcdir) / "api" / "index.rst"
        assert index_source.exists()
        assert "build succeeded" in status.getvalue()
        assert "8 added, 0 changed, 0 removed" in status.getvalue()
        assert "0 added, 0 changed, 0 removed" not in status.getvalue()
>       assert not warning.getvalue().strip()
E       AssertionError: assert not '\x1b[91m/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.to_bytes:4: WARNING: Inline interpreted text or phrase reference start-string without end-string.\x1b[39;49;00m\n\x1b[91m/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.from_bytes:5: WARNING: Inline interpreted text or phrase reference start-string without end-string.\x1b[39;49;00m'
E        +  where '\x1b[91m/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.to_bytes:4: WARNING: Inline interpreted text or phrase reference start-string without end-string.\x1b[39;49;00m\n\x1b[91m/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.from_bytes:5: WARNING: Inline interpreted text or phrase reference start-string without end-string.\x1b[39;49;00m' = <built-in method strip of str object at 0x7fbb30d5e0d0>()
E        +    where <built-in method strip of str object at 0x7fbb30d5e0d0> = '\x1b[91m/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.to_bytes:4: WARNING: Inline interpreted text or phrase reference start-string without end-string.\x1b[39;49;00m\n\x1b[91m/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.from_bytes:5: WARNING: Inline interpreted text or phrase reference start-string without end-string.\x1b[39;49;00m\n'.strip
E        +      where '\x1b[91m/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.to_bytes:4: WARNING: Inline interpreted text or phrase reference start-string without end-string.\x1b[39;49;00m\n\x1b[91m/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.from_bytes:5: WARNING: Inline interpreted text or phrase reference start-string without end-string.\x1b[39;49;00m\n' = <built-in method getvalue of _io.StringIO object at 0x7fbb339afeb0>()
E        +        where <built-in method getvalue of _io.StringIO object at 0x7fbb339afeb0> = <_io.StringIO object at 0x7fbb339afeb0>.getvalue

tests/test_sphinx_api.py:95: AssertionError
--------------------------- Captured stdout teardown ---------------------------
# testroot: root
# builder: text
# srcdir: /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-api-2
# outdir: /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-api-2/_build/text
# status: 
Running Sphinx v5.3.0
[autosummary] generating autosummary for: index.rst
[uqbar-api] wrote /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-api-2/api/index.rst
[uqbar-api] wrote /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-api-2/api/fake_package/index.rst
[uqbar-api] wrote /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-api-2/api/fake_package/enums.rst
[uqbar-api] wrote /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-api-2/api/fake_package/module.rst
[uqbar-api] wrote /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-api-2/api/fake_package/multi/index.rst
[uqbar-api] wrote /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-api-2/api/fake_package/multi/one.rst
[uqbar-api] wrote /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-api-2/api/fake_package/multi/two.rst
building [mo]: targets for 0 po files that are out of date
building [text]: targets for 1 source files that are out of date
updating environment: [new config] 8 added, 0 changed, 0 removed
reading sources... [ 12%] api/fake_package/enums                               
reading sources... [ 25%] api/fake_package/index                               
reading sources... [ 37%] api/fake_package/module                              
reading sources... [ 50%] api/fake_package/multi/index                         
reading sources... [ 62%] api/fake_package/multi/one                           
reading sources... [ 75%] api/fake_package/multi/two                           
reading sources... [ 87%] api/index                                            
reading sources... [100%] index                                                
looking for now-outdated files... none found
pickling environment... done
checking consistency... done
preparing documents... done
writing output... [ 12%] api/fake_package/enums                                
writing output... [ 25%] api/fake_package/index                                
writing output... [ 37%] api/fake_package/module                               
writing output... [ 50%] api/fake_package/multi/index                          
writing output... [ 62%] api/fake_package/multi/one                            
writing output... [ 75%] api/fake_package/multi/two                            
writing output... [ 87%] api/index                                             
writing output... [100%] index                                                 
build succeeded, 2 warnings.

The text files are in ../../../tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-api-2/_build/text.

# warning: 
/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.to_bytes:4: WARNING: Inline interpreted text or phrase reference start-string without end-string.
/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.from_bytes:5: WARNING: Inline interpreted text or phrase reference start-string without end-string.

____________________________ test_sphinx_style_html ____________________________

app = <SphinxTestApp buildername='html'>
status = <_io.StringIO object at 0x7fbb3057e830>
warning = <_io.StringIO object at 0x7fbb3011a3b0>

    @pytest.mark.sphinx("html", testroot="uqbar-sphinx-style")
    def test_sphinx_style_html(app, status, warning):
        app.build()
        assert "build succeeded" in status.getvalue()
>       assert not warning.getvalue().strip()
E       AssertionError: assert not '\x1b[91m/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.to_bytes:4: WARNING: Inline interpreted text or phrase reference start-string without end-string.\x1b[39;49;00m\n\x1b[91m/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.from_bytes:5: WARNING: Inline interpreted text or phrase reference start-string without end-string.\x1b[39;49;00m'
E        +  where '\x1b[91m/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.to_bytes:4: WARNING: Inline interpreted text or phrase reference start-string without end-string.\x1b[39;49;00m\n\x1b[91m/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.from_bytes:5: WARNING: Inline interpreted text or phrase reference start-string without end-string.\x1b[39;49;00m' = <built-in method strip of str object at 0x7fbb2f928eb0>()
E        +    where <built-in method strip of str object at 0x7fbb2f928eb0> = '\x1b[91m/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.to_bytes:4: WARNING: Inline interpreted text or phrase reference start-string without end-string.\x1b[39;49;00m\n\x1b[91m/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.from_bytes:5: WARNING: Inline interpreted text or phrase reference start-string without end-string.\x1b[39;49;00m\n'.strip
E        +      where '\x1b[91m/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.to_bytes:4: WARNING: Inline interpreted text or phrase reference start-string without end-string.\x1b[39;49;00m\n\x1b[91m/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.from_bytes:5: WARNING: Inline interpreted text or phrase reference start-string without end-string.\x1b[39;49;00m\n' = <built-in method getvalue of _io.StringIO object at 0x7fbb3011a3b0>()
E        +        where <built-in method getvalue of _io.StringIO object at 0x7fbb3011a3b0> = <_io.StringIO object at 0x7fbb3011a3b0>.getvalue

tests/test_sphinx_inheritance.py:8: AssertionError
--------------------------- Captured stdout teardown ---------------------------
# testroot: root
# builder: html
# srcdir: /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-style
# outdir: /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-style/_build/html
# status: 
Running Sphinx v5.3.0
[autosummary] generating autosummary for: index.rst
[uqbar-api] wrote /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-style/api/index.rst
[uqbar-api] wrote /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-style/api/fake_package/index.rst
[uqbar-api] wrote /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-style/api/fake_package/enums.rst
[uqbar-api] wrote /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-style/api/fake_package/module.rst
[uqbar-api] wrote /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-style/api/fake_package/multi/index.rst
[uqbar-api] wrote /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-style/api/fake_package/multi/one.rst
[uqbar-api] wrote /tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-style/api/fake_package/multi/two.rst
building [mo]: targets for 0 po files that are out of date
building [html]: targets for 1 source files that are out of date
updating environment: [new config] 8 added, 0 changed, 0 removed
reading sources... [ 12%] api/fake_package/enums                               
reading sources... [ 25%] api/fake_package/index                               
reading sources... [ 37%] api/fake_package/module                              
reading sources... [ 50%] api/fake_package/multi/index                         
reading sources... [ 62%] api/fake_package/multi/one                           
reading sources... [ 75%] api/fake_package/multi/two                           
reading sources... [ 87%] api/index                                            
reading sources... [100%] index                                                
looking for now-outdated files... none found
pickling environment... done
checking consistency... done
preparing documents... done
writing output... [ 12%] api/fake_package/enums                                
writing output... [ 25%] api/fake_package/index                                
writing output... [ 37%] api/fake_package/module                               
writing output... [ 50%] api/fake_package/multi/index                          
writing output... [ 62%] api/fake_package/multi/one                            
writing output... [ 75%] api/fake_package/multi/two                            
writing output... [ 87%] api/index                                             
writing output... [100%] index                                                 
generating indices... genindex py-modindex done
writing additional pages... search done
copying static files... done
copying extra files... done
dumping search index in English (code: en)... done
dumping object inventory... done
build succeeded, 2 warnings.

The HTML pages are in ../../../tmp/pytest-of-jgart/pytest-3/uqbar-sphinx-style/_build/html.

# warning: 
/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.to_bytes:4: WARNING: Inline interpreted text or phrase reference start-string without end-string.
/home/jgart/uqbar/tests/fake_package/enums.py:docstring of fake_package.enums.FakeEnum.from_bytes:5: WARNING: Inline interpreted text or phrase reference start-string without end-string.

=============================== warnings summary ===============================
.venv/lib/python3.11/site-packages/sphinx/util/images.py:4
  /home/jgart/uqbar/.venv/lib/python3.11/site-packages/sphinx/util/images.py:4: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13
    import imghdr

tests/test_book_sphinx.py: 11 warnings
  /home/jgart/uqbar/uqbar/book/sphinx.py:360: DeprecationWarning: The frontend.OptionParser class will be replaced by a subclass of argparse.ArgumentParser in Docutils 0.21 or later.
    settings = OptionParser(components=(Parser,)).get_default_values()

tests/test_book_sphinx.py: 748 warnings
  /usr/lib/python3.11/optparse.py:1000: DeprecationWarning: The frontend.Option class will be removed in Docutils 0.21 or later.
    option = self.option_class(*args, **kwargs)

tests/test_book_sphinx.py::test_interpret_code_blocks_02
tests/test_book_sphinx.py::test_interpret_code_blocks_02
  /home/jgart/uqbar/tests/test_book_sphinx.py:207: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
    if LooseVersion(sys.version.split()[0]) < LooseVersion("3.7"):

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html

---------- coverage: platform linux, python 3.11.1-final-0 -----------
Name                                   Stmts   Miss Branch BrPart  Cover
------------------------------------------------------------------------
uqbar/__init__.py                          2      0      0      0   100%
uqbar/_version.py                          2      0      2      0   100%
uqbar/apis/__init__.py                    54      4     36      5    90%
uqbar/apis/builders.py                   150     19     82      6    88%
uqbar/apis/documenters.py                208     15    114     11    91%
uqbar/apis/dummy.py                        7      0      0      0   100%
uqbar/apis/graphs.py                     226     16    125      8    93%
uqbar/apis/nodes.py                       54      4     26      0    95%
uqbar/apis/summarizers.py                230     40    139     12    79%
uqbar/book/__init__.py                     3      0      0      0   100%
uqbar/book/console.py                    103     15     35      5    86%
uqbar/book/extensions.py                  92      8     44      3    92%
uqbar/book/sphinx.py                     256     24    110     14    89%
uqbar/containers/__init__.py               3      0      0      0   100%
uqbar/containers/dependency_graph.py      78      3     36      5    93%
uqbar/containers/unique_tree.py          411    165    220     12    56%
uqbar/enums.py                            70     34     22      4    52%
uqbar/ext/__init__.py                      0      0      0      0   100%
uqbar/ext/ipython.py                      30     26     10      0    10%
uqbar/graphs/__init__.py                   6      0      0      0   100%
uqbar/graphs/attrs.py                    266     49    130      6    83%
uqbar/graphs/core.py                     304     38    169     16    86%
uqbar/graphs/graphers.py                  85      5     18      3    92%
uqbar/graphs/html.py                     127      7     48      8    91%
uqbar/graphs/records.py                   40      2     16      3    91%
uqbar/io.py                              192     36     90     14    79%
uqbar/iterables.py                        34     21     20      0    28%
uqbar/objects.py                         192     43    115     21    77%
uqbar/sphinx/__init__.py                   0      0      0      0   100%
uqbar/sphinx/api.py                       69     11     28      6    76%
uqbar/sphinx/book.py                      79      1     24      1    98%
uqbar/sphinx/inheritance.py               89      8     20      3    88%
uqbar/sphinx/style.py                     99     13     34      6    84%
uqbar/strings.py                          61      7     36      4    85%
------------------------------------------------------------------------
TOTAL                                   3622    614   1749    176    81%
Coverage HTML written to dir htmlcov

=========================== short test summary info ============================
FAILED tests/test_apis_InheritanceGraph.py::test_03 - assert 'digraph Inherit...
FAILED tests/test_apis_SummarizingClassDocumenter.py::test_str_04 - Assertion...
FAILED tests/test_sphinx_api.py::test_sphinx_api_2 - AssertionError: assert n...
FAILED tests/test_sphinx_inheritance.py::test_sphinx_style_html - AssertionEr...
================= 4 failed, 137 passed, 762 warnings in 14.10s =================
josiah-wolf-oberholtzer commented 1 year ago

Right. You're testing on 3.11 and there are known test failures for that Python version.

See https://github.com/josiah-wolf-oberholtzer/uqbar/pull/72 from last week. On my to-do to fix.

jgarte commented 1 year ago

I tested on Ubuntu with Python 3.8 and the tests passed after I installed graphviz so yeah that's probably was it on that run.

josiah-wolf-oberholtzer commented 1 year ago

If you wanted to make a welcome contribution, a simple PR that gets Python 3.11 working alongside all of the other versions would be appreciated.

jgarte commented 1 year ago

If you wanted to make a welcome contribution, a simple PR that gets Python 3.11 working alongside all of the other versions would be appreciated.

What do you think that involves besides just adding the version string here on line 70?

https://github.com/josiah-wolf-oberholtzer/uqbar/blob/main/.github/workflows/test.yml#L70

josiah-wolf-oberholtzer commented 1 year ago

It involves getting the tests you saw fail above passing under 3.11 without breaking behavior for any of the other supported Python versions. I don't believe it involves any changes to the Uqbar package code, just changes to the test code's assumptions.

My best guess:

... but someone would have to study the test output and give it a try.