flectra/doc/_extensions/autojsdoc/README.rst

88 lines
3.8 KiB
ReStructuredText
Raw Permalink Normal View History

:orphan:
2018-03-14 10:18:18 +01:00
=========================================
2018-02-12 08:55:56 +01:00
JSDoc parser/Sphinx extension for Flectra
2018-03-14 10:18:18 +01:00
=========================================
Why?
====
Spent about a week trying to coerce "standard" javascript tools (jsdoc_ with
the hope of using sphinx-js_ for integration or `documentation.js`_) and
failed to ever get a sensible result: failed to get any result with the
current state of the documentation, significant changes/additions/fixes to
docstrings brought this up to "garbage output" level.
Bug reports and mailing list posts didn't show any path to improvement on the
ES5 codebase (if we ever go whole-hog on ES6 modules and classes things could
be different, in fact most of JSDoc's current effort seem focused on
ES6/ES2015 features) but both experience and looking at the mailing lists
told me that spending more time would be wasted.
Even more so as I was writing visitors/rewriters to generate documentation
from our existing structure, which broadly speaking is relatively strict, and
thus
What?
=====
If it were possible to generate JSDoc annotations from our relatively
well-defined code structures, it was obviously possible to extract documentary
2018-02-12 08:55:56 +01:00
information directly from it, hence this Flectra-specific package/extension
trying to do exactly that.
This package should eventually provide:
* a command-line interface which can be invoked via ``-m autojsdoc`` (assuming
your ``PYTHONPATH`` can find it) which should allow dumping the parsed AST
in a convenient-ish form, possibly doing searches through the AST, a
dependency graph extractor/analysis and a text dumper for the
documentation.
* a sphinx extension (``autojsdoc.sphinx``) which can be used to integrate the
parsed JSDoc information into the Sphinx doc.
How?
====
Sphinx-aside, the package relies on 3 libraries:
* pyjsparser_, an Esprima-compliant ES5.1 parser (with bits of ES6 support),
sadly it does not support comments in its current form so I had to fork it.
Fed a javascript source file, pyjsparser_ simply generates a bunch of nested
dicts representing an Esprima ast, ast-types_ does a reasonably good job of
describing it once you understand that "bases" are basically just structural
mixins.
Because the original does not, this package provides a ``visitor`` module
for pyjsparser_ ASTs.
* pyjsdoc_, a one-file "port" of jsdoc, can actually do much of the JS parsing
(using string munging) but its core semantics don't fit our needs so I'm
only using it to parse the actual JSDoc content, and the ``jsdoc`` module
contains some replacement classes, extensions & monkey patches for things
`pyjsdoc`_ itself does not support, at the time of this writing:
- a bug in FunctionDoc.return_val
- a type on FunctionDoc so it's compatible with ParamDoc
- a more reliable comments-parsing function
- a replacement ModuleDoc as the original does not materialise AMD modules
- a ClassDoc extension to support mixins
- two additional CommentDoc extensions for "namespaces" objects (bag of
attributes without any more information) and mixin objects
* pytest_ to configure and run the test suite, which you can run by invoking
``pytest doc/_extensions`` from the project top-level, the tests represent
both "happy path" things we want to parse and various code patterns which
tripped the happy path because e.g. they were matched and should not have,
they were not matched and should have, or they were more complex than the
happy path had expected
.. _ast-types: _https://github.com/benjamn/ast-types/blob/master/def/core.js
.. _documentation.js: http://documentation.js.org
.. _jsdoc: http://usejsdoc.org
.. _pyjsdoc: https://github.com/nostrademons/pyjsdoc
.. _pyjsparser: https://github.com/PiotrDabkowski/pyjsparser
.. _pytest: https://pytest.org/
.. _sphinx-js: https://sphinx-js-howto.readthedocs.io