from test.test_support import verbose, findfile, is_resource_enabled, TestFailed import os, glob, random from tokenize import (tokenize, generate_tokens, untokenize, NUMBER, NAME, OP, STRING) if verbose: print 'starting...' f = file(findfile('tokenize_tests' + os.extsep + 'txt')) tokenize(f.readline) f.close() ###### Test roundtrip for untokenize ########################## def test_roundtrip(f): ## print 'Testing:', f f = file(f) try: fulltok = list(generate_tokens(f.readline)) finally: f.close() t1 = [tok[:2] for tok in fulltok] newtext = untokenize(t1) readline = iter(newtext.splitlines(1)).next t2 = [tok[:2] for tok in generate_tokens(readline)] assert t1 == t2 f = findfile('tokenize_tests' + os.extsep + 'txt') test_roundtrip(f) testdir = os.path.dirname(f) or os.curdir testfiles = glob.glob(testdir + os.sep + 'test*.py') if not is_resource_enabled('compiler'): testfiles = random.sample(testfiles, 10) for f in testfiles: test_roundtrip(f) ###### Test detecton of IndentationError ###################### from cStringIO import StringIO sampleBadText = """ def foo(): bar baz """ try: for tok in generate_tokens(StringIO(sampleBadText).readline): pass except IndentationError: pass else: raise TestFailed("Did not detect IndentationError:") ###### Test example in the docs ############################### from decimal import Decimal from cStringIO import StringIO def decistmt(s): """Substitute Decimals for floats in a string of statements. >>> from decimal import Decimal >>> s = 'print +21.3e-5*-.1234/81.7' >>> decistmt(s) "print +Decimal ('21.3e-5')*-Decimal ('.1234')/Decimal ('81.7')" >>> exec(s) -3.21716034272e-007 >>> exec(decistmt(s)) -3.217160342717258261933904529E-7 """ result = [] g = generate_tokens(StringIO(s).readline) # tokenize the string for toknum, tokval, _, _, _ in g: if toknum == NUMBER and '.' in tokval: # replace NUMBER tokens result.extend([ (NAME, 'Decimal'), (OP, '('), (STRING, repr(tokval)), (OP, ')') ]) else: result.append((toknum, tokval)) return untokenize(result) import doctest doctest.testmod() if verbose: print 'finished'