12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #!/usr/bin/python2 -O
- # -*- coding: utf-8 -*-
- '''Documentation helpers
- This module contains classes and functions which help to mainain documentation,
- particulary our custom Sphinx extension.
- '''
- import csv
- import posixpath
- import sys
- import urllib2
- import docutils
- import docutils.parsers.rst.roles
- def fetch_ticket_info(uri):
- '''Fetch info about particular trac ticket given
- :param str uri: URI at which ticket resides
- :rtype: mapping
- :raises: urllib2.HTTPError
- '''
- data = urllib2.urlopen(uri + '?format=csv').read()
- reader = csv.reader((line + '\n' for line in data.split('\r\n')),
- quoting=csv.QUOTE_MINIMAL, quotechar='"')
- return dict(zip(*((cell.decode('utf-8') for cell in row) for row in list(reader)[:2])))
- def ticket(name, rawtext, text, lineno, inliner, options={}, content=[]):
- '''Link to qubes ticket
- :param str name: The role name used in the document
- :param str rawtext: The entire markup snippet, with role
- :param str text: The text marked with the role
- :param int lineno: The line noumber where rawtext appearn in the input
- :param docutils.parsers.rst.states.Inliner inliner: The inliner instance that called this function
- :param options: Directive options for customisation
- :param content: The directive content for customisation
- '''
- ticket = text.lstrip('#')
- if not ticket.isdigit():
- msg = inliner.reporter.error('Invalid ticket identificator: {!r}'.format(text), line=lineno)
- prb = inliner.problematic(rawtext, rawtext, msg)
- return [prb], [msg]
- app = inliner.document.settings.env.app
- uri = posixpath.join(app.config.ticket_base_uri, ticket)
- try:
- info = fetch_ticket_info(uri)
- except urllib2.HTTPError, e:
- msg = inliner.reporter.error('Error while fetching ticket info: {!s}'.format(e), line=lineno)
- prb = inliner.problematic(rawtext, rawtext, msg)
- return [prb], [msg]
- docutils.parsers.rst.roles.set_classes(options)
- node = docutils.nodes.reference(
- rawtext,
- '#{} ({})'.format(ticket, info['summary']),
- refuri=uri,
- **options)
- return [node], []
- def setup(app):
- app.add_role('ticket', ticket)
- app.add_config_value('ticket_base_uri', 'https://wiki.qubes-os.org/ticket/', 'env')
- # vim: ts=4 sw=4 et
|