Thread: [Epydoc-commits] SF.net SVN: epydoc: [1309] trunk/epydoc/src/epydoc/cli.py (Page 2)
Brought to you by:
edloper
From: <ed...@us...> - 2006-08-23 15:58:14
|
Revision: 1309 Author: edloper Date: 2006-08-23 08:58:06 -0700 (Wed, 23 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1309&view=rev Log Message: ----------- - Only import pstats/profile when we need them, and if the import fails, then issue an error message, rather than crashing. (pstats is not installed by default on some systems.) Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2006-08-23 15:47:09 UTC (rev 1308) +++ trunk/epydoc/src/epydoc/cli.py 2006-08-23 15:58:06 UTC (rev 1309) @@ -63,7 +63,7 @@ """ __docformat__ = 'epytext en' -import sys, os, time, re, pstats, pickle +import sys, os, time, re, pickle from glob import glob from optparse import OptionParser, OptionGroup import epydoc @@ -470,6 +470,9 @@ # Load profile information, if it was given. if options.pstat_files: + try: import pstats + except ImportError: + log.error("Could not import pstats -- ignoring pstat files.") try: profile_stats = pstats.Stats(options.pstat_files[0]) for filename in options.pstat_files[1:]: @@ -672,7 +675,10 @@ print >>sys.stderr, 'Use --debug to see trace information.' def _profile(): - import profile, pstats + try: import profile + except ImportError: + print >>sys.stderr, "Could not import profile module!" + return try: prof = profile.Profile() prof = prof.runctx('main(*parse_arguments())', globals(), {}) @@ -680,9 +686,13 @@ pass prof.dump_stats('profile.out') return + # Use the pstats statistical browser. This is made unnecessarily # difficult because the whole browser is wrapped in an # if __name__=='__main__' clause. + try: import pstats + except ImportError: + log.error("Could not import pstats -- skipping browser") try: pstats_pyfile = os.path.splitext(pstats.__file__)[0]+'.py' sys.argv = ['pstats.py', 'profile.out'] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-24 06:50:47
|
Revision: 1315 Author: edloper Date: 2006-08-23 23:50:43 -0700 (Wed, 23 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1315&view=rev Log Message: ----------- Check for a bug that exists in Python 2.4's profiler; and if found, patch it before using --profile-epydoc. This profiler bug was fixed in 2.4maint, as of September 2005: <http://mail.python.org/pipermail/python-checkins/2005-September/047099.html> Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2006-08-23 20:10:10 UTC (rev 1314) +++ trunk/epydoc/src/epydoc/cli.py 2006-08-24 06:50:43 UTC (rev 1315) @@ -675,12 +675,18 @@ print >>sys.stderr, 'Use --debug to see trace information.' def _profile(): - try: import profile + try: from profile import Profile except ImportError: print >>sys.stderr, "Could not import profile module!" return + # There was a bug in Python 2.4's profiler. Check if it's + # present, and if so, fix it. (Bug was fixed in 2.4maint: + # <http://mail.python.org/pipermail/python-checkins/ + # 2005-September/047099.html>) + if Profile.dispatch['c_exception'] is Profile.trace_dispatch_exception: + Profile.dispatch['c_exception'] = Profile.trace_dispatch_return try: - prof = profile.Profile() + prof = Profile() prof = prof.runctx('main(*parse_arguments())', globals(), {}) except SystemExit: pass This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-24 07:01:27
|
Revision: 1317 Author: edloper Date: 2006-08-24 00:01:22 -0700 (Thu, 24 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1317&view=rev Log Message: ----------- - Fixing profiling bug, take 2. Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2006-08-24 06:51:22 UTC (rev 1316) +++ trunk/epydoc/src/epydoc/cli.py 2006-08-24 07:01:22 UTC (rev 1317) @@ -683,8 +683,10 @@ # present, and if so, fix it. (Bug was fixed in 2.4maint: # <http://mail.python.org/pipermail/python-checkins/ # 2005-September/047099.html>) - if Profile.dispatch['c_exception'] is Profile.trace_dispatch_exception: - Profile.dispatch['c_exception'] = Profile.trace_dispatch_return + if (Profile.dispatch['c_exception'] is + Profile.trace_dispatch_exception.im_func): + trace_dispatch_return = Profile.trace_dispatch_return.im_func + Profile.dispatch['c_exception'] = trace_dispatch_return try: prof = Profile() prof = prof.runctx('main(*parse_arguments())', globals(), {}) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-29 21:18:57
|
Revision: 1330 Author: edloper Date: 2006-08-29 14:18:53 -0700 (Tue, 29 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1330&view=rev Log Message: ----------- - Added new options --graph-font and --graph-font-size (in response to SF bug [ 1547356 ] dot font problems) Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2006-08-29 21:05:10 UTC (rev 1329) +++ trunk/epydoc/src/epydoc/cli.py 2006-08-29 21:18:53 UTC (rev 1330) @@ -206,6 +206,14 @@ "include multiple graph types in the output. GRAPHTYPE " "should be one of: all, %s." % ', '.join(GRAPH_TYPES))) options_group.add_option( + '--graph-font', dest='graph_font', metavar='FONT', + help=("Specify the font used to generate Graphviz graphs. (e.g., " + "helvetica or times).")) + options_group.add_option( + '--graph-font-size', dest='graph_font_size', metavar='SIZE', + help=("Specify the font size used to generate Graphviz graphs, " + "in points.")) + options_group.add_option( '--separate-classes', action='store_true', dest='list_classes_separately', help=("When generating LaTeX or PDF output, list each class in " @@ -236,6 +244,7 @@ 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=[]) # Parse the arguments. @@ -372,6 +381,10 @@ raise ValueError('"%s" expected one of: all, %s.' % (optname, ', '.join(GRAPH_TYPES))) options.graphs.extend(graphtypes) + elif optname in ('graph-font', 'graph_font'): + options.graph_font = val + elif optname in ('graph-font-size', 'graph_font_size'): + options.graph_font_size = int(val) elif optname in ('separate-classes', 'separate_classes'): options.list_classes_separately = _str_to_bool(val, optname) elif optname == 'sourcecode': @@ -447,6 +460,18 @@ from epydoc.docwriter import dotgraph dotgraph.DOT_PATH = options.dotpath + # Set the default graph font & size + if options.graph_font: + from epydoc.docwriter import dotgraph + fontname = options.graph_font + dotgraph.DotGraph.DEFAULT_NODE_DEFAULTS['fontname'] = fontname + dotgraph.DotGraph.DEFAULT_EDGE_DEFAULTS['fontname'] = fontname + if options.graph_font_size: + from epydoc.docwriter import dotgraph + fontsize = options.graph_font_size + dotgraph.DotGraph.DEFAULT_NODE_DEFAULTS['fontsize'] = fontsize + dotgraph.DotGraph.DEFAULT_EDGE_DEFAULTS['fontsize'] = fontsize + # If the input name is a pickle file, then read the docindex that # it contains. Otherwise, build the docs for the input names. if options.load_pickle: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-09-02 00:50:37
|
Revision: 1338 http://svn.sourceforge.net/epydoc/?rev=1338&view=rev Author: edloper Date: 2006-09-01 17:50:32 -0700 (Fri, 01 Sep 2006) Log Message: ----------- - Fixed SF bug [ 1550509 ] cli.py: DOT_PATH should be DOT_COMAND - Rewrote the code for --profile-epydoc. It now uses the hotshot profiler instead of proflie.py. Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2006-08-30 01:52:10 UTC (rev 1337) +++ trunk/epydoc/src/epydoc/cli.py 2006-09-02 00:50:32 UTC (rev 1338) @@ -77,6 +77,7 @@ GRAPH_TYPES = ('classtree', 'callgraph', 'umlclasstree') ACTIONS = ('html', 'text', 'latex', 'dvi', 'ps', 'pdf', 'check') DEFAULT_DOCFORMAT = 'epytext' +PROFILER = 'hotshot' #: Which profiler to use: 'hotshot' or 'profile' ###################################################################### #{ Argument & Config File Parsing @@ -185,12 +186,12 @@ options_group.add_option( # --introspect-only "--introspect-only", action="store_false", dest="parse", help="Get all information from introspecting (don't parse)") - if epydoc.DEBUG: - # this option is for developers, not users. - options_group.add_option( - "--profile-epydoc", action="store_true", dest="profile", - help="Run the profiler. Output will be written to profile.out") + # this option is for developers, not users. options_group.add_option( + "--profile-epydoc", action="store_true", dest="profile", + help=("Run the hotshot profiler on epydoc itself. Output " + "will be written to profile.out.")) + options_group.add_option( "--dotpath", dest="dotpath", metavar='PATH', help="The path to the Graphviz 'dot' executable.") options_group.add_option( @@ -458,7 +459,7 @@ # Set the dot path if options.dotpath: from epydoc.docwriter import dotgraph - dotgraph.DOT_PATH = options.dotpath + dotgraph.DOT_COMMAND = options.dotpath # Set the default graph font & size if options.graph_font: @@ -700,42 +701,48 @@ print >>sys.stderr, 'Use --debug to see trace information.' def _profile(): - try: from profile import Profile - except ImportError: - print >>sys.stderr, "Could not import profile module!" + # Hotshot profiler. + if PROFILER == 'hotshot': + try: import hotshot, hotshot.stats + except ImportError: + print >>sys.stderr, "Could not import profile module!" + return + try: + prof = hotshot.Profile('hotshot.out') + prof = prof.runctx('main(*parse_arguments())', globals(), {}) + except SystemExit: + pass + prof.close() + # Convert profile.hotshot -> profile.out + print 'Consolidating hotshot profiling info...' + hotshot.stats.load('hotshot.out').dump_stats('profile.out') + + # Standard 'profile' profiler. + elif PROFILER == 'profile': + try: from profile import Profile + except ImportError: + print >>sys.stderr, "Could not import profile module!" + return + + # There was a bug in Python 2.4's profiler. Check if it's + # present, and if so, fix it. (Bug was fixed in 2.4maint: + # <http://mail.python.org/pipermail/python-checkins/ + # 2005-September/047099.html>) + if (Profile.dispatch['c_exception'] is + Profile.trace_dispatch_exception.im_func): + trace_dispatch_return = Profile.trace_dispatch_return.im_func + Profile.dispatch['c_exception'] = trace_dispatch_return + try: + prof = Profile() + prof = prof.runctx('main(*parse_arguments())', globals(), {}) + except SystemExit: + pass + prof.dump_stats('profile.out') + + else: + print >>sys.stderr, 'Unknown profiler %s' % PROFILER return - # There was a bug in Python 2.4's profiler. Check if it's - # present, and if so, fix it. (Bug was fixed in 2.4maint: - # <http://mail.python.org/pipermail/python-checkins/ - # 2005-September/047099.html>) - if (Profile.dispatch['c_exception'] is - Profile.trace_dispatch_exception.im_func): - trace_dispatch_return = Profile.trace_dispatch_return.im_func - Profile.dispatch['c_exception'] = trace_dispatch_return - try: - prof = Profile() - prof = prof.runctx('main(*parse_arguments())', globals(), {}) - except SystemExit: - pass - prof.dump_stats('profile.out') - return - - # Use the pstats statistical browser. This is made unnecessarily - # difficult because the whole browser is wrapped in an - # if __name__=='__main__' clause. - try: import pstats - except ImportError: - log.error("Could not import pstats -- skipping browser") - try: - pstats_pyfile = os.path.splitext(pstats.__file__)[0]+'.py' - sys.argv = ['pstats.py', 'profile.out'] - print - execfile(pstats_pyfile, {'__name__':'__main__'}) - except: - print 'Could not run the pstats browser' - print 'Profiling output is in "profile.out"' - ###################################################################### #{ Logging ###################################################################### This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-09-06 19:12:21
|
Revision: 1355 http://svn.sourceforge.net/epydoc/?rev=1355&view=rev Author: edloper Date: 2006-09-06 12:12:18 -0700 (Wed, 06 Sep 2006) Log Message: ----------- - If --debug is specified, then set epydoc.DEBUG to True. - Commented out what looks like some testing code Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2006-09-06 19:08:13 UTC (rev 1354) +++ trunk/epydoc/src/epydoc/cli.py 2006-09-06 19:12:18 UTC (rev 1355) @@ -408,10 +408,15 @@ ###################################################################### def main(options, names): - if options.action == 'text': - if options.parse and options.introspect: - options.parse = False + # Set the debug flag, if '--debug' was specified. + if options.debug: + epydoc.DEBUG = True + ## [XX] Did this serve a purpose? Commenting out for now: + #if options.action == 'text': + # if options.parse and options.introspect: + # options.parse = False + # Set up the logger if options.action == 'text': logger = None # no logger for text output. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2007-02-04 04:03:50
|
Revision: 1433 http://svn.sourceforge.net/epydoc/?rev=1433&view=rev Author: dvarrazzo Date: 2007-02-03 20:03:48 -0800 (Sat, 03 Feb 2007) Log Message: ----------- - Command line help reorganized. Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2007-02-04 03:12:25 UTC (rev 1432) +++ trunk/epydoc/src/epydoc/cli.py 2007-02-04 04:03:48 UTC (rev 1433) @@ -65,7 +65,7 @@ import sys, os, time, re, pickle from glob import glob -from optparse import OptionParser, OptionGroup +from optparse import OptionParser, OptionGroup, SUPPRESS_HELP import epydoc from epydoc import log from epydoc.util import wordwrap, run_subprocess, RunSubprocessError @@ -89,8 +89,24 @@ version = "Epydoc, version %s" % epydoc.__version__ optparser = OptionParser(usage=usage, version=version) action_group = OptionGroup(optparser, 'Actions') - options_group = OptionGroup(optparser, 'Options') + generation_group = OptionGroup(optparser, 'Generation options') + output_group = OptionGroup(optparser, 'Output options') + graph_group = OptionGroup(optparser, 'Graph options') + optparser.add_option( + '--config', action='append', dest="configfiles", metavar='FILE', + help=("A configuration file, specifying additional OPTIONS " + "and/or NAMES. This option may be repeated.")) + optparser.add_option( # --quiet + "--quiet", "-q", action="count", dest="quiet", + help="Decrease the verbosity.") + optparser.add_option( # --verbose + "--verbose", "-v", action="count", dest="verbose", + help="Increase the verbosity.") + optparser.add_option( # --debug + "--debug", action="store_true", dest="debug", + help="Show full tracebacks for internal errors.") + # Add options -- Actions action_group.add_option( # --html "--html", action="store_const", dest="action", const="html", @@ -117,88 +133,85 @@ "--pickle", action="store_const", dest="action", const="pickle", help="Write the documentation to a pickle file.") - # Add options -- Options - options_group.add_option( # --output + # Add options -- Generation + generation_group.add_option( # --docformat + "--docformat", dest="docformat", metavar="NAME", + help="The default markup language for docstrings. Defaults " + "to \"%s\"." % DEFAULT_DOCFORMAT) + generation_group.add_option( # --parse-only + "--parse-only", action="store_false", dest="introspect", + help="Get all information from parsing (don't introspect)") + generation_group.add_option( # --introspect-only + "--introspect-only", action="store_false", dest="parse", + help="Get all information from introspecting (don't parse)") + generation_group.add_option( # --inheritance + "--inheritance", dest="inheritance", metavar="STYLE", + help="The format for showing inheritance objects. STYLE " + "should be one of: %s." % ', '.join(INHERITANCE_STYLES)) + generation_group.add_option( # --show-private + "--show-private", action="store_true", dest="show_private", + help="Include private variables in the output. (default)") + generation_group.add_option( # --no-private + "--no-private", action="store_false", dest="show_private", + help="Do not include private variables in the output.") + generation_group.add_option( # --show-imports + "--show-imports", action="store_true", dest="show_imports", + help="List each module's imports.") + 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( # --show-sourcecode + '--show-sourcecode', action='store_true', dest='include_source_code', + help=("Include source code with syntax highlighting in the " + "HTML output. (default)")) + generation_group.add_option( # --no-sourcecode + '--no-sourcecode', action='store_false', dest='include_source_code', + help=("Do not include source code with syntax highlighting in the " + "HTML output.")) + + # Add options -- Output + output_group.add_option( # --output "--output", "-o", dest="target", metavar="PATH", help="The output directory. If PATH does not exist, then " "it will be created.") - options_group.add_option( # --show-imports - "--inheritance", dest="inheritance", metavar="STYLE", - help="The format for showing inheritance objects. STYLE " - "should be one of: %s." % ', '.join(INHERITANCE_STYLES)) - options_group.add_option( # --output - "--docformat", dest="docformat", metavar="NAME", - help="The default markup language for docstrings. Defaults " - "to \"%s\"." % DEFAULT_DOCFORMAT) - options_group.add_option( # --css + output_group.add_option( # --css "--css", dest="css", metavar="STYLESHEET", help="The CSS stylesheet. STYLESHEET can be either a " "builtin stylesheet or the name of a CSS file.") - options_group.add_option( # --name + output_group.add_option( # --name "--name", dest="prj_name", metavar="NAME", help="The documented project's name (for the navigation bar).") - options_group.add_option( # --url + output_group.add_option( # --url "--url", dest="prj_url", metavar="URL", help="The documented project's URL (for the navigation bar).") - options_group.add_option( # --navlink + output_group.add_option( # --navlink "--navlink", dest="prj_link", metavar="HTML", help="HTML code for a navigation link to place in the " "navigation bar.") - options_group.add_option( # --top + output_group.add_option( # --top "--top", dest="top_page", metavar="PAGE", help="The \"top\" page for the HTML documentation. PAGE can " "be a URL, the name of a module or class, or one of the " "special names \"trees.html\", \"indices.html\", or \"help.html\"") - options_group.add_option( # --help-file + output_group.add_option( # --help-file "--help-file", dest="help_file", metavar="FILE", help="An alternate help file. FILE should contain the body " "of an HTML file -- navigation bars will be added to it.") - options_group.add_option( # --frames + output_group.add_option( # --frames "--show-frames", action="store_true", dest="show_frames", help="Include frames in the HTML output. (default)") - options_group.add_option( # --no-frames + output_group.add_option( # --no-frames "--no-frames", action="store_false", dest="show_frames", help="Do not include frames in the HTML output.") - options_group.add_option( # --private - "--show-private", action="store_true", dest="show_private", - help="Include private variables in the output. (default)") - options_group.add_option( # --no-private - "--no-private", action="store_false", dest="show_private", - help="Do not include private variables in the output.") - options_group.add_option( # --show-imports - "--show-imports", action="store_true", dest="show_imports", - help="List each module's imports.") - options_group.add_option( # --show-imports - "--no-imports", action="store_false", dest="show_imports", - help="Do not list each module's imports. (default)") - options_group.add_option( # --quiet - "--quiet", "-q", action="count", dest="quiet", - help="Decrease the verbosity.") - options_group.add_option( # --verbose - "--verbose", "-v", action="count", dest="verbose", - help="Increase the verbosity.") - options_group.add_option( # --debug - "--debug", action="store_true", dest="debug", - help="Show full tracebacks for internal errors.") - options_group.add_option( # --parse-only - "--parse-only", action="store_false", dest="introspect", - help="Get all information from parsing (don't introspect)") - options_group.add_option( # --introspect-only - "--introspect-only", action="store_false", dest="parse", - help="Get all information from introspecting (don't parse)") - # this option is for developers, not users. - options_group.add_option( - "--profile-epydoc", action="store_true", dest="profile", - help=("Run the hotshot profiler on epydoc itself. Output " - "will be written to profile.out.")) - options_group.add_option( - "--dotpath", dest="dotpath", metavar='PATH', - help="The path to the Graphviz 'dot' executable.") - options_group.add_option( - '--config', action='append', dest="configfiles", metavar='FILE', - help=("A configuration file, specifying additional OPTIONS " - "and/or NAMES. This option may be repeated.")) - options_group.add_option( + output_group.add_option( # --separate-classes + '--separate-classes', action='store_true', + dest='list_classes_separately', + help=("When generating LaTeX or PDF output, list each class in " + "its own section, instead of listing them under their " + "containing module.")) + + # Add options -- Graph options + graph_group.add_option( '--graph', action='append', dest='graphs', metavar='GRAPHTYPE', help=("Include graphs of type GRAPHTYPE in the generated output. " "Graphs are generated using the Graphviz dot executable. " @@ -206,35 +219,32 @@ "to specify its location. This option may be repeated to " "include multiple graph types in the output. GRAPHTYPE " "should be one of: all, %s." % ', '.join(GRAPH_TYPES))) - options_group.add_option( + graph_group.add_option( + "--dotpath", dest="dotpath", metavar='PATH', + help="The path to the Graphviz 'dot' executable.") + graph_group.add_option( '--graph-font', dest='graph_font', metavar='FONT', help=("Specify the font used to generate Graphviz graphs. (e.g., " "helvetica or times).")) - options_group.add_option( + graph_group.add_option( '--graph-font-size', dest='graph_font_size', metavar='SIZE', help=("Specify the font size used to generate Graphviz graphs, " "in points.")) - options_group.add_option( - '--separate-classes', action='store_true', - dest='list_classes_separately', - help=("When generating LaTeX or PDF output, list each class in " - "its own section, instead of listing them under their " - "containing module.")) - options_group.add_option( - '--show-sourcecode', action='store_true', dest='include_source_code', - help=("Include source code with syntax highlighting in the " - "HTML output.")) - options_group.add_option( - '--no-sourcecode', action='store_false', dest='include_source_code', - help=("Do not include source code with syntax highlighting in the " - "HTML output.")) - options_group.add_option( + graph_group.add_option( '--pstat', action='append', dest='pstat_files', metavar='FILE', help="A pstat output file, to be used in generating call graphs.") + # this option is for developers, not users. + graph_group.add_option( + "--profile-epydoc", action="store_true", dest="profile", + help=SUPPRESS_HELP or + ("Run the hotshot profiler on epydoc itself. Output " + "will be written to profile.out.")) # Add the option groups. optparser.add_option_group(action_group) - optparser.add_option_group(options_group) + optparser.add_option_group(generation_group) + optparser.add_option_group(output_group) + optparser.add_option_group(graph_group) # Set the option parser's defaults. optparser.set_defaults(action="html", show_frames=True, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-02-11 16:02:12
|
Revision: 1461 http://svn.sourceforge.net/epydoc/?rev=1461&view=rev Author: edloper Date: 2007-02-11 08:02:10 -0800 (Sun, 11 Feb 2007) Log Message: ----------- - Added --simple-term option, which tells epydoc not to use any color or cursor control, even if the terminal appears to support it. Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2007-02-11 06:07:27 UTC (rev 1460) +++ trunk/epydoc/src/epydoc/cli.py 2007-02-11 16:02:10 UTC (rev 1461) @@ -106,6 +106,10 @@ optparser.add_option( # --debug "--debug", action="store_true", dest="debug", help="Show full tracebacks for internal errors.") + optparser.add_option( + "--simple-term", action="store_true", dest="simple_term", + help="Do not try to use color or cursor control when displaying " + "the progress bar, warnings, or errors.") # Add options -- Actions action_group.add_option( # --html @@ -264,7 +268,8 @@ debug=epydoc.DEBUG, profile=False, graphs=[], list_classes_separately=False, graph_font=None, graph_font_size=None, - include_source_code=True, pstat_files=[]) + include_source_code=True, pstat_files=[], + simple_term=False) # Parse the arguments. options, names = optparser.parse_args() @@ -410,6 +415,8 @@ options.include_source_code = _str_to_bool(val, optname) elif optname == 'pstat': options.pstat_files.extend(val.replace(',', ' ').split()) + elif optname in ('simple-term', 'simple_term'): + options.simple_term = _str_to_bool(val, optname) else: raise ValueError('Unknown option %s' % optname) @@ -436,6 +443,8 @@ # options.parse = False # Set up the logger + if options.simple_term: + TerminalController.FORCE_SIMPLE_TERM = True if options.action == 'text': logger = None # no logger for text output. elif options.verbosity > 1: @@ -797,9 +806,15 @@ _COLORS = """BLACK BLUE GREEN CYAN RED MAGENTA YELLOW WHITE""".split() _ANSICOLORS = "BLACK RED GREEN YELLOW BLUE MAGENTA CYAN WHITE".split() + #: If this is set to true, then new TerminalControllers will + #: assume that the terminal is not capable of doing manipulation + #: of any kind. + FORCE_SIMPLE_TERM = False + def __init__(self, term_stream=sys.stdout): # If the stream isn't a tty, then assume it has no capabilities. if not term_stream.isatty(): return + if self.FORCE_SIMPLE_TERM: return # Curses isn't available on all platforms try: import curses @@ -843,7 +858,7 @@ return re.sub(r'\$<\d+>[/*]?', '', cap) class ConsoleLogger(log.Logger): - def __init__(self, verbosity): + def __init__(self, verbosity, progress_mode=None): self._verbosity = verbosity self._progress = None self._message_blocks = [] @@ -863,9 +878,11 @@ # Set the progress bar mode. if verbosity >= 2: self._progress_mode = 'list' elif verbosity >= 0: - if self.term.COLS < 15: + if progress_mode is not None: + self._progress_mode = progress_mode + elif self.term.COLS < 15: self._progress_mode = 'simple-bar' - if self.term.BOL and self.term.CLEAR_EOL and self.term.UP: + elif self.term.BOL and self.term.CLEAR_EOL and self.term.UP: self._progress_mode = 'multiline-bar' elif self.term.BOL and self.term.CLEAR_LINE: self._progress_mode = 'bar' @@ -1062,11 +1079,11 @@ print class UnifiedProgressConsoleLogger(ConsoleLogger): - def __init__(self, verbosity, stages): + def __init__(self, verbosity, stages, progress_mode=None): self.stage = 0 self.stages = stages self.task = None - ConsoleLogger.__init__(self, verbosity) + ConsoleLogger.__init__(self, verbosity, progress_mode) def progress(self, percent, message=''): #p = float(self.stage-1+percent)/self.stages This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-02-11 16:53:57
|
Revision: 1462 http://svn.sourceforge.net/epydoc/?rev=1462&view=rev Author: edloper Date: 2007-02-11 08:53:49 -0800 (Sun, 11 Feb 2007) Log Message: ----------- - Added options to control return value:: --fail-on-error --fail-on-warning --fail-on-docstring-warning All three options cause epydoc to exit with status 1 if a message of the indicated level or higher is generated. This can be useful for e.g., incorperation into makefiles. (See sf bug 1558792) Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2007-02-11 16:02:10 UTC (rev 1461) +++ trunk/epydoc/src/epydoc/cli.py 2007-02-11 16:53:49 UTC (rev 1462) @@ -92,6 +92,7 @@ generation_group = OptionGroup(optparser, 'Generation options') output_group = OptionGroup(optparser, 'Output options') graph_group = OptionGroup(optparser, 'Graph options') + return_group = OptionGroup(optparser, 'Return value options') optparser.add_option( '--config', action='append', dest="configfiles", metavar='FILE', @@ -252,11 +253,29 @@ ("Run the hotshot profiler on epydoc itself. Output " "will be written to profile.out.")) + return_group.add_option( + "--fail-on-error", action="store_const", dest="fail_on", + const=log.ERROR, + help="Return a non-zero exit status, indicating failure, if any " + "errors are encountered.") + return_group.add_option( + "--fail-on-warning", action="store_const", dest="fail_on", + const=log.WARNING, + help="Return a non-zero exit status, indicating failure, if any " + "errors or warnings are encountered (not including docstring " + "warnings).") + return_group.add_option( + "--fail-on-docstring-warning", action="store_const", dest="fail_on", + const=log.DOCSTRING_WARNING, + help="Return a non-zero exit status, indicating failure, if any " + "errors or warnings are encountered (including docstring " + "warnings).") # Add the option groups. optparser.add_option_group(action_group) optparser.add_option_group(generation_group) optparser.add_option_group(output_group) optparser.add_option_group(graph_group) + optparser.add_option_group(return_group) # Set the option parser's defaults. optparser.set_defaults(action="html", show_frames=True, @@ -269,7 +288,7 @@ graphs=[], list_classes_separately=False, graph_font=None, graph_font_size=None, include_source_code=True, pstat_files=[], - simple_term=False) + simple_term=False, fail_on=None) # Parse the arguments. options, names = optparser.parse_args() @@ -417,6 +436,17 @@ options.pstat_files.extend(val.replace(',', ' ').split()) elif optname in ('simple-term', 'simple_term'): options.simple_term = _str_to_bool(val, optname) + elif optname in ('failon', 'fail-on', 'fail_on'): + if val.lower.strip() in ('error', 'errors'): + options.fail_on = log.ERROR + elif val.lower.strip() in ('warning', 'warnings'): + options.fail_on = log.WARNING + elif val.lower.strip() in ('docstring_warning', + 'docstring_warnings'): + options.fail_on = log.DOCSTRING_WARNING + else: + raise ValueError("%r expected one of: error, warning, " + "docstring_warning" % optname) else: raise ValueError('Unknown option %s' % optname) @@ -482,7 +512,8 @@ if options.action not in ('text', 'check', 'pickle'): if os.path.exists(options.target): if not os.path.isdir(options.target): - return log.error("%s is not a directory" % options.target) + log.error("%s is not a directory" % options.target) + sys.exit(1) # Set the default docformat from epydoc import docstringparser @@ -526,7 +557,10 @@ exclude_parse=options.exclude_parse) if docindex is None: - return # docbuilder already logged an error. + if log.ERROR in logger.reported_message_levels: + sys.exit(1) + else: + return # docbuilder already logged an error. # Load profile information, if it was given. if options.pstat_files: @@ -572,6 +606,13 @@ if options.verbosity >= 2 and logger is not None: logger.print_times() + # If we encountered any message types that we were requested to + # fail on, then exit with status 1. + if options.fail_on is not None: + max_reported_message_level = max(logger.reported_message_levels) + if max_reported_message_level >= options.fail_on: + sys.exit(1) + def write_html(docindex, options): from epydoc.docwriter.html import HTMLWriter html_writer = HTMLWriter(docindex, **options.__dict__) @@ -721,6 +762,8 @@ _profile() else: main(options, names) + except SystemExit: + raise except KeyboardInterrupt: print '\n\n' print >>sys.stderr, 'Keyboard interrupt.' @@ -733,7 +776,7 @@ print >>sys.stderr, ('\nUNEXPECTED ERROR:\n' '%s\n' % (str(e) or e.__class__.__name__)) print >>sys.stderr, 'Use --debug to see trace information.' - + def _profile(): # Hotshot profiler. if PROFILER == 'hotshot': @@ -867,6 +910,11 @@ # For per-task times: self._task_times = [] self._progress_header = None + + self.reported_message_levels = set() + """This set contains all the message levels (WARNING, ERROR, + etc) that have been reported. It is used by the options + --fail-on-warning etc to determine the return value.""" self.supressed_docstring_warning = 0 """This variable will be incremented once every time a @@ -932,6 +980,7 @@ return color+prefix+self.term.NORMAL+''.join(lines) def log(self, level, message): + self.reported_message_levels.add(level) if self._verbosity >= -2 and level >= log.ERROR: message = self._format(' Error: ', message, self.term.RED) elif self._verbosity >= -1 and level >= log.WARNING: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-02-13 21:59:12
|
Revision: 1478 http://svn.sourceforge.net/epydoc/?rev=1478&view=rev Author: edloper Date: 2007-02-13 13:59:10 -0800 (Tue, 13 Feb 2007) Log Message: ----------- - Added "--exclude" option, which does "--exclude-parse" and "--exclude-introspect" at the same time. It may be mixed freely with the other two exclude options. - Allow "--exclude"-type options to be repeated. E.g., "--exclude foo --exclude bar" is equivalent to "--exclude foo|bar" - Fixed bug 1658378 by changing args to ps2pdf to use "#" instead of "=". Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2007-02-13 20:27:31 UTC (rev 1477) +++ trunk/epydoc/src/epydoc/cli.py 2007-02-13 21:59:10 UTC (rev 1478) @@ -150,11 +150,18 @@ "--introspect-only", action="store_false", dest="parse", help="Get all information from introspecting (don't parse)") generation_group.add_option( # --exclude-introspect + "--exclude", dest="exclude", metavar="PATTERN", + action="append", + help="Exclude modules whose dotted name matches " + "the regular expression PATTERN") + generation_group.add_option( # --exclude-introspect "--exclude-introspect", dest="exclude_introspect", metavar="PATTERN", + action="append", help="Exclude introspection of modules whose dotted name matches " "the regular expression PATTERN") generation_group.add_option( # --exclude-parse "--exclude-parse", dest="exclude_parse", metavar="PATTERN", + action="append", help="Exclude parsing of modules whose dotted name matches " "the regular expression PATTERN") generation_group.add_option( # --inheritance @@ -288,7 +295,9 @@ graphs=[], list_classes_separately=False, graph_font=None, graph_font_size=None, include_source_code=True, pstat_files=[], - simple_term=False, fail_on=None) + simple_term=False, fail_on=None, + exclude=[], exclude_parse=[], + exclude_introspect=[]) # Parse the arguments. options, names = optparser.parse_args() @@ -551,10 +560,15 @@ else: # Build docs for the named values. from epydoc.docbuilder import build_doc_index + exclude_parse = '|'.join(options.exclude_parse+options.exclude) + exclude_introspect = '|'.join(options.exclude_introspect+ + options.exclude) + log.warning('exclude parse', `exclude_parse`) + log.warning('exclude introspect', `exclude_introspect`) docindex = build_doc_index(names, options.introspect, options.parse, add_submodules=(options.action!='text'), - exclude_introspect=options.exclude_introspect, - exclude_parse=options.exclude_parse) + exclude_introspect=exclude_introspect, + exclude_parse=exclude_parse) if docindex is None: if log.ERROR in logger.reported_message_levels: @@ -722,9 +736,9 @@ running = 'ps2pdf' log.progress(5./steps, 'ps2pdf') run_subprocess( - 'ps2pdf -sPAPERSIZE=letter -dMaxSubsetPct=100 ' - '-dSubsetFonts=true -dCompatibilityLevel=1.2 ' - '-dEmbedAllFonts=true api.ps api.pdf') + 'ps2pdf -sPAPERSIZE#letter -dMaxSubsetPct#100 ' + '-dSubsetFonts#true -dCompatibilityLevel#1.2 ' + '-dEmbedAllFonts#true api.ps api.pdf') except RunSubprocessError, e: if running == 'latex': e.out = re.sub(r'(?sm)\A.*?!( LaTeX Error:)?', r'', e.out) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-02-13 22:04:58
|
Revision: 1480 http://svn.sourceforge.net/epydoc/?rev=1480&view=rev Author: edloper Date: 2007-02-13 14:04:45 -0800 (Tue, 13 Feb 2007) Log Message: ----------- - Removed debug printfs Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2007-02-13 22:01:15 UTC (rev 1479) +++ trunk/epydoc/src/epydoc/cli.py 2007-02-13 22:04:45 UTC (rev 1480) @@ -563,8 +563,6 @@ exclude_parse = '|'.join(options.exclude_parse+options.exclude) exclude_introspect = '|'.join(options.exclude_introspect+ options.exclude) - log.warning('exclude parse', `exclude_parse`) - log.warning('exclude introspect', `exclude_introspect`) docindex = build_doc_index(names, options.introspect, options.parse, add_submodules=(options.action!='text'), exclude_introspect=exclude_introspect, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-02-14 02:19:03
|
Revision: 1492 http://svn.sourceforge.net/epydoc/?rev=1492&view=rev Author: edloper Date: 2007-02-13 18:19:00 -0800 (Tue, 13 Feb 2007) Log Message: ----------- - Fixed title in epydoc-log.html Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2007-02-14 02:16:36 UTC (rev 1491) +++ trunk/epydoc/src/epydoc/cli.py 2007-02-14 02:19:00 UTC (rev 1492) @@ -1194,7 +1194,7 @@ "DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> - <title>$title$</title> + <title>Epydoc Log</title> <link rel="stylesheet" href="epydoc.css" type="text/css" /> </head> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-02-16 05:37:01
|
Revision: 1515 http://svn.sourceforge.net/epydoc/?rev=1515&view=rev Author: edloper Date: 2007-02-15 21:36:58 -0800 (Thu, 15 Feb 2007) Log Message: ----------- - Added support for "--help TOPIC" - If the target directory does not exist when the --include-log option is used, then create it. - Changed exit status for --fail-on-error etc from 1 to 2. When exiting because of an internal error, use exit status 3. Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2007-02-16 05:35:01 UTC (rev 1514) +++ trunk/epydoc/src/epydoc/cli.py 2007-02-16 05:36:58 UTC (rev 1515) @@ -74,6 +74,7 @@ from epydoc.apidoc import UNKNOWN from epydoc.compat import * import ConfigParser +from epydoc.docwriter.html_css import STYLESHEETS as CSS_STYLESHEETS INHERITANCE_STYLES = ('grouped', 'listed', 'included') GRAPH_TYPES = ('classtree', 'callgraph', 'umlclasstree') @@ -82,6 +83,42 @@ PROFILER = 'hotshot' #: Which profiler to use: 'hotshot' or 'profile' ###################################################################### +#{ Help Topics +###################################################################### + +DOCFORMATS = ('epytext', 'plaintext', 'restructuredtext', 'javadoc') +HELP_TOPICS = { + 'docformat': textwrap.dedent('''\ + __docformat__ is a module variable that specifies the markup + language for the docstrings in a module. Its value is a + string, consisting the name of a markup language, optionally + followed by a language code (such as "en" for English). Epydoc + currently recognizes the following markup language names: + ''' + ', '.join(DOCFORMATS)), + 'inheritance': textwrap.dedent('''\ + The following inheritance formats are currently supported: + - grouped: inherited objects are gathered into groups, + based on what class they were inherited from. + - listed: inherited objects are listed in a short list + at the end of their section. + - included: inherited objects are mixed in with + non-inherited objects.'''), + 'css': textwrap.dedent( + 'The following built-in CSS stylesheets are available:\n' + + '\n'.join([' %10s: %s' % (key, descr) + for (key, (sheet, descr)) + in CSS_STYLESHEETS.items()])), + #'checks': textwrap.dedent('''\ + # + # '''), + } + + +HELP_TOPICS['topics'] = wordwrap( + 'Epydoc can provide additional help for the following topics: ' + + ', '.join(['%r' % topic for topic in HELP_TOPICS.keys()])) + +###################################################################### #{ Argument & Config File Parsing ###################################################################### @@ -96,9 +133,9 @@ def parse_arguments(): # Construct the option parser. - usage = '%prog ACTION [options] NAMES...' + usage = '%prog [ACTION] [options] NAMES...' version = "Epydoc, version %s" % epydoc.__version__ - optparser = OptionParser(usage=usage, version=version) + optparser = OptionParser(usage=usage, add_help_option=False) action_group = OptionGroup(optparser, 'Actions') generation_group = OptionGroup(optparser, 'Generation options') output_group = OptionGroup(optparser, 'Output options') @@ -122,7 +159,7 @@ "--simple-term", action="store_true", dest="simple_term", help="Do not try to use color or cursor control when displaying " "the progress bar, warnings, or errors.") - + # Add options -- Actions action_group.add_option( # --html "--html", action="store_const", dest="action", const="html", @@ -148,6 +185,15 @@ action_group.add_option( "--pickle", action="store_const", dest="action", const="pickle", help="Write the documentation to a pickle file.") + # Provide our own --help and --version options. + action_group.add_option( + "--version", action="store_const", dest="action", const="version", + help="Show epydoc's version number and exit.") + action_group.add_option( + "-h", "--help", action="store_const", dest="action", const="help", + help="Show this message and exit. For help on specific " + "topics, use \"--help TOPIC\". Use \"--help topics\" for a " + "list of available help topics") # Add options -- Generation generation_group.add_option( # --docformat @@ -191,9 +237,6 @@ 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 " @@ -202,6 +245,9 @@ '--no-sourcecode', action='store_false', dest='include_source_code', help=("Do not include source code with syntax highlighting in the " "HTML output.")) + 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)")) # Add options -- Output output_group.add_option( # --output @@ -303,6 +349,22 @@ # Parse the arguments. options, names = optparser.parse_args() + + # Print help message, if requested. We also provide support for + # --help [topic] + if options.action == 'help': + names = set([n.lower() for n in names]) + for (topic, msg) in HELP_TOPICS.items(): + if topic.lower() in names: + print '\n' + msg.rstrip() + '\n' + sys.exit(0) + optparser.print_help() + sys.exit(0) + + # Print version message, if requested. + if options.action == 'version': + print version + sys.exit(0) # Process any config files. if options.configfiles: @@ -529,6 +591,8 @@ if options.include_log: if options.action == 'html': + if not os.path.exists(options.target): + os.mkdir(options.target) log.register_logger(HTMLLogger(options.target, options)) else: log.warning("--include-log requires --html") @@ -628,11 +692,11 @@ logger.print_times() # If we encountered any message types that we were requested to - # fail on, then exit with status 1. + # fail on, then exit with status 2. if options.fail_on is not None: max_reported_message_level = max(logger.reported_message_levels) if max_reported_message_level >= options.fail_on: - sys.exit(1) + sys.exit(2) def write_html(docindex, options): from epydoc.docwriter.html import HTMLWriter @@ -800,6 +864,7 @@ print >>sys.stderr, ('\nUNEXPECTED ERROR:\n' '%s\n' % (str(e) or e.__class__.__name__)) print >>sys.stderr, 'Use --debug to see trace information.' + sys.exit(3) def _profile(): # Hotshot profiler. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-02-16 07:23:37
|
Revision: 1518 http://svn.sourceforge.net/epydoc/?rev=1518&view=rev Author: edloper Date: 2007-02-15 23:23:36 -0800 (Thu, 15 Feb 2007) Log Message: ----------- - minor HTML change: in epydoc-log.html options table, use valign=top Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2007-02-16 06:13:56 UTC (rev 1517) +++ trunk/epydoc/src/epydoc/cli.py 2007-02-16 07:23:36 UTC (rev 1518) @@ -1289,8 +1289,9 @@ 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>' % + msg += ('<tr valign="top" class="%s"><td valign="top">%s</td>' + '<td valign="top"><tt> = </tt></td>' + '<td valign="top"><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) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2007-02-18 14:05:47
|
Revision: 1530 http://svn.sourceforge.net/epydoc/?rev=1530&view=rev Author: dvarrazzo Date: 2007-02-18 06:05:45 -0800 (Sun, 18 Feb 2007) Log Message: ----------- - configuration file up-to-date with command line - command line source code reformatted. Dropped those comments always out of date... Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2007-02-18 12:34:08 UTC (rev 1529) +++ trunk/epydoc/src/epydoc/cli.py 2007-02-18 14:05:45 UTC (rev 1530) @@ -136,213 +136,252 @@ usage = '%prog [ACTION] [options] NAMES...' version = "Epydoc, version %s" % epydoc.__version__ optparser = OptionParser(usage=usage, add_help_option=False) - action_group = OptionGroup(optparser, 'Actions') - generation_group = OptionGroup(optparser, 'Generation options') - output_group = OptionGroup(optparser, 'Output options') - graph_group = OptionGroup(optparser, 'Graph options') - return_group = OptionGroup(optparser, 'Return value options') - optparser.add_option( - '--config', action='append', dest="configfiles", metavar='FILE', + optparser.add_option('--config', + action='append', dest="configfiles", metavar='FILE', help=("A configuration file, specifying additional OPTIONS " "and/or NAMES. This option may be repeated.")) - optparser.add_option( # --quiet - "--quiet", "-q", action="count", dest="quiet", + + optparser.add_option("--output", "-o", + dest="target", metavar="PATH", + help="The output directory. If PATH does not exist, then " + "it will be created.") + + optparser.add_option("--quiet", "-q", + action="count", dest="quiet", help="Decrease the verbosity.") - optparser.add_option( # --verbose - "--verbose", "-v", action="count", dest="verbose", + + optparser.add_option("--verbose", "-v", + action="count", dest="verbose", help="Increase the verbosity.") - optparser.add_option( # --debug - "--debug", action="store_true", dest="debug", + + optparser.add_option("--debug", + action="store_true", dest="debug", help="Show full tracebacks for internal errors.") - optparser.add_option( - "--simple-term", action="store_true", dest="simple_term", + + optparser.add_option("--simple-term", + action="store_true", dest="simple_term", help="Do not try to use color or cursor control when displaying " "the progress bar, warnings, or errors.") - - # Add options -- Actions - action_group.add_option( # --html - "--html", action="store_const", dest="action", const="html", + + + action_group = OptionGroup(optparser, 'Actions') + optparser.add_option_group(action_group) + + action_group.add_option("--html", + action="store_const", dest="action", const="html", help="Write HTML output.") - action_group.add_option( # --latex - "--text", action="store_const", dest="action", const="text", + + action_group.add_option("--text", + action="store_const", dest="action", const="text", help="Write plaintext output. (not implemented yet)") - action_group.add_option( # --latex - "--latex", action="store_const", dest="action", const="latex", + + action_group.add_option("--latex", + action="store_const", dest="action", const="latex", help="Write LaTeX output.") - action_group.add_option( # --dvi - "--dvi", action="store_const", dest="action", const="dvi", + + action_group.add_option("--dvi", + action="store_const", dest="action", const="dvi", help="Write DVI output.") - action_group.add_option( # --ps - "--ps", action="store_const", dest="action", const="ps", + + action_group.add_option("--ps", + action="store_const", dest="action", const="ps", help="Write Postscript output.") - action_group.add_option( # --pdf - "--pdf", action="store_const", dest="action", const="pdf", + + action_group.add_option("--pdf", + action="store_const", dest="action", const="pdf", help="Write PDF output.") - action_group.add_option( # --check - "--check", action="store_const", dest="action", const="check", + + action_group.add_option("--check", + action="store_const", dest="action", const="check", help="Check completeness of docs.") - action_group.add_option( - "--pickle", action="store_const", dest="action", const="pickle", + + action_group.add_option("--pickle", + action="store_const", dest="action", const="pickle", help="Write the documentation to a pickle file.") + # Provide our own --help and --version options. - action_group.add_option( - "--version", action="store_const", dest="action", const="version", + action_group.add_option("--version", + action="store_const", dest="action", const="version", help="Show epydoc's version number and exit.") - action_group.add_option( - "-h", "--help", action="store_const", dest="action", const="help", + + action_group.add_option("-h", "--help", + action="store_const", dest="action", const="help", help="Show this message and exit. For help on specific " "topics, use \"--help TOPIC\". Use \"--help topics\" for a " "list of available help topics") - # Add options -- Generation - generation_group.add_option( # --docformat - "--docformat", dest="docformat", metavar="NAME", + + generation_group = OptionGroup(optparser, 'Generation options') + optparser.add_option_group(generation_group) + + generation_group.add_option("--docformat", + dest="docformat", metavar="NAME", help="The default markup language for docstrings. Defaults " "to \"%s\"." % DEFAULT_DOCFORMAT) - generation_group.add_option( # --parse-only - "--parse-only", action="store_false", dest="introspect", + + generation_group.add_option("--parse-only", + action="store_false", dest="introspect", help="Get all information from parsing (don't introspect)") - generation_group.add_option( # --introspect-only - "--introspect-only", action="store_false", dest="parse", + + generation_group.add_option("--introspect-only", + action="store_false", dest="parse", help="Get all information from introspecting (don't parse)") - generation_group.add_option( # --exclude-introspect - "--exclude", dest="exclude", metavar="PATTERN", - action="append", + + generation_group.add_option("--exclude", + dest="exclude", metavar="PATTERN", action="append", help="Exclude modules whose dotted name matches " "the regular expression PATTERN") - generation_group.add_option( # --exclude-introspect - "--exclude-introspect", dest="exclude_introspect", metavar="PATTERN", - action="append", + + generation_group.add_option("--exclude-introspect", + dest="exclude_introspect", metavar="PATTERN", action="append", help="Exclude introspection of modules whose dotted name matches " "the regular expression PATTERN") - generation_group.add_option( # --exclude-parse - "--exclude-parse", dest="exclude_parse", metavar="PATTERN", - action="append", + + generation_group.add_option("--exclude-parse", + dest="exclude_parse", metavar="PATTERN", action="append", help="Exclude parsing of modules whose dotted name matches " "the regular expression PATTERN") - generation_group.add_option( # --inheritance - "--inheritance", dest="inheritance", metavar="STYLE", + + generation_group.add_option("--inheritance", + dest="inheritance", metavar="STYLE", help="The format for showing inheritance objects. STYLE " "should be one of: %s." % ', '.join(INHERITANCE_STYLES)) - generation_group.add_option( # --show-private - "--show-private", action="store_true", dest="show_private", + + generation_group.add_option("--show-private", + action="store_true", dest="show_private", help="Include private variables in the output. (default)") - generation_group.add_option( # --no-private - "--no-private", action="store_false", dest="show_private", + + generation_group.add_option("--no-private", + action="store_false", dest="show_private", help="Do not include private variables in the output.") - generation_group.add_option( # --show-imports - "--show-imports", action="store_true", dest="show_imports", + + generation_group.add_option("--show-imports", + action="store_true", dest="show_imports", help="List each module's imports.") - generation_group.add_option( # --no-imports - "--no-imports", action="store_false", dest="show_imports", + + generation_group.add_option("--no-imports", + action="store_false", dest="show_imports", help="Do not list each module's imports. (default)") - generation_group.add_option( # --show-sourcecode - '--show-sourcecode', action='store_true', dest='include_source_code', + + generation_group.add_option('--show-sourcecode', + action='store_true', dest='include_source_code', help=("Include source code with syntax highlighting in the " "HTML output. (default)")) - generation_group.add_option( # --no-sourcecode - '--no-sourcecode', action='store_false', dest='include_source_code', + + generation_group.add_option('--no-sourcecode', + action='store_false', dest='include_source_code', help=("Do not include source code with syntax highlighting in the " "HTML output.")) - generation_group.add_option( # --include-log - '--include-log', action='store_true', dest='include_log', + + generation_group.add_option('--include-log', + action='store_true', dest='include_log', help=("Include a page with the process log (epydoc-log.html)")) - # Add options -- Output - output_group.add_option( # --output - "--output", "-o", dest="target", metavar="PATH", - help="The output directory. If PATH does not exist, then " - "it will be created.") - output_group.add_option( # --css - "--css", dest="css", metavar="STYLESHEET", + + output_group = OptionGroup(optparser, 'Output options') + optparser.add_option_group(output_group) + + output_group.add_option("--name", + dest="prj_name", metavar="NAME", + help="The documented project's name (for the navigation bar).") + + output_group.add_option("--css", + dest="css", metavar="STYLESHEET", help="The CSS stylesheet. STYLESHEET can be either a " "builtin stylesheet or the name of a CSS file.") - output_group.add_option( # --name - "--name", dest="prj_name", metavar="NAME", - help="The documented project's name (for the navigation bar).") - output_group.add_option( # --url - "--url", dest="prj_url", metavar="URL", + + output_group.add_option("--url", + dest="prj_url", metavar="URL", help="The documented project's URL (for the navigation bar).") - output_group.add_option( # --navlink - "--navlink", dest="prj_link", metavar="HTML", + + output_group.add_option("--navlink", + dest="prj_link", metavar="HTML", help="HTML code for a navigation link to place in the " "navigation bar.") - output_group.add_option( # --top - "--top", dest="top_page", metavar="PAGE", + + output_group.add_option("--top", + dest="top_page", metavar="PAGE", help="The \"top\" page for the HTML documentation. PAGE can " "be a URL, the name of a module or class, or one of the " "special names \"trees.html\", \"indices.html\", or \"help.html\"") - output_group.add_option( # --help-file - "--help-file", dest="help_file", metavar="FILE", + + output_group.add_option("--help-file", + dest="help_file", metavar="FILE", help="An alternate help file. FILE should contain the body " "of an HTML file -- navigation bars will be added to it.") - output_group.add_option( # --frames - "--show-frames", action="store_true", dest="show_frames", + + output_group.add_option("--show-frames", + action="store_true", dest="show_frames", help="Include frames in the HTML output. (default)") - output_group.add_option( # --no-frames - "--no-frames", action="store_false", dest="show_frames", + + output_group.add_option("--no-frames", + action="store_false", dest="show_frames", help="Do not include frames in the HTML output.") - output_group.add_option( # --separate-classes - '--separate-classes', action='store_true', - dest='list_classes_separately', + + output_group.add_option('--separate-classes', + action='store_true', dest='list_classes_separately', help=("When generating LaTeX or PDF output, list each class in " "its own section, instead of listing them under their " "containing module.")) - # Add options -- Graph options - graph_group.add_option( - '--graph', action='append', dest='graphs', metavar='GRAPHTYPE', + graph_group = OptionGroup(optparser, 'Graph options') + optparser.add_option_group(graph_group) + + graph_group.add_option('--graph', + action='append', dest='graphs', metavar='GRAPHTYPE', help=("Include graphs of type GRAPHTYPE in the generated output. " "Graphs are generated using the Graphviz dot executable. " "If this executable is not on the path, then use --dotpath " "to specify its location. This option may be repeated to " "include multiple graph types in the output. GRAPHTYPE " "should be one of: all, %s." % ', '.join(GRAPH_TYPES))) - graph_group.add_option( - "--dotpath", dest="dotpath", metavar='PATH', + + graph_group.add_option("--dotpath", + dest="dotpath", metavar='PATH', help="The path to the Graphviz 'dot' executable.") - graph_group.add_option( - '--graph-font', dest='graph_font', metavar='FONT', + + graph_group.add_option('--graph-font', + dest='graph_font', metavar='FONT', help=("Specify the font used to generate Graphviz graphs. (e.g., " "helvetica or times).")) - graph_group.add_option( - '--graph-font-size', dest='graph_font_size', metavar='SIZE', + + graph_group.add_option('--graph-font-size', + dest='graph_font_size', metavar='SIZE', help=("Specify the font size used to generate Graphviz graphs, " "in points.")) - graph_group.add_option( - '--pstat', action='append', dest='pstat_files', metavar='FILE', + + graph_group.add_option('--pstat', + action='append', dest='pstat_files', metavar='FILE', help="A pstat output file, to be used in generating call graphs.") + # this option is for developers, not users. - graph_group.add_option( - "--profile-epydoc", action="store_true", dest="profile", + graph_group.add_option("--profile-epydoc", + action="store_true", dest="profile", help=SUPPRESS_HELP or ("Run the hotshot profiler on epydoc itself. Output " "will be written to profile.out.")) - return_group.add_option( - "--fail-on-error", action="store_const", dest="fail_on", - const=log.ERROR, + + return_group = OptionGroup(optparser, 'Return value options') + optparser.add_option_group(return_group) + + return_group.add_option("--fail-on-error", + action="store_const", dest="fail_on", const=log.ERROR, help="Return a non-zero exit status, indicating failure, if any " "errors are encountered.") - return_group.add_option( - "--fail-on-warning", action="store_const", dest="fail_on", - const=log.WARNING, + + return_group.add_option("--fail-on-warning", + action="store_const", dest="fail_on", const=log.WARNING, help="Return a non-zero exit status, indicating failure, if any " "errors or warnings are encountered (not including docstring " "warnings).") - return_group.add_option( - "--fail-on-docstring-warning", action="store_const", dest="fail_on", - const=log.DOCSTRING_WARNING, + + return_group.add_option("--fail-on-docstring-warning", + action="store_const", dest="fail_on", const=log.DOCSTRING_WARNING, help="Return a non-zero exit status, indicating failure, if any " "errors or warnings are encountered (including docstring " "warnings).") - # Add the option groups. - optparser.add_option_group(action_group) - optparser.add_option_group(generation_group) - optparser.add_option_group(output_group) - optparser.add_option_group(graph_group) - optparser.add_option_group(return_group) # Set the option parser's defaults. optparser.set_defaults(**OPTION_DEFAULTS) @@ -445,27 +484,56 @@ for optname in configparser.options('epydoc'): val = configparser.get('epydoc', optname, vars=os.environ).strip() optname = optname.lower().strip() + if optname in ('modules', 'objects', 'values', 'module', 'object', 'value'): names.extend(val.replace(',', ' ').split()) + elif optname == 'target': + options.target = val elif optname == 'output': if val.lower() not in ACTIONS: raise ValueError('"%s" expected one of: %s' % (optname, ', '.join(ACTIONS))) options.action = val.lower() - elif optname == 'target': - options.target = val + elif optname == 'verbosity': + options.verbosity = _str_to_int(val, optname) + elif optname == 'debug': + options.debug = _str_to_bool(val, optname) + elif optname in ('simple-term', 'simple_term'): + options.simple_term = _str_to_bool(val, optname) + + # Generation options + elif optname == 'docformat': + options.docformat = val + elif optname == 'parse': + options.parse = _str_to_bool(val, optname) + elif optname == 'introspect': + options.introspect = _str_to_bool(val, optname) + elif optname == 'exclude': + options.exclude.append(val) + elif optname in ('exclude-parse', 'exclude_parse'): + options.exclude_parse.append(val) + elif optname in ('exclude-introspect', 'exclude_introspect'): + options.exclude_introspect.append(val) elif optname == 'inheritance': if val.lower() not in INHERITANCE_STYLES: raise ValueError('"%s" expected one of: %s.' % (optname, ', '.join(INHERITANCE_STYLES))) options.inerhitance = val.lower() - elif optname == 'docformat': - options.docformat = val + elif optname =='private': + options.private = _str_to_bool(val, optname) + elif optname =='imports': + options.imports = _str_to_bool(val, optname) + elif optname == 'sourcecode': + options.include_source_code = _str_to_bool(val, optname) + elif optname in ('include-log', 'include_log'): + options.include_log = _str_to_bool(val, optname) + + # Output options + elif optname == 'name': + options.prj_name = val elif optname == 'css': options.css = val - elif optname == 'name': - options.prj_name = val elif optname == 'url': options.prj_url = val elif optname == 'link': @@ -476,21 +544,10 @@ options.help_file = val elif optname =='frames': options.show_frames = _str_to_bool(val, optname) - elif optname =='private': - options.private = _str_to_bool(val, optname) - elif optname =='imports': - options.imports = _str_to_bool(val, optname) - elif optname == 'verbosity': - try: - options.verbosity = int(val) - except ValueError: - raise ValueError('"%s" expected an int' % optname) - elif optname == 'parse': - options.parse = _str_to_bool(val, optname) - elif optname == 'introspect': - options.introspect = _str_to_bool(val, optname) - elif optname == 'dotpath': - options.dotpath = val + elif optname in ('separate-classes', 'separate_classes'): + options.list_classes_separately = _str_to_bool(val, optname) + + # Graph options elif optname == 'graph': graphtypes = val.replace(',', '').split() for graphtype in graphtypes: @@ -498,18 +555,16 @@ raise ValueError('"%s" expected one of: all, %s.' % (optname, ', '.join(GRAPH_TYPES))) options.graphs.extend(graphtypes) + elif optname == 'dotpath': + options.dotpath = val elif optname in ('graph-font', 'graph_font'): options.graph_font = val elif optname in ('graph-font-size', 'graph_font_size'): - options.graph_font_size = int(val) - elif optname in ('separate-classes', 'separate_classes'): - options.list_classes_separately = _str_to_bool(val, optname) - elif optname == 'sourcecode': - options.include_source_code = _str_to_bool(val, optname) + options.graph_font_size = _str_to_int(val) elif optname == 'pstat': options.pstat_files.extend(val.replace(',', ' ').split()) - elif optname in ('simple-term', 'simple_term'): - options.simple_term = _str_to_bool(val, optname) + + # Return value options elif optname in ('failon', 'fail-on', 'fail_on'): if val.lower.strip() in ('error', 'errors'): options.fail_on = log.ERROR @@ -532,6 +587,12 @@ else: raise ValueError('"%s" option expected a boolean' % optname) +def _str_to_int(val, optname): + try: + return int(val) + except ValueError: + raise ValueError('"%s" option expected an int' % optname) + ###################################################################### #{ Interface ###################################################################### This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2007-03-14 01:53:15
|
Revision: 1585 http://svn.sourceforge.net/epydoc/?rev=1585&view=rev Author: dvarrazzo Date: 2007-03-13 18:53:14 -0700 (Tue, 13 Mar 2007) Log Message: ----------- - Fixed external API root and file: more than one can be specified now. Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2007-03-13 21:57:48 UTC (rev 1584) +++ trunk/epydoc/src/epydoc/cli.py 2007-03-14 01:53:14 UTC (rev 1585) @@ -506,7 +506,7 @@ if optname in ('modules', 'objects', 'values', 'module', 'object', 'value'): - names.extend(val.replace(',', ' ').split()) + names.extend(_str_to_list(val)) elif optname == 'target': options.target = val elif optname == 'output': @@ -529,11 +529,11 @@ elif optname == 'introspect': options.introspect = _str_to_bool(val, optname) elif optname == 'exclude': - options.exclude.append(val) + options.exclude.extend(_str_to_list(val)) elif optname in ('exclude-parse', 'exclude_parse'): - options.exclude_parse.append(val) + options.exclude_parse.extend(_str_to_list(val)) elif optname in ('exclude-introspect', 'exclude_introspect'): - options.exclude_introspect.append(val) + options.exclude_introspect.extend(_str_to_list(val)) elif optname == 'inheritance': if val.lower() not in INHERITANCE_STYLES: raise ValueError('"%s" expected one of: %s.' % @@ -568,15 +568,15 @@ # External API elif optname in ('external-api', 'external_api'): - options.external_api.extend(val.replace(',', ' ').split()) + options.external_api.extend(_str_to_list(val)) elif optname in ('external-api-file', 'external_api_file'): - options.external_api_file.append(val) + options.external_api_file.extend(_str_to_list(val)) elif optname in ('external-api-root', 'external_api_root'): - options.external_api_root.append(val) + options.external_api_root.extend(_str_to_list(val)) # Graph options elif optname == 'graph': - graphtypes = val.replace(',', '').split() + graphtypes = _str_to_list(val) for graphtype in graphtypes: if graphtype not in GRAPH_TYPES + ('all',): raise ValueError('"%s" expected one of: all, %s.' % @@ -589,7 +589,7 @@ elif optname in ('graph-font-size', 'graph_font_size'): options.graph_font_size = _str_to_int(val, optname) elif optname == 'pstat': - options.pstat_files.extend(val.replace(',', ' ').split()) + options.pstat_files.extend(_str_to_list(val)) # Return value options elif optname in ('failon', 'fail-on', 'fail_on'): @@ -620,6 +620,9 @@ except ValueError: raise ValueError('"%s" option expected an int' % optname) +def _str_to_list(val): + return val.replace(',', ' ').split() + ###################################################################### #{ Interface ###################################################################### This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-09-23 04:19:58
|
Revision: 1610 http://epydoc.svn.sourceforge.net/epydoc/?rev=1610&view=rev Author: edloper Date: 2007-09-22 21:19:57 -0700 (Sat, 22 Sep 2007) Log Message: ----------- - Fixed 3 bugs in config file parsing, that resulted in options getting ignored (sf bug 1721683) Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2007-09-23 04:11:50 UTC (rev 1609) +++ trunk/epydoc/src/epydoc/cli.py 2007-09-23 04:19:57 UTC (rev 1610) @@ -538,11 +538,11 @@ if val.lower() not in INHERITANCE_STYLES: raise ValueError('"%s" expected one of: %s.' % (optname, ', '.join(INHERITANCE_STYLES))) - options.inerhitance = val.lower() + options.inheritance = val.lower() elif optname =='private': - options.private = _str_to_bool(val, optname) + options.show_private = _str_to_bool(val, optname) elif optname =='imports': - options.imports = _str_to_bool(val, optname) + options.show_imports = _str_to_bool(val, optname) elif optname == 'sourcecode': options.include_source_code = _str_to_bool(val, optname) elif optname in ('include-log', 'include_log'): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-09-24 00:48:16
|
Revision: 1627 http://epydoc.svn.sourceforge.net/epydoc/?rev=1627&view=rev Author: edloper Date: 2007-09-23 17:48:14 -0700 (Sun, 23 Sep 2007) Log Message: ----------- - Use cProfiler, if it's available, for --profile-epydoc Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2007-09-24 00:33:58 UTC (rev 1626) +++ trunk/epydoc/src/epydoc/cli.py 2007-09-24 00:48:14 UTC (rev 1627) @@ -86,7 +86,7 @@ GRAPH_TYPES = ('classtree', 'callgraph', 'umlclasstree') ACTIONS = ('html', 'text', 'latex', 'dvi', 'ps', 'pdf', 'check') DEFAULT_DOCFORMAT = 'epytext' -PROFILER = 'hotshot' #: Which profiler to use: 'hotshot' or 'profile' +PROFILER = 'profile' #: Which profiler to use: 'hotshot' or 'profile' ###################################################################### #{ Help Topics @@ -992,16 +992,21 @@ # Standard 'profile' profiler. elif PROFILER == 'profile': - try: from profile import Profile + # cProfile module was added in Python 2.5 -- use it if its' + # available, since it's faster. + try: from cProfile import Profile except ImportError: - print >>sys.stderr, "Could not import profile module!" - return + try: from profile import Profile + except ImportError: + print >>sys.stderr, "Could not import profile module!" + return # There was a bug in Python 2.4's profiler. Check if it's # present, and if so, fix it. (Bug was fixed in 2.4maint: # <http://mail.python.org/pipermail/python-checkins/ # 2005-September/047099.html>) - if (Profile.dispatch['c_exception'] is + if (hasattr(Profile, 'dispatch') and + Profile.dispatch['c_exception'] is Profile.trace_dispatch_exception.im_func): trace_dispatch_return = Profile.trace_dispatch_return.im_func Profile.dispatch['c_exception'] = trace_dispatch_return This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-01-31 01:18:19
|
Revision: 1699 http://epydoc.svn.sourceforge.net/epydoc/?rev=1699&view=rev Author: edloper Date: 2008-01-30 17:18:16 -0800 (Wed, 30 Jan 2008) Log Message: ----------- - Minor change in help string for --suppress-timestamp Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2008-01-31 01:09:38 UTC (rev 1698) +++ trunk/epydoc/src/epydoc/cli.py 2008-01-31 01:18:16 UTC (rev 1699) @@ -346,8 +346,7 @@ output_group.add_option('--suppress-timestamp', action='store_false', dest='include_timestamp', - help=("When generating HTML output, suppress the timestamp at " - "the bottom of each page.")) + help=("Do not include a timestamp in the generated output.")) # The group of external API options. # Skip if the module couldn't be imported (usually missing docutils) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-01-31 06:50:06
|
Revision: 1702 http://epydoc.svn.sourceforge.net/epydoc/?rev=1702&view=rev Author: edloper Date: 2008-01-30 22:50:04 -0800 (Wed, 30 Jan 2008) Log Message: ----------- - Pass options to plaintext writer Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2008-01-31 06:49:44 UTC (rev 1701) +++ trunk/epydoc/src/epydoc/cli.py 2008-01-31 06:50:04 UTC (rev 1702) @@ -950,7 +950,7 @@ plaintext_writer = PlaintextWriter() s = '' for apidoc in docindex.root: - s += plaintext_writer.write(apidoc) + s += plaintext_writer.write(apidoc, **options.__dict__) log.end_progress() if isinstance(s, unicode): s = s.encode('ascii', 'backslashreplace') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-01 19:18:39
|
Revision: 1705 http://epydoc.svn.sourceforge.net/epydoc/?rev=1705&view=rev Author: edloper Date: 2008-02-01 11:18:37 -0800 (Fri, 01 Feb 2008) Log Message: ----------- - Fixed typo from previous checkin Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2008-02-01 19:15:34 UTC (rev 1704) +++ trunk/epydoc/src/epydoc/cli.py 2008-02-01 19:18:37 UTC (rev 1705) @@ -822,9 +822,10 @@ # Basic timing breakdown: if options.verbosity >= 2: - for logger in logger: + for logger in loggers: if isinstance(logger, ConsoleLogger): logger.print_times() + break # If we encountered any message types that we were requested to # fail on, then exit with status 2. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-01 19:21:56
|
Revision: 1706 http://epydoc.svn.sourceforge.net/epydoc/?rev=1706&view=rev Author: edloper Date: 2008-02-01 11:21:54 -0800 (Fri, 01 Feb 2008) Log Message: ----------- - Fixed a minor bug introduced in svn 1704 Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2008-02-01 19:18:37 UTC (rev 1705) +++ trunk/epydoc/src/epydoc/cli.py 2008-02-01 19:21:54 UTC (rev 1706) @@ -1334,8 +1334,6 @@ print self.term.BOLD + header + self.term.NORMAL def end_progress(self): - if self._progress is None: - return # already ended. self.progress(1.) if self._progress_mode == 'bar': sys.stdout.write(self.term.CLEAR_LINE) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-01 19:28:05
|
Revision: 1707 http://epydoc.svn.sourceforge.net/epydoc/?rev=1707&view=rev Author: edloper Date: 2008-02-01 11:28:01 -0800 (Fri, 01 Feb 2008) Log Message: ----------- - Minor modification to ConsoleLogger.print_times formatting Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2008-02-01 19:21:54 UTC (rev 1706) +++ trunk/epydoc/src/epydoc/cli.py 2008-02-01 19:28:01 UTC (rev 1707) @@ -1352,10 +1352,10 @@ total = sum([time for (time, task) in self._task_times]) max_t = max([time for (time, task) in self._task_times]) for (time, task) in self._task_times: - task = task[:31] - print ' %s%s %7.1fs' % (task, '.'*(35-len(task)), time), - if self.term.COLS > 55: - print '|'+'=' * int((self.term.COLS-53) * time / max_t) + task = task[:34] + print ' %s%s%7.1fs' % (task, '.'*(37-len(task)), time), + if self.term.COLS > 58: + print '|'+'=' * int((self.term.COLS-56) * time / max_t) else: print print This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-02 02:38:14
|
Revision: 1711 http://epydoc.svn.sourceforge.net/epydoc/?rev=1711&view=rev Author: edloper Date: 2008-02-01 18:38:11 -0800 (Fri, 01 Feb 2008) Log Message: ----------- - epydoc will now accept multiple action arguments (eg --html, --pdf) - if the target option (-o) is used before any action arguments, it gives the default target name. If it is used after any action argument, then it applies just to the action argument that preceeds it. Note that this is backwards compatible with the old case where only one action argument could be used -- either way, the target argument would apply to that one action argument. - In config files, the "output" option can now be used with multiple output formats. To specify per-format output targets, use the form "format->target" e.g. "html->myhtmldir" or "pdf->foo.pdf". The "target" option sets the default output target. - if latex output is not explicitly requested, then latex output is now written to a temp dir, and cleaned up after execution. The target name for dvi/ps/pdf outputs is treated as a filename. - parse_arguments now just returns the options argument -- returning a tuple with the names was redundant since we store the names as options.names anyway. Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2008-02-01 19:53:20 UTC (rev 1710) +++ trunk/epydoc/src/epydoc/cli.py 2008-02-02 02:38:11 UTC (rev 1711) @@ -63,7 +63,7 @@ """ __docformat__ = 'epytext en' -import sys, os, time, re, pickle, textwrap +import sys, os, time, re, pickle, textwrap, tempfile, shutil from glob import glob from optparse import OptionParser, OptionGroup, SUPPRESS_HELP import optparse @@ -87,6 +87,8 @@ ACTIONS = ('html', 'text', 'latex', 'dvi', 'ps', 'pdf', 'check') DEFAULT_DOCFORMAT = 'epytext' PROFILER = 'profile' #: Which profiler to use: 'hotshot' or 'profile' +TARGET_ACTIONS = ('html', 'latex', 'dvi', 'ps', 'pdf') +DEFAULT_ACTIONS = ('html',) ###################################################################### #{ Help Topics @@ -128,18 +130,37 @@ #{ 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=[], - external_api=[], external_api_file=[], external_api_root=[], - redundant_details=False, src_code_tab_width=8, - include_timestamp=True) +DEFAULT_TARGET = dict( + html='html', latex='latex', dvi='api.dvi', ps='api.ps', + pdf='api.pdf', pickle='api.pickle') +def option_defaults(): + return dict( + actions=[], 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=[], + external_api=[], external_api_file=[], external_api_root=[], + redundant_details=False, src_code_tab_width=8, verbosity=0, + include_timestamp=True, target={}, default_target=None) + +# append_const is not defined in py2.3 or py2.4, so use a callback +# instead, with the following function: +def add_action(option, opt, value, optparser): + action = opt.replace('-', '') + optparser.values.actions.append(action) + +def add_target(option, opt, value, optparser): + if optparser.values.actions: + optparser.values.target[optparser.values.actions[-1]] = value + elif optparser.values.default_target is None: + optparser.values.default_target = value + else: + optparser.error("Default output target specified multiple times!") + def parse_arguments(): # Construct the option parser. usage = '%prog [ACTION] [options] NAMES...' @@ -152,7 +173,7 @@ "and/or NAMES. This option may be repeated.")) optparser.add_option("--output", "-o", - dest="target", metavar="PATH", + action='callback', callback=add_target, type='string', metavar="PATH", help="The output directory. If PATH does not exist, then " "it will be created.") @@ -173,49 +194,48 @@ help="Do not try to use color or cursor control when displaying " "the progress bar, warnings, or errors.") - action_group = OptionGroup(optparser, 'Actions') optparser.add_option_group(action_group) action_group.add_option("--html", - action="store_const", dest="action", const="html", + action='callback', callback=add_action, help="Write HTML output.") action_group.add_option("--text", - action="store_const", dest="action", const="text", + action='callback', callback=add_action, help="Write plaintext output. (not implemented yet)") action_group.add_option("--latex", - action="store_const", dest="action", const="latex", + action='callback', callback=add_action, help="Write LaTeX output.") action_group.add_option("--dvi", - action="store_const", dest="action", const="dvi", + action='callback', callback=add_action, help="Write DVI output.") action_group.add_option("--ps", - action="store_const", dest="action", const="ps", + action='callback', callback=add_action, help="Write Postscript output.") action_group.add_option("--pdf", - action="store_const", dest="action", const="pdf", + action='callback', callback=add_action, help="Write PDF output.") action_group.add_option("--check", - action="store_const", dest="action", const="check", + action='callback', callback=add_action, help="Check completeness of docs.") action_group.add_option("--pickle", - action="store_const", dest="action", const="pickle", + action='callback', callback=add_action, help="Write the documentation to a pickle file.") # Provide our own --help and --version options. action_group.add_option("--version", - action="store_const", dest="action", const="version", + action='callback', callback=add_action, help="Show epydoc's version number and exit.") action_group.add_option("-h", "--help", - action="store_const", dest="action", const="help", + action='callback', callback=add_action, help="Show this message and exit. For help on specific " "topics, use \"--help TOPIC\". Use \"--help topics\" for a " "list of available help topics") @@ -419,14 +439,14 @@ "warnings).") # Set the option parser's defaults. - optparser.set_defaults(**OPTION_DEFAULTS) + optparser.set_defaults(**option_defaults()) # Parse the arguments. options, names = optparser.parse_args() # Print help message, if requested. We also provide support for # --help [topic] - if options.action == 'help': + if 'help' in options.actions: names = set([n.lower() for n in names]) for (topic, msg) in HELP_TOPICS.items(): if topic.lower() in names: @@ -436,7 +456,7 @@ sys.exit(0) # Print version message, if requested. - if options.action == 'version': + if 'version' in options.actions: print version sys.exit(0) @@ -475,7 +495,7 @@ if not options.parse and not options.introspect: optparser.error("Invalid option combination: --parse-only " "and --introspect-only.") - if options.action == 'text' and len(names) > 1: + if 'text' in options.actions and len(names) > 1: optparser.error("--text option takes only one name.") # Check the list of requested graph types to make sure they're @@ -500,13 +520,9 @@ verbosity = getattr(options, 'verbosity', 0) options.verbosity = verbosity + options.verbose - options.quiet - # The target default depends on the action. - if options.target is None: - options.target = options.action - # Return parsed args. options.names = names - return options, names + return options def parse_configfiles(configfiles, options, names): configparser = ConfigParser.ConfigParser() @@ -524,12 +540,14 @@ 'module', 'object', 'value'): names.extend(_str_to_list(val)) elif optname == 'target': - options.target = val + options.default_target = val elif optname == 'output': - if val.lower() not in ACTIONS: - raise ValueError('"%s" expected one of: %s' % - (optname, ', '.join(ACTIONS))) - options.action = val.lower() + for action, target in re.findall('(\w+)\s*(?:->\s*(\S+))?', val): + if action not in ACTIONS: + raise ValueError('"%s" expected one of %s, got %r' % + (optname, ', '.join(ACTIONS), action)) + options.actions.append(action) + if target: options.target[action] = target elif optname == 'verbosity': options.verbosity = _str_to_int(val, optname) elif optname == 'debug': @@ -649,21 +667,19 @@ #{ Interface ###################################################################### -def main(options, names): +def main(options): # Set the debug flag, if '--debug' was specified. if options.debug: epydoc.DEBUG = True - ## [XX] Did this serve a purpose? Commenting out for now: - #if options.action == 'text': - # if options.parse and options.introspect: - # options.parse = False + if not options.actions: + options.actions = DEFAULT_ACTIONS # Set up the logger loggers = [] if options.simple_term: TerminalController.FORCE_SIMPLE_TERM = True - if options.action == 'text': + if options.actions == ['text']: pass # no logger for text output. elif options.verbosity > 1: logger = ConsoleLogger(options.verbosity) @@ -682,15 +698,15 @@ 2] # Sorting & Grouping if options.load_pickle: stages = [30] # Loading pickled documentation - if options.action == 'html': stages += [100] - elif options.action == 'text': stages += [30] - elif options.action == 'latex': stages += [60] - elif options.action == 'dvi': stages += [60,30] - elif options.action == 'ps': stages += [60,40] - elif options.action == 'pdf': stages += [60,50] - elif options.action == 'check': stages += [10] - elif options.action == 'pickle': stages += [10] - else: raise ValueError, '%r not supported' % options.action + if 'html' in options.actions: stages += [100] + if 'text' in options.actions: stages += [30] + if 'check' in options.actions: stages += [10] + if 'pickle' in options.actions: stages += [10] + if 'latex' in options.actions: stages += [60] + if 'pdf' in options.actions: stages += [50] + elif 'ps' in options.actions: stages += [40] + elif 'dvi' in options.actions: stages += [30] + if options.parse and not options.introspect: del stages[1] # no merging if options.introspect and not options.parse: @@ -699,18 +715,35 @@ log.register_logger(logger) loggers.append(logger) - # check the output directory. - if options.action not in ('text', 'check', 'pickle'): - if os.path.exists(options.target): - if not os.path.isdir(options.target): - log.error("%s is not a directory" % options.target) + # Calculate the target directories/files. + for (key, val) in DEFAULT_TARGET.items(): + if options.default_target is not None: + options.target.setdefault(key, options.default_target) + else: + options.target.setdefault(key, val) + + # Add extensions to target filenames, where appropriate. + for action in ['pdf', 'ps', 'dvi', 'pickle']: + if action in options.target: + if not options.target[action].endswith('.%s' % action): + options.target[action] += '.%s' % action + + # check the output targets. + for action in options.actions: + target = options.target[action] + if os.path.exists(target): + if action not in ['html', 'latex'] and os.path.isdir(target): + log.error("%s is a directory" % target) sys.exit(1) + elif action in ['html', 'latex'] and not os.path.isdir(target): + log.error("%s is not a directory" % target) + sys.exit(1) if options.include_log: - if options.action == 'html': - if not os.path.exists(options.target): - os.mkdir(options.target) - logger = HTMLLogger(options.target, options) + if 'html' in options.actions: + if not os.path.exists(options.target['html']): + os.mkdir(options.target['html']) + logger = HTMLLogger(options.target['html'], options) log.register_logger(logger) loggers.append(logger) else: @@ -748,11 +781,11 @@ # If the input name is a pickle file, then read the docindex that # it contains. Otherwise, build the docs for the input names. if options.load_pickle: - assert len(names) == 1 + assert len(options.names) == 1 log.start_progress('Deserializing') - log.progress(0.1, 'Loading %r' % names[0]) + log.progress(0.1, 'Loading %r' % options.names[0]) t0 = time.time() - unpickler = pickle.Unpickler(open(names[0], 'rb')) + unpickler = pickle.Unpickler(open(options.names[0], 'rb')) unpickler.persistent_load = pickle_persistent_load docindex = unpickler.load() log.debug('deserialization time: %.1f sec' % (time.time()-t0)) @@ -763,8 +796,9 @@ exclude_parse = '|'.join(options.exclude_parse+options.exclude) exclude_introspect = '|'.join(options.exclude_introspect+ options.exclude) - docindex = build_doc_index(names, options.introspect, options.parse, - add_submodules=(options.action!='text'), + docindex = build_doc_index(options.names, + options.introspect, options.parse, + add_submodules=(options.actions!=['text']), exclude_introspect=exclude_introspect, exclude_parse=exclude_parse) @@ -795,18 +829,17 @@ docindex.read_profiling_info(profile_stats) # Perform the specified action. - if options.action == 'html': + if 'check' in options.actions: + check_docs(docindex, options) + if 'pickle' in options.actions: + write_pickle(docindex, options) + if 'html' in options.actions: write_html(docindex, options) - elif options.action in ('latex', 'dvi', 'ps', 'pdf'): - write_latex(docindex, options, options.action) - elif options.action == 'text': + if ('latex' in options.actions or 'dvi' in options.actions or + 'ps' in options.actions or 'pdf' in options.actions): + write_latex(docindex, options) + if 'text' in options.actions: write_text(docindex, options) - elif options.action == 'check': - check_docs(docindex, options) - elif options.action == 'pickle': - write_pickle(docindex, options) - else: - print >>sys.stderr, '\nUnsupported action %s!' % options.action # If we suppressed docstring warnings, then let the user know. for logger in loggers: @@ -817,8 +850,8 @@ else: prefix = ('%d markup errors were found' % logger.suppressed_docstring_warning) - logger.warning("%s while processing docstrings. Use the verbose " - "switch (-v) to display markup errors." % prefix) + log.warning("%s while processing docstrings. Use the verbose " + "switch (-v) to display markup errors." % prefix) # Basic timing breakdown: if options.verbosity >= 2: @@ -841,10 +874,10 @@ from epydoc.docwriter.html import HTMLWriter html_writer = HTMLWriter(docindex, **options.__dict__) if options.verbose > 0: - log.start_progress('Writing HTML docs to %r' % options.target) + log.start_progress('Writing HTML docs to %r' % options.target['html']) else: log.start_progress('Writing HTML docs') - html_writer.write(options.target) + html_writer.write(options.target['html']) log.end_progress() def write_pickle(docindex, options): @@ -852,14 +885,9 @@ read in at a later time. But loading the pickle is only marginally faster than building the docs from scratch, so this has pretty limited application.""" - if options.target == 'pickle': - options.target = 'api.pickle' - elif not options.target.endswith('.pickle'): - options.target += '.pickle' - log.start_progress('Serializing output') - log.progress(0.2, 'Writing %r' % options.target) - outfile = open(options.target, 'wb') + log.progress(0.2, 'Writing %r' % options.target['pickle']) + outfile = open(options.target['pickle'], 'wb') pickler = pickle.Pickler(outfile, protocol=0) pickler.persistent_id = pickle_persistent_id pickler.dump(docindex) @@ -881,31 +909,40 @@ _RERUN_LATEX_RE = re.compile(r'(?im)^LaTeX\s+Warning:\s+Label\(s\)\s+may' r'\s+have\s+changed.\s+Rerun') -def write_latex(docindex, options, format): +def write_latex(docindex, options): + # If latex is an intermediate target, then use a temporary + # directory for its files. + if 'latex' in options.actions: + latex_target = options.target['latex'] + else: + latex_target = tempfile.mkdtemp() + from epydoc.docwriter.latex import LatexWriter latex_writer = LatexWriter(docindex, **options.__dict__) log.start_progress('Writing LaTeX docs') - latex_writer.write(options.target) + latex_writer.write(latex_target) log.end_progress() - # If we're just generating the latex, and not any output format, - # then we're done. - if format == 'latex': return - if format == 'dvi': steps = 4 - elif format == 'ps': steps = 5 - elif format == 'pdf': steps = 6 + if 'pdf' in options.actions: steps = 6 + elif 'ps' in options.actions: steps = 5 + elif 'dvi' in options.actions: steps = 4 + else: + # If we're just generating the latex, and not any derived + # output format, then we're done. + assert 'latex' in options.actions + return log.start_progress('Processing LaTeX docs') oldpath = os.path.abspath(os.curdir) running = None # keep track of what we're doing. try: try: - os.chdir(options.target) + os.chdir(latex_target) # Clear any old files out of the way. - for ext in 'tex aux log out idx ilg toc ind'.split(): - if os.path.exists('apidoc.%s' % ext): - os.remove('apidoc.%s' % ext) + for ext in 'aux log out idx ilg toc ind'.split(): + if os.path.exists('api.%s' % ext): + os.remove('api.%s' % ext) # The first pass generates index files. running = 'latex' @@ -936,19 +973,31 @@ run_subprocess('latex api.tex') # If requested, convert to postscript. - if format in ('ps', 'pdf'): + if 'ps' in options.actions or 'pdf' in options.actions: running = 'dvips' log.progress(4./steps, 'dvips') run_subprocess('dvips api.dvi -o api.ps -G0 -Ppdf') # If requested, convert to pdf. - if format in ('pdf'): + if 'pdf' in options.actions: running = 'ps2pdf' log.progress(5./steps, 'ps2pdf') run_subprocess( 'ps2pdf -sPAPERSIZE#letter -dMaxSubsetPct#100 ' '-dSubsetFonts#true -dCompatibilityLevel#1.2 ' '-dEmbedAllFonts#true api.ps api.pdf') + + # Copy files to their respective targets. + if 'dvi' in options.actions: + dst = os.path.join(oldpath, options.target['dvi']) + shutil.copy2('api.dvi', dst) + if 'ps' in options.actions: + dst = os.path.join(oldpath, options.target['ps']) + shutil.copy2('api.ps', dst) + if 'pdf' in options.actions: + dst = os.path.join(oldpath, options.target['pdf']) + shutil.copy2('api.pdf', dst) + except RunSubprocessError, e: if running == 'latex': e.out = re.sub(r'(?sm)\A.*?!( LaTeX Error:)?', r'', e.out) @@ -959,6 +1008,18 @@ log.error("%s failed: %s" % (running, e)) finally: os.chdir(oldpath) + + if 'latex' not in options.actions: + # The latex output went to a tempdir; clean it up. + log.info('Cleaning up %s' % latex_target) + try: + for filename in os.listdir(latex_target): + os.remove(os.path.join(latex_target, filename)) + os.rmdir(latex_target) + except Exception, e: + log.error("Error cleaning up tempdir %s: %s" % + (latex_target, e)) + log.end_progress() def write_text(docindex, options): @@ -979,14 +1040,14 @@ def cli(): # Parse command-line arguments. - options, names = parse_arguments() + options = parse_arguments() try: try: if options.profile: _profile() else: - main(options, names) + main(options) finally: log.close() except SystemExit: @@ -1431,7 +1492,8 @@ 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) + defaults = option_defaults() + opts = [(val==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' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-02 06:28:12
|
Revision: 1713 http://epydoc.svn.sourceforge.net/epydoc/?rev=1713&view=rev Author: edloper Date: 2008-02-01 22:28:09 -0800 (Fri, 01 Feb 2008) Log Message: ----------- - Removed restriction that --text can only take one name - Fixed bug that caused --text and --check to fail - Put blank lines around generated text docs Modified Paths: -------------- trunk/epydoc/src/epydoc/cli.py Modified: trunk/epydoc/src/epydoc/cli.py =================================================================== --- trunk/epydoc/src/epydoc/cli.py 2008-02-02 02:38:41 UTC (rev 1712) +++ trunk/epydoc/src/epydoc/cli.py 2008-02-02 06:28:09 UTC (rev 1713) @@ -495,8 +495,6 @@ if not options.parse and not options.introspect: optparser.error("Invalid option combination: --parse-only " "and --introspect-only.") - if 'text' in options.actions and len(names) > 1: - optparser.error("--text option takes only one name.") # Check the list of requested graph types to make sure they're # acceptable. @@ -730,6 +728,7 @@ # check the output targets. for action in options.actions: + if action not in TARGET_ACTIONS: continue target = options.target[action] if os.path.exists(target): if action not in ['html', 'latex'] and os.path.isdir(target): @@ -1026,13 +1025,13 @@ log.start_progress('Writing output') from epydoc.docwriter.plaintext import PlaintextWriter plaintext_writer = PlaintextWriter() - s = '' + s = '\n' for apidoc in docindex.root: - s += plaintext_writer.write(apidoc, **options.__dict__) + s += plaintext_writer.write(apidoc, **options.__dict__)+'\n' log.end_progress() if isinstance(s, unicode): s = s.encode('ascii', 'backslashreplace') - print s + sys.stdout.write(s) def check_docs(docindex, options): from epydoc.checker import DocChecker @@ -1117,6 +1116,7 @@ ###################################################################### #{ Logging ###################################################################### +# [xx] this should maybe move to util.py or log.py class TerminalController: """ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |