Mercurial > ~astiob > upreckon > hgweb
view 2.00/config.py @ 21:ec6f1a132109
A pretty usable version
Test groups and testconfs in non-ZIP archives or ZIP archives with comments are not yet supported.
author | Oleg Oshmyan <chortos@inbox.lv> |
---|---|
date | Fri, 06 Aug 2010 15:39:29 +0000 |
parents | f2279b7602d3 |
children | f07b7a431ea6 |
line wrap: on
line source
#! /usr/bin/env python # Copyright (c) 2010 Chortos-2 <chortos@inbox.lv> from __future__ import division, with_statement try: 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 __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': ''} patterns = ('inname', 'outname', 'ansname', 'testcaseinname', 'testcaseoutname', 'dummyinname', 'dummyoutname') defaults_global = {'tasknames': None, 'force_zero_exitcode': True} 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) 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 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: with metafile.open() 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])) for name in patterns: if hasattr(module, name): setattr(module, name, getattr(module, name).replace('%', problem_name)) 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 return Config(module, globalconf) def load_global(): dwb = sys.dont_write_bytecode sys.dont_write_bytecode = True metafile = files.File('testconf.py', True, 'configuration') module = None 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: with metafile.open() 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])) global globalconf globalconf = module sys.dont_write_bytecode = dwb return module