[Epydoc-commits] SF.net SVN: epydoc: [1488] trunk/epydoc/src/epydoc
Brought to you by:
edloper
From: <ed...@us...> - 2007-02-14 00:34:29
|
Revision: 1488 http://svn.sourceforge.net/epydoc/?rev=1488&view=rev Author: edloper Date: 2007-02-13 16:34:27 -0800 (Tue, 13 Feb 2007) Log Message: ----------- - Added --include-log option (feature request #1639425). Currently, it's only useful with --html. The log page is named "epydoc-log.html", and is linked from the footer. - Put option defaults in a global dictionary at the top of the 'argument & config file parsing' section - Added log.close() hook to close logs. Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py trunk/epydoc/src/epydoc/docwriter/html.py trunk/epydoc/src/epydoc/docwriter/html_css.py trunk/epydoc/src/epydoc/log.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2007-02-14 00:34:00 UTC (rev 1487) +++ trunk/epydoc/src/epydoc/cli.py 2007-02-14 00:34:27 UTC (rev 1488) @@ -63,12 +63,14 @@ """ __docformat__ = 'epytext en' -import sys, os, time, re, pickle +import sys, os, time, re, pickle, textwrap from glob import glob from optparse import OptionParser, OptionGroup, SUPPRESS_HELP +import optparse import epydoc from epydoc import log from epydoc.util import wordwrap, run_subprocess, RunSubprocessError +from epydoc.util import plaintext_to_html from epydoc.apidoc import UNKNOWN from epydoc.compat import * import ConfigParser @@ -83,6 +85,15 @@ #{ Argument & Config File Parsing ###################################################################### +OPTION_DEFAULTS = dict( + action="html", show_frames=True, docformat=DEFAULT_DOCFORMAT, + show_private=True, show_imports=False, inheritance="listed", + verbose=0, quiet=0, load_pickle=False, parse=True, introspect=True, + debug=epydoc.DEBUG, profile=False, graphs=[], + list_classes_separately=False, graph_font=None, graph_font_size=None, + include_source_code=True, pstat_files=[], simple_term=False, fail_on=None, + exclude=[], exclude_parse=[], exclude_introspect=[]) + def parse_arguments(): # Construct the option parser. usage = '%prog ACTION [options] NAMES...' @@ -180,6 +191,9 @@ generation_group.add_option( # --no-imports "--no-imports", action="store_false", dest="show_imports", help="Do not list each module's imports. (default)") + generation_group.add_option( # --include-log + '--include-log', action='store_true', dest='include_log', + help=("Include a page with the process log (epydoc-log.html)")) generation_group.add_option( # --show-sourcecode '--show-sourcecode', action='store_true', dest='include_source_code', help=("Include source code with syntax highlighting in the " @@ -285,19 +299,7 @@ optparser.add_option_group(return_group) # Set the option parser's defaults. - optparser.set_defaults(action="html", show_frames=True, - docformat=DEFAULT_DOCFORMAT, - show_private=True, show_imports=False, - inheritance="listed", - verbose=0, quiet=0, load_pickle=False, - parse=True, introspect=True, - debug=epydoc.DEBUG, profile=False, - graphs=[], list_classes_separately=False, - graph_font=None, graph_font_size=None, - include_source_code=True, pstat_files=[], - simple_term=False, fail_on=None, - exclude=[], exclude_parse=[], - exclude_introspect=[]) + optparser.set_defaults(**OPTION_DEFAULTS) # Parse the arguments. options, names = optparser.parse_args() @@ -367,6 +369,7 @@ options.target = options.action # Return parsed args. + options.names = names return options, names def parse_configfiles(configfiles, options, names): @@ -524,6 +527,12 @@ log.error("%s is not a directory" % options.target) sys.exit(1) + if options.include_log: + if options.action == 'html': + log.register_logger(HTMLLogger(options.target, options)) + else: + log.warning("--include-log requires --html") + # Set the default docformat from epydoc import docstringparser docstringparser.DEFAULT_DOCFORMAT = options.docformat @@ -770,10 +779,13 @@ options, names = parse_arguments() try: - if options.profile: - _profile() - else: - main(options, names) + try: + if options.profile: + _profile() + else: + main(options, names) + finally: + log.close() except SystemExit: raise except KeyboardInterrupt: @@ -1169,14 +1181,95 @@ def print_times(self): pass +class HTMLLogger(log.Logger): + """ + A logger used to generate a log of all warnings and messages to an + HTML file. + """ + + FILENAME = "epydoc-log.html" + HEADER = textwrap.dedent('''\ + <?xml version="1.0" encoding="ascii"?> + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "DTD/xhtml1-transitional.dtd"> + <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> + <head> + <title>$title$</title> + <link rel="stylesheet" href="epydoc.css" type="text/css" /> + </head> + + <body bgcolor="white" text="black" link="blue" vlink="#204080" + alink="#204080"> + <h1 class="epydoc">Epydoc Log</h1> + <p class="log">Epydoc started at %s</p>''') + START_BLOCK = '<div class="log-block"><h2 class="log-hdr">%s</h2>' + MESSAGE = '<div class="log-%s"><pre class="log"><b>%s</b>: %s</pre></div>\n' + END_BLOCK = '</div>' + FOOTER = "</body>\n</html>\n" + + def __init__(self, directory, options): + self.start_time = time.time() + self.out = open(os.path.join(directory, self.FILENAME), 'w') + self.out.write(self.HEADER % time.ctime(self.start_time)) + self.is_empty = True + self.options = options + + def write_options(self, options): + self.out.write(self.START_BLOCK % 'Epydoc Options') + msg = '<table border="0" cellpadding="0" cellspacing="0">\n' + opts = [(key, getattr(options, key)) for key in dir(options) + if key not in dir(optparse.Values)] + opts = [(val==OPTION_DEFAULTS.get(key), key, val) + for (key, val) in opts] + for is_default, key, val in sorted(opts): + css = is_default and 'opt-default' or 'opt-changed' + msg += ('<tr class="%s"><td>%s</td><td><tt> = ' + '</tt></td><td><tt>%s</tt></td></tr>' % + (css, key, plaintext_to_html(repr(val)))) + msg += '</table>\n' + self.out.write('<div class="log-info">\n%s</div>\n' % msg) + self.out.write(self.END_BLOCK) + + def start_block(self, header): + self.out.write(self.START_BLOCK % header) + + def end_block(self): + self.out.write(self.END_BLOCK) + + def log(self, level, message): + if message.endswith("(-v) to display markup errors."): return + if level >= log.ERROR: + self.out.write(self.MESSAGE % ('error', 'Error', message)) + self.is_empty = False + elif level >= log.DOCSTRING_WARNING: + self.out.write(self.MESSAGE % ('warning', 'Warning', message)) + self.is_empty = False + + def close(self): + if self.is_empty: + self.out.write('<div class="log-info">' + 'No warnings or errors!</div>') + self.write_options(self.options) + self.out.write('<p class="log">Epydoc finished at %s</p>\n' + '<p class="log">(Elapsed time: %s)</p>' % + (time.ctime(), self._elapsed_time())) + self.out.write(self.FOOTER) + self.out.close() + + def _elapsed_time(self): + secs = int(time.time()-self.start_time) + if secs < 60: + return '%d seconds' % secs + if secs < 3600: + return '%d minutes, %d seconds' % (secs/60, secs%60) + else: + return '%d hours, %d minutes' % (secs/3600, secs%3600) + + ###################################################################### ## main ###################################################################### if __name__ == '__main__': - try: - cli() - except: - print '\n\n' - raise + cli() Modified: trunk/epydoc/src/epydoc/docwriter/html.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html.py 2007-02-14 00:34:00 UTC (rev 1487) +++ trunk/epydoc/src/epydoc/docwriter/html.py 2007-02-14 00:34:27 UTC (rev 1488) @@ -288,6 +288,9 @@ @type include_source_code: C{boolean} @keyword include_source_code: If true, then generate colorized source code files for each python module. + @type include_log: C{boolean} + @keyword include_log: If true, the the footer will include an + href to the page 'epydoc-log.html'. """ self.docindex = docindex @@ -349,6 +352,9 @@ self._graph_types = kwargs.get('graphs', ()) or () """Graphs that we should include in our output.""" + self._include_log = kwargs.get('include_log', False) + """Are we generating an HTML log page?""" + self._callgraph_cache = {} """Map the callgraph L{uid<DotGraph.uid>} to their HTML representation.""" @@ -1653,8 +1659,14 @@ >>> if not short: <table border="0" cellpadding="0" cellspacing="0" width="100%%"> <tr> - <td align="left" class="footer">Generated by Epydoc - $epydoc.__version__$ on $time.asctime()$</td> + <td align="left" class="footer"> + >>> if self._include_log: + <a href="epydoc-log.html">Generated by Epydoc + $epydoc.__version__$ on $time.asctime()$</a> + >>> else: + Generated by Epydoc $epydoc.__version__$ on $time.asctime()$ + >>> #endif + </td> <td align="right" class="footer"> <a href="http://epydoc.sourceforge.net">http://epydoc.sourceforge.net</a> </td> Modified: trunk/epydoc/src/epydoc/docwriter/html_css.py =================================================================== --- trunk/epydoc/src/epydoc/docwriter/html_css.py 2007-02-14 00:34:00 UTC (rev 1487) +++ trunk/epydoc/src/epydoc/docwriter/html_css.py 2007-02-14 00:34:27 UTC (rev 1488) @@ -316,8 +316,29 @@ margin: 0; } .nomargin-top { margin-top: 0; } .nomargin { margin-top: 0; margin-bottom: 0; } -""" +/* HTML Log */ +div.log-block { padding: 0; margin: .5em; + background: $log_bg; color: $log_fg; + border: $log_border; } +div.log-error { padding: .5em; margin: .5em; + background: $log_error_bg; color: $log_error_fg; + border: $log_error_border; } +div.log-warning { padding: .5em; margin: .5em; + background: $log_warn_bg; color: $log_warn_fg; + border: $log_warn_border; } +div.log-info { padding: .5em; margin: .5em; + background: $log_info_bg; color: $log_info_fg; + border: $log_info_border; } +h2.log-hdr { background: $log_hdr_bg; color: $log_hdr_fg; + margin: 0; padding: 0.1em 0.5em 0.1em 0.5em; + border-bottom: $log_border; } +p.log { font-weight: bold; } +tr.opt-changed { color: $opt_changed_fg; font-weight: bold; } +tr.opt-default { color: $opt_default_fg; } +pre.log { margin: 0; padding: 0; } +""" + ############################################################ ## Derived stylesheets ############################################################ @@ -425,6 +446,23 @@ py_decorator = '#804020', # Graphs graph_border = '1px solid #000000', + # Log block + log_bg = '#e8f0f8', + log_fg = '#000000', + log_border = '1px solid #000000', + log_hdr_bg = '#70b0ff', + log_hdr_fg = '#000000', + log_error_bg = '#ffb0b0', + log_error_fg = '#000000', + log_error_border = '1px solid #000000', + log_warn_bg = '#ffffb0', + log_warn_fg = '#000000', + log_warn_border = '1px solid #000000', + log_info_bg = '#b0ffb0', + log_info_fg = '#000000', + log_info_border = '1px solid #000000', + opt_changed_fg = '#000000', + opt_default_fg = '#606060', ) _BLUE_COLORS = _WHITE_COLORS.copy() Modified: trunk/epydoc/src/epydoc/log.py =================================================================== --- trunk/epydoc/src/epydoc/log.py 2007-02-14 00:34:00 UTC (rev 1487) +++ trunk/epydoc/src/epydoc/log.py 2007-02-14 00:34:27 UTC (rev 1488) @@ -64,6 +64,11 @@ message. """ + def close(self): + """ + Perform any tasks needed to close this logger. + """ + #//////////////////////////////////////////////////////////// # Message blocks #//////////////////////////////////////////////////////////// @@ -195,4 +200,5 @@ for logger in _loggers: logger.progress(percent, '%s' % message) progress.__doc__ = Logger.progress.__doc__ - +def close(): + for logger in _loggers: logger.close() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |