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