2 Created on Jul 12, 2011
10 from tempfile
import mkdtemp
12 from EnvConfig
import Variable
13 from EnvConfig
import Control
16 saved_processors = Variable.processors
23 Create a directory structure from the content of files.
25 @param files: a dictionary or list of pairs mapping a filename to the content
26 if the content is a dictionary, recurse
27 @param rootdir: base directory
29 if type(files)
is dict:
33 if not os.path.exists(rootdir):
37 for filename, data
in files:
38 filename = os.path.join(rootdir, filename)
39 if type(data)
is dict:
42 d = os.path.dirname(filename)
43 if not os.path.exists(d):
45 f = open(filename,
"w")
52 Class for easy creation, use and removal of temporary directory structures.
61 shutil.rmtree(self.
tmpdir, ignore_errors=
False)
65 Return the absolute path to a file in the temporary directory.
67 return os.path.join(self.
tmpdir, *args)
71 Helper class to create a temporary directory and manage its lifetime.
73 An instance of this class can be used inside the 'with' statement and
74 returns the path to the temporary directory.
84 Equivalent to os.path.join(self.path, *args).
86 return os.path.join(self.
path, *args)
88 '''String representation (path to the temporary directory).'''
92 Remove the temporary directory.
93 After a call to this method, the object is not usable anymore.
96 shutil.rmtree(self.
path, ignore_errors=
True)
100 Context Manager protocol 'enter' function.
108 Context Manager protocol 'exit' function.
109 Remove the temporary directory and let the exceptions propagate.
117 print "WARNING: not removing temporary directory", self.
path
131 '''Test of value appending, prepending, setting, unsetting, removing'''
134 self.assertFalse(
'MY_PATH' in control.vars())
135 control.append(
'MY_PATH',
'newValue')
136 self.assertTrue(
'MY_PATH' in control.vars())
137 var = control.var(
'MY_PATH')
139 control.append(
'MY_PATH',
'newValue:secondVal:valval')
140 self.assertTrue(var[len(var)-1] ==
'valval')
142 self.assertTrue(
'newValue' in var)
143 control.remove(
'MY_PATH',
'newValue')
144 self.assertFalse(
'newValue' in var)
146 control.prepend(
'MY_PATH',
'newValue')
147 self.assertTrue(
'newValue' == var[0])
149 control.set(
'MY_PATH',
'hi:hello')
150 self.assertTrue(len(var) == 2)
151 self.assertTrue(
'hi' == var[0])
153 control.unset(
'MY_PATH')
154 self.assertTrue(
'MY_PATH' not in control)
159 control.variables[
'.'].set(
'some/dir')
161 self.assertTrue(
'.' in control.variables)
162 self.assertTrue(
'.' not in control.vars())
163 self.assertTrue(
'.' not in control.vars(strings=
False))
165 control.set(
'MY_DIR',
'${.}')
166 self.assertEqual(control.var(
'MY_DIR').
value(
True),
'some/dir')
167 self.assertEqual(control.vars()[
'MY_DIR'],
'some/dir')
172 """XML file write and load test"""
174 control.unset(
'MY_PATH')
175 control.set(
'MY_PATH',
'set:toDelete')
176 control.append(
'MY_PATH',
'appended:toDelete')
177 control.prepend(
'MY_PATH',
'prepended:toDelete')
178 control.remove(
'MY_PATH',
'toDelete')
179 control.finishXMLinput(
'testOutputFile.xml')
182 self.assertFalse(
'MY_PATH' in control.vars())
183 control.loadXML(
'testOutputFile.xml')
185 self.assertTrue(
'MY_PATH' in control.vars())
186 var = control.var(
'MY_PATH')
187 self.assertTrue(var[0] ==
'prepended')
188 self.assertTrue(var[1] ==
'set')
189 self.assertTrue(var[2] ==
'appended')
190 self.assertFalse(
'toDelete' in var)
192 os.remove(
'testOutputFile.xml')
196 """XML file write and load test"""
198 control.unset(
'MY_PATH')
199 control.set(
'MY_PATH', [
'set',
'toDelete'])
200 control.append(
'MY_PATH', [
'appended',
'toDelete'])
201 control.prepend(
'MY_PATH', [
'prepended',
'toDelete'])
202 control.remove(
'MY_PATH', [
'toDelete'])
203 control.finishXMLinput(
'testOutputFile.xml')
206 self.assertFalse(
'MY_PATH' in control.vars())
207 control.loadXML(
'testOutputFile.xml')
209 self.assertTrue(
'MY_PATH' in control.vars())
210 var = control.var(
'MY_PATH')
211 self.assertTrue(var[0] ==
'prepended')
212 self.assertTrue(var[1] ==
'set')
213 self.assertTrue(var[2] ==
'appended')
214 self.assertFalse(
'toDelete' in var)
216 os.remove(
'testOutputFile.xml')
220 """XML file write and load test"""
223 control.unset(
'MY_PATH')
224 control.set(
'MY_PATH',
'set:toDelete')
225 control.append(
'MY_PATH',
'appended:toDelete')
226 control.prepend(
'MY_PATH',
'prepended:toDelete')
227 control.remove(
'MY_PATH',
'toDelete')
228 control.writeToXMLFile(
'testOutputFile.xml')
231 self.assertFalse(
'MY_PATH' in control.vars())
232 control.loadXML(
'testOutputFile.xml')
234 self.assertTrue(
'MY_PATH' in control.vars())
235 var = control.var(
'MY_PATH')
236 self.assertTrue(var[0] ==
'prepended')
237 self.assertTrue(var[1] ==
'set')
238 self.assertTrue(var[2] ==
'appended')
239 self.assertFalse(
'toDelete' in var)
241 os.remove(
'testOutputFile.xml')
244 '''Test addition of variable to system'''
247 control.append(
'sysVar',
'newValue:lala')
248 control.writeToFile(
'setupFile.txt')
250 with open(
'setupFile.txt',
"r") as f:
255 self.assertEqual(stri, 'export sysVar=newValue:lala\n')
257 os.remove(
'setupFile.txt')
260 '''Testing searching in variables'''
263 control.append(
'MY_PATH',
'newValue:mess:something new:aaaabbcc')
265 def count(val, regExp = False):
266 return len(control.search(
'MY_PATH', val, regExp))
268 self.assertEqual(count(
'new'), 0)
269 self.assertEqual(count(
'newValue'), 1)
271 self.assertEqual(count(
'me',
False), 0)
272 self.assertEqual(count(
'me',
True), 2)
274 self.assertEqual(count(
'cc',
False), 0)
275 self.assertEqual(count(
'cc',
True), 1)
277 self.assertEqual(count(
'a{2}b{2}c{2}',
True), 1)
278 self.assertEqual(count(
'a{2}b{2}',
True), 1)
279 self.assertEqual(count(
'a{1}b{2}c{2}',
True), 1)
280 self.assertEqual(count(
'a{1}b{1}c{2}',
True), 0)
281 self.assertEqual(count(
'a{1,2}b{1,2}c{2}',
True), 1)
282 self.assertEqual(count(
'a{2,3}',
True), 1)
283 self.assertEqual(count(
'a{2,3}?',
True), 1)
286 '''Tests variables creation and redeclaration.'''
289 control.append(
'MY_PATH',
'newValue')
290 self.assertFalse(control.var(
'MY_PATH').local)
291 self.assertTrue(isinstance(control.var(
'MY_PATH'),
Variable.List))
293 control.declare(
'loc',
'list',
True)
294 self.assertTrue(control.var(
'loc').local)
295 self.assertTrue(isinstance(control.var(
'loc'),
Variable.List))
297 control.declare(
'myVar2',
'scalar',
False)
298 self.assertFalse(control.var(
'myVar2').local)
301 control.declare(
'loc2',
'scalar',
True)
302 self.assertTrue(control.var(
'loc2').local)
305 control.declare(
'MY_PATH',
'list',
False)
306 self.failUnlessRaises(
Variable.EnvError, control.declare,
'MY_PATH',
'list',
True)
307 self.failUnlessRaises(
Variable.EnvError, control.declare,
'MY_PATH',
'scalar',
True)
308 self.failUnlessRaises(
Variable.EnvError, control.declare,
'MY_PATH',
'scalar',
True)
310 control.declare(
'loc',
'list',
True)
315 control.declare(
'myVar2',
'scalar',
False)
316 self.failUnlessRaises(
Variable.EnvError, control.declare,
'myVar2',
'list',
False)
318 self.failUnlessRaises(
Variable.EnvError, control.declare,
'myVar2',
'scalar',
True)
320 control.declare(
'loc2',
'scalar',
True)
323 self.failUnlessRaises(
Variable.EnvError, control.declare,
'loc2',
'scalar',
False)
329 control.append(
'MY_PATH',
'myVal:anotherVal:lastVal')
330 control.remove(
'MY_PATH',
'anotherVal')
332 self.assertFalse(
'anotherVal' in control[
'MY_PATH'])
333 self.assertTrue(
'myVal' in control[
'MY_PATH'])
334 self.assertTrue(
'lastVal' in control[
'MY_PATH'])
336 control.set(
'MY_PATH',
'myVal:anotherVal:lastVal:else')
337 control.remove(
'MY_PATH',
'^anotherVal$',
False)
338 self.assertTrue(
'anotherVal' in control[
'MY_PATH'])
339 control.remove(
'MY_PATH',
'^anotherVal$',
True)
340 self.assertFalse(
'anotherVal' in control[
'MY_PATH'])
341 self.assertTrue(
'myVal' in control[
'MY_PATH'])
342 self.assertTrue(
'lastVal' in control[
'MY_PATH'])
343 self.assertTrue(
'lastVal' in control[
'MY_PATH'])
344 control.remove(
'MY_PATH',
'Val',
True)
345 self.assertTrue(
'else' in control[
'MY_PATH'])
346 self.assertTrue(len(control[
'MY_PATH']) == 1)
349 control.declare(
'myLoc',
'scalar',
False)
350 control.append(
'myLoc',
'myVal:anotherVal:lastVal')
351 control.remove(
'myLoc',
'Val:',
True)
352 self.assertTrue(str(control[
'myLoc']) ==
'myanotherlastVal')
358 os.environ[
'MY_PATH'] =
'$myVal'
359 os.environ[
'myScal'] =
'$myVal'
361 control.set(
'ABC',
'anyValue')
362 control.declare(
'MY_PATH',
'list',
False)
363 control.append(
'MY_PATH',
'$ABC')
364 self.assertTrue(control[
'MY_PATH'].
value(
True) ==
'$myVal:anyValue')
366 control.declare(
'myScal',
'scalar',
False)
367 control.append(
'myScal',
'$ABC')
368 self.assertTrue(control[
'myScal'].
value(
True) ==
'$myValanyValue')
374 control.declare(
'myVar',
'list',
False)
376 control.declare(
'loc',
'list',
True)
377 control.append(
'loc',
'locVal')
378 control.append(
'loc',
'locVal2')
380 control.declare(
'scal',
'scalar',
False)
381 control.append(
'scal',
'scalVal')
382 control.append(
'scal',
'scalVal2')
384 control.declare(
'scal2',
'scalar',
True)
385 control.append(
'scal2',
'locScal')
386 control.append(
'scal2',
'locScal2')
388 control.set(
'myVar',
'newValue:$loc:endValue')
389 self.assertEqual(str(control[
'myVar']),
'newValue:locVal:locVal2:endValue')
391 control.set(
'myVar',
'newValue:$scal:endValue')
392 self.assertEqual(str(control[
'myVar']),
'newValue:scalValscalVal2:endValue')
394 control.set(
'myVar',
'new${scal}Value:endValue')
395 self.assertEqual(str(control[
'myVar']),
'newscalValscalVal2Value:endValue')
397 control.set(
'myVar',
'bla:$myVar:Value')
398 self.assertEqual(str(control[
'myVar']),
'bla:newscalValscalVal2Value:endValue:Value')
400 control.set(
'scal',
'new${scal2}Value')
401 self.assertEqual(str(control[
'scal']),
'newlocScallocScal2Value')
403 control.set(
'scal',
'new${loc}Value')
404 self.assertEqual(str(control[
'scal']),
'newlocVal:locVal2Value')
406 control.set(
'scal2',
'new${scal2}Value')
407 self.assertEqual(str(control[
'scal2']),
'newlocScallocScal2Value')
411 '''<?xml version="1.0" ?>
412 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
413 <env:set variable="main">first</env:set>
414 <env:append variable="test_path">data1</env:append>
415 <env:include>first_inc.xml</env:include>
418 '''<?xml version="1.0" ?>
419 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
420 <env:set variable="main">second</env:set>
421 <env:include>second_inc.xml</env:include>
422 <env:append variable="test_path">data1</env:append>
425 '''<?xml version="1.0" ?>
426 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
427 <env:set variable="main">third</env:set>
428 <env:append variable="test_path">data1</env:append>
429 <env:include>subdir/first_inc.xml</env:include>
432 '''<?xml version="1.0" ?>
433 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
434 <env:set variable="main">fourth</env:set>
435 <env:include hints="subdir2">fourth_inc.xml</env:include>
438 '''<?xml version="1.0" ?>
439 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
440 <env:set variable="main">recursion</env:set>
441 <env:include>recursion.xml</env:include>
444 '''<?xml version="1.0" ?>
445 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
446 <env:append variable="test_path">data2</env:append>
447 <env:append variable="derived">another_${main}</env:append>
449 'subdir': {
'second_inc.xml':
450 '''<?xml version="1.0" ?>
451 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
452 <env:append variable="test_path">data0</env:append>
453 <env:set variable="map">this_is_second_inc</env:set>
456 '''<?xml version="1.0" ?>
457 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
458 <env:append variable="derived">second_${main}</env:append>
461 '''<?xml version="1.0" ?>
462 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
463 <env:append variable="included">from subdir</env:append>
465 'subdir2': {
'fourth_inc.xml':
466 '''<?xml version="1.0" ?>
467 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
468 <env:append variable="included">from subdir2</env:append>
472 if 'ENVXMLPATH' in os.environ:
473 del os.environ[
'ENVXMLPATH']
475 saved_path = list(EnvConfig.path)
476 EnvConfig.path[:] = [
'.']
481 control.loadXML(tmp(
'first.xml'))
482 self.assertEqual(str(control[
'main']),
'first')
483 self.assertEqual(str(control[
'test_path']),
'data1:data2')
484 self.assertEqual(str(control[
'derived']),
'another_first')
487 control.loadXML(tmp(
'first.xml'))
488 self.assertEqual(str(control[
'main']),
'first')
489 self.assertEqual(str(control[
'test_path']),
'data1:data2')
490 self.assertEqual(str(control[
'derived']),
'another_first')
493 control.loadXML(
'first.xml')
494 self.assertEqual(str(control[
'main']),
'first')
495 self.assertEqual(str(control[
'test_path']),
'data1:data2')
496 self.assertEqual(str(control[
'derived']),
'another_first')
499 self.assertRaises(OSError, control.loadXML, tmp(
'second.xml'))
502 control.loadXML(tmp(
'second.xml'))
503 self.assertEqual(str(control[
'main']),
'second')
504 self.assertEqual(str(control[
'test_path']),
'data0:data1')
505 self.assertEqual(str(control[
'map']),
'this_is_second_inc')
508 control.loadXML(tmp(
'first.xml'))
509 self.assertEqual(str(control[
'main']),
'first')
510 self.assertEqual(str(control[
'test_path']),
'data1:data2')
511 self.assertEqual(str(control[
'derived']),
'another_first')
514 control.loadXML(tmp(
'first.xml'))
515 self.assertEqual(str(control[
'main']),
'first')
516 self.assertEqual(str(control[
'test_path']),
'data1:data2')
517 self.assertEqual(str(control[
'derived']),
'another_first')
520 control.loadXML(
'first.xml')
521 self.assertEqual(str(control[
'main']),
'first')
522 self.assertEqual(str(control[
'test_path']),
'data1:data2')
523 self.assertEqual(str(control[
'derived']),
'another_first')
526 EnvConfig.path[:] = [
'.', tmp(), tmp(
'subdir')]
528 control.loadXML(tmp(
'second.xml'))
529 self.assertEqual(str(control[
'main']),
'second')
530 self.assertEqual(str(control[
'test_path']),
'data0:data1')
531 self.assertEqual(str(control[
'map']),
'this_is_second_inc')
533 EnvConfig.path[:] = [
'.']
536 control.loadXML(tmp(
'third.xml'))
537 self.assertEqual(str(control[
'main']),
'third')
538 self.assertEqual(str(control[
'test_path']),
'data1')
539 self.assertEqual(str(control[
'derived']),
'second_third')
542 control.loadXML(tmp(
'fourth.xml'))
543 self.assertEqual(str(control[
'main']),
'fourth')
544 self.assertEqual(str(control[
'included']),
'from subdir')
547 control.loadXML(tmp(
'fourth.xml'))
548 self.assertEqual(str(control[
'main']),
'fourth')
549 self.assertEqual(str(control[
'included']),
'from subdir2')
553 control.loadXML(tmp(
'recursion.xml'))
556 EnvConfig.path = saved_path
560 with open(
'EntryPoint.xenv',
'w')
as f:
561 f.write(
'''<?xml version="1.0" ?>
562 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">'
563 <env:default variable="INCLUDED_FILE_PATH">${.}/subdir</env:default>
564 <env:search_path>${INCLUDED_FILE_PATH}</env:search_path>
565 <env:include>Included.xenv</env:include>
567 os.makedirs(
'subdir')
568 with open(
'subdir/Included.xenv',
'w')
as f:
569 f.write(
'''<?xml version="1.0" ?>
570 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
571 <env:set variable="INCLUDED_FILE">OK</env:set>
575 control.loadXML(
'EntryPoint.xenv')
577 self.assertEqual(str(control[
'INCLUDED_FILE_PATH']), os.path.join(tmp,
'subdir'))
578 self.assertEqual(str(control[
'INCLUDED_FILE']),
'OK')
582 '''<?xml version="1.0" ?>
583 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
584 <env:set variable="mydirs">${.}</env:set>
585 <env:set variable="myparent">${.}/..</env:set>
589 control.loadXML(tmp(
'env.xml'))
590 self.assertEqual(str(control[
'mydirs']), tmp())
591 self.assertEqual(str(control[
'myparent']), os.path.dirname(tmp()))
597 control.loadXML(
'env.xml')
598 self.assertEqual(str(control[
'mydirs']), tmp())
599 self.assertEqual(str(control[
'myparent']), os.path.dirname(tmp()))
605 '''<?xml version="1.0" ?>
606 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
607 <env:default variable="var1">value1</env:default>
608 <env:declare variable="var2" local="true" />
609 <env:default variable="var2">test2</env:default>
612 if 'var1' in os.environ:
613 del os.environ[
'var1']
615 control.loadXML(tmp(
'env.xml'))
616 self.assertEqual(str(control[
'var1']),
"value1")
617 self.assertEqual(str(control[
'var2']),
"test2")
619 os.environ[
'var1'] =
"some_value"
621 control.loadXML(tmp(
'env.xml'))
622 self.assertEqual(str(control[
'var1']),
"some_value")
623 self.assertEqual(str(control[
'var2']),
"test2")
629 l.set(
"/usr/bin:/some//strange/../nice/./location")
630 assert l.value(asString=
True) ==
"/usr/bin:/some/nice/location"
632 l.append(
"/another/path")
633 assert l.value(asString=
True) ==
"/usr/bin:/some/nice/location:/another/path"
637 assert l.value(asString=
True) ==
"/usr/bin:/some/nice/location:/another/path"
638 l.prepend(
"/another/path")
639 assert l.value(asString=
True) ==
"/another/path:/usr/bin:/some/nice/location"
644 assert s.value(asString=
True) ==
"/usr/bin"
646 s.set(
"/some//strange/../nice/./location")
647 assert s.value(asString=
True) ==
"/some/nice/location"
652 s.set(
"http://cern.ch")
653 assert s.value(asString=
True) ==
"http://cern.ch"
655 if __name__ ==
"__main__":
def testsVariablesInSearchPath(self)
def testDependencies(self)
def testWriteWithList(self)
def __exit__(self, exc_type, exc_val, exc_tb)
def testSystemEnvironment(self)
def testHidingDotVar(self)
def testVariableManipulations(self)