summaryrefslogtreecommitdiff
path: root/docs/users_guide/ghc_packages.py
diff options
context:
space:
mode:
Diffstat (limited to 'docs/users_guide/ghc_packages.py')
-rw-r--r--docs/users_guide/ghc_packages.py65
1 files changed, 65 insertions, 0 deletions
diff --git a/docs/users_guide/ghc_packages.py b/docs/users_guide/ghc_packages.py
new file mode 100644
index 0000000000..6419834e1e
--- /dev/null
+++ b/docs/users_guide/ghc_packages.py
@@ -0,0 +1,65 @@
+from docutils import nodes
+from docutils.parsers.rst import Directive, directives
+from sphinx import addnodes
+from sphinx.domains.std import GenericObject
+from sphinx.errors import SphinxError
+from utils import build_table_from_list
+
+def read_cabal_file(pkg_path):
+ import re
+ cabal_file = open(pkg_path, 'r').read()
+ pkg_name = re.search(r'^[nN]ame\s*:\s*([-a-zA-Z0-9]+)', cabal_file, re.MULTILINE)
+ if pkg_name is not None:
+ pkg_name = pkg_name.group(1)
+ else:
+ raise RuntimeError("Failed to parse `Name:` field from %s" % pkg_path)
+
+ pkg_version = re.search(r'^[vV]ersion\s*:\s*(\d+(\.\d+)*)', cabal_file, re.MULTILINE)
+ if pkg_version is not None:
+ pkg_version = pkg_version.group(1)
+ else:
+ raise RuntimeError("Failed to parse `Version:` field from %s" % pkg_path)
+
+ return (pkg_name, pkg_version)
+
+
+class PackageListDirective(Directive):
+ has_content = True
+ def run(self):
+ self.assert_has_content()
+
+ packages = []
+ for line in self.content:
+ (pkg_path, _, reason) = line.partition(':')
+ if len(reason) == 0:
+ raise RuntimeError("Missing reason for inclusion of package %s"
+ % pkg_path)
+
+ # Parse reason
+ from docutils.statemachine import ViewList
+ reason_vl = ViewList(initlist=[reason.strip()])
+ reason_node = nodes.paragraph()
+ self.state.nested_parse(reason_vl, 0, reason_node)
+ packages.append((pkg_path, reason_node))
+
+ # Create column headers for table
+ header = [ nodes.inline(text=h)
+ for h in ["Package", "Version", "Reason for inclusion"] ]
+ package_list = [header]
+
+ for (pkg_path, reason) in sorted(packages):
+ (pkg_name, pkg_version) = read_cabal_file(pkg_path)
+ cells = [ nodes.paragraph(text=pkg_name),
+ nodes.inline(text=pkg_version),
+ reason ]
+ package_list.append(cells)
+
+ table = build_table_from_list(package_list, [20, 20, 40])
+ table['classes'].append('longtable')
+ return [table]
+
+### Initialization
+def setup(app):
+ app.add_directive('ghc-package-list', PackageListDirective)
+
+ return {'version': '1.0'}