eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/py3kcompat.py
changeset 69 c6bca38c1cbf
equal deleted inserted replaced
68:5ff1fc726848 69:c6bca38c1cbf
       
     1 # py3kcompat.py - compatibility definitions for running hg in py3k
       
     2 #
       
     3 # Copyright 2010 Renato Cunha <renatoc@gmail.com>
       
     4 #
       
     5 # This software may be used and distributed according to the terms of the
       
     6 # GNU General Public License version 2 or any later version.
       
     7 
       
     8 import os, builtins
       
     9 
       
    10 from numbers import Number
       
    11 
       
    12 def bytesformatter(format, args):
       
    13     '''Custom implementation of a formatter for bytestrings.
       
    14 
       
    15     This function currently relias on the string formatter to do the
       
    16     formatting and always returns bytes objects.
       
    17 
       
    18     >>> bytesformatter(20, 10)
       
    19     0
       
    20     >>> bytesformatter('unicode %s, %s!', ('string', 'foo'))
       
    21     b'unicode string, foo!'
       
    22     >>> bytesformatter(b'test %s', 'me')
       
    23     b'test me'
       
    24     >>> bytesformatter('test %s', 'me')
       
    25     b'test me'
       
    26     >>> bytesformatter(b'test %s', b'me')
       
    27     b'test me'
       
    28     >>> bytesformatter('test %s', b'me')
       
    29     b'test me'
       
    30     >>> bytesformatter('test %d: %s', (1, b'result'))
       
    31     b'test 1: result'
       
    32     '''
       
    33     # The current implementation just converts from bytes to unicode, do
       
    34     # what's needed and then convert the results back to bytes.
       
    35     # Another alternative is to use the Python C API implementation.
       
    36     if isinstance(format, Number):
       
    37         # If the fixer erroneously passes a number remainder operation to
       
    38         # bytesformatter, we just return the correct operation
       
    39         return format % args
       
    40     if isinstance(format, bytes):
       
    41         format = format.decode('utf-8', 'surrogateescape')
       
    42     if isinstance(args, bytes):
       
    43         args = args.decode('utf-8', 'surrogateescape')
       
    44     if isinstance(args, tuple):
       
    45         newargs = []
       
    46         for arg in args:
       
    47             if isinstance(arg, bytes):
       
    48                 arg = arg.decode('utf-8', 'surrogateescape')
       
    49             newargs.append(arg)
       
    50         args = tuple(newargs)
       
    51     ret = format % args
       
    52     return ret.encode('utf-8', 'surrogateescape')
       
    53 builtins.bytesformatter = bytesformatter
       
    54 
       
    55 # Create bytes equivalents for os.environ values
       
    56 for key in list(os.environ.keys()):
       
    57     # UTF-8 is fine for us
       
    58     bkey = key.encode('utf-8', 'surrogateescape')
       
    59     bvalue = os.environ[key].encode('utf-8', 'surrogateescape')
       
    60     os.environ[bkey] = bvalue
       
    61 
       
    62 origord = builtins.ord
       
    63 def fakeord(char):
       
    64     if isinstance(char, int):
       
    65         return char
       
    66     return origord(char)
       
    67 builtins.ord = fakeord
       
    68 
       
    69 if __name__ == '__main__':
       
    70     import doctest
       
    71     doctest.testmod()
       
    72