Peeves.Doc

A simple documentation framework, similar to Sphinx. It builds off of a template engine (provided by the TemplateEngine package) and an object-tree traversal class (TemplateWalker) to fill out templates for the different types of python objects. These templates are exported as Markdown so that they can be turned into a final website by a more sophisticated Markdown -> HTML static site generator, like Jekyll. Templates are extremely customizable (down to the object-level) with a flexible and powerful template mini-language that builds off of python’s built-in AST module and syntax. Examples are also possible to provide for individual objects/modules and can also be harvested automatically from unit tests if provided.

Members

The templates provided are for modules, classes, methods, functions, and generic objects. The mini-language used extends standard python string formatting syntax but allows for the evaluation of a whitelisted set of commands within templates. A full HTML/Bootstrap generator is included to allow for total customization of the generated Markdown. See TemplateOps, TemplateFormatDirective, MarkdownOps, and MarkdownFormatDirective for more info.

Examples

Before we can run our examples we should get a bit of setup out of the way. Since these examples were harvested from the unit tests not all pieces will be necessary for all situations.

All tests are wrapped in a test class

class DocsTests(TestCase):
    """
    Sample documentation generator tests
    """

PeevesDoc

    def test_PeevesDoc(self):
        """
        Builds sample documentation for the Peeves package

        :return:
        :rtype:
        """

        import os, tempfile


        root = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
        # with tempfile.TemporaryDirectory() as td:
        td = '/var/folders/9t/tqc70b7d61v753jkdbjkvd640000gp/T/tmpo3b4ztrq/'
        target = os.path.join(td, "docs")
        doc_config = {
            "config": {
                "title": "Peeves",
                "path": "Peeves",
                "url": "https://mccoygroup.github.io/Peeves/",
                "gh_username": "McCoyGroup",
                "gh_repo": "Peeves",
                "gh_branch": "master",
                "footer": "Brought to you by the McCoy Group"
            },
            "packages": [
                {
                    "id": "Peeves"
                }
            ],
            "root": root,
            "target": target,
            "readme": os.path.join(root, "blurb.md"),
            'examples_directory': os.path.join(root, "ci", "examples"),
            'tests_directory': os.path.join(root, "ci", "tests"),
            'templates_directory': os.path.join(root, "ci", "templates")
        }
        DocBuilder(**doc_config).build()

ParseExamples

    def test_ParseExamples(self):
        parser = ExamplesParser.from_file(os.path.abspath(__file__))
        self.assertTrue(hasattr(parser.functions, 'items'))
        tests = TestExamplesFormatter.from_file(os.path.abspath(__file__))
        print(tests.format())

FormatSpec

    def test_FormatSpec(self):

        fmt = inspect.cleandoc("""
        ### My Data
        
        {$:b=loop(add_temp, l1, l2, slots=['l1', 'l2'])}
        {$:len(b) ** 2}
        
        
        """)


        print("",
              TemplateFormatter().format(fmt, param=2, l1=[1, 2, 3], l2=[4, 5, 6], add_temp='{l1} + {l2}', p1=1, p2=0),
              sep="\n"
        )

Feedback

Examples

Templates

Documentation