Mercurial > ~astiob > upreckon > hgweb
diff config.py @ 50:4ea7133ac25c
Converted 2.00 into the default branch
author | Oleg Oshmyan <chortos@inbox.lv> |
---|---|
date | Sun, 19 Dec 2010 23:25:13 +0200 |
parents | 2.00/config.py@81f58c938ec5 |
children | 7c6dba0b84f2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/config.py Sun Dec 19 23:25:13 2010 +0200 @@ -0,0 +1,182 @@ +#! /usr/bin/env python +# Copyright (c) 2010 Chortos-2 <chortos@inbox.lv> + +from __future__ import division, with_statement + +try: + from compat import * + import files +except ImportError: + import __main__ + __main__.import_error(sys.exc_info()[1]) +else: + from __main__ import options + +if files.ZipArchive: + try: + import zipimport + except ImportError: + zipimport = None +else: + zipimport = None + +import imp, os, sys, tempfile + +__all__ = 'load_problem', 'load_global', 'globalconf' + +defaults_problem = {'usegroups': False, + 'maxtime': None, + 'maxmemory': None, + 'dummies': {}, + 'testsexcluded': (), + 'padtests': 0, + 'paddummies': 0, + 'taskweight': 100, + 'pointmap': {}, + 'stdio': False, + 'dummyinname': '', + 'dummyoutname': '', + 'tester': None, + 'maxexitcode': 0, + 'inname': '', + 'ansname': ''} +defaults_global = {'tasknames': None, + 'force_zero_exitcode': True} +defaults_noerase = {'inname': '%.in', + 'outname': '%.out', + 'ansname': '%.ans'} +patterns = ('inname', 'outname', 'ansname', 'testcaseinname', + 'testcaseoutname', 'dummyinname', 'dummyoutname') + +class Config(object): + __slots__ = 'modules', '__dict__' + + def __init__(self, *modules): + self.modules = modules + + def __getattr__(self, name): + for module in self.modules: + try: + return getattr(module, name) + except AttributeError: + pass + # TODO: provide a message + raise AttributeError(name) + +# A helper context manager +class ReadDeleting(object): + __slots__ = 'name', 'file' + + def __init__(self, name): + self.name = name + + def __enter__(self): + try: + self.file = open(self.name, 'rU') + return self.file + except: + try: + self.__exit__(None, None, None) + except: + pass + raise + + def __exit__(self, exc_type, exc_val, exc_tb): + self.file.close() + os.remove(self.name) + +def load_problem(problem_name): + dwb = sys.dont_write_bytecode + sys.dont_write_bytecode = True + metafile = files.File('/'.join((problem_name, 'testconf.py')), True, 'configuration') + module = None + with CompatBuiltins(): + if zipimport and isinstance(metafile.archive, files.ZipArchive): + try: + module = zipimport.zipimporter(os.path.dirname(metafile.full_real_path)).load_module('testconf') + except zipimport.ZipImportError: + pass + else: + del sys.modules['testconf'] + if not module: + try: + with metafile.open() as f: + module = imp.load_module('testconf', f, metafile.full_real_path, ('.py', 'r', imp.PY_SOURCE)) + # Handle the case when f is not a true file object but imp requires one + except ValueError: + # FIXME: 2.5 lacks the delete parameter + with tempfile.NamedTemporaryFile(delete=False) as f: + inputdatafname = f.name + metafile.copy(inputdatafname) + with ReadDeleting(inputdatafname) as f: + module = imp.load_module('testconf', f, metafile.full_real_path, ('.py', 'r', imp.PY_SOURCE)) + del sys.modules['testconf'] + if hasattr(module, 'padwithzeroestolength'): + if not hasattr(module, 'padtests'): + try: + module.padtests = module.padwithzeroestolength[0] + except TypeError: + module.padtests = module.padwithzeroestolength + if not hasattr(module, 'paddummies'): + try: + module.paddummies = module.padwithzeroestolength[1] + except TypeError: + module.paddummies = module.padwithzeroestolength + for name in defaults_problem: + if not hasattr(globalconf, name): + setattr(module, name, getattr(module, name, defaults_problem[name])) + module = Config(module, globalconf) + if not module.dummyinname: + module.dummyinname = getattr(module, 'testcaseinname', module.dummyinname) + if not module.dummyoutname: + module.dummyoutname = getattr(module, 'testcaseoutname', module.dummyoutname) + if not hasattr(module, 'path'): + if hasattr(module, 'name'): + module.path = module.name + elif sys.platform != 'win32': + module.path = os.path.join(os.path.curdir, problem_name) + else: + module.path = problem_name + if options.no_maxtime: + module.maxtime = 0 + sys.dont_write_bytecode = dwb + for name in patterns: + if hasattr(module, name): + setattr(module, name, getattr(module, name).replace('%', problem_name)) + return module + +def load_global(): + dwb = sys.dont_write_bytecode + sys.dont_write_bytecode = True + metafile = files.File('testconf.py', True, 'configuration') + module = None + with CompatBuiltins(): + if zipimport and isinstance(metafile.archive, files.ZipArchive): + try: + module = zipimport.zipimporter(os.path.dirname(metafile.full_real_path)).load_module('testconf') + except zipimport.ZipImportError: + pass + else: + del sys.modules['testconf'] + if not module: + try: + with metafile.open() as f: + module = imp.load_module('testconf', f, metafile.full_real_path, ('.py', 'r', imp.PY_SOURCE)) + # Handle the case when f is not a true file object but imp requires one + except ValueError: + # FIXME: 2.5 lacks the delete parameter + with tempfile.NamedTemporaryFile(delete=False) as f: + inputdatafname = f.name + metafile.copy(inputdatafname) + with ReadDeleting(inputdatafname) as f: + module = imp.load_module('testconf', f, metafile.full_real_path, ('.py', 'r', imp.PY_SOURCE)) + del sys.modules['testconf'] + for name in defaults_global: + setattr(module, name, getattr(module, name, defaults_global[name])) + if not options.erase: + for name in defaults_noerase: + setattr(module, name, getattr(module, name, defaults_noerase[name])) + global globalconf + globalconf = module + sys.dont_write_bytecode = dwb + return module \ No newline at end of file