[Pulp-list] v2 REST API Documentation Early Look

Nick Coghlan ncoghlan at redhat.com
Wed Mar 28 01:20:22 UTC 2012


On 03/28/2012 06:30 AM, Jay Dobies wrote:
> I'll do an overview of sphinx, the syntax, and what I'm suggesting for
> the format for our calls in second part of Thursday's deep dive. I'll
> give my full impressions then, but the short answer is that once you
> start to understand it, it's kinda fun and looks pretty solid. I'd be
> surprised if we found reasons not to continue down this path.

One feature of Sphinx that I particularly love is the service at 
www.readthedocs.org - set up a project over there, set up your 
post-commit hook or a cron job and you have a website with nice looking 
docs ready to go. Very handy for projects that don't have any web 
infrastructure of their own set up yet.

> If you're curious to play around, here's the really quick version:
>
> * Install sphinx (use easy_install)

"pip install sphinx" or "yum install python-sphinx" are probably better 
options. (There are a few things about the way easy_install works that 
mean it doesn't always play well with others - "pip" is the preferred 
replacement for direct installation from PyPI. For anyone running Fedora 
though, the version in the Fedora repos should be sufficiently recent)

> * You'll want to run clean every time, I've had it not pick up changes
> with annoying regularity and, frankly, it's fast.

Hmm, that shouldn't happen for the ordinary ReST files. It can 
definitely be a problem when using extensions like autodoc, though. 
Still, as you say, rebuilding from scratch is generally pretty fast.

Before you do too far down the path of converting to Sphinx, you may 
want to investigate implementing some custom directives and roles, since 
it's a lot easier to use those from the start than it is to retrofit 
them later.

For example, rather than the current manually formatted list of bullet 
points which has no semantic markup, it may instead make sense to write 
something like:

.. rest_api: Create Repository
    :method: POST
    :path: /v2/repositories
    :permission: create
    .. rest_param:: id
       :type: str
       unique identifier for the repository
    .. rest_param:: display_name
       :type: str
       :optional:
       user-friendly name for the repository
    .. rest_param:: description
       :type: str
       :optional:
       user-friendly text describing the repository's contents
    .. rest_param:: notes
       :type: dict
       :optional:
       key-value pairs to programmatically tag the repository
    .. success:: 201
       database representation of the created repository
    .. failure:: 409
       there is already a repository with the given ID
    .. failure:: 400
       one or more of the supplied parameters is invalid


There are a few advantages to using a custom directive like this:
- you can also define a rest_call role that would let you write 
:rest_call:`Create Repository` and it would create a hyperlink for you 
to the appropriate rest_api definition.
- you can define the formatting for the directive *once* and then all 
directives will follow it, instead of having to keep the formatting 
consistent manually
- you can define indices and tables that summarise all instances of a 
particular directive (e.g. the module index and the full index in Python 
are generated that way)

There's a tutorial on creating custom extensions in the Sphinx docs:
http://sphinx.pocoo.org/ext/tutorial.html

Cheers,
Nick.

-- 
Nick Coghlan
Red Hat Engineering Operations, Brisbane




More information about the Pulp-list mailing list