srcanamdw/codescanner/pyinstaller/doc/source/tools/buildrecursive.py
author noe\swadi
Thu, 18 Feb 2010 12:29:02 +0530
changeset 1 22878952f6e2
permissions -rw-r--r--
Committing the CodeScanner Core tool This component has been moved from the StaticAnaApps package. BUG : 5889 (http://developer.symbian.org/webbugs/show_bug.cgi?id=5889).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     1
#!/usr/bin/env python
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     3
# Author: David Goodger
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     4
# Contact: goodger@users.sourceforge.net
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     5
# Revision: $Revision: 1.1 $
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     6
# Date: $Date: 2009/02/05 23:03:30 $
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     7
# Copyright: This module has been placed in the public domain.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     8
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     9
# Addapted by William Caban to look for .rst by default instead of .txt
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    10
# added docutils availability
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    11
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    12
"""
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    13
Generates .html from all the .rst files in a directory.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    14
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    15
Ordinary .rst files are understood to be standalone reStructuredText.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    16
Files named ``pep-*.rst`` are interpreted as reStructuredText PEPs.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    17
"""
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    18
# Once PySource is here, build .html from .py as well.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    19
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    20
__docformat__ = 'reStructuredText'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    21
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    22
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    23
try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    24
    import locale
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    25
    locale.setlocale(locale.LC_ALL, '')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    26
except:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    27
    pass
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    28
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    29
import sys
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    30
import os
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    31
import os.path
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    32
import copy
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    33
try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    34
	import docutils
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    35
	from docutils import ApplicationError
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    36
	from docutils import core, frontend
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    37
	from docutils.parsers import rst
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    38
	from docutils.readers import standalone, pep
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    39
	from docutils.writers import html4css1, pep_html
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    40
except:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    41
	print "################################################################"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    42
	print "# You need 'docutils' installed to execute this program.       #"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    43
	print "# 'docutils' is available from http://docutils.sourceforge.net #"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    44
	print "################################################################"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    45
	sys.exit(1)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    46
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    47
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    48
usage = '%prog [options] [<directory> ...]'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    49
description = ('Generates .html from all the reStructuredText .rst files '
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    50
               '(including PEPs) in each <directory> '
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    51
               '(default is the current directory).')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    52
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    53
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    54
class SettingsSpec(docutils.SettingsSpec):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    55
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    56
    """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    57
    Runtime settings & command-line options for the front end.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    58
    """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    59
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    60
    # Can't be included in OptionParser below because we don't want to
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    61
    # override the base class.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    62
    settings_spec = (
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    63
        'Build-HTML Options',
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    64
        None,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    65
        (('Recursively scan subdirectories for files to process.  This is '
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    66
          'the default.',
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    67
          ['--recurse'],
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    68
          {'action': 'store_true', 'default': 1,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    69
           'validator': frontend.validate_boolean}),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    70
         ('Generate output files in the specified directory.  The default is '
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    71
          'to put them in the same directory of the input files.',
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    72
          ['--outpath'], {'metavar': '<directory>', 'type': 'string'}),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    73
         ('Do not scan subdirectories for files to process.',
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    74
          ['--local'], {'dest': 'recurse', 'action': 'store_false'}),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    75
         ('Do not process files in <directory>.  This option may be used '
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    76
          'more than once to specify multiple directories.',
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    77
          ['--prune'],
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    78
          {'metavar': '<directory>', 'action': 'append',
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    79
           'validator': frontend.validate_colon_separated_string_list}),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    80
         ('Work silently (no progress messages).  Independent of "--quiet".',
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    81
          ['--silent'],
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    82
          {'action': 'store_true', 'validator': frontend.validate_boolean}),))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    83
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    84
    relative_path_settings = ('prune',)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    85
    config_section = 'buildhtml application'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    86
    config_section_dependencies = ('applications',)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    87
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    88
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    89
class OptionParser(frontend.OptionParser):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    90
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    91
    """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    92
    Command-line option processing for the ``buildhtml.py`` front end.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    93
    """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    94
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    95
    def check_values(self, values, args):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    96
        frontend.OptionParser.check_values(self, values, args)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    97
        values._source = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    98
        return values
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    99
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   100
    def check_args(self, args):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   101
        source = destination = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   102
        if args:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   103
            self.values._directories = args
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   104
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   105
            self.values._directories = [os.getcwd()]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   106
        return source, destination
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   107
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   108
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   109
class Struct:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   110
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   111
    """Stores data attributes for dotted-attribute access."""
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   112
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   113
    def __init__(self, **keywordargs):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   114
        self.__dict__.update(keywordargs)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   115
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   116
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   117
class Builder:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   118
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   119
    def __init__(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   120
        self.publishers = {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   121
            '': Struct(components=(pep.Reader, rst.Parser, pep_html.Writer,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   122
                                   SettingsSpec)),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   123
            '.rst': Struct(components=(rst.Parser, standalone.Reader,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   124
                                       html4css1.Writer, SettingsSpec),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   125
                           reader_name='standalone',
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   126
                           writer_name='html'),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   127
            'PEPs': Struct(components=(rst.Parser, pep.Reader,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   128
                                       pep_html.Writer, SettingsSpec),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   129
                           reader_name='pep',
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   130
                           writer_name='pep_html')}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   131
        """Publisher-specific settings.  Key '' is for the front-end script
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   132
        itself.  ``self.publishers[''].components`` must contain a superset of
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   133
        all components used by individual publishers."""
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   134
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   135
        self.setup_publishers()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   136
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   137
    def setup_publishers(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   138
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   139
        Manage configurations for individual publishers.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   140
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   141
        Each publisher (combination of parser, reader, and writer) may have
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   142
        its own configuration defaults, which must be kept separate from those
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   143
        of the other publishers.  Setting defaults are combined with the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   144
        config file settings and command-line options by
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   145
        `self.get_settings()`.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   146
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   147
        for name, publisher in self.publishers.items():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   148
            option_parser = OptionParser(
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   149
                components=publisher.components, read_config_files=1,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   150
                usage=usage, description=description)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   151
            publisher.option_parser = option_parser
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   152
            publisher.setting_defaults = option_parser.get_default_values()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   153
            frontend.make_paths_absolute(publisher.setting_defaults.__dict__,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   154
                                         option_parser.relative_path_settings)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   155
            publisher.config_settings = (
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   156
                option_parser.get_standard_config_settings())
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   157
        self.settings_spec = self.publishers[''].option_parser.parse_args(
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   158
            values=frontend.Values())   # no defaults; just the cmdline opts
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   159
        self.initial_settings = self.get_settings('')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   160
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   161
    def get_settings(self, publisher_name, directory=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   162
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   163
        Return a settings object, from multiple sources.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   164
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   165
        Copy the setting defaults, overlay the startup config file settings,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   166
        then the local config file settings, then the command-line options.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   167
        Assumes the current directory has been set.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   168
        """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   169
        publisher = self.publishers[publisher_name]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   170
        settings = frontend.Values(publisher.setting_defaults.__dict__)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   171
        settings.update(publisher.config_settings, publisher.option_parser)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   172
        if directory:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   173
            local_config = publisher.option_parser.get_config_file_settings(
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   174
                os.path.join(directory, 'docutils.conf'))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   175
            frontend.make_paths_absolute(
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   176
                local_config, publisher.option_parser.relative_path_settings,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   177
                directory)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   178
            settings.update(local_config, publisher.option_parser)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   179
        settings.update(self.settings_spec.__dict__, publisher.option_parser)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   180
        return settings
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   181
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   182
    def run(self, directory=None, recurse=1):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   183
        recurse = recurse and self.initial_settings.recurse
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   184
        if directory:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   185
            self.directories = [directory]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   186
        elif self.settings_spec._directories:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   187
            self.directories = self.settings_spec._directories
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   188
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   189
            self.directories = [os.getcwd()]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   190
        for directory in self.directories:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   191
            os.path.walk(directory, self.visit, recurse)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   192
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   193
    def visit(self, recurse, directory, names):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   194
        settings = self.get_settings('', directory)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   195
        if settings.prune and (os.path.abspath(directory) in settings.prune):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   196
            print >>sys.stderr, '/// ...Skipping directory (pruned):', directory
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   197
            sys.stderr.flush()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   198
            names[:] = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   199
            return
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   200
        if not self.initial_settings.silent:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   201
            print >>sys.stderr, '/// Processing directory:', directory
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   202
            sys.stderr.flush()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   203
        prune = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   204
        for name in names:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   205
            if name.endswith('.rst'):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   206
                prune = self.process_rst(directory, name)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   207
                if prune:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   208
                    break
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   209
        if not recurse:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   210
            del names[:]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   211
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   212
    def process_rst(self, directory, name):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   213
        if name.startswith('pep-'):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   214
            publisher = 'PEPs'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   215
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   216
            publisher = '.rst'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   217
        settings = self.get_settings(publisher, directory)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   218
        pub_struct = self.publishers[publisher]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   219
        if settings.prune and (directory in settings.prune):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   220
            return 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   221
        settings._source = os.path.normpath(os.path.join(directory, name))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   222
        settings._destination = settings._source[:-4]+'.html'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   223
        if settings.outpath:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   224
            # FIXME: we should probably try and recreate the exising structure here,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   225
            # but that's more work than we need right now.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   226
            settings._destination = os.path.join(settings.outpath, os.path.basename(settings._destination))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   227
        if not self.initial_settings.silent:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   228
            print >>sys.stderr, '    ::: Processing:', name
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   229
            sys.stderr.flush()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   230
        try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   231
            core.publish_file(source_path=settings._source,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   232
                              destination_path=settings._destination,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   233
                              reader_name=pub_struct.reader_name,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   234
                              parser_name='restructuredtext',
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   235
                              writer_name=pub_struct.writer_name,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   236
                              settings=settings)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   237
        except ApplicationError, error:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   238
            print >>sys.stderr, ('        Error (%s): %s'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   239
                                 % (error.__class__.__name__, error))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   240
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   241
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   242
if __name__ == "__main__":
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   243
    Builder().run()