annotate upreckon/config.py @ 193:a76cdc26ba9d

Added conf. var. match and match='regexp' for non-archives Specify match='regexp', and your tests and dummies will be treated as regular expressions describing test case identifiers. Every file that is in a suitable location and whose name matches {testcase,dummy}inname and the given regexp will be treated as a file with test case input data. You are free to use backreferences in the regexps, but group numbering starts at two rather than one. If you want test groups, you can get them magically created for you by putting a part of the test ID in a group in the regexp sense and specifying the tests variable as a pair consisting of the regexp itself and the number of this regexp group (remember group numbers start at two).
author Oleg Oshmyan <chortos@inbox.lv>
date Thu, 11 Aug 2011 23:20:52 +0300
parents 35d59ba0e27c
children 1de2ea435d93
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,
193
a76cdc26ba9d Added conf. var. match and match='regexp' for non-archives
Oleg Oshmyan <chortos@inbox.lv>
parents: 175
diff changeset
26 'match': '$%',
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,
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
40 'inname': '',
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
41 'ansname': ''}
79
ee8a99dcaaed Renamed configuration variable tasknames to problems
Oleg Oshmyan <chortos@inbox.lv>
parents: 78
diff changeset
42 defaults_global = {'problems': None,
22
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
43 'force_zero_exitcode': True}
43
81f58c938ec5 Fixed the -s option
Oleg Oshmyan <chortos@inbox.lv>
parents: 38
diff changeset
44 defaults_noerase = {'inname': '%.in',
81f58c938ec5 Fixed the -s option
Oleg Oshmyan <chortos@inbox.lv>
parents: 38
diff changeset
45 'outname': '%.out',
81f58c938ec5 Fixed the -s option
Oleg Oshmyan <chortos@inbox.lv>
parents: 38
diff changeset
46 'ansname': '%.ans'}
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
47 patterns = ('inname', 'outname', 'ansname', 'testcaseinname',
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
48 'testcaseoutname', 'dummyinname', 'dummyoutname')
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
49
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
50 class Config(object):
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
51 __slots__ = 'modules', '__dict__'
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
52
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
53 def __init__(self, *modules):
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
54 self.modules = modules
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
55
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
56 def __getattr__(self, name):
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
57 for module in self.modules:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
58 try:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
59 return getattr(module, name)
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
60 except AttributeError:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
61 pass
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
62 # TODO: provide a message
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
63 raise AttributeError(name)
16
f2279b7602d3 Initial 2.00 commit
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
64
22
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
65 # A helper context manager
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
66 class ReadDeleting(object):
25
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
67 __slots__ = 'name', 'file'
22
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
68
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
69 def __init__(self, name):
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
70 self.name = name
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
71
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
72 def __enter__(self):
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
73 try:
25
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
74 self.file = open(self.name, 'rU')
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
75 return self.file
22
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
76 except:
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
77 try:
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
78 self.__exit__(None, None, None)
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
79 except:
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
80 pass
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
81 raise
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
82
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
83 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
84 self.file.close()
22
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
85 os.remove(self.name)
f07b7a431ea6 Further 2.00 work
Oleg Oshmyan <chortos@inbox.lv>
parents: 21
diff changeset
86
150
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
87 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
88 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
89 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
90 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
91 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
92 if comp == '..':
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
93 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
94 elif comp == '.':
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
95 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
96 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
97 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
98 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
99 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
100 while parent != abspath:
2db236d25ecd Improved the nativization of absolute paths by config.nativize_path
Oleg Oshmyan <chortos@inbox.lv>
parents: 152
diff changeset
101 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
102 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
103 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
104 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
105 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
106 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
107 return native_path
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
108
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
109 def load_problem(problem_name):
70
b9d5857f7b9a Better emulation of built-ins for testconf
Oleg Oshmyan <chortos@inbox.lv>
parents: 60
diff changeset
110 global builtins
83
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
111 try:
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
112 dwb = sys.dont_write_bytecode
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
113 sys.dont_write_bytecode = True
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
114 except AttributeError:
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
115 pass
150
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
116 metafile = files.File(problem_name + '/testconf.py', True, 'configuration')
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
117 module = None
70
b9d5857f7b9a Better emulation of built-ins for testconf
Oleg Oshmyan <chortos@inbox.lv>
parents: 60
diff changeset
118 with CompatBuiltins() as builtins:
25
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
119 if zipimport and isinstance(metafile.archive, files.ZipArchive):
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
120 try:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
121 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
122 except zipimport.ZipImportError:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
123 pass
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
124 else:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
125 del sys.modules['testconf']
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
126 if not module:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
127 try:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
128 with metafile.open() as f:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
129 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
130 # 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
131 except ValueError:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
132 # FIXME: 2.5 lacks the delete parameter
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
133 with tempfile.NamedTemporaryFile(delete=False) as f:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
134 inputdatafname = f.name
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
135 metafile.copy(inputdatafname)
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
136 with ReadDeleting(inputdatafname) as f:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
137 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
138 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
139 module = Config(module, globalconf)
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
140 if hasattr(module, 'padwithzeroestolength'):
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
141 if not hasattr(module, 'padtests'):
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
142 try:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
143 module.padtests = module.padwithzeroestolength[0]
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
144 except TypeError:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
145 module.padtests = module.padwithzeroestolength
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
146 if not hasattr(module, 'paddummies'):
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
147 try:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
148 module.paddummies = module.padwithzeroestolength[1]
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
149 except TypeError:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
150 module.paddummies = module.padwithzeroestolength
92
17041a71bc02 maxtime is now auto-converted to maxcputime
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
151 if (not hasattr(module, 'maxcputime') and
17041a71bc02 maxtime is now auto-converted to maxcputime
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
152 not hasattr(module, 'maxwalltime') and
17041a71bc02 maxtime is now auto-converted to maxcputime
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
153 hasattr(module, 'maxtime')):
17041a71bc02 maxtime is now auto-converted to maxcputime
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
154 module.maxcputime = module.maxtime
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
155 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
156 setattr(module, name, getattr(module, name, defaults_problem[name]))
27
dc4be35d17e0 Bug fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 25
diff changeset
157 if not module.dummyinname:
dc4be35d17e0 Bug fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 25
diff changeset
158 module.dummyinname = getattr(module, 'testcaseinname', module.dummyinname)
dc4be35d17e0 Bug fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 25
diff changeset
159 if not module.dummyoutname:
dc4be35d17e0 Bug fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 25
diff changeset
160 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
161 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
162 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
163 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
164 else:
006dce02752c Added the testee configuration variable and the config.nativize_path function
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
165 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
166 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
167 elif not hasattr(module, 'path'):
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
168 if hasattr(module, 'name'):
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
169 module.path = module.name
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
170 elif sys.platform != 'win32':
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
171 module.path = os.path.join(os.path.curdir, problem_name)
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
172 else:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
173 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
174 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
175 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
176 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
177 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
178 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
179 module.tester = (nativize_path(tester[0]),) + tester[1:]
76
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
180 for name in 'pointmap', 'groupweight':
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
181 oldmap = getattr(module, name)
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
182 if isinstance(oldmap, dict):
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
183 newmap = {}
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
184 for key in oldmap:
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
185 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
186 newmap[key] = oldmap[key]
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
187 else:
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
188 try:
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
189 for k in key:
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
190 newmap[k] = oldmap[key]
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
191 except TypeError:
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
192 newmap[key] = oldmap[key]
0e5ae28e0b2b Points are now weighted on a test context basis
Oleg Oshmyan <chortos@inbox.lv>
parents: 74
diff changeset
193 setattr(module, name, newmap)
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
194 if options.no_maxtime:
82
06356af50bf9 Finished testcases reorganization and CPU time limit implementation
Oleg Oshmyan <chortos@inbox.lv>
parents: 79
diff changeset
195 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
196 if args:
6261eea8a975 Positional cmdline arguments now override testconf.tests and disable groups
Oleg Oshmyan <chortos@inbox.lv>
parents: 150
diff changeset
197 module.usegroups = False
6261eea8a975 Positional cmdline arguments now override testconf.tests and disable groups
Oleg Oshmyan <chortos@inbox.lv>
parents: 150
diff changeset
198 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
199 module.dummies = ()
83
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
200 try:
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
201 sys.dont_write_bytecode = dwb
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
202 except NameError:
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
203 pass
24
c23d81f4a1a3 Score returned by TestCase.__call__() is now normalized to 0..1
Oleg Oshmyan <chortos@inbox.lv>
parents: 22
diff changeset
204 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
205 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
206 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
207 return module
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
208
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
209 def load_global():
70
b9d5857f7b9a Better emulation of built-ins for testconf
Oleg Oshmyan <chortos@inbox.lv>
parents: 60
diff changeset
210 global builtins
83
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
211 try:
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
212 dwb = sys.dont_write_bytecode
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
213 sys.dont_write_bytecode = True
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
214 except AttributeError:
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
215 pass
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
216 metafile = files.File('testconf.py', True, 'configuration')
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
217 module = None
70
b9d5857f7b9a Better emulation of built-ins for testconf
Oleg Oshmyan <chortos@inbox.lv>
parents: 60
diff changeset
218 with CompatBuiltins() as builtins:
25
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
219 if zipimport and isinstance(metafile.archive, files.ZipArchive):
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
220 try:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
221 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
222 except zipimport.ZipImportError:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
223 pass
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
224 else:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
225 del sys.modules['testconf']
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
226 if not module:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
227 try:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
228 with metafile.open() as f:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
229 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
230 # 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
231 except ValueError:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
232 # FIXME: 2.5 lacks the delete parameter
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
233 with tempfile.NamedTemporaryFile(delete=False) as f:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
234 inputdatafname = f.name
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
235 metafile.copy(inputdatafname)
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
236 with ReadDeleting(inputdatafname) as f:
b500e117080e Bug fixes and overhead reduction
Oleg Oshmyan <chortos@inbox.lv>
parents: 24
diff changeset
237 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
238 del sys.modules['testconf']
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
239 for name in defaults_global:
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
240 setattr(module, name, getattr(module, name, defaults_global[name]))
43
81f58c938ec5 Fixed the -s option
Oleg Oshmyan <chortos@inbox.lv>
parents: 38
diff changeset
241 if not options.erase:
81f58c938ec5 Fixed the -s option
Oleg Oshmyan <chortos@inbox.lv>
parents: 38
diff changeset
242 for name in defaults_noerase:
81f58c938ec5 Fixed the -s option
Oleg Oshmyan <chortos@inbox.lv>
parents: 38
diff changeset
243 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
244 if hasattr(module, 'tasknames'):
ee8a99dcaaed Renamed configuration variable tasknames to problems
Oleg Oshmyan <chortos@inbox.lv>
parents: 78
diff changeset
245 module.problems = module.tasknames
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
246 global globalconf
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
247 globalconf = module
83
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
248 try:
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
249 sys.dont_write_bytecode = dwb
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
250 except NameError:
37c4ad87583c Several small fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
251 pass
21
ec6f1a132109 A pretty usable version
Oleg Oshmyan <chortos@inbox.lv>
parents: 16
diff changeset
252 return module