Mercurial > ~astiob > upreckon > hgweb
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 |
rev | line source |
---|---|
78 | 1 # Copyright (c) 2010-2011 Chortos-2 <chortos@inbox.lv> |
16 | 2 |
21 | 3 from __future__ import division, with_statement |
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 | 8 |
9 if files.ZipArchive: | |
10 try: | |
11 import zipimport | |
12 except ImportError: | |
13 zipimport = None | |
14 else: | |
15 zipimport = None | |
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 | 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 | 20 |
74 | 21 defaults_problem = {'kind': 'batch', |
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 | 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 | 28 'testsexcluded': (), |
29 'padtests': 0, | |
30 'paddummies': 0, | |
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 | 33 'pointmap': {}, |
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 | 36 'dummyinname': '', |
37 'dummyoutname': '', | |
38 'tester': None, | |
39 'maxexitcode': 0, | |
40 'inname': '', | |
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 | 43 'force_zero_exitcode': True} |
43 | 44 defaults_noerase = {'inname': '%.in', |
45 'outname': '%.out', | |
46 'ansname': '%.ans'} | |
21 | 47 patterns = ('inname', 'outname', 'ansname', 'testcaseinname', |
48 'testcaseoutname', 'dummyinname', 'dummyoutname') | |
49 | |
50 class Config(object): | |
51 __slots__ = 'modules', '__dict__' | |
52 | |
53 def __init__(self, *modules): | |
54 self.modules = modules | |
55 | |
56 def __getattr__(self, name): | |
57 for module in self.modules: | |
58 try: | |
59 return getattr(module, name) | |
60 except AttributeError: | |
61 pass | |
62 # TODO: provide a message | |
63 raise AttributeError(name) | |
16 | 64 |
22 | 65 # A helper context manager |
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 | 68 |
69 def __init__(self, name): | |
70 self.name = name | |
71 | |
72 def __enter__(self): | |
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 | 76 except: |
77 try: | |
78 self.__exit__(None, None, None) | |
79 except: | |
80 pass | |
81 raise | |
82 | |
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 | 85 os.remove(self.name) |
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 | 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 | 111 try: |
112 dwb = sys.dont_write_bytecode | |
113 sys.dont_write_bytecode = True | |
114 except AttributeError: | |
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 | 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 | 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 | 140 if hasattr(module, 'padwithzeroestolength'): |
141 if not hasattr(module, 'padtests'): | |
142 try: | |
143 module.padtests = module.padwithzeroestolength[0] | |
144 except TypeError: | |
145 module.padtests = module.padwithzeroestolength | |
146 if not hasattr(module, 'paddummies'): | |
147 try: | |
148 module.paddummies = module.padwithzeroestolength[1] | |
149 except TypeError: | |
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 | 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 | 157 if not module.dummyinname: |
158 module.dummyinname = getattr(module, 'testcaseinname', module.dummyinname) | |
159 if not module.dummyoutname: | |
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 | 168 if hasattr(module, 'name'): |
169 module.path = module.name | |
170 elif sys.platform != 'win32': | |
171 module.path = os.path.join(os.path.curdir, problem_name) | |
172 else: | |
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 | 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 | 200 try: |
201 sys.dont_write_bytecode = dwb | |
202 except NameError: | |
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 | 208 |
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 | 211 try: |
212 dwb = sys.dont_write_bytecode | |
213 sys.dont_write_bytecode = True | |
214 except AttributeError: | |
215 pass | |
21 | 216 metafile = files.File('testconf.py', True, 'configuration') |
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 | 238 del sys.modules['testconf'] |
239 for name in defaults_global: | |
240 setattr(module, name, getattr(module, name, defaults_global[name])) | |
43 | 241 if not options.erase: |
242 for name in defaults_noerase: | |
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 | 246 global globalconf |
247 globalconf = module | |
83 | 248 try: |
249 sys.dont_write_bytecode = dwb | |
250 except NameError: | |
251 pass | |
21 | 252 return module |