Mercurial > ~astiob > upreckon > hgweb
diff 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 diff
--- a/2.00/config.py Mon Jun 14 21:02:06 2010 +0000 +++ b/2.00/config.py Fri Aug 06 15:39:29 2010 +0000 @@ -1,8 +1,128 @@ -#!/usr/bin/python +#! /usr/bin/env python # Copyright (c) 2010 Chortos-2 <chortos@inbox.lv> -import os -tasknames = (os.path.curdir,) +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(name): - return object() \ No newline at end of file +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 \ No newline at end of file