summaryrefslogtreecommitdiff
path: root/scripts/taurusdoc
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/taurusdoc')
-rwxr-xr-xscripts/taurusdoc217
1 files changed, 217 insertions, 0 deletions
diff --git a/scripts/taurusdoc b/scripts/taurusdoc
new file mode 100755
index 00000000..707cb107
--- /dev/null
+++ b/scripts/taurusdoc
@@ -0,0 +1,217 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## This file is part of Taurus, a Tango User Interface Library
+##
+## http://www.tango-controls.org/static/taurus/latest/doc/html/index.html
+##
+## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+##
+## Taurus is free software: you can redistribute it and/or modify
+## it under the terms of the GNU Lesser General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## Taurus is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU Lesser General Public License for more details.
+##
+## You should have received a copy of the GNU Lesser General Public License
+## along with Taurus. If not, see <http://www.gnu.org/licenses/>.
+##
+#############################################################################
+
+"""
+This script is designed to provide taurus developers with a fast way to test
+sphinx documentation from source code files or RST files.
+"""
+
+import sys
+import os
+import shutil
+import optparse
+
+from sphinx.application import Sphinx
+from sphinx.util.console import darkred, nocolor, color_terminal
+
+import taurus.core
+
+def abspath(*path):
+ """A method to determine absolute path for a given relative path to the
+ directory where this script is located"""
+ taurusdoc_dir = os.path.dirname(os.path.abspath(__file__))
+ return os.path.join(taurusdoc_dir, *path)
+
+sys.path.append(abspath('..', 'doc'))
+
+try:
+ import auto_rst4api
+except ImportError:
+ print "taurusdoc can only be executed from a source distribution of taurus"
+ sys.exit(1)
+
+__INDEX = """
+TaurusDoc
+---------
+
+This document has been autogenerated by taurusdoc for test purposes.
+Any modifications will be lost.
+
+.. toctree::
+
+ {name}
+"""
+
+class RstCreator(auto_rst4api.Auto_rst4API_Creator):
+
+ def documentClass(self, module, classname, docparentpath):
+ '''Documents a single class
+
+ :param module: (module) python module where class resides
+ :param classname: (str) class name
+ :docparentpath: (str) path to the directory in which the documentation
+ files will be written
+ '''
+ ofname = os.path.join(docparentpath,"_%s.rst"%classname)
+
+ if self.verbose: print 'creating "%s" ...' % ofname,
+ info = dict(modulename = module.__name__,
+ basemodulename = module.__name__.split('.')[-1],
+ modulepath = module.__path__,
+ submodulenames = [],
+ localclassnames = [classname],
+ localfunctionnames = [],
+ localenumerationnames = [],
+ externalmembernames = [],
+ submodules = [],
+ warnings = [])
+ if not os.path.exists(ofname) or self.overwrite_old:
+ text = self.classtemplate.render(info=info, classname=classname)
+ f = open(ofname, "w")
+ f.write('\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text)))
+ f.close()
+ if self.verbose: print ' ok.'
+ else:
+ if self.verbose: print ' skipping (file already exists)'
+
+
+def main():
+ version = "taurusdoc %s" % (taurus.Release.version)
+ usage = "usage: %prog [options]"
+ description = "a tool to help developers preview the documentation "\
+ "generated by their code"
+ parser = optparse.OptionParser(usage=usage, version=version, description=description)
+
+ parser.add_option("-v", "--verbose", dest="verbose", action="store_true",
+ help="display a lot of information [default]", default=True)
+ parser.add_option("-q", "--quiet", dest="verbose", action="store_false",
+ help="be really silent")
+ parser.add_option("--build-dir", dest="build_dir",
+ help="build directory [default=./build]")
+ parser.add_option("-a", "--all-files", dest="all_files", default=True, action="store_true",
+ help="generate from scratch [default]")
+ parser.add_option("--cache", dest="all_files", action="store_false",
+ help="use previously generated files")
+
+ #o_group = optparse.OptionGroup(parser, "output options",
+ # "options regarding the ouput")
+
+ parser.add_option("--format", dest="builder", default="html",
+ help="output format [default=html]")
+
+ parser.add_option("--prefix", dest="prefix",
+ help="output directory")
+
+ #i_group = optparse.OptionGroup(parser, "input options",
+ # "provide one and **only** one of these!")
+
+ parser.add_option("--class", dest="klass", default=None,
+ help="full class name to generate doc for (ex.: taurus.qt.qtgui.display.TaurusLabel")
+ parser.add_option("--package", dest="package", default=None,
+ help="full package name to generate doc for (ex.: taurus.qt.qtgui.display)")
+ parser.add_option("--file", dest="filename", default=None,
+ help="RST file")
+
+ options, args = parser.parse_args()
+
+ if not options.klass and not options.package and not options.filename:
+ parser.error("must give one of --class or --package or --file")
+
+ if int(bool(options.klass)) + int(bool(options.package)) + int(bool(options.filename)) > 1:
+ parser.error("options --class and --package and --file are mutually exclusive")
+
+ fromlist = []
+
+ if options.klass:
+ package_name, class_name = options.klass.rsplit(".", 1)
+ if package_name.find(".") >= 0:
+ fromlist.append( package_name.split(".", 1)[0] )
+ mod = __import__(package_name, fromlist=fromlist)
+ elif options.package:
+ package_name = options.package
+ mod = __import__(package_name, fromlist=fromlist)
+ else:
+ filename = options.filename
+
+ if options.build_dir is None:
+ options.build_dir = os.path.join(os.path.abspath(os.path.curdir), "build")
+
+ # clean build dir
+ if options.all_files:
+ if os.path.isdir(options.build_dir):
+ shutil.rmtree(options.build_dir)
+
+ if not os.path.isdir(options.build_dir):
+ os.makedirs(options.build_dir)
+
+ if options.prefix is None:
+ options.prefix = os.path.join(os.path.abspath(os.path.curdir), "sphinx")
+
+ if not os.path.isdir(options.prefix):
+ os.makedirs(options.prefix)
+
+ doc_dir = abspath("..", "doc")
+
+ if options.verbose:
+ out = sys.stdout
+ else:
+ import StringIO
+ out = StringIO.StringIO()
+
+ if not options.filename:
+ rstCreator = RstCreator(exclude_patterns=['.*\.ui'], templatespath=doc_dir,
+ overwrite_old=True, verbose=options.verbose,
+ classtemplate='api_class_simple.rst')
+
+ rstCreator.cleanAutogenerated(options.build_dir)
+
+ # create index.rst
+ index_rst = os.path.join(options.build_dir, 'index.rst')
+ f = file(index_rst, "w")
+ if options.klass:
+ r = rstCreator.documentClass(mod, class_name, options.build_dir)
+ txt = __INDEX.format(name="_%s" % class_name)
+ elif options.package:
+ r = rstCreator.documentModule(package_name, options.build_dir)
+ txt = __INDEX.format(name=package_name.rsplit(".", 1)[-1])
+ else:
+ shutil.copy(options.filename, options.build_dir)
+ txt = __INDEX.format(name=os.path.basename(options.filename))
+ f.write(txt)
+ f.close()
+
+ # directory where conf.py resides
+ config_dir = os.path.join(doc_dir, 'source')
+ doctree_dir = os.path.join(options.build_dir, 'doctrees')
+
+ app = Sphinx(options.build_dir, config_dir, options.prefix,
+ doctree_dir, options.builder,
+ confoverrides=None, status=out, warning=sys.stderr,
+ freshenv=False, warningiserror=False, tags=None)
+
+ app.build()
+
+if __name__ == "__main__":
+ main() \ No newline at end of file