(original) (raw)
Index: Lib/compileall.py =================================================================== --- Lib/compileall.py (revision 69204) +++ Lib/compileall.py (working copy) @@ -12,9 +12,13 @@ """ +from __future__ import with_statement + import os import sys import py_compile +import struct +import imp __all__ = ["compile_dir","compile_path"] @@ -54,11 +58,17 @@ if os.path.isfile(fullname): head, tail = name[:-3], name[-3:] if tail == '.py': - cfile = fullname + (__debug__ and 'c' or 'o') - ftime = os.stat(fullname).st_mtime - try: ctime = os.stat(cfile).st_mtime - except os.error: ctime = 0 - if (ctime > ftime) and not force: continue + if not force: + try: + mtime = os.stat(fullname).st_mtime + expect = struct.pack('<4sl', imp.get_magic(), mtime) + cfile = fullname + (__debug__ and 'c' or 'o') + with open(cfile, 'rb') as chandle: + actual = chandle.read(8) + if expect == actual: + continue + except IOError: + pass if not quiet: print 'Compiling', fullname, '...' try: Index: Lib/test/test_compileall.py =================================================================== --- Lib/test/test_compileall.py (revision 0) +++ Lib/test/test_compileall.py (revision 0) @@ -0,0 +1,81 @@ +""" + Test cases for the compileall module + Martin von Gagern +""" + +from __future__ import with_statement + +import unittest +from test.test_support import run_unittest +import compileall, imp, struct, os, time, sys, tempfile + + +class CompileallTests(unittest.TestCase): + def setUp(self): + self.tempdir = tempfile.mkdtemp() + + def tearDown(self): + for fname in os.listdir(self.tempdir): + os.unlink(self.tempFile(fname)) + os.rmdir(self.tempdir) + + def compileDir(self, quiet=1, **kwargs): + compileall.compile_dir(self.tempdir, quiet=quiet, **kwargs) + + def tempFile(self, fname='foo.py'): + return os.path.join(self.tempdir, fname) + + def createFile(self, content='print 123\n', fname='foo.py'): + with open(self.tempFile(fname), 'w') as f: + f.write(content) + + def tsMatches(self, fname='foo.py'): + py_name = self.tempFile(fname) + pyc_name = py_name + (__debug__ and 'c' or 'o') + py_mtime = os.stat(py_name).st_mtime + expect = struct.pack('<4sl', imp.get_magic(), py_mtime) + try: + with open(pyc_name, 'rb') as pyc_file: + actual = pyc_file.read(8) + return (expect == actual) + except IOError: + return false + + + def test_modify(self): + self.createFile() + self.compileDir() + self.assertTrue(self.tsMatches()) + time.sleep(2) + self.createFile('print 1234\n') + self.assertFalse(self.tsMatches()) + self.compileDir() + self.assertTrue(self.tsMatches()) + + def test_touch(self): + self.createFile() + self.compileDir() + self.assertTrue(self.tsMatches()) + time.sleep(2) + os.utime(self.tempFile(), None) + self.assertFalse(self.tsMatches()) + self.compileDir() + self.assertTrue(self.tsMatches()) + + def test_backdate(self): + self.createFile() + self.compileDir() + self.assertTrue(self.tsMatches()) + stat = os.stat(self.tempFile()) + os.utime(self.tempFile(), (stat.st_atime, stat.st_mtime - 2)) + self.assertFalse(self.tsMatches()) + self.compileDir() + self.assertTrue(self.tsMatches()) + + +def test_main(): + run_unittest(CompileallTests) + + +if __name__ == "__main__": + test_main()