annotate upreckon/config.py @ 205:166a23999bf7

Added confvar okexitcodemask; changed the validator protocol Callable validators now return three-tuples (number granted, bool correct, str comment) instead of two-tuples (number granted, str comment). They are still allowed to return single numbers. Callable validators must now explicitly raise upreckon.exceptions.WrongAnswer if they want the verdict to be Wrong Answer rather than Partly Correct. okexitcodemask specifies a bitmask ANDed with the exit code of the external validator to get a boolean flag showing whether the answer is to be marked as 'OK' rather than 'partly correct'. The bits covered by the bitmask are reset to zeroes before devising the number of points granted from the resulting number.
author Oleg Oshmyan <chortos@inbox.lv>
date Wed, 17 Aug 2011 20:44:54 +0300
parents dd1f715398f0
children 946e8c09ba12
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
78
d46bd7ee3e69 Updated copyright notices
Oleg Oshmyan <chortos@inbox.lv>
parents: 76
diff changeset
1 # Copyright (c) 2010-2011 Chortos-2 <chortos@inbox.lv>
16
f2279b7602d3 Initial 2.00 commit
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
2
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
3 from __future__ import division, with_statement
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
4
146
d5b6708c1955 Distutils support, reorganization and cleaning up
Oleg Oshmyan <chortos@inbox.lv>
parents: 107
diff changeset
5 from .compat import *
d5b6708c1955 Distutils support, reorganization and cleaning up
Oleg Oshmyan <chortos@inbox.lv>
parents: 107
diff changeset
6 from . import files
151
6261eea8a975 Positional cmdline arguments now override testconf.tests and disable groups
Oleg Oshmyan <chortos@inbox.lv>
parents: 150
diff changeset
7 from __main__ import options, args
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
8
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
9 if files.ZipArchive:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
10 try:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
11 import zipimport
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
12 except ImportError:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
13 zipimport = None
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
14 else:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
15 zipimport = None
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
16
150
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
17 import imp, os, posixpath, sys, tempfile
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
18
150
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
19 __all__ = 'load_problem', 'load_global', 'globalconf', 'nativize_path'
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
20
74
aea4fc87698a Minimal code clean-up
Oleg Oshmyan <chortos@inbox.lv>
parents: 73
diff changeset
21 defaults_problem = {'kind': 'batch',
aea4fc87698a Minimal code clean-up
Oleg Oshmyan <chortos@inbox.lv>
parents: 73
diff changeset
22 'usegroups': False,
82
06356af50bf9 Finished testcases reorganization and CPU time limit implementation
Oleg Oshmyan <chortos@inbox.lv>
parents: 79
diff changeset
23 'maxcputime': None,
06356af50bf9 Finished testcases reorganization and CPU time limit implementation
Oleg Oshmyan <chortos@inbox.lv>
parents: 79
diff changeset
24 'maxwalltime': None,
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
25 'maxmemory': None,
199
1de2ea435d93 The default match mode is now 'literal'
Oleg Oshmyan <chortos@inbox.lv>
parents: 193
diff changeset
26 'match': 'literal',
96
c3afa2b0c14c Fixed a typo (did not affect anything)
Oleg Oshmyan <chortos@inbox.lv>
parents: 92
diff changeset
27 'dummies': (),
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
28 'testsexcluded': (),
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
29 'padtests': 0,
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
30 'paddummies': 0,
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
31 'taskweight': 100,
76
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
32 'groupweight': {},
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
33 'pointmap': {},
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
34 'stdio': False,
174
e0b2fbd7ebe0 Improved built-in output validator; added conf. var. binary
Oleg Oshmyan <chortos@inbox.lv>
parents: 164
diff changeset
35 'binary': False,
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
36 'dummyinname': '',
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
37 'dummyoutname': '',
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
38 'tester': None,
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
39 'maxexitcode': 0,
205
166a23999bf7 Added confvar okexitcodemask; changed the validator protocol
Oleg Oshmyan <chortos@inbox.lv>
parents: 203
diff changeset
40 'okexitcodeflag': 0,
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
41 'inname': '',
200
fa81289ee407 force_zero_exitcode is now a problem-specific configuration variable
Oleg Oshmyan <chortos@inbox.lv>
parents: 199
diff changeset
42 'ansname': '',
fa81289ee407 force_zero_exitcode is now a problem-specific configuration variable
Oleg Oshmyan <chortos@inbox.lv>
parents: 199
diff changeset
43 'force_zero_exitcode': True}
fa81289ee407 force_zero_exitcode is now a problem-specific configuration variable
Oleg Oshmyan <chortos@inbox.lv>
parents: 199
diff changeset
44 defaults_global = {'problems': None}
43
81f58c938ec5 Fixed the -s option
Oleg Oshmyan <chortos@inbox.lv>
parents: 38
diff changeset
45 defaults_noerase = {'inname': '%.in',
81f58c938ec5 Fixed the -s option
Oleg Oshmyan <chortos@inbox.lv>
parents: 38
diff changeset
46 'outname': '%.out',
81f58c938ec5 Fixed the -s option
Oleg Oshmyan <chortos@inbox.lv>
parents: 38
diff changeset
47 'ansname': '%.ans'}
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
48 patterns = ('inname', 'outname', 'ansname', 'testcaseinname',
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
49 'testcaseoutname', 'dummyinname', 'dummyoutname')
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
50
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
51 class Config(object):
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
52 __slots__ = 'modules', '__dict__'
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
53
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
54 def __init__(self, *modules):
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
55 self.modules = modules
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
56
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
57 def __getattr__(self, name):
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
58 for module in self.modules:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
59 try:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
60 return getattr(module, name)
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
61 except AttributeError:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
62 pass
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
63 # TODO: provide a message
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
64 raise AttributeError(name)
16
f2279b7602d3 Initial 2.00 commit
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
65
22
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
66 # A helper context manager
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
67 class ReadDeleting(object):
25
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
68 __slots__ = 'name', 'file'
22
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
69
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
70 def __init__(self, name):
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
71 self.name = name
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
72
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
73 def __enter__(self):
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
74 try:
25
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
75 self.file = open(self.name, 'rU')
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
76 return self.file
22
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
77 except:
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
78 try:
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
79 self.__exit__(None, None, None)
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
80 except:
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
81 pass
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
82 raise
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
83
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
84 def __exit__(self, exc_type, exc_val, exc_tb):
25
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
85 self.file.close()
22
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
86 os.remove(self.name)
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
87
150
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
88 def nativize_path(portable_path):
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
89 if portable_path.startswith('//:'):
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
90 return portable_path[3:]
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
91 comps = portable_path.split('/')
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
92 for i, comp in enumerate(comps):
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
93 if comp == '..':
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
94 comps[i] = os.path.pardir
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
95 elif comp == '.':
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
96 comps[i] = os.path.curdir
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
97 native_path = os.path.join(*comps)
156
2db236d25ecd Improved the nativization of absolute paths by config.nativize_path
Oleg Oshmyan <chortos@inbox.lv>
parents: 152
diff changeset
98 if posixpath.isabs(portable_path) and not os.path.isabs(native_path):
2db236d25ecd Improved the nativization of absolute paths by config.nativize_path
Oleg Oshmyan <chortos@inbox.lv>
parents: 152
diff changeset
99 abspath = os.path.abspath(native_path)
2db236d25ecd Improved the nativization of absolute paths by config.nativize_path
Oleg Oshmyan <chortos@inbox.lv>
parents: 152
diff changeset
100 parent = os.path.dirname(abspath)
2db236d25ecd Improved the nativization of absolute paths by config.nativize_path
Oleg Oshmyan <chortos@inbox.lv>
parents: 152
diff changeset
101 while parent != abspath:
2db236d25ecd Improved the nativization of absolute paths by config.nativize_path
Oleg Oshmyan <chortos@inbox.lv>
parents: 152
diff changeset
102 abspath, parent = parent, os.path.dirname(parent)
2db236d25ecd Improved the nativization of absolute paths by config.nativize_path
Oleg Oshmyan <chortos@inbox.lv>
parents: 152
diff changeset
103 native_path = os.path.join(parent, native_path)
2db236d25ecd Improved the nativization of absolute paths by config.nativize_path
Oleg Oshmyan <chortos@inbox.lv>
parents: 152
diff changeset
104 elif not posixpath.isabs(portable_path) and os.path.isabs(native_path):
150
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
105 native_path = os.path.sep + native_path
156
2db236d25ecd Improved the nativization of absolute paths by config.nativize_path
Oleg Oshmyan <chortos@inbox.lv>
parents: 152
diff changeset
106 if posixpath.isabs(portable_path) != os.path.isabs(native_path):
2db236d25ecd Improved the nativization of absolute paths by config.nativize_path
Oleg Oshmyan <chortos@inbox.lv>
parents: 152
diff changeset
107 raise ValueError('cannot make native path relative/absolute')
150
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
108 return native_path
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
109
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
110 def load_problem(problem_name):
70
b9d5857f7b9a Better emulation of built-ins for testconf
Oleg Oshmyan <chortos@inbox.lv>
parents: 60
diff changeset
111 global builtins
83
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
112 try:
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
113 dwb = sys.dont_write_bytecode
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
114 sys.dont_write_bytecode = True
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
115 except AttributeError:
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
116 pass
150
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
117 metafile = files.File(problem_name + '/testconf.py', True, 'configuration')
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
118 module = None
70
b9d5857f7b9a Better emulation of built-ins for testconf
Oleg Oshmyan <chortos@inbox.lv>
parents: 60
diff changeset
119 with CompatBuiltins() as builtins:
25
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
120 if zipimport and isinstance(metafile.archive, files.ZipArchive):
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
121 try:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
122 module = zipimport.zipimporter(os.path.dirname(metafile.full_real_path)).load_module('testconf')
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
123 except zipimport.ZipImportError:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
124 pass
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
125 else:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
126 del sys.modules['testconf']
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
127 if not module:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
128 try:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
129 with metafile.open() as f:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
130 module = imp.load_module('testconf', f, metafile.full_real_path, ('.py', 'r', imp.PY_SOURCE))
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
131 # Handle the case when f is not a true file object but imp requires one
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
132 except ValueError:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
133 # FIXME: 2.5 lacks the delete parameter
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
134 with tempfile.NamedTemporaryFile(delete=False) as f:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
135 inputdatafname = f.name
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
136 metafile.copy(inputdatafname)
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
137 with ReadDeleting(inputdatafname) as f:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
138 module = imp.load_module('testconf', f, metafile.full_real_path, ('.py', 'r', imp.PY_SOURCE))
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
139 del sys.modules['testconf']
107
6589511f5418 Fixed mishandling of some variables in multi-problem legacy configurations
Oleg Oshmyan <chortos@inbox.lv>
parents: 96
diff changeset
140 module = Config(module, globalconf)
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
141 if hasattr(module, 'padwithzeroestolength'):
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
142 if not hasattr(module, 'padtests'):
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
143 try:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
144 module.padtests = module.padwithzeroestolength[0]
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
145 except TypeError:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
146 module.padtests = module.padwithzeroestolength
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
147 if not hasattr(module, 'paddummies'):
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
148 try:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
149 module.paddummies = module.padwithzeroestolength[1]
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
150 except TypeError:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
151 module.paddummies = module.padwithzeroestolength
92
17041a71bc02 maxtime is now auto-converted to maxcputime
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
152 if (not hasattr(module, 'maxcputime') and
17041a71bc02 maxtime is now auto-converted to maxcputime
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
153 not hasattr(module, 'maxwalltime') and
17041a71bc02 maxtime is now auto-converted to maxcputime
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
154 hasattr(module, 'maxtime')):
17041a71bc02 maxtime is now auto-converted to maxcputime
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
155 module.maxcputime = module.maxtime
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
156 for name in defaults_problem:
107
6589511f5418 Fixed mishandling of some variables in multi-problem legacy configurations
Oleg Oshmyan <chortos@inbox.lv>
parents: 96
diff changeset
157 setattr(module, name, getattr(module, name, defaults_problem[name]))
27
dc4be35d17e0 Bug fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 25
diff changeset
158 if not module.dummyinname:
dc4be35d17e0 Bug fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 25
diff changeset
159 module.dummyinname = getattr(module, 'testcaseinname', module.dummyinname)
dc4be35d17e0 Bug fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 25
diff changeset
160 if not module.dummyoutname:
dc4be35d17e0 Bug fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 25
diff changeset
161 module.dummyoutname = getattr(module, 'testcaseoutname', module.dummyoutname)
150
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
162 if hasattr(module, 'testee'):
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
163 if isinstance(module.testee, basestring):
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
164 module.path = nativize_path(module.testee)
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
165 else:
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
166 testee = tuple(module.testee)
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
167 module.path = (nativize_path(testee[0]),) + testee[1:]
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
168 elif not hasattr(module, 'path'):
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
169 if hasattr(module, 'name'):
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
170 module.path = module.name
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
171 elif sys.platform != 'win32':
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
172 module.path = os.path.join(os.path.curdir, problem_name)
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
173 else:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
174 module.path = problem_name
164
b375daa74371 The first/only item of testconf.tester is now passed through nativize_path
Oleg Oshmyan <chortos@inbox.lv>
parents: 156
diff changeset
175 if module.tester:
b375daa74371 The first/only item of testconf.tester is now passed through nativize_path
Oleg Oshmyan <chortos@inbox.lv>
parents: 156
diff changeset
176 if isinstance(module.tester, basestring):
b375daa74371 The first/only item of testconf.tester is now passed through nativize_path
Oleg Oshmyan <chortos@inbox.lv>
parents: 156
diff changeset
177 module.tester = nativize_path(module.tester)
175
35d59ba0e27c Fixed crashing on callable values of the tester conf. var.
Oleg Oshmyan <chortos@inbox.lv>
parents: 174
diff changeset
178 elif not callable(module.tester):
164
b375daa74371 The first/only item of testconf.tester is now passed through nativize_path
Oleg Oshmyan <chortos@inbox.lv>
parents: 156
diff changeset
179 tester = tuple(module.tester)
b375daa74371 The first/only item of testconf.tester is now passed through nativize_path
Oleg Oshmyan <chortos@inbox.lv>
parents: 156
diff changeset
180 module.tester = (nativize_path(tester[0]),) + tester[1:]
203
dd1f715398f0 Fixed mapping (dict) values of taskweight
Oleg Oshmyan <chortos@inbox.lv>
parents: 201
diff changeset
181 if not isinstance(module.taskweight, dict):
dd1f715398f0 Fixed mapping (dict) values of taskweight
Oleg Oshmyan <chortos@inbox.lv>
parents: 201
diff changeset
182 try:
dd1f715398f0 Fixed mapping (dict) values of taskweight
Oleg Oshmyan <chortos@inbox.lv>
parents: 201
diff changeset
183 module.taskweight = dict(zip(module.problems, module.taskweight))
dd1f715398f0 Fixed mapping (dict) values of taskweight
Oleg Oshmyan <chortos@inbox.lv>
parents: 201
diff changeset
184 except TypeError:
dd1f715398f0 Fixed mapping (dict) values of taskweight
Oleg Oshmyan <chortos@inbox.lv>
parents: 201
diff changeset
185 pass
201
32650f4a2177 taskweight can now be an iterable or a mapping
Oleg Oshmyan <chortos@inbox.lv>
parents: 200
diff changeset
186 try:
32650f4a2177 taskweight can now be an iterable or a mapping
Oleg Oshmyan <chortos@inbox.lv>
parents: 200
diff changeset
187 module.taskweight = module.taskweight[problem_name]
32650f4a2177 taskweight can now be an iterable or a mapping
Oleg Oshmyan <chortos@inbox.lv>
parents: 200
diff changeset
188 except KeyError:
32650f4a2177 taskweight can now be an iterable or a mapping
Oleg Oshmyan <chortos@inbox.lv>
parents: 200
diff changeset
189 module.taskweight = defaults_problem['taskweight']
32650f4a2177 taskweight can now be an iterable or a mapping
Oleg Oshmyan <chortos@inbox.lv>
parents: 200
diff changeset
190 except TypeError:
32650f4a2177 taskweight can now be an iterable or a mapping
Oleg Oshmyan <chortos@inbox.lv>
parents: 200
diff changeset
191 pass
76
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
192 for name in 'pointmap', 'groupweight':
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
193 oldmap = getattr(module, name)
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
194 if isinstance(oldmap, dict):
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
195 newmap = {}
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
196 for key in oldmap:
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
197 if not options.legacy and isinstance(key, basestring):
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
198 newmap[key] = oldmap[key]
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
199 else:
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
200 try:
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
201 for k in key:
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
202 newmap[k] = oldmap[key]
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
203 except TypeError:
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
204 newmap[key] = oldmap[key]
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
205 setattr(module, name, newmap)
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
206 if options.no_maxtime:
82
06356af50bf9 Finished testcases reorganization and CPU time limit implementation
Oleg Oshmyan <chortos@inbox.lv>
parents: 79
diff changeset
207 module.maxcputime = module.maxwalltime = 0
151
6261eea8a975 Positional cmdline arguments now override testconf.tests and disable groups
Oleg Oshmyan <chortos@inbox.lv>
parents: 150
diff changeset
208 if args:
6261eea8a975 Positional cmdline arguments now override testconf.tests and disable groups
Oleg Oshmyan <chortos@inbox.lv>
parents: 150
diff changeset
209 module.usegroups = False
6261eea8a975 Positional cmdline arguments now override testconf.tests and disable groups
Oleg Oshmyan <chortos@inbox.lv>
parents: 150
diff changeset
210 module.tests = args
152
7951219d9866 Dummies are no longer tested when positional cmdline arguments are given
Oleg Oshmyan <chortos@inbox.lv>
parents: 151
diff changeset
211 module.dummies = ()
83
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
212 try:
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
213 sys.dont_write_bytecode = dwb
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
214 except NameError:
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
215 pass
24
c23d81f4a1a3 Score returned by TestCase.__call__() is now normalized to 0..1
Oleg Oshmyan <chortos@inbox.lv>
parents: 22
diff changeset
216 for name in patterns:
c23d81f4a1a3 Score returned by TestCase.__call__() is now normalized to 0..1
Oleg Oshmyan <chortos@inbox.lv>
parents: 22
diff changeset
217 if hasattr(module, name):
c23d81f4a1a3 Score returned by TestCase.__call__() is now normalized to 0..1
Oleg Oshmyan <chortos@inbox.lv>
parents: 22
diff changeset
218 setattr(module, name, getattr(module, name).replace('%', problem_name))
c23d81f4a1a3 Score returned by TestCase.__call__() is now normalized to 0..1
Oleg Oshmyan <chortos@inbox.lv>
parents: 22
diff changeset
219 return module
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
220
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
221 def load_global():
70
b9d5857f7b9a Better emulation of built-ins for testconf
Oleg Oshmyan <chortos@inbox.lv>
parents: 60
diff changeset
222 global builtins
83
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
223 try:
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
224 dwb = sys.dont_write_bytecode
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
225 sys.dont_write_bytecode = True
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
226 except AttributeError:
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
227 pass
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
228 metafile = files.File('testconf.py', True, 'configuration')
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
229 module = None
70
b9d5857f7b9a Better emulation of built-ins for testconf
Oleg Oshmyan <chortos@inbox.lv>
parents: 60
diff changeset
230 with CompatBuiltins() as builtins:
25
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
231 if zipimport and isinstance(metafile.archive, files.ZipArchive):
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
232 try:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
233 module = zipimport.zipimporter(os.path.dirname(metafile.full_real_path)).load_module('testconf')
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
234 except zipimport.ZipImportError:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
235 pass
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
236 else:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
237 del sys.modules['testconf']
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
238 if not module:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
239 try:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
240 with metafile.open() as f:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
241 module = imp.load_module('testconf', f, metafile.full_real_path, ('.py', 'r', imp.PY_SOURCE))
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
242 # Handle the case when f is not a true file object but imp requires one
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
243 except ValueError:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
244 # FIXME: 2.5 lacks the delete parameter
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
245 with tempfile.NamedTemporaryFile(delete=False) as f:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
246 inputdatafname = f.name
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
247 metafile.copy(inputdatafname)
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
248 with ReadDeleting(inputdatafname) as f:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
249 module = imp.load_module('testconf', f, metafile.full_real_path, ('.py', 'r', imp.PY_SOURCE))
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
250 del sys.modules['testconf']
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
251 for name in defaults_global:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
252 setattr(module, name, getattr(module, name, defaults_global[name]))
43
81f58c938ec5 Fixed the -s option
Oleg Oshmyan <chortos@inbox.lv>
parents: 38
diff changeset
253 if not options.erase:
81f58c938ec5 Fixed the -s option
Oleg Oshmyan <chortos@inbox.lv>
parents: 38
diff changeset
254 for name in defaults_noerase:
81f58c938ec5 Fixed the -s option
Oleg Oshmyan <chortos@inbox.lv>
parents: 38
diff changeset
255 setattr(module, name, getattr(module, name, defaults_noerase[name]))
79
ee8a99dcaaed Renamed configuration variable tasknames to problems
Oleg Oshmyan <chortos@inbox.lv>
parents: 78
diff changeset
256 if hasattr(module, 'tasknames'):
ee8a99dcaaed Renamed configuration variable tasknames to problems
Oleg Oshmyan <chortos@inbox.lv>
parents: 78
diff changeset
257 module.problems = module.tasknames
201
32650f4a2177 taskweight can now be an iterable or a mapping
Oleg Oshmyan <chortos@inbox.lv>
parents: 200
diff changeset
258 # Iterable and mapping taskweights cause re-iteration over problems
32650f4a2177 taskweight can now be an iterable or a mapping
Oleg Oshmyan <chortos@inbox.lv>
parents: 200
diff changeset
259 try:
32650f4a2177 taskweight can now be an iterable or a mapping
Oleg Oshmyan <chortos@inbox.lv>
parents: 200
diff changeset
260 len(module.problems)
32650f4a2177 taskweight can now be an iterable or a mapping
Oleg Oshmyan <chortos@inbox.lv>
parents: 200
diff changeset
261 except Exception:
32650f4a2177 taskweight can now be an iterable or a mapping
Oleg Oshmyan <chortos@inbox.lv>
parents: 200
diff changeset
262 module.problems = tuple(module.problems)
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
263 global globalconf
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
264 globalconf = module
83
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
265 try:
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
266 sys.dont_write_bytecode = dwb
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
267 except NameError:
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
268 pass
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
269 return module