Index: doxypypy/README.rst |
diff --git a/doxypypy/README.rst b/doxypypy/README.rst |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c80dce59accff053632782f5ce32b91166b4cf10 |
--- /dev/null |
+++ b/doxypypy/README.rst |
@@ -0,0 +1,186 @@ |
+doxypypy |
+======== |
+ |
+*A more Pythonic version of doxypy, a Doxygen filter for Python.* |
+ |
+Intent |
+------ |
+ |
+For now Doxygen_ has limited support for Python. It recognizes Python comments, |
+but otherwise treats the language as being more or less like Java. It doesn't |
+understand basic Python syntax constructs like docstrings, keyword arguments, |
+generators, nested functions, decorators, or lambda expressions. It likewise |
+doesn't understand conventional constructs like doctests or ZOPE-style |
+interfaces. It does however support inline filters that can be used to make |
+input source code a little more like what it's expecting. |
+ |
+The excellent doxypy_ makes it possible to embed Doxygen commands in Python |
+docstrings, and have those docstrings converted to Doxygen-recognized comments |
+on the fly per Doxygen's regular input filtering process. It however does not |
+address any of the other previously mentioned areas of difficulty. |
+ |
+This project started off as a fork of doxypy but quickly became quite distinct. |
+It shares little (if any) of the same code at this point (but maintains the |
+original license just in case). It is meant to support all the same command |
+line options as doxypy, but handle additional Python syntax beyond docstrings. |
+ |
+Additional Syntax Supported |
+--------------------------- |
+ |
+Python can have functions and classes within both functions and classes. |
+Doxygen best understands this concept via its notion of namespaces. This filter |
+thus can supply Doxygen tags marking namespaces on every function and class. |
+This addresses the issue of Doxygen merging inner functions' documentation with |
+the documentation of the parent. |
+ |
+Python class members whose names begin with a double-underscore are mangled |
+and kept private by the language. Doxygen does not understand this natively |
+yet, so this filter additionally provides Doxygen tags to label such variables |
+as private. |
+ |
+Python frequently embeds doctests within docstrings. This filter makes it |
+trivial to mark off such sections of the docstring so they get displayed as |
+code. |
+ |
+ZOPE-style interfaces overload class definitions to be interface definitions, |
+use embedded variable assignments to identify attributes, and use specific |
+function calls to indicate interface adherence. Furthermore, they frequently |
+don't have any code beyond their docstrings, so naively removing docstrings |
+would result in broken Python. This filter has basic understanding of these |
+interfaces and treats them accordingly, supplying Doxygen tags as appropriate. |
+ |
+Fundamentally Python docstrings are meant for humans and not machines, and ought |
+not to have special mark-up beyond conventional structured text. This filter |
+heuristically examines Python docstrings, and ones like the sample for complex |
+in `PEP 257`_ or that generally follow the stricter `Google Python Style Guide`_ |
+will get appropriate Doxygen tags automatically added. |
+ |
+How It Works |
+------------ |
+ |
+This project takes a radically different approach than doxypy. Rather than use |
+regular expressions tied to a state machine to figure out syntax, Python's own |
+Abstract Syntax Tree module is used to extract items of interest. If the |
+`autobrief` option is enabled, docstrings are parsed via a set of regular |
+expressions and a producer / consumer pair of coroutines. |
+ |
+Example |
+------- |
+ |
+This filter will correctly process code like the following working (albeit |
+contrived) example: |
+ |
+.. code-block:: python |
+ |
+ def myfunction(arg1, arg2, kwarg='whatever.'): |
+ """ |
+ Does nothing more than demonstrate syntax. |
+ |
+ This is an example of how a Pythonic human-readable docstring can |
+ get parsed by doxypypy and marked up with Doxygen commands as a |
+ regular input filter to Doxygen. |
+ |
+ Args: |
+ arg1: A positional argument. |
+ arg2: Another positional argument. |
+ |
+ Kwargs: |
+ kwarg: A keyword argument. |
+ |
+ Returns: |
+ A string holding the result. |
+ |
+ Raises: |
+ ZeroDivisionError, AssertionError, & ValueError. |
+ |
+ Examples: |
+ >>> myfunction(2, 3) |
+ '5 - 0, whatever.' |
+ >>> myfunction(5, 0, 'oops.') |
+ Traceback (most recent call last): |
+ ... |
+ ZeroDivisionError: integer division or modulo by zero |
+ >>> myfunction(4, 1, 'got it.') |
+ '5 - 4, got it.' |
+ >>> myfunction(23.5, 23, 'oh well.') |
+ Traceback (most recent call last): |
+ ... |
+ AssertionError |
+ >>> myfunction(5, 50, 'too big.') |
+ Traceback (most recent call last): |
+ ... |
+ ValueError |
+ """ |
+ assert isinstance(arg1, int) |
+ if arg2 > 23: |
+ raise ValueError |
+ return '{0} - {1}, {2}'.format(arg1 + arg2, arg1 / arg2, kwarg) |
+ |
+There are a few points to note: |
+ |
+1. No special tags are used. Best practice human-readable section headers |
+are enough. |
+ |
+2. Some flexibility is allowed. Most common names for sections are accepted, |
+and items and descriptions may be separated by either colons or dashes. |
+ |
+3. The brief must be the first item and be no longer than one line. |
+ |
+4. Everything thrown into an examples section will be treated as code, so it's |
+the perfect place for doctests. |
+ |
+Additional more comprehensive examples can be found in the test area. |
+ |
+Previewing doxypypy Output |
+-------------------------- |
+ |
+After successful installation, doxypypy can be run from the command line to |
+preview the filtered results with: |
+ |
+.. code-block:: shell |
+ |
+ python -m doxypypy.doxypypy -a -c file.py |
+ |
+Typically you'll want to redirect output to a file for viewing in a text editor: |
+ |
+.. code-block:: shell |
+ |
+ python -m doxypypy.doxypypy -a -c file.py > file.py.out |
+ |
+Invoking doxypypy from Doxygen |
+------------------------------ |
+ |
+To make Doxygen run your Python code through doxypypy, set the FILTER\_PATTERNS |
+tag in your Doxyfile as follows: |
+ |
+.. code-block:: shell |
+ |
+ FILTER_PATTERNS = *.py=py_filter |
+ |
+`py_filter` must be available in your path as a shell script (or Windows batch |
+file). If you wish to run `py_filter` in a particular directory you can include |
+the full or relative path. |
+ |
+For Unix-like operating systems, `py_filter` should like something like this: |
+ |
+.. code-block:: shell |
+ |
+ #!/bin/bash |
+ python -m doxypypy.doxypypy -a -c $1 |
+ |
+In Windows, the batch file should be named `py_filter.bat`, and need only |
+contain the one line: |
+ |
+.. code-block:: shell |
+ |
+ python -m doxypypy.doxypypy -a -c %1 |
+ |
+Running Doxygen as usual should now run all Python code through doxypypy. Be |
+sure to carefully browse the Doxygen output the first time to make sure that |
+Doxygen properly found and executed doxypypy. |
+ |
+.. _Doxygen: http://www.stack.nl/~dimitri/doxygen/ |
+.. _doxypy: https://github.com/Feneric/doxypy |
+.. _PEP 257: http://www.python.org/dev/peps/pep-0257/ |
Jim Stichnoth
2016/01/11 14:44:46
use https
rkotlerimgtec
2016/01/11 21:06:06
Done.
|
+.. _Google Python Style Guide: http://google-styleguide.googlecode.com/svn/trunk/pyguide.html?showone=Comments#Comments |
Jim Stichnoth
2016/01/11 14:44:46
This link is broken (plus it's not https).
rkotlerimgtec
2016/01/11 21:06:06
Done.
|
+ |
Jim Stichnoth
2016/01/11 14:44:46
Trailing whitespace.
rkotlerimgtec
2016/01/11 21:06:06
Done.
|