Package epydoc :: Module compat |
[hide private]
[frames] | no frames]

# Source Code for Module epydoc.compat

      1  # epydoc -- Backwards compatibility
      2  #
      3  # Copyright (C) 2005 Edward Loper
      4  # Author: Edward Loper <edloper@loper.org>
      5  # URL: <http://epydoc.sf.net>
      6  #
      7  # $Id: util.py 956 2006-03-10 01:30:51Z edloper $
      8
      9  """
     10  Backwards compatibility with previous versions of Python.
     11
     12  This module provides backwards compatibility by defining several
     13  functions and classes that were not available in earlier versions of
     14  Python.  Intented usage:
     15
     16      >>> from epydoc.compat import *
     17
     18  Currently, epydoc requires Python 2.3+.
     19  """
     20  __docformat__ = 'epytext'
     21
     22  ######################################################################
     23  #{ New in Python 2.4
     24  ######################################################################
     25
     26  # set
     27  try:
     28      set
     29  except NameError:
     30      try:
     31          from sets import Set as set, ImmutableSet as frozenset
     32      except ImportError:
     33          pass # use fallback, in the next section.
     34
     35  # sorted
     36  try:
     37      sorted
     38  except NameError:
     39 -    def sorted(iterable, cmp=None, key=None, reverse=False):
     40          if key is None:
     41              elts = list(iterable)
     42          else:
     43              elts = [(key(v), v) for v in iterable]
     44
     45          if reverse: elts.reverse() # stable sort.
     46          if cmp is None: elts.sort()
     47          else: elts.sort(cmp)
     48          if reverse: elts.reverse()
     49
     50          if key is None:
     51              return elts
     52          else:
     53              return [v for (k,v) in elts]
     54
     55  # reversed
     56  try:
     57      reversed
     58  except NameError:
     59 -    def reversed(iterable):
     60          elts = list(iterable)
     61          elts.reverse()
     62          return elts
     63
     64  ######################################################################
     65  #{ New in Python 2.3
     66  ######################################################################
     67  # Below is my initial attempt at backporting enough code that
     68  # epydoc 3 would run under python 2.2.  However, I'm starting
     69  # to think that it's not worth the trouble.  At the very least,
     70  # epydoc's current unicode handling still doesn't work under
     71  # 2.2 (after the backports below), since the 'xmlcharrefreplace'
     72  # error handler was introduced in python 2.3.
     73
     74  # # basestring
     75  # try:
     76  #     basestring
     77  # except NameError:
     78  #     basestring = (str, unicode)
     79
     80  # # sum
     81  # try:
     82  #     sum
     83  # except NameError:
     84  #     def _add(a,b): return a+b
     85  #     def sum(vals): return reduce(_add, vals, 0)
     86
     87  # # True & False
     88  # try:
     89  #     True
     90  # except NameError:
     91  #     True = 1
     92  #     False = 0
     93
     94  # # enumerate
     95  # try:
     96  #     enumerate
     97  # except NameError:
     98  #     def enumerate(iterable):
     99  #         lst = list(iterable)
    100  #         return zip(range(len(lst)), lst)
    101
    102  # # set
    103  # try:
    104  #     set
    105  # except NameError:
    106  #     class set(dict):
    107  #         def __init__(self, elts=()):
    108  #             dict.__init__(self, [(e,1) for e in elts])
    109  #         def __repr__(self):
    110  #             return 'set(%r)' % list(self)
    111  #         def add(self, key): self[key] = 1
    112  #         def copy(self):
    113  #             return set(dict.copy(self))
    114  #         def difference(self, other):
    115  #             return set([v for v in self if v not in other])
    116  #         def difference_udpate(self, other):
    117  #             newval = self.difference(other)
    118  #             self.clear(); self.update(newval)
    119  #         def discard(self, elt):
    120  #             try: del self[elt]
    121  #             except: pass
    122  #         def intersection(self, other):
    123  #             return self.copy().update(other)
    124  #         def intersection_update(self, other):
    125  #             newval = self.intersection(other)
    126  #             self.clear(); self.update(newval)
    127  #         def issubset(self, other):
    128  #             for elt in self:
    129  #                 if elt not in other: return False
    130  #             return True
    131  #         def issuperset(self, other):
    132  #             for elt in other:
    133  #                 if elt not in self: return False
    134  #             return True
    135  #         def pop(self): self.popitem()[0]
    136  #         def remove(self, elt): del self[elt]
    137  #         def symmetric_difference(self, other):
    138  #             return set([v for v in list(self)+list(other)
    139  #                         if (v in self)^(v in other)])
    140  #         def symmatric_difference_update(self, other):
    141  #             newval = self.symmetric_difference(other)
    142  #             self.clear(); self.update(newval)
    143  #         def union(self, other):
    144  #             return set([v for v in list(self)+list(other)
    145  #                         if (v in self) or (v in other)])
    146  #         def union_update(self, other):
    147  #             newval = self.union(other)
    148  #             self.clear(); self.update(newval)
    149  #         def update(self, other):
    150  #             dict.update(self, set(other))
    151
    152  # # optparse module
    153  # try:
    154  #     import optparse
    155  # except ImportError:
    156  #     import new, sys, getopt
    157  #     class _OptionVals:
    158  #         def __init__(self, vals): self.__dict__.update(vals)
    159  #     class OptionParser:
    160  #         def __init__(self, usage=None, version=None):
    161  #             self.usage = usage
    162  #             self.version = version
    163  #             self.shortops = ['h']
    164  #             self.longops = []
    165  #             self.option_specs = {}
    166  #             self.defaults = {}
    167  #         def fail(self, message, exitval=1):
    168  #             print >>sys.stderr, message
    169  #             system.exit(exitval)
    170  #         def add_option_group(self, group): pass
    171  #         def set_defaults(self, **defaults):
    172  #             self.defaults = defaults.copy()
    173  #         def parse_args(self):
    174  #             try:
    175  #                 (opts, names) = getopt.getopt(sys.argv[1:],
    176  #                                               ''.join(self.shortops),
    177  #                                               self.longops)
    178  #             except getopt.GetoptError, e:
    179  #                 self.fail(e)
    180
    181  #             options = self.defaults.copy()
    182  #             for (opt,val) in opts:
    183  #                 if opt == '-h':
    184  #                     self.fail('No help available')
    185  #                 if opt not in self.option_specs:
    186  #                     self.fail('Unknown option %s' % opt)
    187  #                 (action, dest, const) = self.option_specs[opt]
    188  #                 if action == 'store':
    189  #                     options[dest] = val
    190  #                 elif action == 'store_const':
    191  #                     options[dest] = const
    192  #                 elif action == 'count':
    193  #                     options[dest] = options.get(dest,0)+1
    194  #                 elif action == 'append':
    195  #                     options.setdefault(dest, []).append(val)
    196  #                 else:
    197  #                     self.fail('unsupported action: %s' % action)
    198  #             for (action,dest,const) in self.option_specs.values():
    199  #                 if dest not in options:
    200  #                     if action == 'count': options[dest] = 0
    201  #                     elif action == 'append': options[dest] = []
    202  #                     else: options[dest] = None
    203  #             for name in names:
    204  #                 if name.startswith('-'):
    205  #                     self.fail('names must follow options')
    206  #             return _OptionVals(options), names
    207  #     class OptionGroup:
    208  #         def __init__(self, optparser, name):
    209  #             self.optparser = optparser
    210  #             self.name = name
    211
    212  #         def add_option(self, *args, **kwargs):
    213  #             action = 'store'
    214  #             dest = None
    215  #             const = None
    216  #             for (key,val) in kwargs.items():
    217  #                 if key == 'action': action = val
    218  #                 elif key == 'dest': dest = val
    219  #                 elif key == 'const': const = val
    220  #                 elif key in ('help', 'metavar'): pass
    221  #                 else: self.fail('unsupported: %s' % key)
    222
    223  #             if action not in ('store_const', 'store_true', 'store_false',
    224  #                               'store', 'count', 'append'):
    225  #                 self.fail('unsupported action: %s' % action)
    226
    227  #             optparser = self.optparser
    228  #             for arg in args:
    229  #                 if arg.startswith('--'):
    230  #                     optparser.longops.append(arg[2:])
    231  #                 elif arg.startswith('-') and len(arg)==2:
    232  #                     optparser.shortops += arg[1]
    233  #                     if action in ('store', 'append'):
    234  #                         optparser.shortops += ':'
    235  #                 else:
    236  #                     self.fail('bad option name %s' % arg)
    237  #                 if action == 'store_true':
    238  #                     (action, const) = ('store_const', True)
    239  #                 if action == 'store_false':
    240  #                     (action, const) = ('store_const', False)
    241  #                 optparser.option_specs[arg] = (action, dest, const)
    242
    243  #     # Install a fake module.
    244  #     optparse = new.module('optparse')
    245  #     optparse.OptionParser = OptionParser
    246  #     optparse.OptionGroup = OptionGroup
    247  #     sys.modules['optparse'] = optparse
    248  #     # Clean up
    249  #     del OptionParser, OptionGroup
    250