contrib/byteify-strings.py
changeset 38386 9f42e4a83676
parent 38385 a2976c27dac4
child 38387 b704da9a9dda
equal deleted inserted replaced
38385:a2976c27dac4 38386:9f42e4a83676
     8 # GNU General Public License version 2 or any later version.
     8 # GNU General Public License version 2 or any later version.
     9 
     9 
    10 from __future__ import absolute_import
    10 from __future__ import absolute_import
    11 
    11 
    12 import argparse
    12 import argparse
       
    13 import contextlib
       
    14 import errno
    13 import io
    15 import io
       
    16 import os
    14 import sys
    17 import sys
       
    18 import tempfile
    15 import token
    19 import token
    16 import tokenize
    20 import tokenize
    17 
    21 
    18 if True:
    22 if True:
    19     def replacetokens(tokens, fullname):
    23     def replacetokens(tokens, fullname):
   160 def process(fin, fout):
   164 def process(fin, fout):
   161     tokens = tokenize.tokenize(fin.readline)
   165     tokens = tokenize.tokenize(fin.readline)
   162     tokens = replacetokens(list(tokens), fullname='<dummy>')
   166     tokens = replacetokens(list(tokens), fullname='<dummy>')
   163     fout.write(tokenize.untokenize(tokens))
   167     fout.write(tokenize.untokenize(tokens))
   164 
   168 
       
   169 def tryunlink(fname):
       
   170     try:
       
   171         os.unlink(fname)
       
   172     except OSError as err:
       
   173         if err.errno != errno.ENOENT:
       
   174             raise
       
   175 
       
   176 @contextlib.contextmanager
       
   177 def editinplace(fname):
       
   178     n = os.path.basename(fname)
       
   179     d = os.path.dirname(fname)
       
   180     fp = tempfile.NamedTemporaryFile(prefix='.%s-' % n, suffix='~', dir=d,
       
   181                                      delete=False)
       
   182     try:
       
   183         yield fp
       
   184         fp.close()
       
   185         if os.name == 'nt':
       
   186             tryunlink(fname)
       
   187         os.rename(fp.name, fname)
       
   188     finally:
       
   189         fp.close()
       
   190         tryunlink(fp.name)
       
   191 
   165 def main():
   192 def main():
   166     ap = argparse.ArgumentParser()
   193     ap = argparse.ArgumentParser()
       
   194     ap.add_argument('-i', '--inplace', action='store_true', default=False,
       
   195                     help='edit files in place')
   167     ap.add_argument('files', metavar='FILE', nargs='+', help='source file')
   196     ap.add_argument('files', metavar='FILE', nargs='+', help='source file')
   168     args = ap.parse_args()
   197     args = ap.parse_args()
   169     for fname in args.files:
   198     for fname in args.files:
   170         with open(fname, 'rb') as fin:
   199         if args.inplace:
   171             fout = sys.stdout.buffer
   200             with editinplace(fname) as fout:
   172             process(fin, fout)
   201                 with open(fname, 'rb') as fin:
       
   202                     process(fin, fout)
       
   203         else:
       
   204             with open(fname, 'rb') as fin:
       
   205                 fout = sys.stdout.buffer
       
   206                 process(fin, fout)
   173 
   207 
   174 if __name__ == '__main__':
   208 if __name__ == '__main__':
   175     main()
   209     main()