diskimage-builder/doc/lib/element_deps.py
Andreas Florath fdd2c4b236 Semi-automatic doc generation of element dependency
Currently there is no description of dependencies in the generated
documentation of the elements: therefore a user of an element does not
know which other elements are automatically included and e.g. which
configuration options are available. In addition there are some
copy&pastes of parts of the README.rst scattered thought different
Ubuntu and Debian specific elements.

This patch adds a semi-automatic generation of dependency information
of all elements.  Nevertheless these are not automatically included.
The author of the element's README.rst can decide if and where the
dependency information should appear and can use the descriptor

.. element_deps::

for this.

This patch adds the dependency information for some Debian and
Ubuntu patches - and creates the base for later removing the
duplicated parts.

A call is added to element_dependencies._find_all_elements() to
populate reverse dependencies for Element objects.

(This is a reworking of I31d2b6050b6c46fefe37378698e9a330025db430 for
the feature/v2 branch)

Change-Id: Iebb83916fed71565071246baa550849eef40560b
2017-02-09 09:50:30 +11:00

68 lines
2.2 KiB
Python

#
# Copyright 2017 Andreas Florath (andreas@florath.net)
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# Scan the element directory, looks for element dependencies and
# writes them out when the directive
# .. element_deps::
# is used.
# This was developed only for internal use and must be called
# from the source top directory.
from diskimage_builder.element_dependencies import _find_all_elements
from diskimage_builder.paths import get_path
from docutils.parsers.rst import Directive
import os
all_elements = _find_all_elements(get_path("elements"))
def append_dependency_list(lines, title, element, deps):
if not deps:
return
lines.append(title)
lines.append("+" * len(title))
for dep in deps:
lines.append("* :doc:`../%s/README`\n" % dep)
class ElementDepsDirective(Directive):
# this enables content in the directive
has_content = True
def run(self):
source = self.state_machine.input_lines.source(
self.lineno - self.state_machine.input_offset - 1)
# Extract the element from the source attribute of the document
element_name = os.path.basename(os.path.dirname(
self.state_machine.document.attributes['source']))
lines = ["Element Dependencies",
"--------------------"]
# This should not fail -- sphinx would be finding an element
# that dib doesn't know about?
element = all_elements[element_name]
append_dependency_list(lines, "Uses", element, element.depends)
append_dependency_list(lines, "Used by", element, element.r_depends)
self.state_machine.insert_input(lines, source)
return []
def setup(app):
app.add_directive('element_deps', ElementDepsDirective)